From f27b82b6a5dae81f56111ed4fcd18269ca7c814e Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 14:24:12 +0800 Subject: [PATCH 01/14] =?UTF-8?q?=E7=99=BB=E8=AE=B0AI=E7=A0=94=E7=A9=B6?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E8=BE=B9=E7=95=8C=E5=B9=B6=E5=88=97=E6=98=8E?= =?UTF-8?q?=E8=A6=86=E7=9B=96=E7=BC=BA=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../02-coverage-and-gaps.md | 28 ++ content/research/ai-companies.sources.json | 241 ++++++++++++++++++ scripts/audit-ai-research.py | 40 +++ 4 files changed, 310 insertions(+) create mode 100644 content/research/ai-companies.sources.json diff --git a/README.md b/README.md index ee59b68..7e5378f 100644 --- a/README.md +++ b/README.md @@ -131,6 +131,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 逐条读取对应 YC 官方公开页面,以页面中的成立年份、团队字段和业务描述筛选。 962 条初筛匹配,其中 34 条与原表 URL 重合,实际新增 928 条;268 条年份不符或缺失、 192 条 AI 业务待确认、6 条成立年份晚于批次年份未纳入本批新增。 +`content/research/ai-companies.sources.json` 保留最初12项来源与后续补充渠道、用途、覆盖边界及下一步;覆盖报告逐渠道复算证据、公司及观测数量。背景报告、入口可读和候选池逐条读取分别标记,零计数不表示没有公司。 `content/research/ai-companies.coverage.json` 保留逐条筛选结果、来源与响应摘要, 数据快照中的 `coverage` 也随版本进入同一 SQLite 数据库。只覆盖该候选池,不能称全球全量。 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index 1e3e8d2..d323cf1 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -66,6 +66,34 @@ | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | | 其他官网、评测及公开资料 | 72 | 68 | 按每条来源限制理解,不能统一当作独立证据 | +## 来源清单与验收边界 + +S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。 + +每条证据在下表只计入一个渠道:先按所列域名归属,再将类型明确标为官方/公司自述/公司披露的剩余项计入S12,其余计入S16。公司可跨渠道出现,所以公司数不可跨行相加。零条证据表示尚未进入研究表,不表示该来源没有相关公司。背景报告不承担公司发现全集的角色。 + +| 来源 | 当前状态 | 证据 / 公司 / 观测数 | 已核对范围 | 剩余核查 | +| --- | --- | --- | --- | --- | +| S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 984 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | +| S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | +| S03 [Dealroom](https://dealroom.co/) | 候选台账待建 | 0 / 0 / 0 | 仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。 | 确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 候选台账待建 | 0 / 0 / 0 | 仅确认首页及发布档案入口可读,尚无两年AI产品候选池;发布不等于公司成立。 | 按发布档案建立候选并回查官网成立信息、区分产品和法人。 | +| S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | +| S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | +| S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | +| S08 [Stripe](https://stripe.com/annual-updates/2025) | 背景研究 | 1 / 0 / 0 | 年度平台观察,不提供可公开穷尽的新AI商户名录。 | 与TrustMRR支付重建数据分开;不据平台总量推算单家公司。 | +| S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | +| S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | +| S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 28 / 14 / 11 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | +| S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | +| S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | +| S16 其他公开补充资料 | 定向使用,未穷尽 | 41 / 21 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | + +Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。 + + ## 尚未满足的研究条件 行业ARR比较仍缺统一业务截止日、币种、经常性定义和业务边界。现有平台MRR可描述已采集产品,不足以代表全部新公司。技术评测只覆盖所列版本与任务,不宜跨领域汇总为统一强弱分数。 diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json new file mode 100644 index 0000000..4b8d159 --- /dev/null +++ b/content/research/ai-companies.sources.json @@ -0,0 +1,241 @@ +{ + "version": "2026-10-30-1", + "scopeConfirmedAt": "2026-10-30", + "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", + "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", + "sources": [ + { + "id": "S01", + "name": "Y Combinator", + "url": "https://www.ycombinator.com/companies", + "role": "discovery", + "status": "candidate-audit", + "hosts": [ + "www.ycombinator.com" + ], + "initialAccess": "官网目录可访问", + "boundary": "已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。", + "nextCheck": "继续复核规则初分和缺项;候选明细见逐条台账。", + "limitation": "批次不等于成立年;不代表全部公司" + }, + { + "id": "S02", + "name": "TechCrunch AI", + "url": "https://techcrunch.com/category/artificial-intelligence/", + "role": "reporting", + "status": "targeted", + "hosts": [ + "techcrunch.com" + ], + "initialAccess": "AI栏目可读取", + "boundary": "已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。", + "nextCheck": "建立两年公司报道候选表,排除老公司新产品及重复转述。", + "limitation": "需追溯原始披露,部分文章受访问限制" + }, + { + "id": "S03", + "name": "Dealroom", + "url": "https://dealroom.co/", + "role": "discovery", + "status": "pending", + "hosts": [ + "dealroom.co", + "app.dealroom.co" + ], + "initialAccess": "官网可读取", + "boundary": "仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。", + "nextCheck": "确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。", + "limitation": "明细或批量访问取决于权限", + "accessRecheckedAt": "2026-10-30" + }, + { + "id": "S04", + "name": "Product Hunt", + "url": "https://www.producthunt.com/", + "role": "discovery", + "status": "pending", + "hosts": [ + "www.producthunt.com", + "producthunt.com" + ], + "initialAccess": "官网可读取", + "boundary": "仅确认首页及发布档案入口可读,尚无两年AI产品候选池;发布不等于公司成立。", + "nextCheck": "按发布档案建立候选并回查官网成立信息、区分产品和法人。", + "limitation": "上线时间不等于成立时间", + "accessRecheckedAt": "2026-10-30" + }, + { + "id": "S05", + "name": "Sacra", + "url": "https://sacra.com/", + "role": "estimation", + "status": "targeted", + "hosts": [ + "sacra.com" + ], + "initialAccess": "官网可读取", + "boundary": "已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。", + "nextCheck": "保留估算与公司披露差异,核实历史截至日。", + "limitation": "部分付费;不能把估算当审计数" + }, + { + "id": "S06", + "name": "Bessemer", + "url": "https://www.bvp.com/atlas/the-state-of-ai-2025", + "role": "context", + "status": "context", + "hosts": [ + "www.bvp.com", + "bvp.com" + ], + "initialAccess": "报告页面可读取", + "boundary": "用于行业分类和增长研究背景;不是新成立公司普查。", + "nextCheck": "核报告样本、方法与年份,不能将组合公司清单当总体。", + "limitation": "投资机构选样偏差" + }, + { + "id": "S07", + "name": "Menlo Ventures", + "url": "https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/", + "role": "context", + "status": "context", + "hosts": [ + "menlovc.com", + "www.menlovc.com" + ], + "initialAccess": "报告页面可读取", + "boundary": "用于企业采购背景;不把调研比例转换为公司ARR。", + "nextCheck": "保留调研方法、采购样本及与新公司样本的差异。", + "limitation": "口径与样本需查看方法说明" + }, + { + "id": "S08", + "name": "Stripe", + "url": "https://stripe.com/annual-updates/2025", + "role": "context", + "status": "context", + "hosts": [ + "stripe.com", + "www.stripe.com" + ], + "initialAccess": "年度信可读取", + "boundary": "年度平台观察,不提供可公开穷尽的新AI商户名录。", + "nextCheck": "与TrustMRR支付重建数据分开;不据平台总量推算单家公司。", + "limitation": "平台样本不能代表全部AI公司" + }, + { + "id": "S09", + "name": "SaaS Capital", + "url": "https://www.saas-capital.com/research/", + "role": "context", + "status": "context", + "hosts": [ + "www.saas-capital.com", + "saas-capital.com" + ], + "initialAccess": "研究页可读取", + "boundary": "B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。", + "nextCheck": "按报告样本及营收规模使用,不强套为行业ARR分布。", + "limitation": "不直接套用硬件与项目制业务" + }, + { + "id": "S10", + "name": "机器之心", + "url": "https://www.jiqizhixin.com/", + "role": "reporting", + "status": "pending", + "hosts": [ + "www.jiqizhixin.com", + "jiqizhixin.com", + "pro.jiqizhixin.com" + ], + "initialAccess": "首页可读取", + "boundary": "首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。", + "nextCheck": "建立中文公司候选台账,会员正文不可读时标明。", + "limitation": "部分会员内容;财务数据需追溯", + "accessRecheckedAt": "2026-10-30" + }, + { + "id": "S11", + "name": "36氪", + "url": "https://www.36kr.com/", + "role": "reporting", + "status": "access-limited", + "hosts": [ + "www.36kr.com", + "36kr.com" + ], + "initialAccess": "安全检测,内容未核验", + "boundary": "2026-10-30仍返回安全检测页面,未把首页作为已读文章。", + "nextCheck": "使用可公开读取的具体文章或其他原始来源;不绕过访问保护。", + "limitation": "暂不作为已读取内容证据", + "accessRecheckedAt": "2026-10-30" + }, + { + "id": "S12", + "name": "公司官网与官方博客", + "url": null, + "role": "primary", + "status": "per-company", + "hosts": [], + "initialAccess": "按公司逐一核验", + "boundary": "公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。", + "nextCheck": "核定价、主体、交付与收入定义,自述与独立验证分开。", + "limitation": "自述不等于独立审计" + }, + { + "id": "S13", + "name": "TrustMRR", + "url": "https://trustmrr.com/", + "role": "platform", + "status": "targeted", + "hosts": [ + "trustmrr.com" + ], + "initialAccess": "见具体证据访问记录", + "boundary": "已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。", + "nextCheck": "核同步日、连接失效、支付平台公式及产品/法人归属。", + "limitation": "来源可读不等于声明已独立验证。" + }, + { + "id": "S14", + "name": "a16z Speedrun", + "url": "https://speedrun.a16z.com/", + "role": "investor", + "status": "targeted", + "hosts": [ + "speedrun.a16z.com" + ], + "initialAccess": "见具体证据访问记录", + "boundary": "投资机构公司介绍定向样本,收入数字仍多来自公司。", + "nextCheck": "核币种、相对时间及管线/履历;未读取的页面保持缺项。", + "limitation": "来源可读不等于声明已独立验证。" + }, + { + "id": "S15", + "name": "Artificial Analysis", + "url": "https://artificialanalysis.ai/", + "role": "technical", + "status": "targeted", + "hosts": [ + "artificialanalysis.ai" + ], + "initialAccess": "见具体证据访问记录", + "boundary": "第三方已发表技术评测,仅覆盖所列模型版本和任务。", + "nextCheck": "核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。", + "limitation": "来源可读不等于声明已独立验证。" + }, + { + "id": "S16", + "name": "其他公开补充资料", + "url": null, + "role": "supplement", + "status": "targeted", + "hosts": [], + "initialAccess": "见具体证据访问记录", + "boundary": "未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。", + "nextCheck": "逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。", + "limitation": "来源可读不等于声明已独立验证。" + } + ] +} diff --git a/scripts/audit-ai-research.py b/scripts/audit-ai-research.py index 58b72ec..0a646b2 100644 --- a/scripts/audit-ai-research.py +++ b/scripts/audit-ai-research.py @@ -9,10 +9,49 @@ from urllib.parse import urlsplit ROOT = Path(__file__).resolve().parents[1] DATA = json.loads((ROOT / 'content/research/ai-companies.seed.json').read_text()) AUDIT = json.loads((ROOT / 'content/research/ai-companies.coverage.json').read_text()) +SOURCES = json.loads((ROOT / 'content/research/ai-companies.sources.json').read_text()) TARGET = ROOT / 'content/docs/ai-company-research/02-coverage-and-gaps.md' BASE = '/docs/other-research/ai-company-research/overview' + +def source_register(): + sources = SOURCES['sources'] + ids = {s['id'] for s in sources} + assert len(ids) == len(sources) and ids == {f'S{i:02}' for i in range(1, 17)} + assert SOURCES['scopeConfirmedAt'] <= DATA['asOf'] + host_map = {} + for source in sources: + assert source['status'] in {'candidate-audit', 'targeted', 'pending', 'context', 'access-limited', 'per-company'} + assert source['boundary'] and source['nextCheck'] + if source['url']: + assert urlsplit(source['url']).scheme in {'http', 'https'} and urlsplit(source['url']).netloc + for host in source['hosts']: + assert host not in host_map, f'Duplicate source host: {host}' + host_map[host] = source['id'] + assigned = {key: [] for key in ids} + for evidence in DATA['evidence']: + owner = host_map.get(urlsplit(evidence['url']).netloc) + if owner is None: + owner = 'S12' if any(word in evidence['kind'] for word in ('官方', '公司自述', '公司披露')) else 'S16' + assigned[owner].append(evidence) + assert sum(len(v) for v in assigned.values()) == len(DATA['evidence']) + statuses = {'candidate-audit': '候选池逐条已读', 'targeted': '定向使用,未穷尽', 'pending': '候选台账待建', + 'context': '背景研究', 'access-limited': '访问受限', 'per-company': '随公司逐条核对'} + lines = ['', '## 来源清单与验收边界', '', SOURCES['provenance'], '', + '每条证据在下表只计入一个渠道:先按所列域名归属,再将类型明确标为官方/公司自述/公司披露的剩余项计入S12,其余计入S16。公司可跨渠道出现,所以公司数不可跨行相加。零条证据表示尚未进入研究表,不表示该来源没有相关公司。背景报告不承担公司发现全集的角色。', '', + '| 来源 | 当前状态 | 证据 / 公司 / 观测数 | 已核对范围 | 剩余核查 |', '| --- | --- | --- | --- | --- |'] + for source in sources: + evidence = assigned[source['id']] + evidence_ids = {e['id'] for e in evidence} + company_ids = {e['companyId'] for e in evidence if e['companyId']} + observations = sum(o['evidence'] in evidence_ids for o in DATA['observations']) + name = f"[{source['name']}]({source['url']})" if source['url'] else source['name'] + lines.append(f"| {source['id']} {name} | {statuses[source['status']]} | {len(evidence)} / {len(company_ids)} / {observations} | {source['boundary']} | {source['nextCheck']} |") + lines += ['', 'Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。', ''] + return lines + + def render(): cov = DATA['coverage'] companies = DATA['companies'] @@ -85,6 +124,7 @@ def render(): lines.append(f"| {name} | {len(entries)} | {len({e['url'] for e in entries})} | {note} |") others = [e for e in DATA['evidence'] if urlsplit(e['url']).netloc not in included] lines.append(f"| 其他官网、评测及公开资料 | {len(others)} | {len({e['url'] for e in others})} | 按每条来源限制理解,不能统一当作独立证据 |") + lines += source_register() lines += ['', '## 尚未满足的研究条件', '', '行业ARR比较仍缺统一业务截止日、币种、经常性定义和业务边界。现有平台MRR可描述已采集产品,不足以代表全部新公司。技术评测只覆盖所列版本与任务,不宜跨领域汇总为统一强弱分数。', '', '下一轮优先补收入线索的日期及合同定义、非YC和非英文来源、规则初分的人工复核,以及停止服务或被收购案例。这样能减少“只见赢家”和“只见融资公司”的偏差。公开来源池之外的未披露公司仍无法证明已被穷尽。', '', From dca7c81889e0b3c393136f540ea0f40365c80ddc Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 15:11:59 +0800 Subject: [PATCH 02/14] =?UTF-8?q?=E7=99=BB=E8=AE=B0Product=20Hunt=E5=80=99?= =?UTF-8?q?=E9=80=89=E5=B9=B6=E8=A1=A5=E5=85=85Kilo=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E4=B8=AA=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- apps/docs/scripts/auth-cli.ts | 6 +- apps/docs/src/lib/ai-research.ts | 33 +- apps/docs/tests/research.test.ts | 32 +- .../docs/ai-company-research/00-overview.md | 1 + .../ai-company-research/01-income-snapshot.md | 2 +- .../02-coverage-and-gaps.md | 53 +- content/research/ai-companies.seed.json | 467 +++++++++++++++++- content/research/ai-companies.sources.json | 8 +- content/research/ai-income-analysis.json | 2 +- scripts/audit-ai-research.py | 38 ++ 11 files changed, 616 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index 7e5378f..b7cddb3 100644 --- a/README.md +++ b/README.md @@ -98,10 +98,11 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,015 条公司/产品记录、10 类业务及待分类组、1,091 条证据记录和 183 条经营与技术观测。 -其中保留 86 家个案资料、913 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,101 条证据记录和 187 条经营与技术观测。 +其中保留 87 家个案资料、913 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +Product Hunt首批19张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;54条核查中43条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;57条核查中46条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 @@ -144,7 +145,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。 AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。 技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。 -当前7条完成该字段的专项记录,其中3条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 +当前8条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。 `pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 4224810..d1b04df 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -185,10 +185,10 @@ async function main() { assert.equal(researchResponse.status, 200, "authenticated research API"); assert.ok(researchResponse.headers.get("cache-control")?.includes("no-store")); const research = await researchResponse.json(); - assert.equal(research.companies.length, 1015); + assert.equal(research.companies.length, 1016); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1091); - assert.equal(research.observations.length, 183); + assert.equal(research.evidence.length, 1101); + assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); assert.equal(researchPage.status, 200); diff --git a/apps/docs/src/lib/ai-research.ts b/apps/docs/src/lib/ai-research.ts index 2a39825..dbef876 100644 --- a/apps/docs/src/lib/ai-research.ts +++ b/apps/docs/src/lib/ai-research.ts @@ -43,11 +43,20 @@ export type ResearchCoverage = { otherOrMissingYear: number; unclearAI: number; dateConflicts: number; failedProfiles: number; discoverySha256: string; }; +export type ResearchCandidateBatch = { + id: string; sourceId: string; url: string; accessedAt: string; scope: string; complete: boolean; + records: { + id: string; name: string; url: string | null; categoryId: string; + kind: "product" | "promotion"; profileStatus: "readable" | "unavailable" | "archive-only"; + status: "pending-year" | "linked" | "existing-outside-cohort" | "promotion"; + companyId?: string; note: string; + }[]; +}; export type ResearchSnapshot = { version: string; asOf: string; scope: string; limitations: string[]; categories: ResearchCategory[]; companies: ResearchCompany[]; observations: ResearchObservation[]; evidence: ResearchEvidence[]; - reviews: ResearchReview[]; coverage?: ResearchCoverage; + reviews: ResearchReview[]; coverage?: ResearchCoverage; candidateBatches?: ResearchCandidateBatch[]; }; export function evidenceUrl(value: string): string | undefined { @@ -98,6 +107,28 @@ export function validateResearch(snapshot: ResearchSnapshot) { !Number.isFinite(o.value)) throw new Error(`Invalid research observation: ${o.id}`); } + unique((snapshot.candidateBatches ?? []).map((b) => b.id), "candidate batches"); + unique((snapshot.candidateBatches ?? []).flatMap((b) => b.records.map((r) => r.id)), "candidates"); + for (const batch of snapshot.candidateBatches ?? []) { + if (!/^S\d{2}$/.test(batch.sourceId) || !evidenceUrl(batch.url) || !batch.scope.trim() || + typeof batch.complete !== "boolean" || !/^\d{4}-\d{2}-\d{2}$/.test(batch.accessedAt) || + Number.isNaN(Date.parse(batch.accessedAt)) || + new Date(batch.accessedAt).toISOString().slice(0, 10) !== batch.accessedAt || + batch.accessedAt > snapshot.asOf) + throw new Error(`Invalid research candidate batch: ${batch.id}`); + for (const row of batch.records) { + const linked = ["linked", "existing-outside-cohort"].includes(row.status); + if (!row.name.trim() || !row.note.trim() || !categories.has(row.categoryId) || + !["product", "promotion"].includes(row.kind) || + !["readable", "unavailable", "archive-only"].includes(row.profileStatus) || + !["pending-year", "linked", "existing-outside-cohort", "promotion"].includes(row.status) || + (row.kind === "product" && (!row.url || !evidenceUrl(row.url))) || + (row.url !== null && !evidenceUrl(row.url)) || + linked !== !!row.companyId || (row.companyId && !companies.has(row.companyId)) || + (row.kind === "promotion") !== (row.status === "promotion")) + throw new Error(`Invalid research candidate: ${row.id}`); + } + } const coverage = snapshot.coverage; if (coverage && (coverage.profilesRead + coverage.failedProfiles !== coverage.candidateRecords || coverage.matchingProfiles !== coverage.existingProfiles + coverage.newProfiles || diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index f0a8774..e26a5b5 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -23,9 +23,10 @@ test("research revisions share the authentication database and preserve replay l for (let i = 0; i < 20; i++) consumeCode(config, "invalid"); assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); - assert.equal(initial.companies.length, 1015); - assert.equal(initial.evidence.length, 1091); - assert.equal(initial.observations.length, 183); + assert.equal(initial.companies.length, 1016); + assert.equal(initial.evidence.length, 1101); + assert.equal(initial.observations.length, 187); + assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records"); const db = openSiteDatabase(); const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as { name: string }[]; @@ -62,7 +63,7 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 43); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 46); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 3); assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 8); const review = snapshot.reviews.find((r) => r.id === "R4")!; @@ -83,11 +84,11 @@ test("reviews link explicit companies without turning global or excluded cases i test("disclosure counts exclude client income, biographies, targets and duplicate milestones", () => { const snapshot = seed as ResearchSnapshot; const summary = categorySummary(snapshot); - assert.equal(summary.reduce((n, c) => n + c.count, 0), 1015); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1016); assert.equal(summary.reduce((n, c) => n + c.self, 0), 26); assert.equal(summary.reduce((n, c) => n + c.estimate, 0), 1); assert.equal(summary.reduce((n, c) => n + c.platform, 0), 16); - assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 972); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 973); assert.equal(snapshot.companies.find((c) => c.name === "Rork")?.revenueStatus, "unknown"); assert.equal(snapshot.companies.find((c) => c.name === "Result")?.revenueStatus, "unknown"); assert.ok(snapshot.observations.filter((o) => o.selection === "signal").every((o) => o.scope === "公司整体")); @@ -95,8 +96,8 @@ test("disclosure counts exclude client income, biographies, targets and duplicat test("technical reviews keep accessible materials separate from tested capabilities", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 7); - assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 3); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 8); + assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 4); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1); assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown"); assert.match(snapshot.companies.find((c) => c.id === "AI051")!.technicalReview!.testScope!, /Sep 2026/); @@ -255,3 +256,18 @@ test("distribution statistics match independently calculated snapshot references } } }); + + +test("product launch candidates preserve unresolved years and many launches per company", () => { + const snapshot = structuredClone(seed) as ResearchSnapshot; + const batch = snapshot.candidateBatches![0]; + assert.equal(batch.complete, false); + assert.equal(batch.records.length, 19); + const kilo = batch.records.filter((r) => r.companyId === "AI072"); + assert.equal(kilo.length, 2, "IDE and hosted products resolve to one company"); + assert.equal(snapshot.companies.filter((c) => c.id === "AI072").length, 1); + assert.ok(batch.records.some((r) => r.status === "pending-year" && !r.companyId)); + assert.ok(batch.records.some((r) => r.status === "existing-outside-cohort" && r.companyId === "AI054")); + kilo[0].companyId = "missing-company"; + assert.throws(() => validateResearch(snapshot), /research candidate/); +}); diff --git a/content/docs/ai-company-research/00-overview.md b/content/docs/ai-company-research/00-overview.md index 56ea368..1fbe713 100644 --- a/content/docs/ai-company-research/00-overview.md +++ b/content/docs/ai-company-research/00-overview.md @@ -20,6 +20,7 @@ | 小企业综合Agent | Runable(AI059) | 公司披露历史ARR里程碑;[官方公告](https://runable.com/blogs/runable-grow) | 限定一个任务,测完整成功率、收费与执行成本 | 当前付费客户、续费、推理成本、人工接管 | | 行业专业Agent与服务 | LunaBill、Plena Health、Bizmark | 有合同ARR、数量级或ARR自述,日历截止日和交付拆分不完整 | 采购周期、上线工时、失败处理与验收标准 | 合同、经常性与实施费拆分、使用深度 | | AI辅助工程与研究服务 | Marengo、Harbor | 有首月收入、待交付或多年服务合同;不直接当ARR | 已验收项目毛利、专业人员工时、返工和责任成本 | 合同收入确认、软件/服务拆分、应收账款和交付集中度 | +| 开源编程工具与企业治理 | [Kilo Code](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 官方定价区分席位、推理、充值处理费和云算力;已被收购,收入未知 | 企业付费转换、平台净收入、推理转付与补贴、支持成本 | 付费客户、留存、收入确认及并表边界;不能从token吞吐推ARR | | 模型、算力与机器人 | Wafer、Induction Labs、Congruent | 可确定产品方向;团队小或融资多不证明单位经济 | 客户真实负载、性能成本、交付与售后成本 | 同口径收入、资本开支、独立性能测试 | **对我们商业试验的推论:** 先选择能接触真实买家、结果可验收、成本可计量的工作流,比较软件订阅与服务交付的实际毛利,再评估是否扩成综合Agent。当前证据不足以断定某类必然更赚钱;平台数据更适合帮助选择访谈与试验对象。 diff --git a/content/docs/ai-company-research/01-income-snapshot.md b/content/docs/ai-company-research/01-income-snapshot.md index 6073038..664c32d 100644 --- a/content/docs/ai-company-research/01-income-snapshot.md +++ b/content/docs/ai-company-research/01-income-snapshot.md @@ -2,7 +2,7 @@ 截至 2026-10-30,7日窗口内有 14 个产品的美元平台MRR可纳入分组描述。创意软件订阅组的样本均值较高、CV也较大;营销软件组与消费者个人应用组的CV接近。各组只有1至5个产品,尚不足以估计行业总体或造假概率。 -这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,015条公司/产品记录的收入普查。 +这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,016条公司/产品记录的收入普查。 ## 7日窗口的分组结果 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index d323cf1..97e776f 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -1,6 +1,6 @@ # AI 公司资料覆盖与缺项 -截至 2026-10-30,研究表含1,015条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 +截至 2026-10-30,研究表含1,016条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。 @@ -19,23 +19,23 @@ | AI业务待确认 | 192 | 不强行把背景关键词当主营 | | 成立年与批次冲突 | 6 | 另保留核查记录 | -全表由913条目录基础项和102条个案或平台记录组成。候选池已匹配项之外另有53条记录,包含其他来源及发布/转型对照;其中已有15条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 +全表由913条目录基础项和103条个案或平台记录组成。候选池已匹配项之外另有54条记录,包含其他来源及发布/转型对照;其中已有15条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 ## 成立年与证据深度 | 维度 | 当前记录 | 解读 | | --- | --- | --- | -| 记录为2025年成立 | 619 | 成立来源和精度见公司明细 | +| 记录为2025年成立 | 620 | 成立来源和精度见公司明细 | | 记录为2026年成立 | 391 | 不将产品发布日期代替成立日 | | 成立年未知或范围外 | 5 | 发布/转型对照单列,不进入两年成立分组 | | 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 | | 其他目录基础项 | 753 | 规则初分或资料不足,继续待复核 | | 有团队数字 | 945 | 多为自报Team Size或Employees,时点与口径不统一 | -| 专项技术证据记录 | 7 | 其中3条自述、3条公开材料、1条第三方评测 | +| 专项技术证据记录 | 8 | 其中3条自述、4条公开材料、1条第三方评测 | | 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR | | 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 | | 仅第三方估算 | 1 | 不与直接披露混合 | -| 暂无可用收入数字 | 972 | 包含尚未逐家搜索的目录项,不代表没有收入 | +| 暂无可用收入数字 | 973 | 包含尚未逐家搜索的目录项,不代表没有收入 | ## 业务分类与数据入口 @@ -44,7 +44,7 @@ | [基础模型](/docs/other-research/ai-company-research/overview?category=C01) | 29 | | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 102 | | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 51 | -| [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 109 | +| [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 110 | | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 176 | | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 52 | | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 321 | @@ -55,7 +55,7 @@ ## 已使用来源的分布 -1,091条证据记录对应1,077个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,101条证据记录对应1,087个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | @@ -64,7 +64,7 @@ | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 72 | 68 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 82 | 78 | 按每条来源限制理解,不能统一当作独立证据 | ## 来源清单与验收边界 @@ -77,7 +77,7 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 984 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | | S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | | S03 [Dealroom](https://dealroom.co/) | 候选台账待建 | 0 / 0 / 0 | 仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。 | 确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。 | -| S04 [Product Hunt](https://www.producthunt.com/) | 候选台账待建 | 0 / 0 / 0 | 仅确认首页及发布档案入口可读,尚无两年AI产品候选池;发布不等于公司成立。 | 按发布档案建立候选并回查官网成立信息、区分产品和法人。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 2 / 1 / 0 | 已登记2026年度榜单首次响应19张卡片:17个产品页可读、1超时、1推广卡;只核当前可见批次,未穷尽两年发布档案。 | 补2025档案、2026其余分页/日期及公司成立证据;多产品映射同一公司,未核年份保持候选。 | | S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | | S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | @@ -85,15 +85,46 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | | S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 28 / 14 / 11 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 35 / 15 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | -| S16 其他公开补充资料 | 定向使用,未穷尽 | 41 / 21 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | +| S16 其他公开补充资料 | 定向使用,未穷尽 | 42 / 22 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。 +## S04 产品发布候选核对 + +[发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 + +本批19条:2条关联公司、1条关联范围外对照、15条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 + +| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 限制 | +| --- | --- | --- | --- | --- | +| [Fundraisly](https://www.producthunt.com/products/fundraisly) | 行业专业应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | 软件开发 | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | +| [Brila](https://www.producthunt.com/products/brila-2) | 软件开发 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [happycapy](https://www.producthunt.com/products/happycapy) | 消费者个人应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Cowork](https://www.producthunt.com/products/claude) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Upstream](https://www.producthunt.com/products/upstream-3) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | 消费者个人应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Framer 3.0](https://www.producthunt.com/products/framer) | 软件开发 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [OpenSEO](https://www.producthunt.com/products/openseo) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Clarify](https://www.producthunt.com/products/clarify-6) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Lightfield](https://www.producthunt.com/products/lightfield) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Pazi](https://www.producthunt.com/products/pazi) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [SuperX](https://www.producthunt.com/products/superx) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Kilo Code for VS Code](https://www.producthunt.com/products/kilocode) | 软件开发 | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | +| [Brew](https://www.producthunt.com/products/brew-5) | 客户与收入运营 | 成立年待核 | — | 产品页读取超时,保留榜单发现;主体、成立年和收入待核。 | +| Render startup credits | 算力与模型基础设施 | 推广活动,非公司新增 | — | 推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。 | +| [DataFast](https://www.producthunt.com/products/datafast) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [KiloClaw](https://www.producthunt.com/products/kiloclaw) | Agent 开发与运行设施 | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | +| [Stitch 2.0 by Google](https://www.producthunt.com/products/stitch-2-0-by-google-2) | 内容与创意 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | + +产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。HTTP直接采集返回403,因此不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 + + ## 尚未满足的研究条件 行业ARR比较仍缺统一业务截止日、币种、经常性定义和业务边界。现有平台MRR可描述已采集产品,不足以代表全部新公司。技术评测只覆盖所列版本与任务,不宜跨领域汇总为统一强弱分数。 diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index ced6dc4..504c116 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-depth-4", + "version": "2026-10-30-ph-1", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28596,6 +28596,47 @@ ], "revenueStatus": "self", "classificationBasis": "按当前或最后公开主营归类,历史产品和业务边界另记。" + }, + { + "id": "AI072", + "name": "Kilo Code(已被Anaconda收购)", + "url": "https://kilo.ai/", + "cat": "C04", + "year": 2025, + "team": null, + "location": "美国旧金山 / 荷兰阿姆斯特丹;远程团队", + "business": "提供开源编程Agent、IDE/CLI/云端工作流、模型路由及企业治理。", + "buyer": "软件开发者与企业工程团队", + "delivery": "官方代码和商业套餐可访问;未独立运行验证,2026年7月收购后仍提供产品。", + "notes": "2025成立依据收购方官方案例与创立说明,非工商核验。KiloClaw与IDE插件归同一案例;不同于kilo.co健康业务。采用数和token吞吐不是ARR。", + "cohort": "2025年成立(官方案例及创立说明)", + "teamBasis": "官方案例列11—50人及15名工程师,截止日未列;不转换为精确员工数", + "price": "个人平台免费;Teams每用户每月15,Kilo Pass每月19起(原文$);5%充值处理费与云算力另计,企业定制", + "pricingEvidence": "KILO-PRICE", + "stage": "已被Anaconda收购;有公开软件与商业套餐,收入待核", + "sourceType": "公司与收购方官方材料,Product Hunt发现", + "evidenceIds": [ + "KILO-PH", + "KILO-ABOUT", + "KILO-HOME", + "KILO-PRICE", + "KILO-CODE", + "KILO-START", + "KILO-ACQ", + "KILO-SIZE" + ], + "revenueStatus": "unknown", + "businessModel": "开源获客、团队平台席位与企业合同、可选额度订阅、充值处理费及云算力;模型供应商成本与平台净收入需分开", + "entityBasis": "2025创立的Kilo Code品牌/公司;2026-07-15起按已被收购业务观察,法律并表细节未核", + "classificationBasis": "按主要买家与软件开发工作流归C04;模型网关和托管产品不另计一家公司。", + "technicalReview": { + "level": "public-artifact", + "reviewedAt": "2026-10-30", + "summary": "官方仓库与源码、MIT许可证可访问;未运行产品、复测厂商基准或确认独立技术排名。", + "evidenceIds": [ + "KILO-CODE" + ] + } } ], "observations": [ @@ -31572,6 +31613,66 @@ "reason": "奖金不是经常性ARR;需核获奖名单、时期和收款主体,不与个人履历奖金相加", "bound": "=", "comparisonGroup": null + }, + { + "id": "KILO-O-developers", + "company": "AI072", + "name": "Kilo Code", + "kind": "官网自述采用规模", + "value": 5000000, + "unit": "名开发者,未核独立付费客户", + "timing": "官网未给业务截止日;2026-10-30读取", + "evidence": "KILO-HOME", + "scope": "Kilo产品采用或吞吐", + "selection": "adoption", + "reason": "采用和token吞吐不等于收入;日期与定义未对齐时不合并、不反推ARR。", + "bound": ">", + "comparisonGroup": null + }, + { + "id": "KILO-O-tokens-home", + "company": "AI072", + "name": "Kilo Code", + "kind": "首页月token吞吐", + "value": 10000000000000, + "unit": "tokens/月", + "timing": "官网未给业务截止月;2026-10-30读取", + "evidence": "KILO-HOME", + "scope": "Kilo产品采用或吞吐", + "selection": "adoption", + "reason": "采用和token吞吐不等于收入;日期与定义未对齐时不合并、不反推ARR。", + "bound": ">", + "comparisonGroup": null + }, + { + "id": "KILO-O-tokens-about", + "company": "AI072", + "name": "Kilo Code", + "kind": "关于页月token吞吐", + "value": 6000000000000, + "unit": "tokens/月", + "timing": "关于页未给业务截止月;2026-10-30读取", + "evidence": "KILO-ABOUT", + "scope": "Kilo产品采用或吞吐", + "selection": "adoption", + "reason": "采用和token吞吐不等于收入;日期与定义未对齐时不合并、不反推ARR。", + "bound": "=", + "comparisonGroup": null + }, + { + "id": "KILO-O-developers-acq", + "company": "AI072", + "name": "Kilo Code", + "kind": "收购公告采用规模", + "value": 3000000, + "unit": "名开发者,未核独立付费客户", + "timing": "2026-07-15收购公告;2026-10-30读取", + "evidence": "KILO-ACQ", + "scope": "Kilo产品采用或吞吐", + "selection": "adoption", + "reason": "采用和token吞吐不等于收入;日期与定义未对齐时不合并、不反推ARR。", + "bound": ">", + "comparisonGroup": null } ], "evidence": [ @@ -43575,6 +43676,116 @@ "kind": "公司官方材料", "summary": "公开仓库可访问,包含Rust源码、测试、脚本和MIT许可证说明。", "limitation": "仅确认公开材料可访问;未编译、运行或验证安全和性能。星数是动态采用信号,不是付费客户。" + }, + { + "id": "PH-2026-PAGE", + "companyId": null, + "title": "Product Hunt 2026年度榜单可读响应", + "url": "https://www.producthunt.com/leaderboard/yearly/2026", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "登记首次响应19张产品/推广卡片;已解析17个产品页,Brew超时,Render为推广卡。", + "limitation": "未获取全量分页;2025档案及2026其他记录未穷尽;发布时间不是公司成立年。" + }, + { + "id": "KILO-PH", + "companyId": "AI072", + "title": "Kilo Code产品发布资料", + "url": "https://www.producthunt.com/products/kilocode", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "页面标记2025发布并列多次产品发布,跳转kilo.ai及官方仓库。", + "limitation": "发布年份不单独当公司成立年;平台排名和关注数不当财务或技术测试。" + }, + { + "id": "KILO-ABOUT", + "companyId": "AI072", + "title": "Kilo官方关于页", + "url": "https://kilo.ai/about", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "公司称构想始于2025年3月,提供开源编程Agent编排,页面称月处理6万亿tokens。", + "limitation": "构想日不等于注册日;与首页10万亿以上吞吐的截止日及定义未对齐,均不转为收入。" + }, + { + "id": "KILO-HOME", + "companyId": "AI072", + "title": "Kilo官方产品页", + "url": "https://kilo.ai/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "提供IDE、CLI和云端编程Agent、模型路由与BYOK;自述500多万Kilo Coders、月处理10万亿以上tokens。", + "limitation": "自述采用数非付费客户;吞吐非收入或利润,不将匿名使用量折算ARR。" + }, + { + "id": "KILO-PRICE", + "companyId": "AI072", + "title": "Kilo官方定价", + "url": "https://kilo.ai/pricing", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "个人平台免费,Teams每用户每月15(原文$),企业定制;推理按供应商价格,充值处理费5%,可选Kilo Pass每月19起,云算力另计。", + "limitation": "仅2026-10-30公开标价,未验证实际账单、补贴成本、总额/净额确认或付费采用;无推理加价不等于无收费。" + }, + { + "id": "KILO-CODE", + "companyId": "AI072", + "title": "Kilo公开代码仓库", + "url": "https://github.com/kilo-org/kilocode?ref=producthunt", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "公开仓库可读,包含源码与MIT许可证;CLI说明其源于OpenCode分叉。", + "limitation": "仅确认材料可访问;未编译、运行或独立测试性能、安全与生产交付。" + }, + { + "id": "KILO-START", + "companyId": "AI072", + "title": "Anaconda关于Kilo的创立与产品说明", + "url": "https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know", + "publishedAt": "2026-07-15", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官方称Kilo Code始于2025年早期,并介绍创始团队及KiloClaw属于其产品体系。", + "limitation": "收购方官方材料,非工商核验;KiloClaw不作为另一个新公司重复计数。" + }, + { + "id": "KILO-ACQ", + "companyId": "AI072", + "title": "Anaconda收购Kilo Code公告", + "url": "https://www.anaconda.com/press/anaconda-acquires-kilo-code", + "publishedAt": "2026-07-15", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2026年7月15日宣布已收购Kilo Code,公告称当时有超过300万开发者采用。", + "limitation": "收购金额和Kilo收入未披露;不能将母公司经营规模当Kilo收入。" + }, + { + "id": "KILO-SIZE", + "companyId": "AI072", + "title": "Anaconda Kilo案例资料", + "url": "https://www.anaconda.com/resources/case-study/building-kilo-at-the-speed-of-thought", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "资料列成立2025年、公司规模11—50人,并描述15名工程师的工作方式。", + "limitation": "人数范围不转为精确团队总数,工程师数也不等于全公司人数;采用及流程效果仍为官方案例。" + }, + { + "id": "KILO-OTHER", + "companyId": null, + "title": "健康业务Kilo官方介绍", + "url": "https://kilo.co/newsroom/kilo-ceo-interview-growth-strategy/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "该站介绍健康、长寿和消费品牌业务及CEO Žygimantas Surintas,与kilo.ai编程工具的创始团队、产品及域名不同。", + "limitation": "只用于近名实体排除,不把该公司的收入、融资或目标归Kilo Code。" } ], "reviews": [ @@ -44378,6 +44589,53 @@ "companyIds": [ "YC32138" ] + }, + { + "id": "KILO-R-MODEL", + "type": "收费与收入边界", + "company": "Kilo Code", + "summary": "零推理加价与平台席位、额度订阅、充值费及云算力收费并存;没有可用公司收入。", + "evidenceIds": [ + "KILO-HOME", + "KILO-ABOUT", + "KILO-PRICE" + ], + "handling": "分别核平台净收入、供应商转付、补贴和成本;不从开发者或token吞吐推ARR。", + "scope": "companies", + "companyIds": [ + "AI072" + ] + }, + { + "id": "KILO-R-ENTITY", + "type": "近名与重复产品", + "company": "Kilo Code", + "summary": "Kilo Code与kilo.co健康业务不同;KiloClaw和IDE插件属于同一产品体系。", + "evidenceIds": [ + "KILO-START", + "KILO-OTHER", + "KILO-PH" + ], + "handling": "不转移重名公司的财务数字;两个PH发布只映射一个公司个案。", + "scope": "companies", + "companyIds": [ + "AI072" + ] + }, + { + "id": "KILO-R-ACQ", + "type": "并购与规模", + "company": "Kilo Code", + "summary": "2025创立,2026-07-15被Anaconda收购;11—50人数范围和15名工程师不等于精确员工数。", + "evidenceIds": [ + "KILO-ACQ", + "KILO-SIZE" + ], + "handling": "保留成立年和已收购状态,区分母公司、业务和法律并表范围。", + "scope": "companies", + "companyIds": [ + "AI072" + ] } ], "coverage": { @@ -44393,5 +44651,210 @@ "dateConflicts": 6, "failedProfiles": 0, "discoverySha256": "e89300524efc0f31ffcdae02aa3e04635fcb21d8b04e9a72e4fce8e12ff51b85" - } + }, + "candidateBatches": [ + { + "sourceId": "S04", + "url": "https://www.producthunt.com/leaderboard/yearly/2026", + "accessedAt": "2026-10-30", + "scope": "年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。", + "complete": false, + "records": [ + { + "id": "PH26-01", + "name": "Fundraisly", + "url": "https://www.producthunt.com/products/fundraisly", + "categoryId": "C07", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-02", + "name": "Rork Max", + "url": "https://www.producthunt.com/products/rork-app-for-ios", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "existing-outside-cohort", + "note": "映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。", + "companyId": "AI054" + }, + { + "id": "PH26-03", + "name": "Brila", + "url": "https://www.producthunt.com/products/brila-2", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-04", + "name": "happycapy", + "url": "https://www.producthunt.com/products/happycapy", + "categoryId": "C09", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-05", + "name": "Cowork", + "url": "https://www.producthunt.com/products/claude", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-06", + "name": "Upstream", + "url": "https://www.producthunt.com/products/upstream-3", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-07", + "name": "Goldfish", + "url": "https://www.producthunt.com/products/goldfish-early-access", + "categoryId": "C09", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-08", + "name": "Framer 3.0", + "url": "https://www.producthunt.com/products/framer", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-09", + "name": "OpenSEO", + "url": "https://www.producthunt.com/products/openseo", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-10", + "name": "Clarify", + "url": "https://www.producthunt.com/products/clarify-6", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-11", + "name": "Lightfield", + "url": "https://www.producthunt.com/products/lightfield", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-12", + "name": "Pazi", + "url": "https://www.producthunt.com/products/pazi", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-13", + "name": "SuperX", + "url": "https://www.producthunt.com/products/superx", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-14", + "name": "Kilo Code for VS Code", + "url": "https://www.producthunt.com/products/kilocode", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "linked", + "note": "映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。", + "companyId": "AI072" + }, + { + "id": "PH26-15", + "name": "Brew", + "url": "https://www.producthunt.com/products/brew-5", + "categoryId": "C06", + "kind": "product", + "profileStatus": "unavailable", + "status": "pending-year", + "note": "产品页读取超时,保留榜单发现;主体、成立年和收入待核。" + }, + { + "id": "PH26-16", + "name": "Render startup credits", + "url": null, + "categoryId": "C02", + "kind": "promotion", + "profileStatus": "archive-only", + "status": "promotion", + "note": "推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。" + }, + { + "id": "PH26-17", + "name": "DataFast", + "url": "https://www.producthunt.com/products/datafast", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + }, + { + "id": "PH26-18", + "name": "KiloClaw", + "url": "https://www.producthunt.com/products/kiloclaw", + "categoryId": "C03", + "kind": "product", + "profileStatus": "readable", + "status": "linked", + "note": "映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。", + "companyId": "AI072" + }, + { + "id": "PH26-19", + "name": "Stitch 2.0 by Google", + "url": "https://www.producthunt.com/products/stitch-2-0-by-google-2", + "categoryId": "C08", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + } + ], + "id": "PH-2026-visible-1" + } + ] } diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 4b8d159..db146b0 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-1", + "version": "2026-10-30-2", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -53,14 +53,14 @@ "name": "Product Hunt", "url": "https://www.producthunt.com/", "role": "discovery", - "status": "pending", + "status": "targeted", "hosts": [ "www.producthunt.com", "producthunt.com" ], "initialAccess": "官网可读取", - "boundary": "仅确认首页及发布档案入口可读,尚无两年AI产品候选池;发布不等于公司成立。", - "nextCheck": "按发布档案建立候选并回查官网成立信息、区分产品和法人。", + "boundary": "已登记2026年度榜单首次响应19张卡片:17个产品页可读、1超时、1推广卡;只核当前可见批次,未穷尽两年发布档案。", + "nextCheck": "补2025档案、2026其余分页/日期及公司成立证据;多产品映射同一公司,未核年份保持候选。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 2022e83..c6de6bf 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-depth-4", + "sourceVersion": "2026-10-30-ph-1", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", diff --git a/scripts/audit-ai-research.py b/scripts/audit-ai-research.py index 0a646b2..a06c982 100644 --- a/scripts/audit-ai-research.py +++ b/scripts/audit-ai-research.py @@ -52,6 +52,43 @@ def source_register(): return lines + +def candidate_register(): + batches = DATA.get('candidateBatches', []) + companies = {c['id']: c for c in DATA['companies']} + categories = {c['id']: c['name'] for c in DATA['categories']} + known_sources = {s['id'] for s in SOURCES['sources']} + assert len({b['id'] for b in batches}) == len(batches) + all_ids = [r['id'] for b in batches for r in b['records']] + assert len(set(all_ids)) == len(all_ids) + lines = [] + statuses = {'pending-year': '成立年待核', 'linked': '已关联公司', + 'existing-outside-cohort': '已有关联,年份范围外', 'promotion': '推广活动,非公司新增'} + for batch in batches: + assert batch['sourceId'] in known_sources + assert batch['accessedAt'] <= DATA['asOf'] + assert any(e['url'] == batch['url'] for e in DATA['evidence']) + rows = batch['records'] + counts = Counter(r['status'] for r in rows) + assert sum(counts.values()) == len(rows) + lines += ['', f"## {batch['sourceId']} 产品发布候选核对", '', + f"[发现页面]({batch['url']}),读取于{batch['accessedAt']}。{batch['scope']}", '', + f"本批{len(rows)}条:{counts['linked']}条关联公司、{counts['existing-outside-cohort']}条关联范围外对照、{counts['pending-year']}条成立年待核、{counts['promotion']}条推广活动。完整来源覆盖标记:{'已完成' if batch['complete'] else '未完成'}。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。", '', + '| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 限制 |', '| --- | --- | --- | --- | --- |'] + for row in rows: + assert row['categoryId'] in categories + assert row['status'] in statuses + name = f"[{row['name']}]({row['url']})" if row['url'] else row['name'] + company = '—' + if row.get('companyId'): + assert row['companyId'] in companies + c = companies[row['companyId']] + company = f"[{c['name']}]({BASE}?company={c['id']}#research-company-detail)" + lines.append(f"| {name} | {categories[row['categoryId']]} | {statuses[row['status']]} | {company} | {row['note']} |") + lines += ['', '产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。HTTP直接采集返回403,因此不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。', ''] + return lines + + def render(): cov = DATA['coverage'] companies = DATA['companies'] @@ -125,6 +162,7 @@ def render(): others = [e for e in DATA['evidence'] if urlsplit(e['url']).netloc not in included] lines.append(f"| 其他官网、评测及公开资料 | {len(others)} | {len({e['url'] for e in others})} | 按每条来源限制理解,不能统一当作独立证据 |") lines += source_register() + lines += candidate_register() lines += ['', '## 尚未满足的研究条件', '', '行业ARR比较仍缺统一业务截止日、币种、经常性定义和业务边界。现有平台MRR可描述已采集产品,不足以代表全部新公司。技术评测只覆盖所列版本与任务,不宜跨领域汇总为统一强弱分数。', '', '下一轮优先补收入线索的日期及合同定义、非YC和非英文来源、规则初分的人工复核,以及停止服务或被收购案例。这样能减少“只见赢家”和“只见融资公司”的偏差。公开来源池之外的未披露公司仍无法证明已被穷尽。', '', From 0dcd178394ddbbd45e6043a8f349115e63de5640 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 15:16:35 +0800 Subject: [PATCH 03/14] docs: explore Endor as a coding agent traffic platform --- content/catalog.json | 7 + .../08-coding-agent-traffic-platform-draft.md | 150 ++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 content/docs/08-coding-agent-traffic-platform-draft.md diff --git a/content/catalog.json b/content/catalog.json index 33d4703..de57109 100644 --- a/content/catalog.json +++ b/content/catalog.json @@ -64,6 +64,13 @@ "slug": "endor/endor-purpose-draft", "category": "Endor" }, + "08-coding-agent-traffic-platform-draft": { + "group": "奇思妙想", + "description": "从 AI 供给、注意力与获客成本,探索伪装成 coding agent 的需求与能力分发平台。", + "draft": true, + "slug": "endor/coding-agent-traffic-platform-draft", + "category": "Endor" + }, "05-object-graphs-gc": { "collection": "对象关系与垃圾回收", "group": "运行时基础", diff --git a/content/docs/08-coding-agent-traffic-platform-draft.md b/content/docs/08-coding-agent-traffic-platform-draft.md new file mode 100644 index 0000000..a09f42f --- /dev/null +++ b/content/docs/08-coding-agent-traffic-platform-draft.md @@ -0,0 +1,150 @@ +# 一个伪装成 coding agent 的流量平台 + +> **奇思妙想 · 探索草案,2026-10-30**:记录一次关于 AI、注意力和 Endor 定位的推演。这不是已确认的产品战略、商业模式或架构规范,也不表示下面描述的发现、推荐、交易与结算能力已经实现。本提案保留在 `codex/wild-ideas` 分支,暂不合并主线。 + +## 核心命题 + +**我们是一个伪装成 coding agent 的流量平台。** + +这句话试图描述 Endor 的一种潜在发展方向:用户因为需要 AI 帮忙写代码、修改程序、完成工作而进入;Endor 在推进任务的过程中,连接用户的真实需求与能够满足需求的对象、程序、服务和开发者。写代码是切入口,需求与能力之间的分发可能成为平台价值的重要来源。 + +这里的“伪装”是一种内部讨论的修辞:表面产品形态是 coding agent,底层战略假设是流量与需求分发平台。它不意味着向用户隐瞒推荐依据、商业关系或数据用途。Agent 必须真的把工作做好;商业分发不能成为牺牲用户任务结果的理由。 + +这里的“流量”也不只指页面浏览量。我们关心的是一项真实需求最终被交给哪个能力、哪项服务或哪个开发者,以及它有没有被完成。一次没有外部点击、但经用户授权调用了合适能力的任务,也可能构成需求分发。 + +## 起点:当生产越来越便宜,什么会变得稀缺 + +最初的直觉是:AI 越来越强,互联网的内容、软件和服务产出就会越来越多;人的时间不能同步增长,于是每个产出平均分到的注意力减少,流量越来越贵。 + +这条链条有方向上的解释力,但不能把最后一步直接当成定律。需要分开三个问题: + +1. **生产成本**:AI 是否降低了完成某类产出的成本? +2. **注意力竞争**:争夺同一人群和同一种需求的有效供给,是否增长得比消费更快? +3. **获客成本**:获得一个真正成交、留存的客户,需要花多少成本? + +大量从未被展示的机器文章增加了互联网总产量,却不一定增加某个产品面对的实际竞争。企业也可能用 AI 提高质量或减少投入,而不是无限扩张产量。因而,应观察真正进入候选范围的替代品,而不只统计生成内容总量。 + +即使注意力竞争加剧,广告单价也未必上涨。更多内容可能增加广告库存;AI 可能提高匹配与转化效率;经济环境和广告主预算也会改变竞价需求。普通曝光可能更便宜,而高购买意图、可信且能带来结果的触达更贵。 + +更适合支撑本提案的假设是:**当更多人能够生产可用的东西,让合适的人发现、信任并选择它,可能成为更大的瓶颈。** + +## 已有证据与推演边界 + +以下资料是提出假设的依据,不是 Endor 已经拥有商业价值或市场地位的证明。 + +| 观察 | 原始来源 | 能说明什么与不能说明什么 | +| --- | --- | --- | +| 2023 年针对 453 名专业人士的随机写作实验中,使用 ChatGPT 的参与者平均用时减少 40%,产出质量评分提高 18% | [Noy 与 Zhang,Science](https://doi.org/10.1126/science.adh2586) | 支持部分写作任务的生产成本下降,不能外推所有行业的产量和质量 | +| Meta 2022 年广告展示量增长 18%,平均广告价格下降 16% | [Meta 2022 年报](https://www.sec.gov/Archives/edgar/data/1326801/000132680123000013/meta-20221231.htm) | 证明量增不必然价增;这是历史反例,不是生成式 AI 的效果实验 | +| Meta 2025 年广告展示量增长 12%,平均广告价格上涨 9% | [Meta 2025 年报](https://www.sec.gov/Archives/edgar/data/1326801/000162828026003942/meta-20251231.htm) | 说明该平台当年的综合单价上涨,不能单独识别 AI 的因果贡献,也不代表每个广告主 | +| Pew 对 900 名美国成年人 2025 年 3 月浏览记录的分析中,有 AI 摘要的搜索访问点击传统结果的比例为 8%,没有摘要时为 15%;点击摘要内链接的比例约为 1% | [Pew 原始研究](https://www.pewresearch.org/short-reads/2025/07/22/google-users-are-less-likely-to-click-on-links-when-an-ai-summary-appears-in-the-results/) | 提示需求可能在入口处被满足;查询类型不同,这不是随机因果实验,也不能直接套用中国市场 | + +对经营者而言,一个简化关系是:广告获客成本 = 每次点击价格 ÷ 点击后的新客转化率。完整获客成本还包括内容、销售、人员与工具等投入。单价上涨而转化改善时,获客成本可以下降;单价下降而转化恶化时,获客成本可以上涨。 + +因此,我们暂不押注“整个互联网的流量价格持续上涨”。我们要研究的是:**用户越来越依赖谁来表达需求、筛选候选、执行任务和判断结果。** 如果这些环节集中在少数入口,入口可能拥有更强的分发与议价能力;如果 AI 让用户更容易比较和切换,入口溢价也可能被削弱。 + +## 为什么从 coding agent 进入 + +传统内容入口通常先争夺注意力,再等待用户表达需求。Coding agent 有机会直接从任务开始:用户说要做什么,Agent 读取获准访问的工作上下文,选择能力,执行并获得结果反馈。 + +在这个假设下,它可能同时接触到四类信号: + +- **需求**:用户究竟想完成什么,而不仅是搜索过什么关键词。 +- **上下文**:现有项目、对象、约束和已经作出的选择;以用户授权的访问范围为限。 +- **执行**:某个候选能力能否被接入,适不适合当前环境,失败时如何继续。 +- **结果**:用户是否接受、是否继续使用,以及任务有没有达到目标。 + +这些信号可能比一次泛曝光更接近真实需求,但是否更准确、更有价值,需要用实际任务验证。用户也完全可能只需要一个本地代码工具,并不愿意让它承担服务发现或购买入口。 + +Coding agent 的切入口不等于永远只服务程序员。如果 Endor 的对象与能力能够支持更多工作流,入口可以逐步从“帮我写一个程序”扩展为“帮我把这件事完成”。这种扩展是候选方向,不是已完成的用户覆盖。 + +## 与 Endor 对象世界的连接 + +[Endor 的意义](/docs/endor/endor-purpose-draft)提出以对象池组织工作对象、由 Agent 推进任务,并把操作权交还给用户与 AI。本提案从需求分发角度重新观察同一条路径,暂不替换原有定位。 + +假设用户说:“帮我做一个报名系统。”Coding agent 可以从头生成代码,也可以发现已有的报名、身份、通知或导出能力,在检查适配性和授权后复用。关键不只是找到一个链接,而是让能力能够在当前工作里实际使用。 + +| Endor 的既有讨论方向 | 在本提案中的潜在作用 | 尚需验证的部分 | +| --- | --- | --- | +| 对象、类型与可执行行为 | 让能力具备可识别的输入、输出和使用边界 | 类型可表达不等于自动理解全部业务,也不保证可安全组合 | +| 对象池与来源关系 | 让产出、依赖和后续工作能够继续关联 | 身份、版本、迁移和失败状态的实际成本 | +| Agent 承载任务 | 在需求出现时选择与组织能力 | 能否比从头生成或手工搜索更好地完成任务 | +| Tessera 等呈现入口 | 让用户查看候选、检查效果并继续操作 | 用户能否理解选择依据、商业关系与操作影响 | +| 挂载与运行位置 | 探索使用本地、自部署或平台侧的能力 | 可达性、兼容、权限和运行成本,不能假定跨端调用总能成功 | + +这一连接的核心设想是:**别人做出的能力,能够成为 Agent 完成下一项真实任务时的候选;用户自己的产出,也可能在愿意共享时成为他人可用的能力。** + +## 一个候选闭环:从生产工具到需求分发 + +1. 用户带着具体任务进入,Agent 先帮助完成工作,形成独立的工具价值。 +2. 在重复需求出现时,识别哪些已有能力值得复用,而不是每次重新生成。 +3. 能力提供者以某种待设计的方式描述用途、输入输出、版本、成本与使用条件。 +4. Agent 根据任务适配性提出候选,用户按任务需要检查、选择和授权。 +5. 执行产生结果,平台在允许的范围内记录成功、失败和用户反馈,改善后续匹配。 +6. 供应者因为获得合适需求而继续提供能力,用户因为更容易完成任务而回来。 + +这个闭环能否形成网络效应,取决于新增供给是否改善匹配,以及新增需求是否吸引有价值的供给。如果新增的只是大量重复、低质量能力,反而可能增加筛选成本。 + +我们因此不能把“有很多用户和很多程序”直接等同于平台已经成立。必须证明任务分发创造了新增价值。 + +## 流量平台究竟分发什么 + +这里至少存在三种候选对象,不能混为一谈: + +| 分发对象 | 例子 | 可以观察的有效结果 | +| --- | --- | --- | +| 注意力 | 用户查看一个能力的说明或演示 | 是否进入适合的评估,而非只增加曝光 | +| 任务与调用机会 | Agent 选择一个库、对象或外部服务 | 是否适配、成功执行并被用户接受 | +| 商业需求 | 用户决定购买服务、订阅能力或联系供应者 | 是否形成可归因的新增成交与持续使用 | + +一个开源组件被复用,可能有用户价值而没有收入;一次付费服务调用,也不必然形成可持续的平台利润。曝光、调用、成交与留存需要分别衡量。 + +## 可能的商业模式,以及它们与用户利益的关系 + +以下只是待比较的选项,尚未确定定价、抽成比例、排序规则或结算机制。 + +- **Agent 订阅或执行收费**:用户为工具本身付费。先检验不依赖广告或交易抽成时,Endor 是否值得使用。 +- **能力市场的交易服务费**:在确实帮助发现、执行或保障交易时收费,需要验证是否带来新增成交,以及双方是否愿意持续使用平台。 +- **面向供应者的经营工具**:能力托管、版本维护、运行观测与支持等服务,收入来自提供的服务质量。 +- **明确标识的商业推荐**:可能产生分发收入,但也最容易与任务适配产生冲突。应单独讨论,不能默认把付费排名混入 Agent 的技术判断。 + +一个必须正面处理的矛盾是:用户希望 Agent 帮自己找到最合适的方案,供应者可能希望付费换取更多推荐。如果商业利益损害用户判断,入口赖以成立的信任也会受损。 + +所以“伪装成 coding agent”不能演变成“用工具承诺获取信任,再偷偷出售决策”。用户应该理解谁提供能力、为何推荐、要付什么成本,以及是否存在商业关系。具体的展示和治理机制仍需设计。 + +## 这条路线最可能失败在哪里 + +首先,Coding agent 自身可能没有形成持续使用价值。一个不好用的工具不能靠市场叙事变成入口。 + +其次,能力复用未必比即时生成划算。对于简单、一次性的程序,AI 直接生成可能比发现、理解、适配和维护依赖更便宜。更值得验证的是有长期维护、真实数据、专业经验或外部执行资源的能力。 + +第三,用户可能多入口并用,供应者也可以直接服务用户。除非 Endor 持续提供匹配、执行、可靠性或关系维护价值,否则不应假定可以长期抽取渠道费用。 + +第四,能力分发会带来版本、兼容、质量、供应者退出与外部副作用等成本。对象可连接不代表这些问题消失,也不能把它们隐藏在一次看似顺滑的调用后面。 + +最后,平台入口本身也面临竞争。上游模型、现有开发工具、开源生态和其他任务入口都可能承担相同角色。我们不能先假定拥有垄断入口,再倒推出商业模式成立。 + +## 怎样把奇思妙想变成可以被否定的实验 + +先选择一个明确、重复出现的任务场景,例如前面的报名系统。保持材料、任务目标和辅助条件相近,比较三条正常可用的路径:用户手工寻找和组合、Agent 从头生成、Agent 发现并复用已有能力。不要刻意削弱对照方案。 + +| 假设 | 需要收集的证据 | 什么结果会削弱假设 | +| --- | --- | --- | +| 用户愿意把需求交给入口 | 完成真实任务后的再次使用与主动委托 | 只试用一次,后续仍回到原工具 | +| 能力复用优于重新生成 | 完成时间、总成本、成功率与维护负担 | 适配和依赖处理抵消全部节省 | +| 匹配带来有效需求 | 候选接受、成功调用、持续使用与新增成交 | 只有曝光或点击,没有任务结果 | +| 供给增长改善体验 | 新能力加入前后的任务覆盖和筛选成本 | 重复供给增加,选择更困难 | +| 分发不损害信任 | 用户对推荐原因和商业关系的理解、拒绝与切换行为 | 为变现偏离需求,用户难以判断或退出 | +| 商业模式能保留收益 | 收入扣除推理、运行、支持与获客后的贡献 | 调用量增长,但服务成本与获客投入更快增长 | + +数值门槛应在具体实验开始前根据场景确定,不能看完结果后再改成功定义。任务完成、用户接受和商业转化也不能互相替代。 + +## 暂时保留的定位 + +对内部讨论,可以保留这句有冲击力的表达:**我们是一个伪装成 coding agent 的流量平台。** + +展开来说:Endor 先通过 Agent 帮用户完成工作,再探索把真实需求与可执行能力连接起来,使生产、发现、选择、使用和持续维护形成连续过程。生产力工具是起点,需求分发平台是需要证明的可能性。 + +这条方向不依赖“所有流量一定涨价”,而依赖三个更具体的假设:用户愿意在这里交付真实任务;平台能比其他方式更好地匹配和执行能力;用户、供应者和平台都能保留足够价值。 + +本分支用于继续记录这类奇思妙想及其引出的修改。未经后续评估与明确合并决定,本提案保持探索状态,不据此改变主线产品承诺、推荐策略或部署行为。 From 79a6a8dbd7badb0e158cc2f45c200f51325e57d3 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 15:21:28 +0800 Subject: [PATCH 04/14] =?UTF-8?q?=E8=A1=A52025=E4=BA=A7=E5=93=81=E5=80=99?= =?UTF-8?q?=E9=80=89=E5=B9=B6=E6=A0=B8=E5=AF=B9=E6=88=90=E7=AB=8B=E5=B9=B4?= =?UTF-8?q?=E4=B8=8ETrace=E4=B8=BB=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +- apps/docs/scripts/auth-cli.ts | 2 +- apps/docs/src/lib/ai-research.ts | 10 +- apps/docs/tests/research.test.ts | 26 +- .../02-coverage-and-gaps.md | 97 ++- content/research/ai-companies.seed.json | 602 +++++++++++++++++- content/research/ai-companies.sources.json | 6 +- content/research/ai-income-analysis.json | 2 +- scripts/audit-ai-research.py | 19 +- 9 files changed, 699 insertions(+), 75 deletions(-) diff --git a/README.md b/README.md index b7cddb3..5ccb83c 100644 --- a/README.md +++ b/README.md @@ -98,11 +98,11 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,101 条证据记录和 187 条经营与技术观测。 -其中保留 87 家个案资料、913 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 -Product Hunt首批19张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 +当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,124 条证据记录和 187 条经营与技术观测。 +其中保留 88 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;57条核查中46条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;58条核查中47条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 @@ -145,7 +145,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。 AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。 技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。 -当前8条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 +当前9条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。 `pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index d1b04df..17e575c 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -187,7 +187,7 @@ async function main() { const research = await researchResponse.json(); assert.equal(research.companies.length, 1016); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1101); + assert.equal(research.evidence.length, 1124); assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); diff --git a/apps/docs/src/lib/ai-research.ts b/apps/docs/src/lib/ai-research.ts index dbef876..f2f8a65 100644 --- a/apps/docs/src/lib/ai-research.ts +++ b/apps/docs/src/lib/ai-research.ts @@ -48,8 +48,8 @@ export type ResearchCandidateBatch = { records: { id: string; name: string; url: string | null; categoryId: string; kind: "product" | "promotion"; profileStatus: "readable" | "unavailable" | "archive-only"; - status: "pending-year" | "linked" | "existing-outside-cohort" | "promotion"; - companyId?: string; note: string; + status: "pending-year" | "linked" | "existing-outside-cohort" | "outside-cohort" | "promotion"; + companyId?: string; evidenceIds?: string[]; note: string; }[]; }; export type ResearchSnapshot = { @@ -121,11 +121,13 @@ export function validateResearch(snapshot: ResearchSnapshot) { if (!row.name.trim() || !row.note.trim() || !categories.has(row.categoryId) || !["product", "promotion"].includes(row.kind) || !["readable", "unavailable", "archive-only"].includes(row.profileStatus) || - !["pending-year", "linked", "existing-outside-cohort", "promotion"].includes(row.status) || + !["pending-year", "linked", "existing-outside-cohort", "outside-cohort", "promotion"].includes(row.status) || (row.kind === "product" && (!row.url || !evidenceUrl(row.url))) || (row.url !== null && !evidenceUrl(row.url)) || linked !== !!row.companyId || (row.companyId && !companies.has(row.companyId)) || - (row.kind === "promotion") !== (row.status === "promotion")) + (row.kind === "promotion") !== (row.status === "promotion") || + (row.evidenceIds ?? []).some((id) => !evidence.has(id)) || + (row.status === "outside-cohort" && !row.evidenceIds?.length)) throw new Error(`Invalid research candidate: ${row.id}`); } } diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index e26a5b5..a017096 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -24,7 +24,7 @@ test("research revisions share the authentication database and preserve replay l assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); assert.equal(initial.companies.length, 1016); - assert.equal(initial.evidence.length, 1101); + assert.equal(initial.evidence.length, 1124); assert.equal(initial.observations.length, 187); assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records"); @@ -63,7 +63,7 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 46); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 47); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 3); assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 8); const review = snapshot.reviews.find((r) => r.id === "R4")!; @@ -96,7 +96,7 @@ test("disclosure counts exclude client income, biographies, targets and duplicat test("technical reviews keep accessible materials separate from tested capabilities", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 8); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 9); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 4); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1); assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown"); @@ -271,3 +271,23 @@ test("product launch candidates preserve unresolved years and many launches per kilo[0].companyId = "missing-company"; assert.throws(() => validateResearch(snapshot), /research candidate/); }); + +test("annual launch archives exclude older companies only with evidence and reuse existing records", () => { + const snapshot = structuredClone(seed) as ResearchSnapshot; + const batch = snapshot.candidateBatches!.find((b) => b.id === "PH-2025-visible-1")!; + assert.equal(batch.complete, false); + assert.equal(batch.records.length, 19); + const older = batch.records.filter((r) => r.status === "outside-cohort"); + assert.equal(older.length, 3); + assert.ok(older.every((r) => !r.companyId && r.evidenceIds?.length)); + assert.equal(batch.records.find((r) => r.name === "Trace")?.companyId, "YC30687"); + const trace = snapshot.companies.find((c) => c.id === "YC30687")!; + assert.equal(trace.profileOnly, false); + assert.equal(trace.directoryOrigin, "yc-2025-2026"); + assert.equal(trace.revenueStatus, "unknown"); + assert.ok(!snapshot.observations.some((o) => o.evidence === "TRACE-HOME"), "demo metrics must not become reported results"); + older[0].evidenceIds = []; + assert.throws(() => validateResearch(snapshot), /research candidate/); + older[0].evidenceIds = ["missing-proof"]; + assert.throws(() => validateResearch(snapshot), /research candidate/); +}); diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index 97e776f..749ede6 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -19,7 +19,7 @@ | AI业务待确认 | 192 | 不强行把背景关键词当主营 | | 成立年与批次冲突 | 6 | 另保留核查记录 | -全表由913条目录基础项和103条个案或平台记录组成。候选池已匹配项之外另有54条记录,包含其他来源及发布/转型对照;其中已有15条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 +全表由912条目录基础项和104条个案或平台记录组成。候选池已匹配项之外另有54条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 ## 成立年与证据深度 @@ -29,9 +29,9 @@ | 记录为2026年成立 | 391 | 不将产品发布日期代替成立日 | | 成立年未知或范围外 | 5 | 发布/转型对照单列,不进入两年成立分组 | | 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 | -| 其他目录基础项 | 753 | 规则初分或资料不足,继续待复核 | +| 其他目录基础项 | 752 | 规则初分或资料不足,继续待复核 | | 有团队数字 | 945 | 多为自报Team Size或Employees,时点与口径不统一 | -| 专项技术证据记录 | 8 | 其中3条自述、4条公开材料、1条第三方评测 | +| 专项技术证据记录 | 9 | 其中4条自述、4条公开材料、1条第三方评测 | | 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR | | 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 | | 仅第三方估算 | 1 | 不与直接披露混合 | @@ -55,16 +55,16 @@ ## 已使用来源的分布 -1,101条证据记录对应1,087个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,124条证据记录对应1,110个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | -| YC官方目录 | 984 | 975 | 公司自述的成立、团队与业务;英文及加速器样本偏多 | +| YC官方目录 | 986 | 977 | 公司自述的成立、团队与业务;英文及加速器样本偏多 | | TrustMRR | 18 | 18 | 支付平台重建指标及方法;公开者存在选择偏差,非财务审计 | | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 82 | 78 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 103 | 99 | 按每条来源限制理解,不能统一当作独立证据 | ## 来源清单与验收边界 @@ -74,10 +74,10 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | 来源 | 当前状态 | 证据 / 公司 / 观测数 | 已核对范围 | 剩余核查 | | --- | --- | --- | --- | --- | -| S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 984 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | +| S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 986 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | | S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | | S03 [Dealroom](https://dealroom.co/) | 候选台账待建 | 0 / 0 / 0 | 仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。 | 确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。 | -| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 2 / 1 / 0 | 已登记2026年度榜单首次响应19张卡片:17个产品页可读、1超时、1推广卡;只核当前可见批次,未穷尽两年发布档案。 | 补2025档案、2026其余分页/日期及公司成立证据;多产品映射同一公司,未核年份保持候选。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及成立证据;推广位不当历史发布,不把产品改名、版本与公司成立混同。 | | S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | | S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | @@ -85,7 +85,7 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | | S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 35 / 15 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 37 / 16 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | @@ -94,35 +94,66 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。 -## S04 产品发布候选核对 +## S04 产品发布候选核对(PH-2026-visible-1) [发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 -本批19条:2条关联公司、1条关联范围外对照、15条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:2条关联公司、1条关联范围外对照、1条范围外不新增公司、14条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 -| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 限制 | -| --- | --- | --- | --- | --- | -| [Fundraisly](https://www.producthunt.com/products/fundraisly) | 行业专业应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | 软件开发 | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | -| [Brila](https://www.producthunt.com/products/brila-2) | 软件开发 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [happycapy](https://www.producthunt.com/products/happycapy) | 消费者个人应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Cowork](https://www.producthunt.com/products/claude) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Upstream](https://www.producthunt.com/products/upstream-3) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | 消费者个人应用 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Framer 3.0](https://www.producthunt.com/products/framer) | 软件开发 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [OpenSEO](https://www.producthunt.com/products/openseo) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Clarify](https://www.producthunt.com/products/clarify-6) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Lightfield](https://www.producthunt.com/products/lightfield) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Pazi](https://www.producthunt.com/products/pazi) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [SuperX](https://www.producthunt.com/products/superx) | 客户与收入运营 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Kilo Code for VS Code](https://www.producthunt.com/products/kilocode) | 软件开发 | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | -| [Brew](https://www.producthunt.com/products/brew-5) | 客户与收入运营 | 成立年待核 | — | 产品页读取超时,保留榜单发现;主体、成立年和收入待核。 | -| Render startup credits | 算力与模型基础设施 | 推广活动,非公司新增 | — | 推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。 | -| [DataFast](https://www.producthunt.com/products/datafast) | 企业通用工作 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [KiloClaw](https://www.producthunt.com/products/kiloclaw) | Agent 开发与运行设施 | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | -| [Stitch 2.0 by Google](https://www.producthunt.com/products/stitch-2-0-by-google-2) | 内容与创意 | 成立年待核 | — | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | +| --- | --- | --- | --- | --- | --- | +| [Fundraisly](https://www.producthunt.com/products/fundraisly) | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | [E054](https://speedrun.a16z.com/companies/rork) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | +| [Brila](https://www.producthunt.com/products/brila-2) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [happycapy](https://www.producthunt.com/products/happycapy) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy) | 与PH25-19 Trickle历史发布共用当前产品页;页面称原Trickle团队。公司成立年与法人沿革待核,不因改名或新发布自动算新公司。 | +| [Cowork](https://www.producthunt.com/products/claude) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Upstream](https://www.producthunt.com/products/upstream-3) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Framer 3.0](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH-FRAMER-ABOUT](https://www.framer.com/about) | Framer官网列2014成立;3.0及AI新产品不作2026新公司,未新增公司。 | +| [OpenSEO](https://www.producthunt.com/products/openseo) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Clarify](https://www.producthunt.com/products/clarify-6) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Lightfield](https://www.producthunt.com/products/lightfield) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Pazi](https://www.producthunt.com/products/pazi) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [SuperX](https://www.producthunt.com/products/superx) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Kilo Code for VS Code](https://www.producthunt.com/products/kilocode) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | [KILO-START](https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know)、[KILO-PH](https://www.producthunt.com/products/kilocode) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | +| [Brew](https://www.producthunt.com/products/brew-5) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 产品页读取超时,保留榜单发现;主体、成立年和收入待核。 | +| Render startup credits | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 推广活动,非公司新增 | — | [PH-2026-PAGE](https://www.producthunt.com/leaderboard/yearly/2026) | 推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。 | +| [DataFast](https://www.producthunt.com/products/datafast) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [KiloClaw](https://www.producthunt.com/products/kiloclaw) | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | [KILO-START](https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know)、[KILO-PH](https://www.producthunt.com/products/kilocode) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | +| [Stitch 2.0 by Google](https://www.producthunt.com/products/stitch-2-0-by-google-2) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。HTTP直接采集返回403,因此不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 +产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 + + +## S04 产品发布候选核对(PH-2025-visible-1) + +[发现页面](https://www.producthunt.com/leaderboard/yearly/2025),读取于2026-10-30。当前年度档案首个公开响应中19张有文字链接的产品/推广卡片;另有一张仅图片的Framer 3.0位置,未解析为独立产品,保留缺项。未穷尽分页或全年;当前推广位不等于2025发布。 + +本批19条:1条关联公司、0条关联范围外对照、3条范围外不新增公司、14条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 + +| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | +| --- | --- | --- | --- | --- | --- | +| [Screen Studio 3.0](https://www.producthunt.com/products/screen-studio) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-01](https://www.producthunt.com/products/screen-studio) | 产品页还列2022年首次发布;公司成立年和AI主营仍待核,不因3.0版本重新算新公司。 | +| [Tana](https://www.producthunt.com/products/tana) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-02](https://www.producthunt.com/products/tana) | AI笔记工作区;2025发布不是公司成立证据,成立年待核。 | +| [Trace](https://www.producthunt.com/products/trace) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 已关联公司 | [Trace](/docs/other-research/ai-company-research/overview?company=YC30687#research-company-detail) | [PH25-E-03](https://www.producthunt.com/products/trace)、[YC-E-30687](https://www.ycombinator.com/companies/trace-so)、[TRACE-HOME](https://www.trace.so/) | 产品页指向trace.so,与现有YC30687对应,不新增近名公司。 | +| [Tanka](https://www.producthunt.com/products/tanka) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-04](https://www.producthunt.com/products/tanka) | 团队通信与AI记忆;公司成立年待核。 | +| [Sider 5.0](https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-05](https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension) | AI研究与浏览器工具;版本更新不等于公司创立,成立年待核。 | +| [Guideflow](https://www.producthunt.com/products/guideflow) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | [PH25-E-06](https://www.producthunt.com/products/guideflow) | 演示自动化;公司成立年、AI业务与收费范围待核。 | +| [Clueso](https://www.producthunt.com/products/clueso) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH25-E-07](https://www.producthunt.com/products/clueso)、[PH25-CLUESO-YC](https://www.ycombinator.com/companies/clueso) | YC官方列Founded 2023;2025是产品平台发布时间,不纳入2025—2026新公司。 | +| [YouMind](https://www.producthunt.com/products/youmind) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-08](https://www.producthunt.com/products/youmind) | 创作与资料整理;公司成立年待核。 | +| [MGX(现Atoms)](https://www.producthunt.com/products/metagpt-x) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-09](https://www.producthunt.com/products/metagpt-x) | 产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。 | +| Cloudflare Workers推广 | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 推广活动,非公司新增 | — | [PH-2025-PAGE](https://www.producthunt.com/leaderboard/yearly/2025) | 当前榜单推广位链接回年度榜单;不作为2025新公司或收入。 | +| [Tool Finder](https://www.producthunt.com/products/tool-finder) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-11](https://www.producthunt.com/products/tool-finder) | 资料显示较早产品发布;公司成立年与是否AI主营待核,不能把软件目录直接当AI公司。 | +| [Chronicle: Cursor for Slides](https://www.producthunt.com/products/chronicle-6) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-12](https://www.producthunt.com/products/chronicle-6) | 演示文稿产品;不能按近名关联现有Chronicle Labs(企业Agent测试),成立年待核。 | +| [21st.dev](https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH25-E-13](https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers)、[PH25-21ST-YC](https://www.ycombinator.com/companies/21st) | YC官方列Founded 2024、W26批次;发布年与加速器批次不改变成立年,不归新公司样本。 | +| [Aha](https://www.producthunt.com/products/aha-3) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | [PH25-E-14](https://www.producthunt.com/products/aha-3) | 网红营销Agent;当前品牌AhaCreator,主体、成立年待核。 | +| [Basalt](https://www.producthunt.com/products/basalt) | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 成立年待核 | — | [PH25-E-15](https://www.producthunt.com/products/basalt) | AI评估、监控及部署工具;仅有2025发布信息,成立年待核,质量宣传未独立测试。 | +| [Framer AI Agents](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH25-E-16](https://www.producthunt.com/products/framer)、[PH-FRAMER-ABOUT](https://www.framer.com/about) | 当前推广卡片指向Framer;官网列2014成立,不作2025新公司或2025发布证据。 | +| [Tapflow 2.0](https://www.producthunt.com/products/tapflow) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-17](https://www.producthunt.com/products/tapflow) | 将知识与文档打包出售;公司成立年、AI主营与收入归属待核。 | +| [Musa](https://www.producthunt.com/products/musa-2) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-18](https://www.producthunt.com/products/musa-2) | 个人健康与自我照护产品;公司成立年及AI是否主营待核。 | +| [Trickle - Magic Canvas](https://www.producthunt.com/products/happycapy) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy) | 历史卡片现跳到Happycapy页面,页面称原Trickle团队;与PH26-04有产品沿革关联,不能据此确认新法人或成立年。 | + +产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 ## 尚未满足的研究条件 diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 504c116..6b2672b 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-ph-1", + "version": "2026-10-30-ph-2", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -7517,28 +7517,41 @@ "year": 2025, "team": 3, "location": "London, United Kingdom", - "business": "公司简介:Context-aware orchestration between humans and AI.", - "buyer": "本轮未逐一核验", - "delivery": "公开YC公司资料;交付与付费使用待核验", - "notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。", + "business": "提供企业人与AI Agent的上下文编排、任务路由及跨部门自动化。", + "buyer": "企业运营、业务与IT团队", + "delivery": "官网BETA与联系入口可读;未独立运行或验证付费使用。", + "notes": "2025成立据YC自述。官网合同金额及任务计数属于产品示例,不能当公司ARR或实际客户指标;公开定价和收入未取得。", "cohort": "2025年成立", "teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明", - "price": "本轮未逐一核验", - "stage": "目录公开,商业成熟度待核验", - "sourceType": "YC官方页面中的公司自述", + "price": "官网联系团队;未取得公开金额", + "stage": "BETA与公开联系入口;商业规模待核", + "sourceType": "YC公司自述、公司官网及Product Hunt发布", "evidenceIds": [ - "YC-E-30687" + "YC-E-30687", + "PH25-E-03", + "TRACE-HOME" ], "revenueStatus": "unknown", - "profileOnly": true, - "classificationBasis": "目录标签的规则初分", + "profileOnly": false, + "classificationBasis": "2026-10-30人工复核YC与官网:按主要企业运营任务归C05;不因底层Agent能力归基础设施。", "directoryTags": [ "SaaS", "B2B", "Productivity", "Enterprise Software", "AI" - ] + ], + "directoryOrigin": "yc-2025-2026", + "businessModel": "企业工作流编排;收费方式和合同经常性待核", + "technicalReview": { + "level": "description", + "reviewedAt": "2026-10-30", + "summary": "已读上下文编排与治理的官方功能介绍;没有执行产品、复测性能或核验宣称采用。", + "evidenceIds": [ + "YC-E-30687", + "TRACE-HOME" + ] + } }, { "id": "YC30688", @@ -43786,6 +43799,259 @@ "kind": "公司官方材料", "summary": "该站介绍健康、长寿和消费品牌业务及CEO Žygimantas Surintas,与kilo.ai编程工具的创始团队、产品及域名不同。", "limitation": "只用于近名实体排除,不把该公司的收入、融资或目标归Kilo Code。" + }, + { + "id": "PH-2025-PAGE", + "companyId": null, + "title": "Product Hunt 2025年度榜单可读响应", + "url": "https://www.producthunt.com/leaderboard/yearly/2025", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "登记首个公开响应中19张有文字链接的产品/推广卡片,另有一张只有图片的Framer 3.0位置保留缺项。", + "limitation": "未包括分页、动态加载和全年档案;当前响应有推广位,不能把当前推广内容当作2025发布证据。" + }, + { + "id": "PH25-E-01", + "companyId": null, + "title": "Screen Studio 3.0产品发布资料", + "url": "https://www.producthunt.com/products/screen-studio", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "产品页还列2022年首次发布;公司成立年和AI主营仍待核,不因3.0版本重新算新公司。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-02", + "companyId": null, + "title": "Tana产品发布资料", + "url": "https://www.producthunt.com/products/tana", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "AI笔记工作区;2025发布不是公司成立证据,成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-03", + "companyId": "YC30687", + "title": "Trace产品发布资料", + "url": "https://www.producthunt.com/products/trace", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "产品页指向trace.so,与现有YC30687对应,不新增近名公司。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-04", + "companyId": null, + "title": "Tanka产品发布资料", + "url": "https://www.producthunt.com/products/tanka", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "团队通信与AI记忆;公司成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-05", + "companyId": null, + "title": "Sider 5.0产品发布资料", + "url": "https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "AI研究与浏览器工具;版本更新不等于公司创立,成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-06", + "companyId": null, + "title": "Guideflow产品发布资料", + "url": "https://www.producthunt.com/products/guideflow", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "演示自动化;公司成立年、AI业务与收费范围待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-07", + "companyId": null, + "title": "Clueso产品发布资料", + "url": "https://www.producthunt.com/products/clueso", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "YC官方列Founded 2023;2025是产品平台发布时间,不纳入2025—2026新公司。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-08", + "companyId": null, + "title": "YouMind产品发布资料", + "url": "https://www.producthunt.com/products/youmind", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "创作与资料整理;公司成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-09", + "companyId": null, + "title": "MGX(现Atoms)产品发布资料", + "url": "https://www.producthunt.com/products/metagpt-x", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-11", + "companyId": null, + "title": "Tool Finder产品发布资料", + "url": "https://www.producthunt.com/products/tool-finder", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "资料显示较早产品发布;公司成立年与是否AI主营待核,不能把软件目录直接当AI公司。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-12", + "companyId": null, + "title": "Chronicle: Cursor for Slides产品发布资料", + "url": "https://www.producthunt.com/products/chronicle-6", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "演示文稿产品;不能按近名关联现有Chronicle Labs(企业Agent测试),成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-13", + "companyId": null, + "title": "21st.dev产品发布资料", + "url": "https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "YC官方列Founded 2024、W26批次;发布年与加速器批次不改变成立年,不归新公司样本。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-14", + "companyId": null, + "title": "Aha产品发布资料", + "url": "https://www.producthunt.com/products/aha-3", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "网红营销Agent;当前品牌AhaCreator,主体、成立年待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-15", + "companyId": null, + "title": "Basalt产品发布资料", + "url": "https://www.producthunt.com/products/basalt", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "AI评估、监控及部署工具;仅有2025发布信息,成立年待核,质量宣传未独立测试。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-16", + "companyId": null, + "title": "Framer AI Agents产品发布资料", + "url": "https://www.producthunt.com/products/framer", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "当前推广卡片指向Framer;官网列2014成立,不作2025新公司或2025发布证据。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-17", + "companyId": null, + "title": "Tapflow 2.0产品发布资料", + "url": "https://www.producthunt.com/products/tapflow", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "将知识与文档打包出售;公司成立年、AI主营与收入归属待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-18", + "companyId": null, + "title": "Musa产品发布资料", + "url": "https://www.producthunt.com/products/musa-2", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "个人健康与自我照护产品;公司成立年及AI是否主营待核。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-E-19", + "companyId": null, + "title": "Trickle - Magic Canvas产品发布资料", + "url": "https://www.producthunt.com/products/happycapy", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "历史卡片现跳到Happycapy页面,页面称原Trickle团队;与PH26-04有产品沿革关联,不能据此确认新法人或成立年。", + "limitation": "平台发布与当前产品定位;不单独证明公司成立年、公司ARR或技术性能。" + }, + { + "id": "PH25-CLUESO-YC", + "companyId": null, + "title": "Clueso官方目录成立年", + "url": "https://www.ycombinator.com/companies/clueso", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "YC官方页面中的公司自述", + "summary": "YC官方字段列Founded 2023、Winter 2023,与2025产品发布不同。", + "limitation": "官方目录中的公司自述,未作工商核验;仅用于范围排除。" + }, + { + "id": "PH25-21ST-YC", + "companyId": null, + "title": "21st官方目录成立年", + "url": "https://www.ycombinator.com/companies/21st", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "YC官方页面中的公司自述", + "summary": "YC官方字段列Founded 2024、Winter 2026;加入2026批次不代表当年成立。", + "limitation": "官方目录中的公司自述,未作工商核验;创始人此前Rork与其他项目的财务不归21st。" + }, + { + "id": "PH-FRAMER-ABOUT", + "companyId": null, + "title": "Framer官方创立介绍", + "url": "https://www.framer.com/about", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网列2014成立,并描述设计工具至网站平台及AI Agent的演化。", + "limitation": "估值与融资不当收入;2025—2026发布的版本不能改变公司创立时间。" + }, + { + "id": "TRACE-HOME", + "companyId": "YC30687", + "title": "Trace官方产品介绍", + "url": "https://www.trace.so/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网将产品标为BETA,面向企业部门间的人与Agent编排、上下文和审计工作流,入口为联系团队。", + "limitation": "示例界面的合同金额、任务数及实体数不是公司收入、真实客户或采用数据;未独立运行,未取得公开定价。" } ], "reviews": [ @@ -44636,6 +44902,21 @@ "companyIds": [ "AI072" ] + }, + { + "id": "TRACE-R-DEMO", + "type": "演示与财务边界", + "company": "Trace", + "summary": "官网示例呈现合同金额、任务计数和实体数;页面未将这些定义为公司实绩。", + "evidenceIds": [ + "TRACE-HOME", + "PH25-E-03" + ], + "handling": "不录入收入或采用观测;Trace按官网域名trace.so与YC主体关联,不与TraceRoot等近名项混淆。", + "scope": "companies", + "companyIds": [ + "YC30687" + ] } ], "coverage": { @@ -44679,7 +44960,10 @@ "profileStatus": "readable", "status": "existing-outside-cohort", "note": "映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。", - "companyId": "AI054" + "companyId": "AI054", + "evidenceIds": [ + "E054" + ] }, { "id": "PH26-03", @@ -44699,7 +44983,10 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "note": "与PH25-19 Trickle历史发布共用当前产品页;页面称原Trickle团队。公司成立年与法人沿革待核,不因改名或新发布自动算新公司。", + "evidenceIds": [ + "PH25-E-19" + ] }, { "id": "PH26-05", @@ -44738,8 +45025,11 @@ "categoryId": "C04", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "outside-cohort", + "note": "Framer官网列2014成立;3.0及AI新产品不作2026新公司,未新增公司。", + "evidenceIds": [ + "PH-FRAMER-ABOUT" + ] }, { "id": "PH26-09", @@ -44800,7 +45090,11 @@ "profileStatus": "readable", "status": "linked", "note": "映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。", - "companyId": "AI072" + "companyId": "AI072", + "evidenceIds": [ + "KILO-START", + "KILO-PH" + ] }, { "id": "PH26-15", @@ -44820,7 +45114,10 @@ "kind": "promotion", "profileStatus": "archive-only", "status": "promotion", - "note": "推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。" + "note": "推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。", + "evidenceIds": [ + "PH-2026-PAGE" + ] }, { "id": "PH26-17", @@ -44841,7 +45138,11 @@ "profileStatus": "readable", "status": "linked", "note": "映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。", - "companyId": "AI072" + "companyId": "AI072", + "evidenceIds": [ + "KILO-START", + "KILO-PH" + ] }, { "id": "PH26-19", @@ -44855,6 +45156,269 @@ } ], "id": "PH-2026-visible-1" + }, + { + "id": "PH-2025-visible-1", + "sourceId": "S04", + "url": "https://www.producthunt.com/leaderboard/yearly/2025", + "accessedAt": "2026-10-30", + "scope": "当前年度档案首个公开响应中19张有文字链接的产品/推广卡片;另有一张仅图片的Framer 3.0位置,未解析为独立产品,保留缺项。未穷尽分页或全年;当前推广位不等于2025发布。", + "complete": false, + "records": [ + { + "id": "PH25-01", + "name": "Screen Studio 3.0", + "url": "https://www.producthunt.com/products/screen-studio", + "categoryId": "C08", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "产品页还列2022年首次发布;公司成立年和AI主营仍待核,不因3.0版本重新算新公司。", + "evidenceIds": [ + "PH25-E-01" + ] + }, + { + "id": "PH25-02", + "name": "Tana", + "url": "https://www.producthunt.com/products/tana", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "AI笔记工作区;2025发布不是公司成立证据,成立年待核。", + "evidenceIds": [ + "PH25-E-02" + ] + }, + { + "id": "PH25-03", + "name": "Trace", + "url": "https://www.producthunt.com/products/trace", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "linked", + "note": "产品页指向trace.so,与现有YC30687对应,不新增近名公司。", + "evidenceIds": [ + "PH25-E-03", + "YC-E-30687", + "TRACE-HOME" + ], + "companyId": "YC30687" + }, + { + "id": "PH25-04", + "name": "Tanka", + "url": "https://www.producthunt.com/products/tanka", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "团队通信与AI记忆;公司成立年待核。", + "evidenceIds": [ + "PH25-E-04" + ] + }, + { + "id": "PH25-05", + "name": "Sider 5.0", + "url": "https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension", + "categoryId": "C09", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "AI研究与浏览器工具;版本更新不等于公司创立,成立年待核。", + "evidenceIds": [ + "PH25-E-05" + ] + }, + { + "id": "PH25-06", + "name": "Guideflow", + "url": "https://www.producthunt.com/products/guideflow", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "演示自动化;公司成立年、AI业务与收费范围待核。", + "evidenceIds": [ + "PH25-E-06" + ] + }, + { + "id": "PH25-07", + "name": "Clueso", + "url": "https://www.producthunt.com/products/clueso", + "categoryId": "C08", + "kind": "product", + "profileStatus": "readable", + "status": "outside-cohort", + "note": "YC官方列Founded 2023;2025是产品平台发布时间,不纳入2025—2026新公司。", + "evidenceIds": [ + "PH25-E-07", + "PH25-CLUESO-YC" + ] + }, + { + "id": "PH25-08", + "name": "YouMind", + "url": "https://www.producthunt.com/products/youmind", + "categoryId": "C08", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "创作与资料整理;公司成立年待核。", + "evidenceIds": [ + "PH25-E-08" + ] + }, + { + "id": "PH25-09", + "name": "MGX(现Atoms)", + "url": "https://www.producthunt.com/products/metagpt-x", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。", + "evidenceIds": [ + "PH25-E-09" + ] + }, + { + "id": "PH25-10", + "name": "Cloudflare Workers推广", + "url": null, + "categoryId": "C02", + "kind": "promotion", + "profileStatus": "archive-only", + "status": "promotion", + "note": "当前榜单推广位链接回年度榜单;不作为2025新公司或收入。", + "evidenceIds": [ + "PH-2025-PAGE" + ] + }, + { + "id": "PH25-11", + "name": "Tool Finder", + "url": "https://www.producthunt.com/products/tool-finder", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "资料显示较早产品发布;公司成立年与是否AI主营待核,不能把软件目录直接当AI公司。", + "evidenceIds": [ + "PH25-E-11" + ] + }, + { + "id": "PH25-12", + "name": "Chronicle: Cursor for Slides", + "url": "https://www.producthunt.com/products/chronicle-6", + "categoryId": "C08", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "演示文稿产品;不能按近名关联现有Chronicle Labs(企业Agent测试),成立年待核。", + "evidenceIds": [ + "PH25-E-12" + ] + }, + { + "id": "PH25-13", + "name": "21st.dev", + "url": "https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "outside-cohort", + "note": "YC官方列Founded 2024、W26批次;发布年与加速器批次不改变成立年,不归新公司样本。", + "evidenceIds": [ + "PH25-E-13", + "PH25-21ST-YC" + ] + }, + { + "id": "PH25-14", + "name": "Aha", + "url": "https://www.producthunt.com/products/aha-3", + "categoryId": "C06", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "网红营销Agent;当前品牌AhaCreator,主体、成立年待核。", + "evidenceIds": [ + "PH25-E-14" + ] + }, + { + "id": "PH25-15", + "name": "Basalt", + "url": "https://www.producthunt.com/products/basalt", + "categoryId": "C03", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "AI评估、监控及部署工具;仅有2025发布信息,成立年待核,质量宣传未独立测试。", + "evidenceIds": [ + "PH25-E-15" + ] + }, + { + "id": "PH25-16", + "name": "Framer AI Agents", + "url": "https://www.producthunt.com/products/framer", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "outside-cohort", + "note": "当前推广卡片指向Framer;官网列2014成立,不作2025新公司或2025发布证据。", + "evidenceIds": [ + "PH25-E-16", + "PH-FRAMER-ABOUT" + ] + }, + { + "id": "PH25-17", + "name": "Tapflow 2.0", + "url": "https://www.producthunt.com/products/tapflow", + "categoryId": "C05", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "将知识与文档打包出售;公司成立年、AI主营与收入归属待核。", + "evidenceIds": [ + "PH25-E-17" + ] + }, + { + "id": "PH25-18", + "name": "Musa", + "url": "https://www.producthunt.com/products/musa-2", + "categoryId": "C09", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "个人健康与自我照护产品;公司成立年及AI是否主营待核。", + "evidenceIds": [ + "PH25-E-18" + ] + }, + { + "id": "PH25-19", + "name": "Trickle - Magic Canvas", + "url": "https://www.producthunt.com/products/happycapy", + "categoryId": "C04", + "kind": "product", + "profileStatus": "readable", + "status": "pending-year", + "note": "历史卡片现跳到Happycapy页面,页面称原Trickle团队;与PH26-04有产品沿革关联,不能据此确认新法人或成立年。", + "evidenceIds": [ + "PH25-E-19" + ] + } + ] } ] } diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index db146b0..f0f2088 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-2", + "version": "2026-10-30-3", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -59,8 +59,8 @@ "producthunt.com" ], "initialAccess": "官网可读取", - "boundary": "已登记2026年度榜单首次响应19张卡片:17个产品页可读、1超时、1推广卡;只核当前可见批次,未穷尽两年发布档案。", - "nextCheck": "补2025档案、2026其余分页/日期及公司成立证据;多产品映射同一公司,未核年份保持候选。", + "boundary": "2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及成立证据;推广位不当历史发布,不把产品改名、版本与公司成立混同。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index c6de6bf..683ccb6 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-ph-1", + "sourceVersion": "2026-10-30-ph-2", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", diff --git a/scripts/audit-ai-research.py b/scripts/audit-ai-research.py index a06c982..8973e89 100644 --- a/scripts/audit-ai-research.py +++ b/scripts/audit-ai-research.py @@ -58,12 +58,14 @@ def candidate_register(): companies = {c['id']: c for c in DATA['companies']} categories = {c['id']: c['name'] for c in DATA['categories']} known_sources = {s['id'] for s in SOURCES['sources']} + evidence = {e['id']: e for e in DATA['evidence']} assert len({b['id'] for b in batches}) == len(batches) all_ids = [r['id'] for b in batches for r in b['records']] assert len(set(all_ids)) == len(all_ids) lines = [] statuses = {'pending-year': '成立年待核', 'linked': '已关联公司', - 'existing-outside-cohort': '已有关联,年份范围外', 'promotion': '推广活动,非公司新增'} + 'existing-outside-cohort': '已有关联,年份范围外', + 'outside-cohort': '成立年范围外,不新增公司', 'promotion': '推广活动,非公司新增'} for batch in batches: assert batch['sourceId'] in known_sources assert batch['accessedAt'] <= DATA['asOf'] @@ -71,21 +73,26 @@ def candidate_register(): rows = batch['records'] counts = Counter(r['status'] for r in rows) assert sum(counts.values()) == len(rows) - lines += ['', f"## {batch['sourceId']} 产品发布候选核对", '', + lines += ['', f"## {batch['sourceId']} 产品发布候选核对({batch['id']})", '', f"[发现页面]({batch['url']}),读取于{batch['accessedAt']}。{batch['scope']}", '', - f"本批{len(rows)}条:{counts['linked']}条关联公司、{counts['existing-outside-cohort']}条关联范围外对照、{counts['pending-year']}条成立年待核、{counts['promotion']}条推广活动。完整来源覆盖标记:{'已完成' if batch['complete'] else '未完成'}。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。", '', - '| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 限制 |', '| --- | --- | --- | --- | --- |'] + f"本批{len(rows)}条:{counts['linked']}条关联公司、{counts['existing-outside-cohort']}条关联范围外对照、{counts['outside-cohort']}条范围外不新增公司、{counts['pending-year']}条成立年待核、{counts['promotion']}条推广活动。完整来源覆盖标记:{'已完成' if batch['complete'] else '未完成'}。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。", '', + '| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 |', '| --- | --- | --- | --- | --- | --- |'] for row in rows: assert row['categoryId'] in categories assert row['status'] in statuses + assert all(eid in evidence for eid in row.get('evidenceIds', [])) + if row['status'] == 'outside-cohort': + assert row.get('evidenceIds') and not row.get('companyId') name = f"[{row['name']}]({row['url']})" if row['url'] else row['name'] company = '—' if row.get('companyId'): assert row['companyId'] in companies c = companies[row['companyId']] company = f"[{c['name']}]({BASE}?company={c['id']}#research-company-detail)" - lines.append(f"| {name} | {categories[row['categoryId']]} | {statuses[row['status']]} | {company} | {row['note']} |") - lines += ['', '产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。HTTP直接采集返回403,因此不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。', ''] + proof = '、'.join(f"[{eid}]({evidence[eid]['url']})" for eid in row.get('evidenceIds', [])) or '成立证据待补,产品页读取状态见候选记录' + category = f"[{categories[row['categoryId']]}]({BASE}?category={row['categoryId']})" + lines.append(f"| {name} | {category} | {statuses[row['status']]} | {company} | {proof} | {row['note']} |") + lines += ['', '产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。', ''] return lines From 744e3314b87f55cacc0adf2d30fb6f971ae06aa0 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 15:44:50 +0800 Subject: [PATCH 05/14] =?UTF-8?q?=E6=A0=B8=E5=AF=B9=E4=B8=83=E9=A1=B9?= =?UTF-8?q?=E5=80=99=E9=80=89=E5=B9=B4=E4=BB=BD=E5=B9=B6=E9=9A=94=E7=A6=BB?= =?UTF-8?q?=E7=AC=AC=E4=B8=89=E6=96=B9=E8=B4=A2=E5=8A=A1=E5=AD=97=E6=AE=B5?= =?UTF-8?q?=E5=BC=82=E5=B8=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +- apps/docs/scripts/auth-cli.ts | 2 +- apps/docs/tests/research.test.ts | 16 +- .../docs/ai-company-research/00-overview.md | 3 + .../02-coverage-and-gaps.md | 32 +-- content/research/ai-companies.seed.json | 235 ++++++++++++++++-- content/research/ai-companies.sources.json | 12 +- content/research/ai-income-analysis.json | 2 +- 8 files changed, 257 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index 5ccb83c..7608209 100644 --- a/README.md +++ b/README.md @@ -98,11 +98,11 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,124 条证据记录和 187 条经营与技术观测。 +当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,139 条证据记录和 187 条经营与技术观测。 其中保留 88 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 -Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 +Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中21条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;58条核查中47条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;59条核查中47条指向具体公司、4条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 17e575c..0da43c6 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -187,7 +187,7 @@ async function main() { const research = await researchResponse.json(); assert.equal(research.companies.length, 1016); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1124); + assert.equal(research.evidence.length, 1139); assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index a017096..d3743ce 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -24,7 +24,7 @@ test("research revisions share the authentication database and preserve replay l assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); assert.equal(initial.companies.length, 1016); - assert.equal(initial.evidence.length, 1124); + assert.equal(initial.evidence.length, 1139); assert.equal(initial.observations.length, 187); assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records"); @@ -64,7 +64,7 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 47); - assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 3); + assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 4); assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 8); const review = snapshot.reviews.find((r) => r.id === "R4")!; assert.deepEqual(reviewCompanyIds(snapshot, review), ["AI007", "AI013", "AI021", "AI034"]); @@ -278,7 +278,7 @@ test("annual launch archives exclude older companies only with evidence and reus assert.equal(batch.complete, false); assert.equal(batch.records.length, 19); const older = batch.records.filter((r) => r.status === "outside-cohort"); - assert.equal(older.length, 3); + assert.equal(older.length, 7); assert.ok(older.every((r) => !r.companyId && r.evidenceIds?.length)); assert.equal(batch.records.find((r) => r.name === "Trace")?.companyId, "YC30687"); const trace = snapshot.companies.find((c) => c.id === "YC30687")!; @@ -291,3 +291,13 @@ test("annual launch archives exclude older companies only with evidence and reus older[0].evidenceIds = ["missing-proof"]; assert.throws(() => validateResearch(snapshot), /research candidate/); }); + +test("unreconciled directory financials remain source reviews instead of income observations", () => { + const snapshot = seed as ResearchSnapshot; + const review = snapshot.reviews.find((r) => r.id === "PH-R-SOURCE-QUALITY")!; + assert.equal(review.scope, "dataset"); + assert.ok(review.evidenceIds.includes("PH-TANA-DR")); + assert.equal(reviewCompanyIds(snapshot, review).length, 0); + assert.ok(!snapshot.observations.some((o) => o.evidence === "PH-TANA-DR")); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 21); +}); diff --git a/content/docs/ai-company-research/00-overview.md b/content/docs/ai-company-research/00-overview.md index 1fbe713..662a6db 100644 --- a/content/docs/ai-company-research/00-overview.md +++ b/content/docs/ai-company-research/00-overview.md @@ -37,8 +37,11 @@ | ARR与近30日收款差距大 | 查年付、季付、退款、试用、币种及平台计算方法 | 不同指标不应机械相等 | | 用户很多,付费数缺失 | 取得付费客户、套餐与账期数据,再核ARPA | 不能用注册人数直接反推真实性 | | 公司、投资方与媒体重复一个数字 | 追到首发声明及独立底账 | 多篇转述不等于独立证据 | +| 第三方目录的概览、收入、利润和利润率不能互相核对 | 查原始凭证、字段映射、单位、时期与业务范围 | 先记录来源质量问题,不直接归因为公司造假 | | 声明撤回、口径变更或含并购业务 | 保留历史版本,拆分边界并核对更正原因 | 单个异常无法生成可靠造假概率 | +2026-10-30读取的[Tana第三方目录](https://dealroom.co/companies/tana/)是一个来源核查实例:可读文本响应的概览与财务表口径不同,若按“利润÷收入”理解,其列值不能与利润率互相核对。尚未取得原始财报,也未确认是否涉及页面占位、文本采集、字段、单位或时期差异,因此这些数字未进入收入观测或图表。该业务本身也早于2025年,保留在候选排除台账;来源异常不能作为公司的造假结论。 + ### 从原文到可比较收入:新增核查实例 以下均为2026-10-30读取的公司自述,读取日不代表收入业务截止日。点击公司可查看分项观测、核查和原始来源。原文仅有美元符号时保留币种待核;未给币种的数字不补成美元。 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index 749ede6..0724dba 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -55,7 +55,7 @@ ## 已使用来源的分布 -1,124条证据记录对应1,110个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,139条证据记录对应1,125个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | @@ -64,7 +64,7 @@ | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 103 | 99 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 118 | 114 | 按每条来源限制理解,不能统一当作独立证据 | ## 来源清单与验收边界 @@ -76,8 +76,8 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | --- | --- | --- | --- | --- | | S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 986 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | | S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | -| S03 [Dealroom](https://dealroom.co/) | 候选台账待建 | 0 / 0 / 0 | 仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。 | 确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。 | -| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及成立证据;推广位不当历史发布,不把产品改名、版本与公司成立混同。 | +| S03 [Dealroom](https://dealroom.co/) | 定向使用,未穷尽 | 1 / 0 / 0 | 已读Tana公开公司档案并记录成立年线索与财务字段不一致;尚未取得2025—2026成立筛选结果集,个案不等于目录全量。 | 确认公开可取得的两年成立筛选清单;逐项追溯财务原始凭证及字段口径,受权限限制保留缺项。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及21条成立年待核候选;推广位与旧公司新产品不纳入新成立公司。 | | S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | | S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | @@ -85,11 +85,11 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | | S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 37 / 16 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 48 / 16 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | -| S16 其他公开补充资料 | 定向使用,未穷尽 | 42 / 22 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | +| S16 其他公开补充资料 | 定向使用,未穷尽 | 45 / 22 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。 @@ -98,7 +98,7 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 [发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 -本批19条:2条关联公司、1条关联范围外对照、1条范围外不新增公司、14条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:2条关联公司、1条关联范围外对照、4条范围外不新增公司、11条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 | 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | @@ -106,12 +106,12 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 | [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | [E054](https://speedrun.a16z.com/companies/rork) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | | [Brila](https://www.producthunt.com/products/brila-2) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [happycapy](https://www.producthunt.com/products/happycapy) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy) | 与PH25-19 Trickle历史发布共用当前产品页;页面称原Trickle团队。公司成立年与法人沿革待核,不因改名或新发布自动算新公司。 | -| [Cowork](https://www.producthunt.com/products/claude) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Cowork](https://www.producthunt.com/products/claude) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-COWORK-OWNER](https://www.anthropic.com/news/introducing-anthropic-labs)、[PH-ANTHROPIC-FOUND](https://www.anthropic.com/events/builder-summit-bengaluru) | Cowork是Anthropic产品,官方称母公司2021成立;2026研究预览不新增公司,也不转移其他Claude产品收入。 | | [Upstream](https://www.producthunt.com/products/upstream-3) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Framer 3.0](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH-FRAMER-ABOUT](https://www.framer.com/about) | Framer官网列2014成立;3.0及AI新产品不作2026新公司,未新增公司。 | | [OpenSEO](https://www.producthunt.com/products/openseo) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Clarify](https://www.producthunt.com/products/clarify-6) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Clarify](https://www.producthunt.com/products/clarify-6) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年范围外,不新增公司 | — | [PH-CLARIFY-LINKEDIN](https://www.linkedin.com/company/getclarify)、[PH-CLARIFY-MANIFESTO](https://www.clarify.ai/blog/manifesto) | Clarify CRM公司主页列2024成立,2024创始人宣言佐证已有业务;不与医疗及其他同名Clarify混淆。 | | [Lightfield](https://www.producthunt.com/products/lightfield) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Pazi](https://www.producthunt.com/products/pazi) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [SuperX](https://www.producthunt.com/products/superx) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | @@ -120,7 +120,7 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 | Render startup credits | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 推广活动,非公司新增 | — | [PH-2026-PAGE](https://www.producthunt.com/leaderboard/yearly/2026) | 推广创业额度活动,链接回榜单,不把额度当公司收入或新成立公司。 | | [DataFast](https://www.producthunt.com/products/datafast) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [KiloClaw](https://www.producthunt.com/products/kiloclaw) | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | [KILO-START](https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know)、[KILO-PH](https://www.producthunt.com/products/kilocode) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | -| [Stitch 2.0 by Google](https://www.producthunt.com/products/stitch-2-0-by-google-2) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Stitch 2.0 by Google](https://www.producthunt.com/products/stitch-2-0-by-google-2) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH-STITCH-OWNER](https://blog.google/innovation-and-ai/products/google-io-2025-all-our-announcements/)、[PH-GOOGLE-FOUND](https://about.google/company-info/our-story/) | Google的Stitch产品及新版本,不是独立2026创业公司;Google公司沿革始于1998,不转移集团收入。 | 产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 @@ -129,22 +129,22 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 [发现页面](https://www.producthunt.com/leaderboard/yearly/2025),读取于2026-10-30。当前年度档案首个公开响应中19张有文字链接的产品/推广卡片;另有一张仅图片的Framer 3.0位置,未解析为独立产品,保留缺项。未穷尽分页或全年;当前推广位不等于2025发布。 -本批19条:1条关联公司、0条关联范围外对照、3条范围外不新增公司、14条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:1条关联公司、0条关联范围外对照、7条范围外不新增公司、10条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 | 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | | [Screen Studio 3.0](https://www.producthunt.com/products/screen-studio) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-01](https://www.producthunt.com/products/screen-studio) | 产品页还列2022年首次发布;公司成立年和AI主营仍待核,不因3.0版本重新算新公司。 | -| [Tana](https://www.producthunt.com/products/tana) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-02](https://www.producthunt.com/products/tana) | AI笔记工作区;2025发布不是公司成立证据,成立年待核。 | +| [Tana](https://www.producthunt.com/products/tana) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-TANA-DR](https://dealroom.co/companies/tana/)、[PH-TANA-INV](https://tolacapital.com/2025/02/04/my-productivity-quest-and-tanas-series-a)、[PH-TANA-HOME](https://tana.inc/) | Dealroom列2020成立;投资人回忆2025前已与团队合作。按2025前已有业务排除,法律注册年未核;现行会议平台不另算新公司。 | | [Trace](https://www.producthunt.com/products/trace) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 已关联公司 | [Trace](/docs/other-research/ai-company-research/overview?company=YC30687#research-company-detail) | [PH25-E-03](https://www.producthunt.com/products/trace)、[YC-E-30687](https://www.ycombinator.com/companies/trace-so)、[TRACE-HOME](https://www.trace.so/) | 产品页指向trace.so,与现有YC30687对应,不新增近名公司。 | -| [Tanka](https://www.producthunt.com/products/tanka) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-04](https://www.producthunt.com/products/tanka) | 团队通信与AI记忆;公司成立年待核。 | +| [Tanka](https://www.producthunt.com/products/tanka) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-TANKA-RELEASE](https://www.prnewswire.com/news-releases/tankaai-launches-in-japan-bringing-team-memory-to-everyday-work-302891558.html)、[PH-TANKA-LINKEDIN](https://www.linkedin.com/company/tankaai) | 公司新闻稿及公开主页均列2024成立;2025产品榜单及2026日本上线不改变公司成立年。 | | [Sider 5.0](https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-05](https://www.producthunt.com/products/chatgpt-sidebar-chrome-extension) | AI研究与浏览器工具;版本更新不等于公司创立,成立年待核。 | -| [Guideflow](https://www.producthunt.com/products/guideflow) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | [PH25-E-06](https://www.producthunt.com/products/guideflow) | 演示自动化;公司成立年、AI业务与收费范围待核。 | +| [Guideflow](https://www.producthunt.com/products/guideflow) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年范围外,不新增公司 | — | [PH-GUIDEFLOW-ABOUT](https://www.guideflow.com/company/about-us) | Guideflow官网列2023成立;2025榜单为既有公司产品,不加入新成立公司样本。 | | [Clueso](https://www.producthunt.com/products/clueso) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH25-E-07](https://www.producthunt.com/products/clueso)、[PH25-CLUESO-YC](https://www.ycombinator.com/companies/clueso) | YC官方列Founded 2023;2025是产品平台发布时间,不纳入2025—2026新公司。 | -| [YouMind](https://www.producthunt.com/products/youmind) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-08](https://www.producthunt.com/products/youmind) | 创作与资料整理;公司成立年待核。 | +| [YouMind](https://www.producthunt.com/products/youmind) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH-YOUMIND-FOUNDER](https://www.caicai.me/zh/product/youmind)、[PH-YOUMIND-SEED](https://www.caicai.me/zh/blogs/youmind-startup-journey-2) | 联合创始人自述2024创业、获得种子投资并开发产品;按2025前已开展业务排除,精确法人成立日仍未核。 | | [MGX(现Atoms)](https://www.producthunt.com/products/metagpt-x) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-09](https://www.producthunt.com/products/metagpt-x) | 产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。 | | Cloudflare Workers推广 | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 推广活动,非公司新增 | — | [PH-2025-PAGE](https://www.producthunt.com/leaderboard/yearly/2025) | 当前榜单推广位链接回年度榜单;不作为2025新公司或收入。 | | [Tool Finder](https://www.producthunt.com/products/tool-finder) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-11](https://www.producthunt.com/products/tool-finder) | 资料显示较早产品发布;公司成立年与是否AI主营待核,不能把软件目录直接当AI公司。 | -| [Chronicle: Cursor for Slides](https://www.producthunt.com/products/chronicle-6) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-12](https://www.producthunt.com/products/chronicle-6) | 演示文稿产品;不能按近名关联现有Chronicle Labs(企业Agent测试),成立年待核。 | +| [Chronicle: Cursor for Slides](https://www.producthunt.com/products/chronicle-6) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-12](https://www.producthunt.com/products/chronicle-6)、[PH-CHRONICLE-ACCESS](https://blog.chroniclehq.com/2023/02/14/chronicle-raises-7-5m-seed-round-from-accel-and-square-peg-to-reimagine-presentations/) | 演示文稿产品,与Chronicle Labs不同;历史公告正文两次超时,不能据搜索摘要确定成立年,继续待核。 | | [21st.dev](https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH25-E-13](https://www.producthunt.com/products/21st-dev-the-npm-for-design-engineers)、[PH25-21ST-YC](https://www.ycombinator.com/companies/21st) | YC官方列Founded 2024、W26批次;发布年与加速器批次不改变成立年,不归新公司样本。 | | [Aha](https://www.producthunt.com/products/aha-3) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | [PH25-E-14](https://www.producthunt.com/products/aha-3) | 网红营销Agent;当前品牌AhaCreator,主体、成立年待核。 | | [Basalt](https://www.producthunt.com/products/basalt) | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 成立年待核 | — | [PH25-E-15](https://www.producthunt.com/products/basalt) | AI评估、监控及部署工具;仅有2025发布信息,成立年待核,质量宣传未独立测试。 | diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 6b2672b..16ecf37 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-ph-2", + "version": "2026-10-30-ph-3", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -44052,6 +44052,171 @@ "kind": "公司官方材料", "summary": "官网将产品标为BETA,面向企业部门间的人与Agent编排、上下文和审计工作流,入口为联系团队。", "limitation": "示例界面的合同金额、任务数及实体数不是公司收入、真实客户或采用数据;未独立运行,未取得公开定价。" + }, + { + "id": "PH-TANA-DR", + "companyId": null, + "title": "Tana第三方成立年及财务字段核对", + "url": "https://dealroom.co/companies/tana/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "第三方公司目录", + "summary": "页面列Founded 2020。可读文本的概览收入范围与财务表不同;表内Revenue、Profit及Margin按常见利润率定义不能相互勾稽。", + "limitation": "未取得原始财报与完整业务口径;可能涉及字段映射、显示占位、单位或时间差异,不能确定原因。不把该表数值导入收入观测,也不据此判断公司造假。" + }, + { + "id": "PH-TANA-INV", + "companyId": null, + "title": "Tola对Tana历史团队与投资的说明", + "url": "https://tolacapital.com/2025/02/04/my-productivity-quest-and-tanas-series-a", + "publishedAt": "2025-02-04", + "accessedAt": "2026-10-30", + "kind": "投资方官方材料", + "summary": "2025年2月文章回忆约三年前已与Tana创始团队见面,能佐证该业务在2025年前存在。", + "limitation": "相对回忆不作精确注册日期;投资人有利益关系,融资、采用及效果不等于公司ARR。" + }, + { + "id": "PH-TANA-HOME", + "companyId": null, + "title": "Tana现行产品与Outliner区分", + "url": "https://tana.inc/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网明确现行Agent会议平台与原笔记产品Tana Outliner是分开的产品。", + "limitation": "产品扩展不作为新公司成立;界面示例不作为客户收入或真实采用。" + }, + { + "id": "PH-TANKA-RELEASE", + "companyId": null, + "title": "Tanka日本发布新闻稿中的成立信息", + "url": "https://www.prnewswire.com/news-releases/tankaai-launches-in-japan-bringing-team-memory-to-everyday-work-302891558.html", + "publishedAt": "2026-09-28", + "accessedAt": "2026-10-30", + "kind": "公司自述新闻稿", + "summary": "Tanka发布的新闻稿写明美国公司成立于2024年,日本产品上线为2026年。", + "limitation": "公司提供的新闻稿而非独立审计;地域发布、套餐与推广名额不当新公司或收入。" + }, + { + "id": "PH-TANKA-LINKEDIN", + "companyId": null, + "title": "Tanka公开公司主页", + "url": "https://www.linkedin.com/company/tankaai", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司自述公开主页", + "summary": "主页对应tanka.ai,Founded字段为2024,人数仅列11—50范围。", + "limitation": "公司主页自述;公开关联员工数不等于员工总数,不据范围填精确人数。" + }, + { + "id": "PH-YOUMIND-FOUNDER", + "companyId": null, + "title": "YouMind联合创始人的项目历程", + "url": "https://www.caicai.me/zh/product/youmind", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司创始人自述", + "summary": "联合创始人称2024年离开大公司开始创业,并在半年内上线YouMind。", + "limitation": "团队创业与注册日期不同;仅可确认2025年前已开展业务,精确法人成立年未核。" + }, + { + "id": "PH-YOUMIND-SEED", + "companyId": null, + "title": "YouMind联合创始人回顾2024融资", + "url": "https://www.caicai.me/zh/blogs/youmind-startup-journey-2", + "publishedAt": "2025-11-17", + "accessedAt": "2026-10-30", + "kind": "公司创始人自述", + "summary": "2025年11月文章记载YouMind在2024年已获得种子投资并开发产品。", + "limitation": "融资不是收入;不将创始人在此前语雀项目的用户或业绩转移给YouMind。" + }, + { + "id": "PH-GUIDEFLOW-ABOUT", + "companyId": null, + "title": "Guideflow官方成立信息", + "url": "https://www.guideflow.com/company/about-us", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网Year founded列2023,描述销售、营销、支持及入职引导工作。", + "limitation": "团队与交互次数是官方宣传口径,未独立核验,不当收入。" + }, + { + "id": "PH-CLARIFY-LINKEDIN", + "companyId": null, + "title": "Clarify CRM公开公司主页", + "url": "https://www.linkedin.com/company/getclarify", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司自述公开主页", + "summary": "主页链接clarify.ai,Founded列2024,位于Seattle。", + "limitation": "公司自述主页非工商核验;不与医疗Clarify或其他同名业务混淆。" + }, + { + "id": "PH-CLARIFY-MANIFESTO", + "companyId": null, + "title": "Clarify创始人2024产品宣言", + "url": "https://www.clarify.ai/blog/manifesto", + "publishedAt": "2024-09-20", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2024年9月两位联合创始人介绍其AI原生CRM愿景,佐证2025前已有业务。", + "limitation": "是产品愿景而非交付性能;不从愿景推收入。" + }, + { + "id": "PH-ANTHROPIC-FOUND", + "companyId": null, + "title": "Anthropic官方成立信息", + "url": "https://www.anthropic.com/events/builder-summit-bengaluru", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官方活动About介绍称Anthropic成立于2021年。", + "limitation": "用于母公司主体辨识;产品新发布不等于公司新成立。" + }, + { + "id": "PH-COWORK-OWNER", + "companyId": null, + "title": "Anthropic Labs与Cowork归属", + "url": "https://www.anthropic.com/news/introducing-anthropic-labs", + "publishedAt": "2026-01-13", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2026年1月13日官方文章将Cowork列为其前一天发布研究预览的产品。", + "limitation": "不作为独立2026公司,也不将同文其他产品收入或下载量转给Cowork。" + }, + { + "id": "PH-GOOGLE-FOUND", + "companyId": null, + "title": "Google官方公司沿革", + "url": "https://about.google/company-info/our-story/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官方沿革写明Google Inc.在1998年成立。", + "limitation": "用于区分既有公司和新产品,不将集团收入转为Stitch收入。" + }, + { + "id": "PH-STITCH-OWNER", + "companyId": null, + "title": "Google I/O对Stitch的产品介绍", + "url": "https://blog.google/innovation-and-ai/products/google-io-2025-all-our-announcements/", + "publishedAt": "2025-05-21", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2025年5月Google官方公告将Stitch列为AI界面设计与前端代码生成工具。", + "limitation": "新工具发布不是独立创业公司;产品具体法律主体与独立收入未核。" + }, + { + "id": "PH-CHRONICLE-ACCESS", + "companyId": null, + "title": "Chronicle历史公告读取缺项", + "url": "https://blog.chroniclehq.com/2023/02/14/chronicle-raises-7-5m-seed-round-from-accel-and-square-peg-to-reimagine-presentations/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官网访问记录", + "summary": "URL和搜索摘要指向2023年官方历史公告;两次读取正文均超时。", + "limitation": "未当作全文已读;不凭URL、摘要或融资日期确认精确成立年,候选继续待核。" } ], "reviews": [ @@ -44917,6 +45082,17 @@ "companyIds": [ "YC30687" ] + }, + { + "id": "PH-R-SOURCE-QUALITY", + "type": "来源数据质量", + "company": "全局方法:第三方目录财务表", + "summary": "Tana第三方目录的可读文本响应中,概览与财务表口径不一,收入、利润及利润率无法按常见定义互相核对。", + "evidenceIds": [ + "PH-TANA-DR" + ], + "handling": "不导入这些收入数值;先查原始凭证、字段、单位、时间和业务口径。来源展示或采集异常与公司财务异常分别记录,不能据此推造假概率。", + "scope": "dataset" } ], "coverage": { @@ -44995,8 +45171,12 @@ "categoryId": "C05", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "outside-cohort", + "note": "Cowork是Anthropic产品,官方称母公司2021成立;2026研究预览不新增公司,也不转移其他Claude产品收入。", + "evidenceIds": [ + "PH-COWORK-OWNER", + "PH-ANTHROPIC-FOUND" + ] }, { "id": "PH26-06", @@ -45048,8 +45228,12 @@ "categoryId": "C06", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "outside-cohort", + "note": "Clarify CRM公司主页列2024成立,2024创始人宣言佐证已有业务;不与医疗及其他同名Clarify混淆。", + "evidenceIds": [ + "PH-CLARIFY-LINKEDIN", + "PH-CLARIFY-MANIFESTO" + ] }, { "id": "PH26-11", @@ -45151,8 +45335,12 @@ "categoryId": "C08", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "outside-cohort", + "note": "Google的Stitch产品及新版本,不是独立2026创业公司;Google公司沿革始于1998,不转移集团收入。", + "evidenceIds": [ + "PH-STITCH-OWNER", + "PH-GOOGLE-FOUND" + ] } ], "id": "PH-2026-visible-1" @@ -45185,10 +45373,12 @@ "categoryId": "C05", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "AI笔记工作区;2025发布不是公司成立证据,成立年待核。", + "status": "outside-cohort", + "note": "Dealroom列2020成立;投资人回忆2025前已与团队合作。按2025前已有业务排除,法律注册年未核;现行会议平台不另算新公司。", "evidenceIds": [ - "PH25-E-02" + "PH-TANA-DR", + "PH-TANA-INV", + "PH-TANA-HOME" ] }, { @@ -45214,10 +45404,11 @@ "categoryId": "C05", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "团队通信与AI记忆;公司成立年待核。", + "status": "outside-cohort", + "note": "公司新闻稿及公开主页均列2024成立;2025产品榜单及2026日本上线不改变公司成立年。", "evidenceIds": [ - "PH25-E-04" + "PH-TANKA-RELEASE", + "PH-TANKA-LINKEDIN" ] }, { @@ -45240,10 +45431,10 @@ "categoryId": "C06", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "演示自动化;公司成立年、AI业务与收费范围待核。", + "status": "outside-cohort", + "note": "Guideflow官网列2023成立;2025榜单为既有公司产品,不加入新成立公司样本。", "evidenceIds": [ - "PH25-E-06" + "PH-GUIDEFLOW-ABOUT" ] }, { @@ -45267,10 +45458,11 @@ "categoryId": "C08", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "创作与资料整理;公司成立年待核。", + "status": "outside-cohort", + "note": "联合创始人自述2024创业、获得种子投资并开发产品;按2025前已开展业务排除,精确法人成立日仍未核。", "evidenceIds": [ - "PH25-E-08" + "PH-YOUMIND-FOUNDER", + "PH-YOUMIND-SEED" ] }, { @@ -45320,9 +45512,10 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "演示文稿产品;不能按近名关联现有Chronicle Labs(企业Agent测试),成立年待核。", + "note": "演示文稿产品,与Chronicle Labs不同;历史公告正文两次超时,不能据搜索摘要确定成立年,继续待核。", "evidenceIds": [ - "PH25-E-12" + "PH25-E-12", + "PH-CHRONICLE-ACCESS" ] }, { diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index f0f2088..5f92877 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-3", + "version": "2026-10-30-4", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -37,15 +37,15 @@ "name": "Dealroom", "url": "https://dealroom.co/", "role": "discovery", - "status": "pending", + "status": "targeted", "hosts": [ "dealroom.co", "app.dealroom.co" ], "initialAccess": "官网可读取", - "boundary": "仅核对官网入口与产品介绍,尚无两年筛选结果集;首页示例不是候选全集。", - "nextCheck": "确认公开可取得的成立年筛选清单;受权限限制时明确记缺,不填完成。", - "limitation": "明细或批量访问取决于权限", + "boundary": "已读Tana公开公司档案并记录成立年线索与财务字段不一致;尚未取得2025—2026成立筛选结果集,个案不等于目录全量。", + "nextCheck": "确认公开可取得的两年成立筛选清单;逐项追溯财务原始凭证及字段口径,受权限限制保留缺项。", + "limitation": "完整档案需权限;概览及财务表不能未经勾稽直接导入ARR", "accessRecheckedAt": "2026-10-30" }, { @@ -60,7 +60,7 @@ ], "initialAccess": "官网可读取", "boundary": "2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。", - "nextCheck": "继续补两年其余分页/日期、仅图片位置及成立证据;推广位不当历史发布,不把产品改名、版本与公司成立混同。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及21条成立年待核候选;推广位与旧公司新产品不纳入新成立公司。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 683ccb6..d5e68e4 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-ph-2", + "sourceVersion": "2026-10-30-ph-3", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", From ec95f3be31dab8c2d108680d800c5877f4a847c1 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 15:51:57 +0800 Subject: [PATCH 06/14] =?UTF-8?q?=E6=98=8E=E7=A1=AE=E6=94=B6=E5=85=A5?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E7=9A=84=E4=B8=9A=E5=8A=A1=E7=B1=BB=E5=88=AB?= =?UTF-8?q?=E4=B8=8E=E7=BB=9F=E8=AE=A1=E5=88=86=E7=BB=84=E5=B1=82=E7=BA=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/IncomeDistribution.tsx | 26 ++++++++++++++----- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/apps/docs/src/components/IncomeDistribution.tsx b/apps/docs/src/components/IncomeDistribution.tsx index 611b3d0..cd2cc64 100644 --- a/apps/docs/src/components/IncomeDistribution.tsx +++ b/apps/docs/src/components/IncomeDistribution.tsx @@ -20,6 +20,9 @@ export default function IncomeDistribution({ data, onSelect }: { }), [data, dateWindow, year, annualize]); const groups = useMemo(() => groupIncome(sample.points, splitModels).sort((a, b) => a.category.localeCompare(b.category) || a.provider.localeCompare(b.provider) || a.model.localeCompare(b.model)), [sample.points, splitModels]); + const categoryGroups = [...new Set(groups.map((group) => group.category))].map((category) => ({ + category, rows: groups.filter((group) => group.category === category), + })); const categories = new Map(data.categories.map((category) => [category.id, category.name])); const metric = annualize ? "MRR×12参考年化" : "平台MRR"; const values = sample.points.map((point) => point.value); @@ -41,6 +44,7 @@ export default function IncomeDistribution({ data, onSelect }: {
+

{splitModels ? "分组:业务类别 × 支付平台 × 收费与交付模式。同一类别下的多行是不同统计组,各自计算均值和中位数。" : "分组:业务类别 × 支付平台。同一平台内的收费模式已合并,不同支付平台仍分别统计。"}

资料截至 {data.asOf},纳入 {sample.points.length} 个产品,另有 {sample.excluded.length} 个 MRR 观测未纳入。{annualize ? "乘12只改变显示单位,不证明全年收入、续约或ARR;CV与相对敏感性不变。" : "MRR不等于近30日收款;平台数据连接也不等于财务审计。"}{dateWindow === "all" && " 当前包含不同时间的历史观测,不能称为同期对照。"}

{sample.points.length ? <>
@@ -48,9 +52,16 @@ export default function IncomeDistribution({ data, onSelect }: { {ticks.map((tick) => {usd(tick)})} {groups.map((group, index) => { const y = index * 70 + 40; - return - {categories.get(group.category)} - {group.provider} · {group.model} · n={group.stats.n} + const firstInCategory = index === 0 || groups[index - 1].category !== group.category; + const categoryRowCount = categoryGroups.find((entry) => entry.category === group.category)!.rows.length; + return + {firstInCategory && <> + {index > 0 && } + {categories.get(group.category)}({categoryRowCount}组) + {categoryRowCount > 1 && } + } + {group.provider} · {group.model} · n={group.stats.n} + {group.stats.n < 3 && {group.stats.n === 1 ? "仅1个产品,无法判断组内离散度" : "仅2个产品,不代表领域典型收入"}} 样本均值 {usd(group.stats.mean)} 样本中位数 {usd(group.stats.median)} @@ -62,12 +73,13 @@ export default function IncomeDistribution({ data, onSelect }: { ; })} -
圆点:产品观测 竖线:样本均值 菱形:样本中位数。按业务类别与支付来源分组,点击点或下表产品名可看原始证据。
+
圆点:产品观测 竖线:样本均值 菱形:样本中位数。业务类别标题下各行按支付平台{splitModels && "及收费与交付模式"}分别统计;n为该组产品数。点击点或下表产品名可看原始证据。
-
{groups.map((group) => - +
{metric}样本统计;金额按显示值计算,CV使用样本标准差
类别 / 来源 / 模式n均值中位数均值/中位数CV去除最大值后的均值 / 下降幅度产品与限制
{categories.get(group.category)}{group.provider} · {group.model}{group.stats.n}{usd(group.stats.mean)}{usd(group.stats.median)}{group.stats.meanMedianRatio?.toFixed(2) ?? "—"}{group.stats.cv?.toFixed(2) ?? "—"}{usd(group.stats.meanWithoutLargest)}{percent(group.stats.largestRemovalDrop)}
{categoryGroups.map(({ category, rows }) => {rows.map((group, index) => + {index === 0 && } + - )}
{metric}样本统计;每行是类别下的一个统计组,CV使用样本标准差
业务类别支付平台 / 收费模式n均值中位数均值/中位数CV去除最大值后的均值 / 下降幅度产品与限制
{categories.get(category)}{rows.length}个统计组{group.provider}{group.model}{group.stats.n}{usd(group.stats.mean)}{usd(group.stats.median)}{group.stats.meanMedianRatio?.toFixed(2) ?? "—"}{group.stats.cv?.toFixed(2) ?? "—"}{usd(group.stats.meanWithoutLargest)}{percent(group.stats.largestRemovalDrop)} {group.points.map((point) => {" "})}{group.stats.n < 3 ? "样本少于3,不能据此判断领域典型收入。" : "自选的小样本,须结合产品年龄、成本与留存评估。"}
+ )})} :

当前窗口和创立年份没有符合条件的 MRR 记录。

}
统计规则与解释

每个产品只取符合条件的最新一条平台 MRR;币种为美元,要求有效数据日期、确定数值及支付来源。公司 ARR、估算、融资、目标和近30日收入均不进入这里。未知值不补零。

CV=样本标准差÷均值,标准差分母为 n−1;n=1 不算 CV。n=2 时均值必然等于中位数,不能据此认为均值有代表性。较大的均值/中位数差距、CV或移除最大值的变化,仅提示进一步核查样本构成。

支付商与平台的退款、试用、年付、币种及指标计算可能不同(平台方法说明)。不能将 MRR 与收款差异、单个高值或高离散度直接解释为财务造假。比较商业模式还需要毛利、获客成本、留存、人工交付和客户集中度。

{sample.excluded.length > 0 &&
未纳入的 MRR 记录({sample.excluded.length})
    {sample.excluded.map(({ observation, reason }) =>
  • :{usd(observation.value)} / 月,{observation.observedAt ?? "日期未知"};{reason}
  • )}
} From 62c015fa9b0b35726f3831e33972abf8e4154edc Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 16:00:13 +0800 Subject: [PATCH 07/14] =?UTF-8?q?=E6=A0=B8=E5=AF=B9=E4=BA=A7=E5=93=81?= =?UTF-8?q?=E8=BF=90=E8=90=A5=E4=B8=BB=E4=BD=93=E5=B9=B6=E8=A1=A5Lightfiel?= =?UTF-8?q?d=E8=BD=AC=E5=9E=8B=E5=AF=B9=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- apps/docs/scripts/auth-cli.ts | 4 +- apps/docs/tests/research.test.ts | 28 +- .../docs/ai-company-research/00-overview.md | 4 + .../ai-company-research/01-income-snapshot.md | 2 +- .../02-coverage-and-gaps.md | 34 +-- content/research/ai-companies.seed.json | 275 +++++++++++++++++- content/research/ai-companies.sources.json | 4 +- content/research/ai-income-analysis.json | 2 +- 9 files changed, 317 insertions(+), 47 deletions(-) diff --git a/README.md b/README.md index 7608209..9f9df3e 100644 --- a/README.md +++ b/README.md @@ -98,11 +98,12 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,016 条公司/产品记录、10 类业务及待分类组、1,139 条证据记录和 187 条经营与技术观测。 -其中保留 88 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 -Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中21条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 +当前资料包含 1,017 条公司/产品记录、10 类业务及待分类组、1,154 条证据记录和 187 条经营与技术观测。 +其中保留 89 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中20条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;59条核查中47条指向具体公司、4条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;61条核查中48条指向具体公司、4条属于全局方法、9条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +Lightfield按Magical Tome主体与2025前历史业务列为CRM转型对照,成立年未知,不计新成立公司;Fundraisly成立年待核,其客户融资和创始人历史ARR不转移为公司收入。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 @@ -145,7 +146,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。 AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。 技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。 -当前9条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 +当前10条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。 `pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 0da43c6..be07f26 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -185,9 +185,9 @@ async function main() { assert.equal(researchResponse.status, 200, "authenticated research API"); assert.ok(researchResponse.headers.get("cache-control")?.includes("no-store")); const research = await researchResponse.json(); - assert.equal(research.companies.length, 1016); + assert.equal(research.companies.length, 1017); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1139); + assert.equal(research.evidence.length, 1154); assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index d3743ce..3fb3442 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -23,8 +23,8 @@ test("research revisions share the authentication database and preserve replay l for (let i = 0; i < 20; i++) consumeCode(config, "invalid"); assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); - assert.equal(initial.companies.length, 1016); - assert.equal(initial.evidence.length, 1139); + assert.equal(initial.companies.length, 1017); + assert.equal(initial.evidence.length, 1154); assert.equal(initial.observations.length, 187); assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records"); @@ -63,9 +63,9 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 47); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 48); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 4); - assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 8); + assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 9); const review = snapshot.reviews.find((r) => r.id === "R4")!; assert.deepEqual(reviewCompanyIds(snapshot, review), ["AI007", "AI013", "AI021", "AI034"]); assert.deepEqual(reviewCompanyIds(snapshot, snapshot.reviews.find((r) => r.id === "CN-R-PSI")!), []); @@ -84,11 +84,11 @@ test("reviews link explicit companies without turning global or excluded cases i test("disclosure counts exclude client income, biographies, targets and duplicate milestones", () => { const snapshot = seed as ResearchSnapshot; const summary = categorySummary(snapshot); - assert.equal(summary.reduce((n, c) => n + c.count, 0), 1016); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1017); assert.equal(summary.reduce((n, c) => n + c.self, 0), 26); assert.equal(summary.reduce((n, c) => n + c.estimate, 0), 1); assert.equal(summary.reduce((n, c) => n + c.platform, 0), 16); - assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 973); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 974); assert.equal(snapshot.companies.find((c) => c.name === "Rork")?.revenueStatus, "unknown"); assert.equal(snapshot.companies.find((c) => c.name === "Result")?.revenueStatus, "unknown"); assert.ok(snapshot.observations.filter((o) => o.selection === "signal").every((o) => o.scope === "公司整体")); @@ -96,7 +96,7 @@ test("disclosure counts exclude client income, biographies, targets and duplicat test("technical reviews keep accessible materials separate from tested capabilities", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 9); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 10); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 4); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1); assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown"); @@ -299,5 +299,17 @@ test("unreconciled directory financials remain source reviews instead of income assert.ok(review.evidenceIds.includes("PH-TANA-DR")); assert.equal(reviewCompanyIds(snapshot, review).length, 0); assert.ok(!snapshot.observations.some((o) => o.evidence === "PH-TANA-DR")); - assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 21); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 20); +}); + +test("product pivots and founder histories do not become new company years or current revenue", () => { + const snapshot = seed as ResearchSnapshot; + const pivot = snapshot.companies.find((c) => c.id === "AI073")!; + assert.equal(pivot.year, null, "CRM launch is not a verified company founding year"); + assert.equal(pivot.revenueStatus, "unknown"); + const candidate = snapshot.candidateBatches!.flatMap((b) => b.records).find((r) => r.id === "PH26-11")!; + assert.equal(candidate.status, "existing-outside-cohort"); + assert.equal(candidate.companyId, pivot.id); + assert.ok(!platformIncomeSample(snapshot, { windowDays: null }).points.some((point) => point.company.id === pivot.id)); + assert.ok(!snapshot.observations.some((o) => ["PH-FUNDRAISLY-ABOUT", "LF-PIVOT", "LF-HISTORY"].includes(o.evidence)), "other ventures' ARR, users and funding must not transfer"); }); diff --git a/content/docs/ai-company-research/00-overview.md b/content/docs/ai-company-research/00-overview.md index 662a6db..e0254fe 100644 --- a/content/docs/ai-company-research/00-overview.md +++ b/content/docs/ai-company-research/00-overview.md @@ -21,6 +21,7 @@ | 行业专业Agent与服务 | LunaBill、Plena Health、Bizmark | 有合同ARR、数量级或ARR自述,日历截止日和交付拆分不完整 | 采购周期、上线工时、失败处理与验收标准 | 合同、经常性与实施费拆分、使用深度 | | AI辅助工程与研究服务 | Marengo、Harbor | 有首月收入、待交付或多年服务合同;不直接当ARR | 已验收项目毛利、专业人员工时、返工和责任成本 | 合同收入确认、软件/服务拆分、应收账款和交付集中度 | | 开源编程工具与企业治理 | [Kilo Code](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 官方定价区分席位、推理、充值处理费和云算力;已被收购,收入未知 | 企业付费转换、平台净收入、推理转付与补贴、支持成本 | 付费客户、留存、收入确认及并表边界;不能从token吞吐推ARR | +| 企业CRM与组织上下文 | [Lightfield转型对照](/docs/other-research/ai-company-research/overview?company=AI073#research-company-detail) | 有席位及工作区套餐,部分含实施、专人支持;2025是产品上线,既有公司历史单列 | 数据接入成本、记录与行动准确率、销售团队留存、实施和人工支持毛利 | 付费采用、用量额度、续费及真实ARPA;不把Tome历史用户当CRM客户 | | 模型、算力与机器人 | Wafer、Induction Labs、Congruent | 可确定产品方向;团队小或融资多不证明单位经济 | 客户真实负载、性能成本、交付与售后成本 | 同口径收入、资本开支、独立性能测试 | **对我们商业试验的推论:** 先选择能接触真实买家、结果可验收、成本可计量的工作流,比较软件订阅与服务交付的实际毛利,再评估是否扩成综合Agent。当前证据不足以断定某类必然更赚钱;平台数据更适合帮助选择访谈与试验对象。 @@ -37,11 +38,14 @@ | ARR与近30日收款差距大 | 查年付、季付、退款、试用、币种及平台计算方法 | 不同指标不应机械相等 | | 用户很多,付费数缺失 | 取得付费客户、套餐与账期数据,再核ARPA | 不能用注册人数直接反推真实性 | | 公司、投资方与媒体重复一个数字 | 追到首发声明及独立底账 | 多篇转述不等于独立证据 | +| 品牌改名、业务转型或主体名不同 | 对照服务条款、历史公告、合同主体和原始日期 | 产品上线不是公司成立,历史用户与其他业务收入不自动继承 | | 第三方目录的概览、收入、利润和利润率不能互相核对 | 查原始凭证、字段映射、单位、时期与业务范围 | 先记录来源质量问题,不直接归因为公司造假 | | 声明撤回、口径变更或含并购业务 | 保留历史版本,拆分边界并核对更正原因 | 单个异常无法生成可靠造假概率 | 2026-10-30读取的[Tana第三方目录](https://dealroom.co/companies/tana/)是一个来源核查实例:可读文本响应的概览与财务表口径不同,若按“利润÷收入”理解,其列值不能与利润率互相核对。尚未取得原始财报,也未确认是否涉及页面占位、文本采集、字段、单位或时期差异,因此这些数字未进入收入观测或图表。该业务本身也早于2025年,保留在候选排除台账;来源异常不能作为公司的造假结论。 +[Fundraisly创始人介绍](https://fundraisly.com/about-us)还展示了履历与客户融资的归属问题:此前Gett业务的ARR、创始人融资经历以及客户筹资,均不等于Fundraisly收入。[现行条款](https://fundraisly.com/terms-of-service)列运营者为Accumulator Fundraising LLC,并提到月订阅和按通话收费;条款生效日不当成立日,固定或经常性费用也需查实际合同、交付与续费,才能讨论可比ARR。该项目目前仍在成立年待核候选中。 + ### 从原文到可比较收入:新增核查实例 以下均为2026-10-30读取的公司自述,读取日不代表收入业务截止日。点击公司可查看分项观测、核查和原始来源。原文仅有美元符号时保留币种待核;未给币种的数字不补成美元。 diff --git a/content/docs/ai-company-research/01-income-snapshot.md b/content/docs/ai-company-research/01-income-snapshot.md index 664c32d..528603f 100644 --- a/content/docs/ai-company-research/01-income-snapshot.md +++ b/content/docs/ai-company-research/01-income-snapshot.md @@ -2,7 +2,7 @@ 截至 2026-10-30,7日窗口内有 14 个产品的美元平台MRR可纳入分组描述。创意软件订阅组的样本均值较高、CV也较大;营销软件组与消费者个人应用组的CV接近。各组只有1至5个产品,尚不足以估计行业总体或造假概率。 -这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,016条公司/产品记录的收入普查。 +这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,017条公司/产品记录的收入普查。 ## 7日窗口的分组结果 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index 0724dba..fe49a1c 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -1,6 +1,6 @@ # AI 公司资料覆盖与缺项 -截至 2026-10-30,研究表含1,016条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 +截至 2026-10-30,研究表含1,017条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。 @@ -19,7 +19,7 @@ | AI业务待确认 | 192 | 不强行把背景关键词当主营 | | 成立年与批次冲突 | 6 | 另保留核查记录 | -全表由912条目录基础项和104条个案或平台记录组成。候选池已匹配项之外另有54条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 +全表由912条目录基础项和105条个案或平台记录组成。候选池已匹配项之外另有55条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 ## 成立年与证据深度 @@ -27,15 +27,15 @@ | --- | --- | --- | | 记录为2025年成立 | 620 | 成立来源和精度见公司明细 | | 记录为2026年成立 | 391 | 不将产品发布日期代替成立日 | -| 成立年未知或范围外 | 5 | 发布/转型对照单列,不进入两年成立分组 | +| 成立年未知或范围外 | 6 | 发布/转型对照单列,不进入两年成立分组 | | 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 | | 其他目录基础项 | 752 | 规则初分或资料不足,继续待复核 | | 有团队数字 | 945 | 多为自报Team Size或Employees,时点与口径不统一 | -| 专项技术证据记录 | 9 | 其中4条自述、4条公开材料、1条第三方评测 | +| 专项技术证据记录 | 10 | 其中5条自述、4条公开材料、1条第三方评测 | | 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR | | 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 | | 仅第三方估算 | 1 | 不与直接披露混合 | -| 暂无可用收入数字 | 973 | 包含尚未逐家搜索的目录项,不代表没有收入 | +| 暂无可用收入数字 | 974 | 包含尚未逐家搜索的目录项,不代表没有收入 | ## 业务分类与数据入口 @@ -46,7 +46,7 @@ | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 51 | | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 110 | | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 176 | -| [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 52 | +| [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 53 | | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 321 | | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 45 | | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 46 | @@ -55,7 +55,7 @@ ## 已使用来源的分布 -1,139条证据记录对应1,125个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,154条证据记录对应1,140个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | @@ -64,7 +64,7 @@ | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 118 | 114 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 133 | 129 | 按每条来源限制理解,不能统一当作独立证据 | ## 来源清单与验收边界 @@ -77,7 +77,7 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 986 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | | S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | | S03 [Dealroom](https://dealroom.co/) | 定向使用,未穷尽 | 1 / 0 / 0 | 已读Tana公开公司档案并记录成立年线索与财务字段不一致;尚未取得2025—2026成立筛选结果集,个案不等于目录全量。 | 确认公开可取得的两年成立筛选清单;逐项追溯财务原始凭证及字段口径,受权限限制保留缺项。 | -| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及21条成立年待核候选;推广位与旧公司新产品不纳入新成立公司。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及20条成立年待核候选;核清品牌、产品与运营主体关系,不转移历史或客户业绩。 | | S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | | S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | @@ -85,7 +85,7 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | | S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 48 / 16 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 63 / 17 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | @@ -98,21 +98,21 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 [发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 -本批19条:2条关联公司、1条关联范围外对照、4条范围外不新增公司、11条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:2条关联公司、2条关联范围外对照、4条范围外不新增公司、10条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 | 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | -| [Fundraisly](https://www.producthunt.com/products/fundraisly) | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Fundraisly](https://www.producthunt.com/products/fundraisly) | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 成立年待核 | — | [PH-FUNDRAISLY-ABOUT](https://fundraisly.com/about-us)、[PH-FUNDRAISLY-ENTITY](https://fundraisly.com/terms-of-service)、[PH-FUNDRAISLY-PLAN](https://fundraisly.com/service-plan) | 运营主体Accumulator Fundraising LLC;成立年待核。固定/经常性或按通话的服务收费需拆分;Gett历史ARR、创始人及客户筹资不作Fundraisly收入。 | | [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | [E054](https://speedrun.a16z.com/companies/rork) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | -| [Brila](https://www.producthunt.com/products/brila-2) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [happycapy](https://www.producthunt.com/products/happycapy) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy) | 与PH25-19 Trickle历史发布共用当前产品页;页面称原Trickle团队。公司成立年与法人沿革待核,不因改名或新发布自动算新公司。 | +| [Brila](https://www.producthunt.com/products/brila-2) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH-BRILA-ENTITY](https://brila.ai/about)、[PH-BRILA-TERMS](https://brila.ai/terms-and-conditions) | 官网及条款列Generated Media, Inc.运营;注册号不代表日期,母公司成立年待核。网站生成与托管订阅为产品业务,不因2026发布新增独立公司。 | +| [happycapy](https://www.producthunt.com/products/happycapy) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy)、[PH-HAPPYCAPY-ABOUT](https://happycapy.ai/about)、[PH-HAPPYCAPY-PRIVACY](https://happycapy.ai/privacy) | Trickle历史发布与Happycapy当前产品页相关联;官网功能及政策可读,但法人成立与股权沿革未核。政策生效日不作成立日,仍保留候选,不重复新增公司。 | | [Cowork](https://www.producthunt.com/products/claude) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-COWORK-OWNER](https://www.anthropic.com/news/introducing-anthropic-labs)、[PH-ANTHROPIC-FOUND](https://www.anthropic.com/events/builder-summit-bengaluru) | Cowork是Anthropic产品,官方称母公司2021成立;2026研究预览不新增公司,也不转移其他Claude产品收入。 | | [Upstream](https://www.producthunt.com/products/upstream-3) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Framer 3.0](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH-FRAMER-ABOUT](https://www.framer.com/about) | Framer官网列2014成立;3.0及AI新产品不作2026新公司,未新增公司。 | | [OpenSEO](https://www.producthunt.com/products/openseo) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Clarify](https://www.producthunt.com/products/clarify-6) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年范围外,不新增公司 | — | [PH-CLARIFY-LINKEDIN](https://www.linkedin.com/company/getclarify)、[PH-CLARIFY-MANIFESTO](https://www.clarify.ai/blog/manifesto) | Clarify CRM公司主页列2024成立,2024创始人宣言佐证已有业务;不与医疗及其他同名Clarify混淆。 | -| [Lightfield](https://www.producthunt.com/products/lightfield) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Lightfield](https://www.producthunt.com/products/lightfield) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 已有关联,年份范围外 | [Lightfield(Tome转型对照)](/docs/other-research/ai-company-research/overview?company=AI073#research-company-detail) | [LF-ENTITY](https://lightfield.com/privacy)、[LF-PIVOT](https://lightfield.com/blog/venturebeat-tome-s-founders-ditch-viral-presentation-app-with-20m-users-to-build-ai-native-crm)、[LF-HISTORY](https://greylock.com/blog/persuasion-through-stories/) | 映射Magical Tome, Inc.转型对照;2025是CRM上线,2022已有Tome业务,精确注册年未核,不计2026新公司。 | | [Pazi](https://www.producthunt.com/products/pazi) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [SuperX](https://www.producthunt.com/products/superx) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Kilo Code for VS Code](https://www.producthunt.com/products/kilocode) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | [KILO-START](https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know)、[KILO-PH](https://www.producthunt.com/products/kilocode) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | @@ -141,7 +141,7 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 | [Guideflow](https://www.producthunt.com/products/guideflow) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年范围外,不新增公司 | — | [PH-GUIDEFLOW-ABOUT](https://www.guideflow.com/company/about-us) | Guideflow官网列2023成立;2025榜单为既有公司产品,不加入新成立公司样本。 | | [Clueso](https://www.producthunt.com/products/clueso) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH25-E-07](https://www.producthunt.com/products/clueso)、[PH25-CLUESO-YC](https://www.ycombinator.com/companies/clueso) | YC官方列Founded 2023;2025是产品平台发布时间,不纳入2025—2026新公司。 | | [YouMind](https://www.producthunt.com/products/youmind) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年范围外,不新增公司 | — | [PH-YOUMIND-FOUNDER](https://www.caicai.me/zh/product/youmind)、[PH-YOUMIND-SEED](https://www.caicai.me/zh/blogs/youmind-startup-journey-2) | 联合创始人自述2024创业、获得种子投资并开发产品;按2025前已开展业务排除,精确法人成立日仍未核。 | -| [MGX(现Atoms)](https://www.producthunt.com/products/metagpt-x) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-09](https://www.producthunt.com/products/metagpt-x) | 产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。 | +| [MGX(现Atoms)](https://www.producthunt.com/products/metagpt-x) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH-ATOMS-ABOUT](https://atoms.dev/about)、[PH-ATOMS-TIMELINE](https://atoms.dev/metagpt)、[PH-ATOMS-ENTITY](https://atoms.dev/terms-of-service) | MetaGPT研究→MGX→Atoms为产品沿革;官网产品化年份有2024与2024—2025口径,技术服务方列MetaGPT LLC。公司成立年和跨主体关系待核,不因更名新增公司。 | | Cloudflare Workers推广 | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 推广活动,非公司新增 | — | [PH-2025-PAGE](https://www.producthunt.com/leaderboard/yearly/2025) | 当前榜单推广位链接回年度榜单;不作为2025新公司或收入。 | | [Tool Finder](https://www.producthunt.com/products/tool-finder) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-11](https://www.producthunt.com/products/tool-finder) | 资料显示较早产品发布;公司成立年与是否AI主营待核,不能把软件目录直接当AI公司。 | | [Chronicle: Cursor for Slides](https://www.producthunt.com/products/chronicle-6) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-12](https://www.producthunt.com/products/chronicle-6)、[PH-CHRONICLE-ACCESS](https://blog.chroniclehq.com/2023/02/14/chronicle-raises-7-5m-seed-round-from-accel-and-square-peg-to-reimagine-presentations/) | 演示文稿产品,与Chronicle Labs不同;历史公告正文两次超时,不能据搜索摘要确定成立年,继续待核。 | @@ -151,7 +151,7 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 | [Framer AI Agents](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH25-E-16](https://www.producthunt.com/products/framer)、[PH-FRAMER-ABOUT](https://www.framer.com/about) | 当前推广卡片指向Framer;官网列2014成立,不作2025新公司或2025发布证据。 | | [Tapflow 2.0](https://www.producthunt.com/products/tapflow) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PH25-E-17](https://www.producthunt.com/products/tapflow) | 将知识与文档打包出售;公司成立年、AI主营与收入归属待核。 | | [Musa](https://www.producthunt.com/products/musa-2) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-18](https://www.producthunt.com/products/musa-2) | 个人健康与自我照护产品;公司成立年及AI是否主营待核。 | -| [Trickle - Magic Canvas](https://www.producthunt.com/products/happycapy) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy) | 历史卡片现跳到Happycapy页面,页面称原Trickle团队;与PH26-04有产品沿革关联,不能据此确认新法人或成立年。 | +| [Trickle - Magic Canvas](https://www.producthunt.com/products/happycapy) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy)、[PH-HAPPYCAPY-ABOUT](https://happycapy.ai/about)、[PH-HAPPYCAPY-PRIVACY](https://happycapy.ai/privacy) | Trickle历史发布与Happycapy当前产品页相关联;官网功能及政策可读,但法人成立与股权沿革未核。政策生效日不作成立日,仍保留候选,不重复新增公司。 | 产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 16ecf37..8edef54 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-ph-3", + "version": "2026-10-30-ph-4", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28650,6 +28650,44 @@ "KILO-CODE" ] } + }, + { + "id": "AI073", + "name": "Lightfield(Tome转型对照)", + "url": "https://lightfield.com/", + "cat": "C06", + "year": null, + "team": null, + "location": null, + "business": "从既有Tome演示业务转向AI原生CRM,整合邮箱、会议、客户记录与销售工作流。", + "buyer": "创业公司创始人及客户运营、销售团队", + "delivery": "有公开套餐和操作文档;未独立运行,付费采用与收入待核。", + "notes": "2025为CRM产品上线,不能当公司成立年。政策列Magical Tome, Inc. dba Lightfield,2022年已有Tome投资方记录。精确注册年未核;Tome历史用户与融资不归Lightfield当前收入。", + "cohort": "2025产品上线;既有公司转型对照,不计2025—2026新成立公司", + "teamBasis": null, + "price": "Starter每用户月付89;Pro每工作区月额999、Growth月额1999但年付(原文$,币种待核);企业定制", + "pricingEvidence": "LF-PRICE", + "stage": "公开商业套餐与产品文档;业务收入待核", + "sourceType": "公司政策、产品及定价文档,历史投资方材料", + "evidenceIds": [ + "LF-ENTITY", + "LF-PIVOT", + "LF-HISTORY", + "LF-PRICE", + "LF-DOCS" + ], + "revenueStatus": "unknown", + "businessModel": "CRM订阅;席位和工作区套餐、用量额度及实施支持需拆分", + "entityBasis": "运营主体列Magical Tome, Inc. dba Lightfield;2025前已有Tome业务,精确成立年及重组细节未核", + "classificationBasis": "按主要客户与销售运营任务归C06;作为2025产品转型对照,非当年新成立公司。", + "technicalReview": { + "level": "description", + "reviewedAt": "2026-10-30", + "summary": "已读CRM记录自动更新与Agent操作的官方文档;未独立测试产品、准确率或厂商性能声明。", + "evidenceIds": [ + "LF-DOCS" + ] + } } ], "observations": [ @@ -44217,6 +44255,171 @@ "kind": "公司官网访问记录", "summary": "URL和搜索摘要指向2023年官方历史公告;两次读取正文均超时。", "limitation": "未当作全文已读;不凭URL、摘要或融资日期确认精确成立年,候选继续待核。" + }, + { + "id": "LF-ENTITY", + "companyId": "AI073", + "title": "Lightfield隐私声明中的运营主体", + "url": "https://lightfield.com/privacy", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "隐私声明将运营者列为Magical Tome, Inc. dba Lightfield,页面标注2026-04-18更新。", + "limitation": "政策更新日不等于公司成立日;未作工商注册查询或取得完整重组记录。" + }, + { + "id": "LF-PIVOT", + "companyId": "AI073", + "title": "Lightfield对Tome转型与CRM上线的介绍", + "url": "https://lightfield.com/blog/venturebeat-tome-s-founders-ditch-viral-presentation-app-with-20m-users-to-build-ai-native-crm", + "publishedAt": "2025-11-20", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2025-11-20公司介绍从Tome演示产品转向Lightfield CRM的上线背景。", + "limitation": "Tome历史用户不等于Lightfield客户或当前付费用户,不能转为CRM收入。" + }, + { + "id": "LF-HISTORY", + "companyId": "AI073", + "title": "Greylock 2022年对Tome的投资介绍", + "url": "https://greylock.com/blog/persuasion-through-stories/", + "publishedAt": "2022-03-21", + "accessedAt": "2026-10-30", + "kind": "投资方官方材料", + "summary": "2022-03-21投资方已介绍Tome、Keith Peiris与Henri Liriani创始团队,佐证此前已有业务。", + "limitation": "投资人材料有利益关系;仅作历史与主体连续线索,不填精确注册年或收入。" + }, + { + "id": "LF-PRICE", + "companyId": "AI073", + "title": "Lightfield现行套餐", + "url": "https://lightfield.com/pricing", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "Starter每用户月付89,Pro每工作区月额999但年付,Growth每工作区月额1999但年付,原文$;企业定制,部分套餐含实施与专人支持。", + "limitation": "席位、工作区、额度与实施服务不同;不把报价当实际ARPA或已确认收入,币种仍按原文保留。" + }, + { + "id": "LF-DOCS", + "companyId": "AI073", + "title": "Lightfield操作文档", + "url": "https://docs.lightfield.app/help/getting-started/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "文档描述连接邮箱、日历和会议后创建或更新CRM记录,通过Agent查询和修改客户信息。", + "limitation": "只读官方功能说明,未运行产品或独立核验自动化准确率、付费采用与效果。" + }, + { + "id": "PH-ATOMS-ABOUT", + "companyId": null, + "title": "Atoms官方产品与技术沿革", + "url": "https://atoms.dev/about", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官方描述MetaGPT研究、MGX产品及Atoms平台的连续演化,资料中的研究与产品年份并不等于当前主体成立年。", + "limitation": "社区人数、GitHub星标和论文数不是付费客户或收入;未做独立技术排名。" + }, + { + "id": "PH-ATOMS-TIMELINE", + "companyId": null, + "title": "MetaGPT至MGX和Atoms的官方时间线", + "url": "https://atoms.dev/metagpt", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "该页将MetaGPT列于2023、MGX列于2024;About页则写2024—2025,另有官网文章称2025商业上线。", + "limitation": "保留研究、产品化及商业上线口径差异;不擅自填成精确公司成立年或因此新增多家公司。" + }, + { + "id": "PH-ATOMS-ENTITY", + "companyId": null, + "title": "Atoms条款中的服务主体", + "url": "https://atoms.dev/terms-of-service", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "条款列技术服务提供者为美国MetaGPT LLC,并列Delaware文档号7606285。", + "limitation": "公司名及文档号不是成立日期;尚未核其与中国DeepWisdom各主体的股权或合同关系。" + }, + { + "id": "PH-HAPPYCAPY-ABOUT", + "companyId": null, + "title": "Happycapy官方产品介绍", + "url": "https://happycapy.ai/about", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网描述浏览器中的Claude Code、技能及隔离沙箱界面。", + "limitation": "功能自述未独立测试;与Trickle团队沿革不能单独证明新旧法人的关系。" + }, + { + "id": "PH-HAPPYCAPY-PRIVACY", + "companyId": null, + "title": "Happycapy隐私政策与主体缺项", + "url": "https://happycapy.ai/privacy", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "政策生效日为2026-08-28,文本以Happycapy自称,未据该文本确认法人成立年。", + "limitation": "政策生效日不是公司创立证据;不能由2026品牌发布反推2026成立。" + }, + { + "id": "PH-BRILA-ENTITY", + "companyId": null, + "title": "Brila官方运营主体说明", + "url": "https://brila.ai/about", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "Brila列为Generated Media, Inc.的产品,资料称其为Delaware公司并列注册号7627361。", + "limitation": "产品不自动视为独立公司;注册号、页脚年份均不作为成立年,母公司年份继续待核。" + }, + { + "id": "PH-BRILA-TERMS", + "companyId": null, + "title": "Brila条款与收费交付边界", + "url": "https://brila.ai/terms-and-conditions", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "条款约定与Generated Media, Inc.订立合同,提供基于商户资料的网站生成、托管和导出;套餐支持月或年续费。", + "limitation": "只用于业务与收费定义;生成网站数不等于独立付费客户或公司收入。" + }, + { + "id": "PH-FUNDRAISLY-ABOUT", + "companyId": null, + "title": "Fundraisly创始人与客户融资的业绩归属", + "url": "https://fundraisly.com/about-us", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网将Gett历史ARR、创始人融资经历和客户筹资、投资人会议列为不同背景和采用材料。", + "limitation": "这些不是Fundraisly公司收入;客户融资额与创始人此前公司的ARR不转为该产品ARR。" + }, + { + "id": "PH-FUNDRAISLY-ENTITY", + "companyId": null, + "title": "Fundraisly条款中的运营者", + "url": "https://fundraisly.com/terms-of-service", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "网站条款列运营者Accumulator Fundraising LLC,并提到月订阅及按通话收费;条款生效2026-03-19。", + "limitation": "条款生效不等于公司成立;服务与实际收费依合同,未取得注册年与公司收入。" + }, + { + "id": "PH-FUNDRAISLY-PLAN", + "companyId": null, + "title": "Fundraisly服务计划条款", + "url": "https://fundraisly.com/service-plan", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "服务计划对应Accumulator Fundraising LLC dba Fundraisly,写明按所选计划预付固定或经常性费用及约定交付。", + "limitation": "固定或经常性收费不自动等于可比SaaS ARR;金额、期限、人工服务、履约和续费需查实际合同。" } ], "reviews": [ @@ -45093,6 +45296,35 @@ ], "handling": "不导入这些收入数值;先查原始凭证、字段、单位、时间和业务口径。来源展示或采集异常与公司财务异常分别记录,不能据此推造假概率。", "scope": "dataset" + }, + { + "id": "LF-R-COHORT", + "type": "转型与历史归属", + "company": "Lightfield", + "summary": "2025为CRM产品上线;既有Tome业务与Magical Tome主体线索不能重计成新成立公司,精确注册年未核。", + "evidenceIds": [ + "LF-ENTITY", + "LF-PIVOT", + "LF-HISTORY" + ], + "handling": "成立年保留未知并标转型对照;不转移Tome历史用户、融资或收入,也不将套餐价格反推实际ARPA。", + "scope": "companies", + "companyIds": [ + "AI073" + ] + }, + { + "id": "FUNDRAISLY-R-ATTRIBUTION", + "type": "履历、客户融资与收入边界", + "company": "Fundraisly(成立年待核候选)", + "summary": "官网包含创始人Gett历史ARR、个人融资经历与客户筹资和会议业绩;当前主体为Accumulator Fundraising LLC。", + "evidenceIds": [ + "PH-FUNDRAISLY-ABOUT", + "PH-FUNDRAISLY-ENTITY", + "PH-FUNDRAISLY-PLAN" + ], + "handling": "不新增收入观测。公司成立年、合同金额、人工交付与经常性费用继续待核;条款生效日不当成立年。", + "scope": "excluded-candidate" } ], "coverage": { @@ -45125,7 +45357,12 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "note": "运营主体Accumulator Fundraising LLC;成立年待核。固定/经常性或按通话的服务收费需拆分;Gett历史ARR、创始人及客户筹资不作Fundraisly收入。", + "evidenceIds": [ + "PH-FUNDRAISLY-ABOUT", + "PH-FUNDRAISLY-ENTITY", + "PH-FUNDRAISLY-PLAN" + ] }, { "id": "PH26-02", @@ -45149,7 +45386,11 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "note": "官网及条款列Generated Media, Inc.运营;注册号不代表日期,母公司成立年待核。网站生成与托管订阅为产品业务,不因2026发布新增独立公司。", + "evidenceIds": [ + "PH-BRILA-ENTITY", + "PH-BRILA-TERMS" + ] }, { "id": "PH26-04", @@ -45159,9 +45400,11 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "与PH25-19 Trickle历史发布共用当前产品页;页面称原Trickle团队。公司成立年与法人沿革待核,不因改名或新发布自动算新公司。", + "note": "Trickle历史发布与Happycapy当前产品页相关联;官网功能及政策可读,但法人成立与股权沿革未核。政策生效日不作成立日,仍保留候选,不重复新增公司。", "evidenceIds": [ - "PH25-E-19" + "PH25-E-19", + "PH-HAPPYCAPY-ABOUT", + "PH-HAPPYCAPY-PRIVACY" ] }, { @@ -45242,8 +45485,14 @@ "categoryId": "C06", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "existing-outside-cohort", + "note": "映射Magical Tome, Inc.转型对照;2025是CRM上线,2022已有Tome业务,精确注册年未核,不计2026新公司。", + "companyId": "AI073", + "evidenceIds": [ + "LF-ENTITY", + "LF-PIVOT", + "LF-HISTORY" + ] }, { "id": "PH26-12", @@ -45473,9 +45722,11 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "产品更名后沿用发布页,需追溯创立主体;不单独新增MGX和Atoms两家公司。", + "note": "MetaGPT研究→MGX→Atoms为产品沿革;官网产品化年份有2024与2024—2025口径,技术服务方列MetaGPT LLC。公司成立年和跨主体关系待核,不因更名新增公司。", "evidenceIds": [ - "PH25-E-09" + "PH-ATOMS-ABOUT", + "PH-ATOMS-TIMELINE", + "PH-ATOMS-ENTITY" ] }, { @@ -45606,9 +45857,11 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "历史卡片现跳到Happycapy页面,页面称原Trickle团队;与PH26-04有产品沿革关联,不能据此确认新法人或成立年。", + "note": "Trickle历史发布与Happycapy当前产品页相关联;官网功能及政策可读,但法人成立与股权沿革未核。政策生效日不作成立日,仍保留候选,不重复新增公司。", "evidenceIds": [ - "PH25-E-19" + "PH25-E-19", + "PH-HAPPYCAPY-ABOUT", + "PH-HAPPYCAPY-PRIVACY" ] } ] diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 5f92877..62aa55e 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-4", + "version": "2026-10-30-5", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -60,7 +60,7 @@ ], "initialAccess": "官网可读取", "boundary": "2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。", - "nextCheck": "继续补两年其余分页/日期、仅图片位置及21条成立年待核候选;推广位与旧公司新产品不纳入新成立公司。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及20条成立年待核候选;核清品牌、产品与运营主体关系,不转移历史或客户业绩。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index d5e68e4..69d5724 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-ph-3", + "sourceVersion": "2026-10-30-ph-4", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", From 62d3d498bbf1653150d4139376df6e418e115240 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 16:09:43 +0800 Subject: [PATCH 08/14] =?UTF-8?q?=E5=A4=8D=E6=A0=B8EveryApp=E5=85=A5?= =?UTF-8?q?=E8=A1=A8=E5=B9=B6=E4=BF=9D=E7=95=99=E5=8E=9F=E5=80=99=E9=80=89?= =?UTF-8?q?=E5=88=9D=E7=AD=9B=E5=AE=A1=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 11 +- apps/docs/scripts/auth-cli.ts | 4 +- apps/docs/src/lib/ai-research.ts | 13 + apps/docs/tests/research.test.ts | 32 +- .../docs/ai-company-research/00-overview.md | 3 + .../ai-company-research/01-income-snapshot.md | 2 +- .../02-coverage-and-gaps.md | 47 ++- content/research/ai-companies.seed.json | 332 +++++++++++++++++- content/research/ai-companies.sources.json | 4 +- content/research/ai-income-analysis.json | 2 +- scripts/audit-ai-research.py | 25 ++ 11 files changed, 430 insertions(+), 45 deletions(-) diff --git a/README.md b/README.md index 9f9df3e..1e5f22a 100644 --- a/README.md +++ b/README.md @@ -98,13 +98,14 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,017 条公司/产品记录、10 类业务及待分类组、1,154 条证据记录和 187 条经营与技术观测。 -其中保留 89 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 -Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中20条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 +当前资料包含 1,018 条公司/产品记录、10 类业务及待分类组、1,172 条证据记录和 187 条经营与技术观测。 +其中保留 90 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中18条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;61条核查中48条指向具体公司、4条属于全局方法、9条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;64条核查中49条指向具体公司、4条属于全局方法、11条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 Lightfield按Magical Tome主体与2025前历史业务列为CRM转型对照,成立年未知,不计新成立公司;Fundraisly成立年待核,其客户融资和创始人历史ARR不转移为公司收入。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 +原候选36088 EveryApp从AI不明经补证入表,`directoryRechecks`保存后续复核,原1,428条台账及928条原始新增计数不改。OpenSEO与EveryApp不重复计公司;定价、星标、客户数和数据成本加价均不转为ARR。 验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 保留被撤回的声明作为核查记录,并排除收入比较;并购后业务、管理层预测与历史里程碑单列。 @@ -146,7 +147,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。 AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。 技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。 -当前10条完成该字段的专项记录,其中4条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 +当前11条完成该字段的专项记录,其中5条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。 `pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index be07f26..23403ff 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -185,9 +185,9 @@ async function main() { assert.equal(researchResponse.status, 200, "authenticated research API"); assert.ok(researchResponse.headers.get("cache-control")?.includes("no-store")); const research = await researchResponse.json(); - assert.equal(research.companies.length, 1017); + assert.equal(research.companies.length, 1018); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1154); + assert.equal(research.evidence.length, 1172); assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); diff --git a/apps/docs/src/lib/ai-research.ts b/apps/docs/src/lib/ai-research.ts index f2f8a65..4ffbf31 100644 --- a/apps/docs/src/lib/ai-research.ts +++ b/apps/docs/src/lib/ai-research.ts @@ -57,6 +57,10 @@ export type ResearchSnapshot = { categories: ResearchCategory[]; companies: ResearchCompany[]; observations: ResearchObservation[]; evidence: ResearchEvidence[]; reviews: ResearchReview[]; coverage?: ResearchCoverage; candidateBatches?: ResearchCandidateBatch[]; + directoryRechecks?: { + ycId: number; originalStatus: "ai-unclear" | "year-outside-or-missing" | "date-conflict"; + companyId: string; reviewedAt: string; evidenceIds: string[]; reason: string; + }[]; }; export function evidenceUrl(value: string): string | undefined { @@ -132,6 +136,15 @@ export function validateResearch(snapshot: ResearchSnapshot) { } } const coverage = snapshot.coverage; + unique((snapshot.directoryRechecks ?? []).map((row) => String(row.ycId)), "directory rechecks"); + for (const row of snapshot.directoryRechecks ?? []) { + if (!Number.isSafeInteger(row.ycId) || row.ycId <= 0 || !companies.has(row.companyId) || + !["ai-unclear", "year-outside-or-missing", "date-conflict"].includes(row.originalStatus) || + !/^\d{4}-\d{2}-\d{2}$/.test(row.reviewedAt) || Number.isNaN(Date.parse(row.reviewedAt)) || + new Date(row.reviewedAt).toISOString().slice(0, 10) !== row.reviewedAt || row.reviewedAt > snapshot.asOf || + !row.reason.trim() || !row.evidenceIds.length || row.evidenceIds.some((id) => !evidence.has(id))) + throw new Error(`Invalid directory recheck: ${row.ycId}`); + } if (coverage && (coverage.profilesRead + coverage.failedProfiles !== coverage.candidateRecords || coverage.matchingProfiles !== coverage.existingProfiles + coverage.newProfiles || coverage.matchingProfiles + coverage.otherOrMissingYear + coverage.unclearAI + coverage.dateConflicts !== coverage.profilesRead || diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index 3fb3442..5473387 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -23,10 +23,11 @@ test("research revisions share the authentication database and preserve replay l for (let i = 0; i < 20; i++) consumeCode(config, "invalid"); assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); - assert.equal(initial.companies.length, 1017); - assert.equal(initial.evidence.length, 1154); + assert.equal(initial.companies.length, 1018); + assert.equal(initial.evidence.length, 1172); assert.equal(initial.observations.length, 187); assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); + assert.deepEqual(initial.directoryRechecks, seed.directoryRechecks, "follow-up classifications persist without rewriting the discovery audit"); assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records"); const db = openSiteDatabase(); const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as { name: string }[]; @@ -63,9 +64,9 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 48); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 49); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 4); - assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 9); + assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 11); const review = snapshot.reviews.find((r) => r.id === "R4")!; assert.deepEqual(reviewCompanyIds(snapshot, review), ["AI007", "AI013", "AI021", "AI034"]); assert.deepEqual(reviewCompanyIds(snapshot, snapshot.reviews.find((r) => r.id === "CN-R-PSI")!), []); @@ -84,11 +85,11 @@ test("reviews link explicit companies without turning global or excluded cases i test("disclosure counts exclude client income, biographies, targets and duplicate milestones", () => { const snapshot = seed as ResearchSnapshot; const summary = categorySummary(snapshot); - assert.equal(summary.reduce((n, c) => n + c.count, 0), 1017); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1018); assert.equal(summary.reduce((n, c) => n + c.self, 0), 26); assert.equal(summary.reduce((n, c) => n + c.estimate, 0), 1); assert.equal(summary.reduce((n, c) => n + c.platform, 0), 16); - assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 974); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 975); assert.equal(snapshot.companies.find((c) => c.name === "Rork")?.revenueStatus, "unknown"); assert.equal(snapshot.companies.find((c) => c.name === "Result")?.revenueStatus, "unknown"); assert.ok(snapshot.observations.filter((o) => o.selection === "signal").every((o) => o.scope === "公司整体")); @@ -96,8 +97,8 @@ test("disclosure counts exclude client income, biographies, targets and duplicat test("technical reviews keep accessible materials separate from tested capabilities", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 10); - assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 4); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 11); + assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 5); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1); assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown"); assert.match(snapshot.companies.find((c) => c.id === "AI051")!.technicalReview!.testScope!, /Sep 2026/); @@ -299,7 +300,7 @@ test("unreconciled directory financials remain source reviews instead of income assert.ok(review.evidenceIds.includes("PH-TANA-DR")); assert.equal(reviewCompanyIds(snapshot, review).length, 0); assert.ok(!snapshot.observations.some((o) => o.evidence === "PH-TANA-DR")); - assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 20); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 18); }); test("product pivots and founder histories do not become new company years or current revenue", () => { @@ -313,3 +314,16 @@ test("product pivots and founder histories do not become new company years or cu assert.ok(!platformIncomeSample(snapshot, { windowDays: null }).points.some((point) => point.company.id === pivot.id)); assert.ok(!snapshot.observations.some((o) => ["PH-FUNDRAISLY-ABOUT", "LF-PIVOT", "LF-HISTORY"].includes(o.evidence)), "other ventures' ARR, users and funding must not transfer"); }); + +test("follow-up evidence can admit an uncertain directory candidate without rewriting its original status", () => { + const snapshot = structuredClone(seed) as ResearchSnapshot; + const followup = snapshot.directoryRechecks!.find((row) => row.ycId === 36088)!; + const original = coverageAudit.records.find((row) => row.ycId === followup.ycId)!; + assert.equal(original.status, "ai-unclear"); + assert.equal(followup.originalStatus, original.status); + assert.equal(snapshot.companies.find((c) => c.id === followup.companyId)?.year, 2026); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).find((r) => r.name === "OpenSEO")?.companyId, followup.companyId); + assert.ok(!snapshot.observations.some((o) => ["SEO-PRICE", "UP-YC", "PAZI-PRICE"].includes(o.evidence)), "pricing, other ventures' ARR and prepaid balances stay outside income observations"); + followup.companyId = "missing-company"; + assert.throws(() => validateResearch(snapshot), /directory recheck/); +}); diff --git a/content/docs/ai-company-research/00-overview.md b/content/docs/ai-company-research/00-overview.md index e0254fe..62348d0 100644 --- a/content/docs/ai-company-research/00-overview.md +++ b/content/docs/ai-company-research/00-overview.md @@ -21,6 +21,7 @@ | 行业专业Agent与服务 | LunaBill、Plena Health、Bizmark | 有合同ARR、数量级或ARR自述,日历截止日和交付拆分不完整 | 采购周期、上线工时、失败处理与验收标准 | 合同、经常性与实施费拆分、使用深度 | | AI辅助工程与研究服务 | Marengo、Harbor | 有首月收入、待交付或多年服务合同;不直接当ARR | 已验收项目毛利、专业人员工时、返工和责任成本 | 合同收入确认、软件/服务拆分、应收账款和交付集中度 | | 开源编程工具与企业治理 | [Kilo Code](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 官方定价区分席位、推理、充值处理费和云算力;已被收购,收入未知 | 企业付费转换、平台净收入、推理转付与补贴、支持成本 | 付费客户、留存、收入确认及并表边界;不能从token吞吐推ARR | +| 开源工具、Agent网关与数据服务 | [EveryApp / OpenSEO](/docs/other-research/ai-company-research/overview?company=AI074#research-company-detail) | 官方代码可读;OpenSEO有订阅额度及数据成本加价,EveryApp托管收费仍为计划 | 自托管到付费转化、数据转付与净收入、实际用量、支持成本及供应商依赖 | 真实付费和续费、收入确认、加价与毛利的差异;28%成本加价不等于公司毛利率 | | 企业CRM与组织上下文 | [Lightfield转型对照](/docs/other-research/ai-company-research/overview?company=AI073#research-company-detail) | 有席位及工作区套餐,部分含实施、专人支持;2025是产品上线,既有公司历史单列 | 数据接入成本、记录与行动准确率、销售团队留存、实施和人工支持毛利 | 付费采用、用量额度、续费及真实ARPA;不把Tome历史用户当CRM客户 | | 模型、算力与机器人 | Wafer、Induction Labs、Congruent | 可确定产品方向;团队小或融资多不证明单位经济 | 客户真实负载、性能成本、交付与售后成本 | 同口径收入、资本开支、独立性能测试 | @@ -46,6 +47,8 @@ [Fundraisly创始人介绍](https://fundraisly.com/about-us)还展示了履历与客户融资的归属问题:此前Gett业务的ARR、创始人融资经历以及客户筹资,均不等于Fundraisly收入。[现行条款](https://fundraisly.com/terms-of-service)列运营者为Accumulator Fundraising LLC,并提到月订阅和按通话收费;条款生效日不当成立日,固定或经常性费用也需查实际合同、交付与续费,才能讨论可比ARR。该项目目前仍在成立年待核候选中。 +[Pazi官方目录](https://www.ycombinator.com/companies/pazi)中的Founded 2026、Winter 2024和2023 Pythagora历史叙述尚未对齐;[条款](https://pazi.ai/terms)仍列Pythagora Technologies Incorporated运营。其定价页所称业务funding与余额可用于任务及广告,不能直接当软件ARR。项目保持年份待核,避免以一个成立字段覆盖主体和产品历史。 + ### 从原文到可比较收入:新增核查实例 以下均为2026-10-30读取的公司自述,读取日不代表收入业务截止日。点击公司可查看分项观测、核查和原始来源。原文仅有美元符号时保留币种待核;未给币种的数字不补成美元。 diff --git a/content/docs/ai-company-research/01-income-snapshot.md b/content/docs/ai-company-research/01-income-snapshot.md index 528603f..8c65c8a 100644 --- a/content/docs/ai-company-research/01-income-snapshot.md +++ b/content/docs/ai-company-research/01-income-snapshot.md @@ -2,7 +2,7 @@ 截至 2026-10-30,7日窗口内有 14 个产品的美元平台MRR可纳入分组描述。创意软件订阅组的样本均值较高、CV也较大;营销软件组与消费者个人应用组的CV接近。各组只有1至5个产品,尚不足以估计行业总体或造假概率。 -这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,017条公司/产品记录的收入普查。 +这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,018条公司/产品记录的收入普查。 ## 7日窗口的分组结果 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index fe49a1c..bdf2298 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -1,6 +1,6 @@ # AI 公司资料覆盖与缺项 -截至 2026-10-30,研究表含1,017条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 +截至 2026-10-30,研究表含1,018条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。 @@ -19,23 +19,23 @@ | AI业务待确认 | 192 | 不强行把背景关键词当主营 | | 成立年与批次冲突 | 6 | 另保留核查记录 | -全表由912条目录基础项和105条个案或平台记录组成。候选池已匹配项之外另有55条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 +全表由912条目录基础项和106条个案或平台记录组成。候选池已匹配项之外另有56条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 ## 成立年与证据深度 | 维度 | 当前记录 | 解读 | | --- | --- | --- | | 记录为2025年成立 | 620 | 成立来源和精度见公司明细 | -| 记录为2026年成立 | 391 | 不将产品发布日期代替成立日 | +| 记录为2026年成立 | 392 | 不将产品发布日期代替成立日 | | 成立年未知或范围外 | 6 | 发布/转型对照单列,不进入两年成立分组 | | 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 | | 其他目录基础项 | 752 | 规则初分或资料不足,继续待复核 | -| 有团队数字 | 945 | 多为自报Team Size或Employees,时点与口径不统一 | -| 专项技术证据记录 | 10 | 其中5条自述、4条公开材料、1条第三方评测 | +| 有团队数字 | 946 | 多为自报Team Size或Employees,时点与口径不统一 | +| 专项技术证据记录 | 11 | 其中5条自述、5条公开材料、1条第三方评测 | | 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR | | 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 | | 仅第三方估算 | 1 | 不与直接披露混合 | -| 暂无可用收入数字 | 974 | 包含尚未逐家搜索的目录项,不代表没有收入 | +| 暂无可用收入数字 | 975 | 包含尚未逐家搜索的目录项,不代表没有收入 | ## 业务分类与数据入口 @@ -43,7 +43,7 @@ | --- | --- | | [基础模型](/docs/other-research/ai-company-research/overview?category=C01) | 29 | | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 102 | -| [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 51 | +| [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 52 | | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 110 | | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 176 | | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 53 | @@ -55,16 +55,27 @@ ## 已使用来源的分布 -1,154条证据记录对应1,140个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,172条证据记录对应1,158个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | -| YC官方目录 | 986 | 977 | 公司自述的成立、团队与业务;英文及加速器样本偏多 | +| YC官方目录 | 989 | 980 | 公司自述的成立、团队与业务;英文及加速器样本偏多 | | TrustMRR | 18 | 18 | 支付平台重建指标及方法;公开者存在选择偏差,非财务审计 | | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 133 | 129 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 148 | 144 | 按每条来源限制理解,不能统一当作独立证据 | + +## 原候选池的后续复核 + +原始1,428条读取快照与初筛计数保持不变;下表记录当时未入表、后续补足证据后进入公司表的项目。初筛未通过不是永久排除。后续入表不回写为当时已匹配,也不重复计入928条原始新增目录项。 + +| 原候选 | 原始状态 | 后续公司记录 | 复核证据 | 处理与限制 | +| --- | --- | --- | --- | --- | +| [EveryApp · YC36088](https://www.ycombinator.com/companies/everyapp) | ai-unclear | [EveryApp(含OpenSEO)](/docs/other-research/ai-company-research/overview?company=AI074#research-company-detail) | [EA-YC](https://www.ycombinator.com/companies/everyapp)、[EA-HOME](https://everyapp.com/)、[SEO-HOME](https://openseo.so/) | 2026-10-30:原快照规则初筛未确认AI主营;本次确认Agent应用托管、MCP及OpenSEO产品关联后入表。保留2026成立来源及法律主体待核限制,不更改原初筛状态或928条发现计数。 | + +已记录1条后续复核入表;其余未入表候选仍按原状态保留缺项,不能把这一批复核视为完成全部模糊项。 + ## 来源清单与验收边界 @@ -74,10 +85,10 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | 来源 | 当前状态 | 证据 / 公司 / 观测数 | 已核对范围 | 剩余核查 | | --- | --- | --- | --- | --- | -| S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 986 / 969 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | +| S01 [Y Combinator](https://www.ycombinator.com/companies) | 候选池逐条已读 | 989 / 970 / 82 | 已读取八个2025—2026批次镜像候选池1428条,再核YC官方页面;不声称覆盖全部YC历年或未公开公司。 | 继续复核规则初分和缺项;候选明细见逐条台账。 | | S02 [TechCrunch AI](https://techcrunch.com/category/artificial-intelligence/) | 定向使用,未穷尽 | 3 / 2 / 1 | 已使用公司相关新闻;尚未逐条清点2025—2026栏目档案。 | 建立两年公司报道候选表,排除老公司新产品及重复转述。 | | S03 [Dealroom](https://dealroom.co/) | 定向使用,未穷尽 | 1 / 0 / 0 | 已读Tana公开公司档案并记录成立年线索与财务字段不一致;尚未取得2025—2026成立筛选结果集,个案不等于目录全量。 | 确认公开可取得的两年成立筛选清单;逐项追溯财务原始凭证及字段口径,受权限限制保留缺项。 | -| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 21 / 2 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及20条成立年待核候选;核清品牌、产品与运营主体关系,不转移历史或客户业绩。 | +| S04 [Product Hunt](https://www.producthunt.com/) | 定向使用,未穷尽 | 25 / 3 / 0 | 2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。 | 继续补两年其余分页/日期、仅图片位置及18条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。 | | S05 [Sacra](https://sacra.com/) | 定向使用,未穷尽 | 3 / 1 / 3 | 已用于定向估算及日期口径交叉核查;无全站公司名录读取台账。 | 保留估算与公司披露差异,核实历史截至日。 | | S06 [Bessemer](https://www.bvp.com/atlas/the-state-of-ai-2025) | 背景研究 | 0 / 0 / 0 | 用于行业分类和增长研究背景;不是新成立公司普查。 | 核报告样本、方法与年份,不能将组合公司清单当总体。 | | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | @@ -85,7 +96,7 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | | S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 63 / 17 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 74 / 18 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | @@ -98,7 +109,7 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 [发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 -本批19条:2条关联公司、2条关联范围外对照、4条范围外不新增公司、10条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:3条关联公司、2条关联范围外对照、5条范围外不新增公司、8条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 | 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | @@ -107,13 +118,13 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 | [Brila](https://www.producthunt.com/products/brila-2) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年待核 | — | [PH-BRILA-ENTITY](https://brila.ai/about)、[PH-BRILA-TERMS](https://brila.ai/terms-and-conditions) | 官网及条款列Generated Media, Inc.运营;注册号不代表日期,母公司成立年待核。网站生成与托管订阅为产品业务,不因2026发布新增独立公司。 | | [happycapy](https://www.producthunt.com/products/happycapy) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [PH25-E-19](https://www.producthunt.com/products/happycapy)、[PH-HAPPYCAPY-ABOUT](https://happycapy.ai/about)、[PH-HAPPYCAPY-PRIVACY](https://happycapy.ai/privacy) | Trickle历史发布与Happycapy当前产品页相关联;官网功能及政策可读,但法人成立与股权沿革未核。政策生效日不作成立日,仍保留候选,不重复新增公司。 | | [Cowork](https://www.producthunt.com/products/claude) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-COWORK-OWNER](https://www.anthropic.com/news/introducing-anthropic-labs)、[PH-ANTHROPIC-FOUND](https://www.anthropic.com/events/builder-summit-bengaluru) | Cowork是Anthropic产品,官方称母公司2021成立;2026研究预览不新增公司,也不转移其他Claude产品收入。 | -| [Upstream](https://www.producthunt.com/products/upstream-3) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | -| [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Upstream](https://www.producthunt.com/products/upstream-3) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [UP-YC](https://www.ycombinator.com/companies/upstream)、[UP-HOME](https://www.upstream.do/)、[PH-UP](https://www.producthunt.com/products/upstream-3) | YC官方列2023成立、S23批次,2026发布不重算公司年;创始人此前Asana、Algolia的ARR不归Upstream。 | +| [Goldfish](https://www.producthunt.com/products/goldfish-early-access) | [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 成立年待核 | — | [GOLD-HOME](https://goldfish.sh/)、[GOLD-TERMS](https://goldfish.sh/tos)、[GOLD-PRIVACY](https://goldfish.sh/privacy)、[PH-GOLD](https://www.producthunt.com/products/goldfish-early-access) | 运营者Goldfish AI Inc.,成立年未核;政策生效日不当成立日。测试期间免费不说明收入为零,点击计数不等于客户数或MRR。 | | [Framer 3.0](https://www.producthunt.com/products/framer) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 成立年范围外,不新增公司 | — | [PH-FRAMER-ABOUT](https://www.framer.com/about) | Framer官网列2014成立;3.0及AI新产品不作2026新公司,未新增公司。 | -| [OpenSEO](https://www.producthunt.com/products/openseo) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [OpenSEO](https://www.producthunt.com/products/openseo) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 已关联公司 | [EveryApp(含OpenSEO)](/docs/other-research/ai-company-research/overview?company=AI074#research-company-detail) | [EA-YC](https://www.ycombinator.com/companies/everyapp)、[SEO-HOME](https://openseo.so/)、[PH-SEO](https://www.producthunt.com/products/openseo) | OpenSEO归EveryApp;官方目录列EveryApp 2026成立,两者只计一个公司。原候选36088从AI不明复核入表,原台账计数不回写。 | | [Clarify](https://www.producthunt.com/products/clarify-6) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年范围外,不新增公司 | — | [PH-CLARIFY-LINKEDIN](https://www.linkedin.com/company/getclarify)、[PH-CLARIFY-MANIFESTO](https://www.clarify.ai/blog/manifesto) | Clarify CRM公司主页列2024成立,2024创始人宣言佐证已有业务;不与医疗及其他同名Clarify混淆。 | | [Lightfield](https://www.producthunt.com/products/lightfield) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 已有关联,年份范围外 | [Lightfield(Tome转型对照)](/docs/other-research/ai-company-research/overview?company=AI073#research-company-detail) | [LF-ENTITY](https://lightfield.com/privacy)、[LF-PIVOT](https://lightfield.com/blog/venturebeat-tome-s-founders-ditch-viral-presentation-app-with-20m-users-to-build-ai-native-crm)、[LF-HISTORY](https://greylock.com/blog/persuasion-through-stories/) | 映射Magical Tome, Inc.转型对照;2025是CRM上线,2022已有Tome业务,精确注册年未核,不计2026新公司。 | -| [Pazi](https://www.producthunt.com/products/pazi) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | +| [Pazi](https://www.producthunt.com/products/pazi) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年待核 | — | [PAZI-YC](https://www.ycombinator.com/companies/pazi)、[PAZI-TERMS](https://pazi.ai/terms)、[PAZI-PRICE](https://pazi.ai/pricing)、[PH-PAZI](https://www.producthunt.com/products/pazi) | Founded 2026与W24及2023 Pythagora历史同页冲突;条款运营者为Pythagora Technologies Incorporated,法律沿革未核,保留年份待核。业务余额与广告支出不当ARR。 | | [SuperX](https://www.producthunt.com/products/superx) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。 | | [Kilo Code for VS Code](https://www.producthunt.com/products/kilocode) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已关联公司 | [Kilo Code(已被Anaconda收购)](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | [KILO-START](https://www.anaconda.com/blog/kilo-code-joins-anaconda-what-builders-should-know)、[KILO-PH](https://www.producthunt.com/products/kilocode) | 映射同一Kilo Code个案,不因插件与托管产品分别发布重复新增公司。 | | [Brew](https://www.producthunt.com/products/brew-5) | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 成立年待核 | — | 成立证据待补,产品页读取状态见候选记录 | 产品页读取超时,保留榜单发现;主体、成立年和收入待核。 | diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 8edef54..95bec6e 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-ph-4", + "version": "2026-10-30-ph-5", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28688,6 +28688,47 @@ "LF-DOCS" ] } + }, + { + "id": "AI074", + "name": "EveryApp(含OpenSEO)", + "url": "https://everyapp.com/", + "cat": "C03", + "year": 2026, + "team": 2, + "location": null, + "business": "在用户Cloudflare账户托管开源应用,通过统一网关与MCP供人和AI Agent使用;OpenSEO为其SEO数据及Agent工具产品。", + "buyer": "开发者、使用Agent的企业团队及SEO从业者", + "delivery": "公开自托管代码和OpenSEO商业套餐可读;EveryApp托管服务仍以计划描述,未独立运行。", + "notes": "YC列2026成立。原候选36088曾标AI业务待确认,本次通过PH关联与官网/代码补核入表;原台账不回写。OpenSEO不另计公司,用户与星标不当收入。", + "cohort": "2026年成立(YC公司自述)", + "teamBasis": "YC Team Size为2;2026-10-30读取,业务截止日未列", + "price": "OpenSEO月额10/30/200(原文$),含用量额度;额外数据请求按供应商成本加价28%并取整;EveryApp托管计划待核", + "pricingEvidence": "SEO-PRICE", + "stage": "开源自托管与产品商业套餐公开;平台托管进度及收入待核", + "sourceType": "Product Hunt线索复查YC、公司官网与官方源码", + "evidenceIds": [ + "EA-YC", + "EA-HOME", + "SEO-HOME", + "SEO-PRICE", + "SEO-CODE", + "EA-CODE", + "PH-SEO" + ], + "revenueStatus": "unknown", + "businessModel": "开源自托管获客、托管与数据用量收费;订阅额度、数据转付和平台净额分开", + "entityBasis": "YC将EveryApp与创始人的OpenSEO归同一业务;法律并表与合同主体尚未另行核验", + "classificationBasis": "按Agent应用托管、网关及MCP设施归C03;OpenSEO产品任务初分C06,不另计一家公司。", + "technicalReview": { + "level": "public-artifact", + "reviewedAt": "2026-10-30", + "summary": "EveryApp与OpenSEO官方仓库可访问,OpenSEO源码及MIT许可证可读;未执行、自托管或复测厂商性能。", + "evidenceIds": [ + "EA-CODE", + "SEO-CODE" + ] + } } ], "observations": [ @@ -44420,6 +44461,204 @@ "kind": "公司官方材料", "summary": "服务计划对应Accumulator Fundraising LLC dba Fundraisly,写明按所选计划预付固定或经常性费用及约定交付。", "limitation": "固定或经常性收费不自动等于可比SaaS ARR;金额、期限、人工服务、履约和续费需查实际合同。" + }, + { + "id": "EA-YC", + "companyId": "AI074", + "title": "EveryApp官方公司目录与OpenSEO归属", + "url": "https://www.ycombinator.com/companies/everyapp", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "YC官方页面中的公司自述", + "summary": "YC列成立2026、Fall 2026、团队2;创始人将OpenSEO列为自己的产品,描述AI Agent应用托管与网关,托管服务收费为计划。", + "limitation": "目录自述非注册核验;团队与采用数截至日未给,计划收费不当已实现收入。" + }, + { + "id": "EA-HOME", + "companyId": "AI074", + "title": "EveryApp官方托管与产品目录", + "url": "https://everyapp.com/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "网站关联OpenSEO,描述在用户Cloudflare账户托管开源应用,并通过统一网关供人和Agent使用。", + "limitation": "Cloudflare基础设施费用是供应商成本,不是EveryApp平台收入;功能及安全自述未独立测试。" + }, + { + "id": "SEO-HOME", + "companyId": "AI074", + "title": "OpenSEO官方产品与EveryApp归属", + "url": "https://openseo.so/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网列Part of EveryApp,提供SEO数据、MCP和Agent技能,使用DataForSEO数据。", + "limitation": "是EveryApp产品而非第二家公司;示例关键词、流量和工具输出不作公司实绩。" + }, + { + "id": "SEO-PRICE", + "companyId": "AI074", + "title": "OpenSEO托管定价及用量加价", + "url": "https://openseo.so/pricing", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "月额Base10、Pro30、Agency200,原文$;附带用量额度,额外数据请求按成本加价28%并取整。", + "limitation": "套餐额度、充值、供应商成本、确认收入与净额不同;28%加价率不是公司毛利率,也不从报价推ARR。" + }, + { + "id": "SEO-CODE", + "companyId": "AI074", + "title": "OpenSEO官方开源仓库", + "url": "https://github.com/every-app/open-seo", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "仓库与openseo.so相互关联,公开源码与MIT许可证可读,说明自托管及托管商业版本。", + "limitation": "代码可读不代表运行成功或安全、性能已验证;没有部署或执行。" + }, + { + "id": "EA-CODE", + "companyId": "AI074", + "title": "EveryApp官方仓库", + "url": "https://github.com/every-app/every-app", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网指向同组织下EveryApp公开应用平台仓库。", + "limitation": "只确认仓库与文件可访问,未运行部署或独立评测。" + }, + { + "id": "UP-YC", + "companyId": null, + "title": "Upstream官方成立年及履历归属", + "url": "https://www.ycombinator.com/companies/upstream", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "YC官方页面中的公司自述", + "summary": "YC字段列Founded 2023、Summer 2023;产品链接upstream.do,创始人另述此前Asana和Algolia经历。", + "limitation": "创始人此前公司的ARR不归Upstream;2026产品发布不重置成立年。" + }, + { + "id": "UP-HOME", + "companyId": null, + "title": "Upstream官方产品介绍", + "url": "https://www.upstream.do/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "产品面向邮件工作流中的人和Agent,公开介绍分类、回复、跟进及MCP接入。", + "limitation": "功能、用户反馈及免费体验不作为已确认付费采用或公司收入。" + }, + { + "id": "PAZI-YC", + "companyId": null, + "title": "Pazi官方目录日期冲突", + "url": "https://www.ycombinator.com/companies/pazi", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "YC官方页面中的公司自述", + "summary": "同页列Founded 2026、Winter 2024,并保留创始人2023年10月组建Pythagora的叙述。", + "limitation": "可能涉及品牌、主体或字段变化,原因未核;不把2026字段直接当确定成立年,也不擅自改成2023。" + }, + { + "id": "PAZI-TERMS", + "companyId": null, + "title": "Pazi官方服务运营主体", + "url": "https://pazi.ai/terms", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "条款列Pythagora Technologies Incorporated为运营者,政策生效2026-08-21。", + "limitation": "条款日期不是成立日;保留与YC日期冲突及Pythagora历史关联,未取得重组或注册文件。" + }, + { + "id": "PAZI-PRICE", + "companyId": null, + "title": "Pazi订阅与业务余额", + "url": "https://pazi.ai/pricing", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "定价选择月度funding并加入业务余额,用于Agent任务、内容或广告;充值与订阅分开,余额可累积。", + "limitation": "余额、广告支出和预付额不直接当已确认收入或SaaS ARR;币种及实际合同待核。" + }, + { + "id": "GOLD-HOME", + "companyId": null, + "title": "Goldfish官方产品及免费测试状态", + "url": "https://goldfish.sh/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官网称本地上下文记忆助手,测试期间免费,页脚列Goldfish AI Inc.。", + "limitation": "测试免费不表示公司收入为零;点击计数不是用户数、付费数或MRR,成立年未核。" + }, + { + "id": "GOLD-TERMS", + "companyId": null, + "title": "Goldfish条款与运营者", + "url": "https://goldfish.sh/tos", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "条款列Goldfish AI Inc.,生效2026-06-09,描述通过系统辅助功能读取文本和本地记忆。", + "limitation": "政策日期及品牌上线不当成立年;功能与数据处理仅为官方说明,未独立验证。" + }, + { + "id": "GOLD-PRIVACY", + "companyId": null, + "title": "Goldfish隐私与数据处理说明", + "url": "https://goldfish.sh/privacy", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "政策称记忆存本地,部分任务与后台处理需向外部AI服务发送相关文本。", + "limitation": "本地记忆不等于所有推理在本地,也不证明推理成本为零;未独立复测。" + }, + { + "id": "PH-UP", + "companyId": null, + "title": "Upstream产品发布线索", + "url": "https://www.producthunt.com/products/upstream-3", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "从年度榜单回查产品页及官网归属;发布年与当前产品名称不单独作为公司成立年。", + "limitation": "平台关注、排名与评论不作为独立财务或技术验证。" + }, + { + "id": "PH-SEO", + "companyId": "AI074", + "title": "OpenSEO产品发布线索", + "url": "https://www.producthunt.com/products/openseo", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "从年度榜单回查产品页及官网归属;发布年与当前产品名称不单独作为公司成立年。", + "limitation": "平台关注、排名与评论不作为独立财务或技术验证。" + }, + { + "id": "PH-PAZI", + "companyId": null, + "title": "Pazi产品发布线索", + "url": "https://www.producthunt.com/products/pazi", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "从年度榜单回查产品页及官网归属;发布年与当前产品名称不单独作为公司成立年。", + "limitation": "平台关注、排名与评论不作为独立财务或技术验证。" + }, + { + "id": "PH-GOLD", + "companyId": null, + "title": "Goldfish产品发布线索", + "url": "https://www.producthunt.com/products/goldfish-early-access", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "产品发布平台", + "summary": "从年度榜单回查产品页及官网归属;发布年与当前产品名称不单独作为公司成立年。", + "limitation": "平台关注、排名与评论不作为独立财务或技术验证。" } ], "reviews": [ @@ -45325,6 +45564,48 @@ ], "handling": "不新增收入观测。公司成立年、合同金额、人工交付与经常性费用继续待核;条款生效日不当成立年。", "scope": "excluded-candidate" + }, + { + "id": "EA-R-RECHECK", + "type": "原候选复核与收入边界", + "company": "EveryApp", + "summary": "原候选36088标AI不明;官网、YC及源码补足Agent业务与OpenSEO归属后入表。定价包含订阅额度与数据成本加价。", + "evidenceIds": [ + "EA-YC", + "EA-HOME", + "SEO-HOME", + "SEO-PRICE", + "SEO-CODE" + ], + "handling": "原快照和初筛计数不改;OpenSEO只作同公司产品。Cloudflare费用不是平台收入,28%加价不是公司毛利率,报价和计划不转ARR。", + "scope": "companies", + "companyIds": [ + "AI074" + ] + }, + { + "id": "PAZI-R-DATES", + "type": "日期与主体冲突", + "company": "Pazi(年份待核候选)", + "summary": "官方同页的Founded 2026、W24与2023 Pythagora叙述不一致;条款仍由Pythagora Technologies Incorporated运营。", + "evidenceIds": [ + "PAZI-YC", + "PAZI-TERMS", + "PAZI-PRICE" + ], + "handling": "保持候选,不强行选新成立年。政策生效日、订阅funding与业务余额不当成立日或已确认收入。", + "scope": "excluded-candidate" + }, + { + "id": "UP-R-OLD", + "type": "成立范围与履历归属", + "company": "Upstream(范围外候选)", + "summary": "YC官方列2023成立;创始人的Asana及Algolia经历包含其他业务ARR,不能归Upstream。", + "evidenceIds": [ + "UP-YC" + ], + "handling": "2026发布不新增公司;不导入履历收入,按2023成立排除本轮新公司样本。", + "scope": "excluded-candidate" } ], "coverage": { @@ -45428,8 +45709,13 @@ "categoryId": "C05", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "outside-cohort", + "note": "YC官方列2023成立、S23批次,2026发布不重算公司年;创始人此前Asana、Algolia的ARR不归Upstream。", + "evidenceIds": [ + "UP-YC", + "UP-HOME", + "PH-UP" + ] }, { "id": "PH26-07", @@ -45439,7 +45725,13 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "note": "运营者Goldfish AI Inc.,成立年未核;政策生效日不当成立日。测试期间免费不说明收入为零,点击计数不等于客户数或MRR。", + "evidenceIds": [ + "GOLD-HOME", + "GOLD-TERMS", + "GOLD-PRIVACY", + "PH-GOLD" + ] }, { "id": "PH26-08", @@ -45461,8 +45753,14 @@ "categoryId": "C06", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "status": "linked", + "note": "OpenSEO归EveryApp;官方目录列EveryApp 2026成立,两者只计一个公司。原候选36088从AI不明复核入表,原台账计数不回写。", + "companyId": "AI074", + "evidenceIds": [ + "EA-YC", + "SEO-HOME", + "PH-SEO" + ] }, { "id": "PH26-10", @@ -45502,7 +45800,13 @@ "kind": "product", "profileStatus": "readable", "status": "pending-year", - "note": "候选分类按发布定位初分;公司成立年、主体及收入待核,不能因2026榜单就加入成立年样本。" + "note": "Founded 2026与W24及2023 Pythagora历史同页冲突;条款运营者为Pythagora Technologies Incorporated,法律沿革未核,保留年份待核。业务余额与广告支出不当ARR。", + "evidenceIds": [ + "PAZI-YC", + "PAZI-TERMS", + "PAZI-PRICE", + "PH-PAZI" + ] }, { "id": "PH26-13", @@ -45866,5 +46170,19 @@ } ] } + ], + "directoryRechecks": [ + { + "ycId": 36088, + "originalStatus": "ai-unclear", + "companyId": "AI074", + "reviewedAt": "2026-10-30", + "evidenceIds": [ + "EA-YC", + "EA-HOME", + "SEO-HOME" + ], + "reason": "原快照规则初筛未确认AI主营;本次确认Agent应用托管、MCP及OpenSEO产品关联后入表。保留2026成立来源及法律主体待核限制,不更改原初筛状态或928条发现计数。" + } ] } diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 62aa55e..7655e42 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-5", + "version": "2026-10-30-6", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -60,7 +60,7 @@ ], "initialAccess": "官网可读取", "boundary": "2026与2025年度档案各登记首个公开响应19条,共38条候选/推广;2025另有一个仅图片位置未解析。已逐条保留关联、范围外与年份待核状态,未穷尽两年档案。", - "nextCheck": "继续补两年其余分页/日期、仅图片位置及20条成立年待核候选;核清品牌、产品与运营主体关系,不转移历史或客户业绩。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及18条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 69d5724..7259aa7 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-ph-4", + "sourceVersion": "2026-10-30-ph-5", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", diff --git a/scripts/audit-ai-research.py b/scripts/audit-ai-research.py index 8973e89..f6fdade 100644 --- a/scripts/audit-ai-research.py +++ b/scripts/audit-ai-research.py @@ -96,6 +96,30 @@ def candidate_register(): return lines +def directory_rechecks(): + rows = DATA.get('directoryRechecks', []) + if not rows: + return [] + original = {row['ycId']: row for row in AUDIT['records']} + companies = {c['id']: c for c in DATA['companies']} + evidence = {e['id']: e for e in DATA['evidence']} + assert len({row['ycId'] for row in rows}) == len(rows) + lines = ['', '## 原候选池的后续复核', '', + '原始1,428条读取快照与初筛计数保持不变;下表记录当时未入表、后续补足证据后进入公司表的项目。初筛未通过不是永久排除。后续入表不回写为当时已匹配,也不重复计入928条原始新增目录项。', '', + '| 原候选 | 原始状态 | 后续公司记录 | 复核证据 | 处理与限制 |', '| --- | --- | --- | --- | --- |'] + for row in rows: + baseline = original[row['ycId']] + assert baseline['status'] == row['originalStatus'] + assert row['reviewedAt'] <= DATA['asOf'] and row['reason'] + assert row['originalStatus'] in {'ai-unclear', 'year-outside-or-missing', 'date-conflict'} + company = companies[row['companyId']] + assert row['evidenceIds'] and all(eid in evidence for eid in row['evidenceIds']) + proof = '、'.join(f"[{eid}]({evidence[eid]['url']})" for eid in row['evidenceIds']) + lines.append(f"| [{baseline['name']} · YC{row['ycId']}]({baseline['source']}) | {row['originalStatus']} | [{company['name']}]({BASE}?company={company['id']}#research-company-detail) | {proof} | {row['reviewedAt']}:{row['reason']} |") + lines += ['', f"已记录{len(rows)}条后续复核入表;其余未入表候选仍按原状态保留缺项,不能把这一批复核视为完成全部模糊项。", ''] + return lines + + def render(): cov = DATA['coverage'] companies = DATA['companies'] @@ -168,6 +192,7 @@ def render(): lines.append(f"| {name} | {len(entries)} | {len({e['url'] for e in entries})} | {note} |") others = [e for e in DATA['evidence'] if urlsplit(e['url']).netloc not in included] lines.append(f"| 其他官网、评测及公开资料 | {len(others)} | {len({e['url'] for e in others})} | 按每条来源限制理解,不能统一当作独立证据 |") + lines += directory_rechecks() lines += source_register() lines += candidate_register() lines += ['', '## 尚未满足的研究条件', '', From 9a026a08a534dd4427f71e306a9660b9408e4ef1 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 16:22:55 +0800 Subject: [PATCH 09/14] =?UTF-8?q?=E7=99=BB=E8=AE=B0=E4=B8=AD=E6=96=87?= =?UTF-8?q?=E6=9D=A5=E6=BA=90=E7=BA=BF=E7=B4=A2=E5=B9=B6=E8=A1=A5Agent?= =?UTF-8?q?=E4=B8=8E=E5=9F=BA=E7=A1=80=E8=AE=BE=E6=96=BD=E5=85=AC=E5=8F=B8?= =?UTF-8?q?=E4=B8=AA=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 9 +- apps/docs/scripts/auth-cli.ts | 4 +- apps/docs/src/lib/ai-research.ts | 6 +- apps/docs/tests/research.test.ts | 33 +- .../docs/ai-company-research/00-overview.md | 4 + .../ai-company-research/01-income-snapshot.md | 2 +- .../02-coverage-and-gaps.md | 52 ++- content/research/ai-companies.seed.json | 323 +++++++++++++++++- content/research/ai-companies.sources.json | 10 +- content/research/ai-income-analysis.json | 2 +- scripts/audit-ai-research.py | 11 +- 11 files changed, 408 insertions(+), 48 deletions(-) diff --git a/README.md b/README.md index 1e5f22a..b516238 100644 --- a/README.md +++ b/README.md @@ -98,11 +98,12 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。 所有修改都经过工作分支和 PR,部署仍等待人工合并主线。 -当前资料包含 1,018 条公司/产品记录、10 类业务及待分类组、1,172 条证据记录和 187 条经营与技术观测。 -其中保留 90 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 +当前资料包含 1,020 条公司/产品记录、10 类业务及待分类组、1,185 条证据记录和 187 条经营与技术观测。 +其中保留 92 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中18条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。 +机器之心首批4条公司线索以独立候选批次记录:直达正文未读,经公司公开主页、官方代码或发起方公告补核PrismShadow与Stargate;SSI用2024官方历史更新排除,Utopai仍待核。不是两年中文来源全量。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;64条核查中49条指向具体公司、4条属于全局方法、11条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;67条核查中51条指向具体公司、4条属于全局方法、12条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 Lightfield按Magical Tome主体与2025前历史业务列为CRM转型对照,成立年未知,不计新成立公司;Fundraisly成立年待核,其客户融资和创始人历史ARR不转移为公司收入。 Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。 原候选36088 EveryApp从AI不明经补证入表,`directoryRechecks`保存后续复核,原1,428条台账及928条原始新增计数不改。OpenSEO与EveryApp不重复计公司;定价、星标、客户数和数据成本加价均不转为ARR。 @@ -147,7 +148,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。 AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。 技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。 -当前11条完成该字段的专项记录,其中5条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 +当前12条完成该字段的专项记录,其中6条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。 界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。 `pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、 diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 23403ff..989cd06 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -185,9 +185,9 @@ async function main() { assert.equal(researchResponse.status, 200, "authenticated research API"); assert.ok(researchResponse.headers.get("cache-control")?.includes("no-store")); const research = await researchResponse.json(); - assert.equal(research.companies.length, 1018); + assert.equal(research.companies.length, 1020); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1172); + assert.equal(research.evidence.length, 1185); assert.equal(research.observations.length, 187); assert.equal((await request("/api/research/ai-companies", { method: "POST", headers })).status, 405); const researchPage = await request("/docs/other-research/ai-company-research/overview", { headers }); diff --git a/apps/docs/src/lib/ai-research.ts b/apps/docs/src/lib/ai-research.ts index 4ffbf31..22f5744 100644 --- a/apps/docs/src/lib/ai-research.ts +++ b/apps/docs/src/lib/ai-research.ts @@ -47,7 +47,7 @@ export type ResearchCandidateBatch = { id: string; sourceId: string; url: string; accessedAt: string; scope: string; complete: boolean; records: { id: string; name: string; url: string | null; categoryId: string; - kind: "product" | "promotion"; profileStatus: "readable" | "unavailable" | "archive-only"; + kind: "product" | "company" | "promotion"; profileStatus: "readable" | "unavailable" | "archive-only"; status: "pending-year" | "linked" | "existing-outside-cohort" | "outside-cohort" | "promotion"; companyId?: string; evidenceIds?: string[]; note: string; }[]; @@ -123,10 +123,10 @@ export function validateResearch(snapshot: ResearchSnapshot) { for (const row of batch.records) { const linked = ["linked", "existing-outside-cohort"].includes(row.status); if (!row.name.trim() || !row.note.trim() || !categories.has(row.categoryId) || - !["product", "promotion"].includes(row.kind) || + !["product", "company", "promotion"].includes(row.kind) || !["readable", "unavailable", "archive-only"].includes(row.profileStatus) || !["pending-year", "linked", "existing-outside-cohort", "outside-cohort", "promotion"].includes(row.status) || - (row.kind === "product" && (!row.url || !evidenceUrl(row.url))) || + (row.kind !== "promotion" && (!row.url || !evidenceUrl(row.url))) || (row.url !== null && !evidenceUrl(row.url)) || linked !== !!row.companyId || (row.companyId && !companies.has(row.companyId)) || (row.kind === "promotion") !== (row.status === "promotion") || diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index 5473387..c4976b4 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -23,8 +23,8 @@ test("research revisions share the authentication database and preserve replay l for (let i = 0; i < 20; i++) consumeCode(config, "invalid"); assert.equal(consumeCode(config, "invalid"), "limited"); const initial = readResearchSnapshot(); - assert.equal(initial.companies.length, 1018); - assert.equal(initial.evidence.length, 1172); + assert.equal(initial.companies.length, 1020); + assert.equal(initial.evidence.length, 1185); assert.equal(initial.observations.length, 187); assert.deepEqual(initial.candidateBatches, seed.candidateBatches, "candidate gaps persist in the same database metadata"); assert.deepEqual(initial.directoryRechecks, seed.directoryRechecks, "follow-up classifications persist without rewriting the discovery audit"); @@ -64,9 +64,9 @@ test("research validation rejects broken evidence and unsafe source links", () = test("reviews link explicit companies without turning global or excluded cases into companies", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 49); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 51); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 4); - assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 11); + assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 12); const review = snapshot.reviews.find((r) => r.id === "R4")!; assert.deepEqual(reviewCompanyIds(snapshot, review), ["AI007", "AI013", "AI021", "AI034"]); assert.deepEqual(reviewCompanyIds(snapshot, snapshot.reviews.find((r) => r.id === "CN-R-PSI")!), []); @@ -85,11 +85,11 @@ test("reviews link explicit companies without turning global or excluded cases i test("disclosure counts exclude client income, biographies, targets and duplicate milestones", () => { const snapshot = seed as ResearchSnapshot; const summary = categorySummary(snapshot); - assert.equal(summary.reduce((n, c) => n + c.count, 0), 1018); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1020); assert.equal(summary.reduce((n, c) => n + c.self, 0), 26); assert.equal(summary.reduce((n, c) => n + c.estimate, 0), 1); assert.equal(summary.reduce((n, c) => n + c.platform, 0), 16); - assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 975); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 977); assert.equal(snapshot.companies.find((c) => c.name === "Rork")?.revenueStatus, "unknown"); assert.equal(snapshot.companies.find((c) => c.name === "Result")?.revenueStatus, "unknown"); assert.ok(snapshot.observations.filter((o) => o.selection === "signal").every((o) => o.scope === "公司整体")); @@ -97,8 +97,8 @@ test("disclosure counts exclude client income, biographies, targets and duplicat test("technical reviews keep accessible materials separate from tested capabilities", () => { const snapshot = structuredClone(seed) as ResearchSnapshot; - assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 11); - assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 5); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 12); + assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 6); assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1); assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown"); assert.match(snapshot.companies.find((c) => c.id === "AI051")!.technicalReview!.testScope!, /Sep 2026/); @@ -300,7 +300,7 @@ test("unreconciled directory financials remain source reviews instead of income assert.ok(review.evidenceIds.includes("PH-TANA-DR")); assert.equal(reviewCompanyIds(snapshot, review).length, 0); assert.ok(!snapshot.observations.some((o) => o.evidence === "PH-TANA-DR")); - assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 18); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 19); }); test("product pivots and founder histories do not become new company years or current revenue", () => { @@ -327,3 +327,18 @@ test("follow-up evidence can admit an uncertain directory candidate without rewr followup.companyId = "missing-company"; assert.throws(() => validateResearch(snapshot), /directory recheck/); }); + +test("Chinese discovery entries preserve unread articles and use separate primary evidence", () => { + const snapshot = structuredClone(seed) as ResearchSnapshot; + const batch = snapshot.candidateBatches!.find((b) => b.id === "JQ-2026-targeted-1")!; + assert.equal(batch.complete, false); + assert.equal(batch.records.length, 4); + assert.ok(batch.records.every((row) => row.kind === "company" && row.profileStatus === "unavailable")); + assert.equal(batch.records.filter((row) => row.status === "linked").length, 2); + assert.equal(batch.records.find((row) => row.name === "Utopai")?.status, "pending-year"); + assert.ok(!snapshot.observations.some((o) => ["PS-CODE", "SG-START", "SG-APR", "SSI-HISTORY"].includes(o.evidence)), "task costs, investment, capacity and financing are not revenue"); + const prism = snapshot.companies.find((c) => c.id === "AI075")!; + assert.equal(prism.team, null, "a team range or linked employees must not become exact headcount"); + batch.records[0].url = null; + assert.throws(() => validateResearch(snapshot), /research candidate/); +}); diff --git a/content/docs/ai-company-research/00-overview.md b/content/docs/ai-company-research/00-overview.md index 62348d0..5509dd1 100644 --- a/content/docs/ai-company-research/00-overview.md +++ b/content/docs/ai-company-research/00-overview.md @@ -22,6 +22,8 @@ | AI辅助工程与研究服务 | Marengo、Harbor | 有首月收入、待交付或多年服务合同;不直接当ARR | 已验收项目毛利、专业人员工时、返工和责任成本 | 合同收入确认、软件/服务拆分、应收账款和交付集中度 | | 开源编程工具与企业治理 | [Kilo Code](/docs/other-research/ai-company-research/overview?company=AI072#research-company-detail) | 官方定价区分席位、推理、充值处理费和云算力;已被收购,收入未知 | 企业付费转换、平台净收入、推理转付与补贴、支持成本 | 付费客户、留存、收入确认及并表边界;不能从token吞吐推ARR | | 开源工具、Agent网关与数据服务 | [EveryApp / OpenSEO](/docs/other-research/ai-company-research/overview?company=AI074#research-company-detail) | 官方代码可读;OpenSEO有订阅额度及数据成本加价,EveryApp托管收费仍为计划 | 自托管到付费转化、数据转付与净收入、实际用量、支持成本及供应商依赖 | 真实付费和续费、收入确认、加价与毛利的差异;28%成本加价不等于公司毛利率 | +| Agent构建与优化框架 | [PrismShadow](/docs/other-research/ai-company-research/overview?company=AI075#research-company-detail) | PenguinHarness源码及许可证可读,企业收费与收入未知 | 企业持续使用、任务成功率、评估维护及实施支持成本 | 独立复测、付费合同与留存;厂商任务成本不等于收费、毛利或收入 | +| 算力基础设施合资 | [Stargate](/docs/other-research/ai-company-research/overview?company=AI076#research-company-detail) | 发起方公告与分期设施进度;投资计划和容量不是收入 | 资本到位、投运进度、利用率、能源成本及长期合同回款 | 注册与并表边界、合同收入确认、实际负载、折旧与资本成本;不套轻资产软件ARR比较 | | 企业CRM与组织上下文 | [Lightfield转型对照](/docs/other-research/ai-company-research/overview?company=AI073#research-company-detail) | 有席位及工作区套餐,部分含实施、专人支持;2025是产品上线,既有公司历史单列 | 数据接入成本、记录与行动准确率、销售团队留存、实施和人工支持毛利 | 付费采用、用量额度、续费及真实ARPA;不把Tome历史用户当CRM客户 | | 模型、算力与机器人 | Wafer、Induction Labs、Congruent | 可确定产品方向;团队小或融资多不证明单位经济 | 客户真实负载、性能成本、交付与售后成本 | 同口径收入、资本开支、独立性能测试 | @@ -49,6 +51,8 @@ [Pazi官方目录](https://www.ycombinator.com/companies/pazi)中的Founded 2026、Winter 2024和2023 Pythagora历史叙述尚未对齐;[条款](https://pazi.ai/terms)仍列Pythagora Technologies Incorporated运营。其定价页所称业务funding与余额可用于任务及广告,不能直接当软件ARR。项目保持年份待核,避免以一个成立字段覆盖主体和产品历史。 +中文报道的发现与验证也分开处理:机器之心首批四条直达记录均未读到正文,不能把检索摘录当已读全文。PrismShadow的成立和代码材料、Stargate的公司公告另由原始来源补证;SSI以2024官方历史更新排除,Utopai继续待核。具体访问状态与证据见[覆盖台账](/docs/other-research/ai-company-research/coverage)。 + ### 从原文到可比较收入:新增核查实例 以下均为2026-10-30读取的公司自述,读取日不代表收入业务截止日。点击公司可查看分项观测、核查和原始来源。原文仅有美元符号时保留币种待核;未给币种的数字不补成美元。 diff --git a/content/docs/ai-company-research/01-income-snapshot.md b/content/docs/ai-company-research/01-income-snapshot.md index 8c65c8a..08cce24 100644 --- a/content/docs/ai-company-research/01-income-snapshot.md +++ b/content/docs/ai-company-research/01-income-snapshot.md @@ -2,7 +2,7 @@ 截至 2026-10-30,7日窗口内有 14 个产品的美元平台MRR可纳入分组描述。创意软件订阅组的样本均值较高、CV也较大;营销软件组与消费者个人应用组的CV接近。各组只有1至5个产品,尚不足以估计行业总体或造假概率。 -这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,018条公司/产品记录的收入普查。 +这是已采集资料的固定快照。[动态工作台](/docs/other-research/ai-company-research/overview)提供筛选与原始证据。窗口按最后同步日计算,不保证所有点同日,也不是1,020条公司/产品记录的收入普查。 ## 7日窗口的分组结果 diff --git a/content/docs/ai-company-research/02-coverage-and-gaps.md b/content/docs/ai-company-research/02-coverage-and-gaps.md index bdf2298..2e72794 100644 --- a/content/docs/ai-company-research/02-coverage-and-gaps.md +++ b/content/docs/ai-company-research/02-coverage-and-gaps.md @@ -1,6 +1,6 @@ # AI 公司资料覆盖与缺项 -截至 2026-10-30,研究表含1,018条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 +截至 2026-10-30,研究表含1,020条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。 验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。 @@ -19,31 +19,31 @@ | AI业务待确认 | 192 | 不强行把背景关键词当主营 | | 成立年与批次冲突 | 6 | 另保留核查记录 | -全表由912条目录基础项和106条个案或平台记录组成。候选池已匹配项之外另有56条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 +全表由912条目录基础项和108条个案或平台记录组成。候选池已匹配项之外另有58条记录,包含其他来源及发布/转型对照;其中已有16条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。 ## 成立年与证据深度 | 维度 | 当前记录 | 解读 | | --- | --- | --- | -| 记录为2025年成立 | 620 | 成立来源和精度见公司明细 | +| 记录为2025年成立 | 622 | 成立来源和精度见公司明细 | | 记录为2026年成立 | 392 | 不将产品发布日期代替成立日 | | 成立年未知或范围外 | 6 | 发布/转型对照单列,不进入两年成立分组 | | 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 | | 其他目录基础项 | 752 | 规则初分或资料不足,继续待复核 | | 有团队数字 | 946 | 多为自报Team Size或Employees,时点与口径不统一 | -| 专项技术证据记录 | 11 | 其中5条自述、5条公开材料、1条第三方评测 | +| 专项技术证据记录 | 12 | 其中5条自述、6条公开材料、1条第三方评测 | | 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR | | 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 | | 仅第三方估算 | 1 | 不与直接披露混合 | -| 暂无可用收入数字 | 975 | 包含尚未逐家搜索的目录项,不代表没有收入 | +| 暂无可用收入数字 | 977 | 包含尚未逐家搜索的目录项,不代表没有收入 | ## 业务分类与数据入口 | 业务类别 | 记录数 | | --- | --- | | [基础模型](/docs/other-research/ai-company-research/overview?category=C01) | 29 | -| [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 102 | -| [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 52 | +| [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 103 | +| [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 53 | | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 110 | | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 176 | | [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 53 | @@ -55,7 +55,7 @@ ## 已使用来源的分布 -1,172条证据记录对应1,158个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 +1,185条证据记录对应1,171个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。 | 来源 | 证据记录 | 不同URL | 用途及限制 | | --- | --- | --- | --- | @@ -64,7 +64,7 @@ | a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 | | TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 | | Sacra | 3 | 3 | 第三方估算;与直接披露分开 | -| 其他官网、评测及公开资料 | 148 | 144 | 按每条来源限制理解,不能统一当作独立证据 | +| 其他官网、评测及公开资料 | 161 | 157 | 按每条来源限制理解,不能统一当作独立证据 | ## 原候选池的后续复核 @@ -94,24 +94,24 @@ S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》 | S07 [Menlo Ventures](https://menlovc.com/perspective/2025-the-state-of-generative-ai-in-the-enterprise/) | 背景研究 | 0 / 0 / 0 | 用于企业采购背景;不把调研比例转换为公司ARR。 | 保留调研方法、采购样本及与新公司样本的差异。 | | S08 [Stripe](https://stripe.com/annual-updates/2025) | 背景研究 | 1 / 0 / 0 | 年度平台观察,不提供可公开穷尽的新AI商户名录。 | 与TrustMRR支付重建数据分开;不据平台总量推算单家公司。 | | S09 [SaaS Capital](https://www.saas-capital.com/research/) | 背景研究 | 0 / 0 / 0 | B2B订阅软件基准,不能直接代表新AI公司、硬件或服务企业。 | 按报告样本及营收规模使用,不强套为行业ARR分布。 | -| S10 [机器之心](https://www.jiqizhixin.com/) | 候选台账待建 | 0 / 0 / 0 | 首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。 | 建立中文公司候选台账,会员正文不可读时标明。 | +| S10 [机器之心](https://www.jiqizhixin.com/) | 定向使用,未穷尽 | 5 / 2 / 0 | 已登记4篇定向检索线索;三篇直达仅登录外壳,一篇读取失败。2项经公开原始资料补证关联公司,1项范围外,1项仍待核;未阅读全文或穷尽两年档案。 | 补公开可读文章、2025档案及Utopai原始成立材料;受限正文留缺,不以搜索摘录代全文。 | | S11 [36氪](https://www.36kr.com/) | 访问受限 | 0 / 0 / 0 | 2026-10-30仍返回安全检测页面,未把首页作为已读文章。 | 使用可公开读取的具体文章或其他原始来源;不绕过访问保护。 | -| S12 公司官网与官方博客 | 随公司逐条核对 | 74 / 18 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | +| S12 公司官网与官方博客 | 随公司逐条核对 | 81 / 20 / 15 | 公司官网和官方材料逐条绑定证据;不是可预先列尽的全站候选池。 | 核定价、主体、交付与收入定义,自述与独立验证分开。 | | S13 [TrustMRR](https://trustmrr.com/) | 定向使用,未穷尽 | 18 / 17 / 51 | 已采集产品与支付快照;公开者自选,不是全部商户或独立财务审计。 | 核同步日、连接失效、支付平台公式及产品/法人归属。 | | S14 [a16z Speedrun](https://speedrun.a16z.com/) | 定向使用,未穷尽 | 11 / 10 / 19 | 投资机构公司介绍定向样本,收入数字仍多来自公司。 | 核币种、相对时间及管线/履历;未读取的页面保持缺项。 | | S15 [Artificial Analysis](https://artificialanalysis.ai/) | 定向使用,未穷尽 | 2 / 1 / 3 | 第三方已发表技术评测,仅覆盖所列模型版本和任务。 | 核榜单版本、测评方法及置信区间,不将排名变成企业整体能力。 | -| S16 其他公开补充资料 | 定向使用,未穷尽 | 45 / 22 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | +| S16 其他公开补充资料 | 定向使用,未穷尽 | 46 / 23 / 13 | 未归入上述来源的公开材料按原始证据链接逐条保留;不视为新增已批准的完整候选池。 | 逐项核来源归属、可靠性及可读正文,不能将搜索摘要当全文。 | Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。官网首页可读不证明已取得完整筛选结果;安全检测页面不作为文章内容。候选池之外的来源边界尚需建立可回查条目,完成前不宣布来源清单已全部覆盖。 -## S04 产品发布候选核对(PH-2026-visible-1) +## S04 候选核对(PH-2026-visible-1) [发现页面](https://www.producthunt.com/leaderboard/yearly/2026),读取于2026-10-30。年度榜单首次公开响应中可见的19张产品或推广卡片;不含分页或后续动态加载,不是2026全年、更不是2025—2026全量。 -本批19条:3条关联公司、2条关联范围外对照、5条范围外不新增公司、8条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:3条关联公司、2条关联范围外对照、5条范围外不新增公司、8条成立年待核、1条推广活动。完整来源覆盖标记:未完成。主营或产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 -| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | +| 发现条目 | 主营或产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | | [Fundraisly](https://www.producthunt.com/products/fundraisly) | [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 成立年待核 | — | [PH-FUNDRAISLY-ABOUT](https://fundraisly.com/about-us)、[PH-FUNDRAISLY-ENTITY](https://fundraisly.com/terms-of-service)、[PH-FUNDRAISLY-PLAN](https://fundraisly.com/service-plan) | 运营主体Accumulator Fundraising LLC;成立年待核。固定/经常性或按通话的服务收费需拆分;Gett历史ARR、创始人及客户筹资不作Fundraisly收入。 | | [Rork Max](https://www.producthunt.com/products/rork-app-for-ios) | [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 已有关联,年份范围外 | [Rork](/docs/other-research/ai-company-research/overview?company=AI054#research-company-detail) | [E054](https://speedrun.a16z.com/companies/rork) | 映射现有Rork对照记录;2024成立,不因Rork Max发布重新算2026新公司。 | @@ -136,13 +136,13 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 -## S04 产品发布候选核对(PH-2025-visible-1) +## S04 候选核对(PH-2025-visible-1) [发现页面](https://www.producthunt.com/leaderboard/yearly/2025),读取于2026-10-30。当前年度档案首个公开响应中19张有文字链接的产品/推广卡片;另有一张仅图片的Framer 3.0位置,未解析为独立产品,保留缺项。未穷尽分页或全年;当前推广位不等于2025发布。 -本批19条:1条关联公司、0条关联范围外对照、7条范围外不新增公司、10条成立年待核、1条推广活动。完整来源覆盖标记:未完成。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 +本批19条:1条关联公司、0条关联范围外对照、7条范围外不新增公司、10条成立年待核、1条推广活动。完整来源覆盖标记:未完成。主营或产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 -| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | +| 发现条目 | 主营或产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | | --- | --- | --- | --- | --- | --- | | [Screen Studio 3.0](https://www.producthunt.com/products/screen-studio) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [PH25-E-01](https://www.producthunt.com/products/screen-studio) | 产品页还列2022年首次发布;公司成立年和AI主营仍待核,不因3.0版本重新算新公司。 | | [Tana](https://www.producthunt.com/products/tana) | [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 成立年范围外,不新增公司 | — | [PH-TANA-DR](https://dealroom.co/companies/tana/)、[PH-TANA-INV](https://tolacapital.com/2025/02/04/my-productivity-quest-and-tanas-series-a)、[PH-TANA-HOME](https://tana.inc/) | Dealroom列2020成立;投资人回忆2025前已与团队合作。按2025前已有业务排除,法律注册年未核;现行会议平台不另算新公司。 | @@ -167,6 +167,22 @@ Dealroom、Product Hunt、机器之心与36氪入口于2026-10-30重新访问。 产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。 +## S10 候选核对(JQ-2026-targeted-1) + +[发现页面](https://www.jiqizhixin.com/),读取于2026-10-30。成立年关键词定向检索中选择的4篇2026 URL公司线索;三篇直达仅登录外壳,一篇读取失败。搜索摘录与已读全文分开,关联公司另用原始材料核对;非全部检索结果、非2025—2026全站档案。 + +本批4条:2条关联公司、0条关联范围外对照、1条范围外不新增公司、1条成立年待核、0条推广活动。完整来源覆盖标记:未完成。主营或产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。 + +| 发现条目 | 主营或产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 | +| --- | --- | --- | --- | --- | --- | +| [PrismShadow / PenguinHarness](https://www.jiqizhixin.com/articles/2026-08-03-9) | [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 已关联公司 | [PrismShadow(PenguinHarness)](/docs/other-research/ai-company-research/overview?company=AI075#research-company-detail) | [JQ-PRISM](https://www.jiqizhixin.com/articles/2026-08-03-9)、[PS-PROFILE](https://sg.linkedin.com/company/prismshadow)、[PS-CODE](https://github.com/Prism-Shadow/penguin-harness) | 直达仅登录外壳;2025成立由公司公开主页补证,代码材料可读;成本和性能宣传未独立验证。 | +| [Stargate](https://www.jiqizhixin.com/articles/2026-04-11-2) | [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 已关联公司 | [Stargate(基础设施合资项目)](/docs/other-research/ai-company-research/overview?company=AI076#research-company-detail) | [JQ-STARGATE](https://www.jiqizhixin.com/articles/2026-04-11-2)、[SG-START](https://openai.com/index/announcing-the-stargate-project/)、[SG-JAN](https://openai.com/index/stargate-community/)、[SG-APR](https://openai.com/index/building-the-compute-infrastructure-for-the-intelligence-age/) | 媒体直达读取失败;发起方2025公告称新公司,官方后续进度另列。合资与项目边界待核,投资及容量不当ARR。 | +| [Safe Superintelligence(SSI)](https://www.jiqizhixin.com/articles/2026-08-25-12) | [基础模型](/docs/other-research/ai-company-research/overview?category=C01) | 成立年范围外,不新增公司 | — | [JQ-SSI](https://www.jiqizhixin.com/articles/2026-08-25-12)、[SSI-HISTORY](https://ssi.inc/updates) | 媒体直达仅登录外壳;官方2024已有融资更新,按2025前已存在业务排除,精确注册日未核;融资不当收入。 | +| [Utopai](https://www.jiqizhixin.com/articles/2026-10-06-4) | [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 成立年待核 | — | [JQ-UTOPAI](https://www.jiqizhixin.com/articles/2026-10-06-4) | 搜索摘录有公司与成立线索,但直达仅登录外壳,原始成立、主体和业务材料未补齐,不把估值、片单或模型排名作为公司收入或独立技术验证。 | + +发现条目和可读正文分开记录;登录外壳、读取失败或搜索摘录不充当已阅读全文。关联公司以列出的原始材料补证,仍保留技术、主体与收入未核事项。 + + ## 尚未满足的研究条件 行业ARR比较仍缺统一业务截止日、币种、经常性定义和业务边界。现有平台MRR可描述已采集产品,不足以代表全部新公司。技术评测只覆盖所列版本与任务,不宜跨领域汇总为统一强弱分数。 diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 95bec6e..852d5bc 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-ph-5", + "version": "2026-10-30-cn-1", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28729,6 +28729,71 @@ "SEO-CODE" ] } + }, + { + "id": "AI075", + "name": "PrismShadow(PenguinHarness)", + "url": "https://prismshadow.com/", + "cat": "C03", + "year": 2025, + "team": null, + "location": "新加坡(公司公开主页)", + "business": "提供Agent构建、评估和自我优化框架,公开产品包括PenguinHarness。", + "buyer": "Agent开发者及需要业务工作流自动化的企业团队", + "delivery": "官方开源仓库可访问;未独立安装、评测或确认企业付费部署。", + "notes": "成立2025据公司公开主页自述,非工商核验。11—50人范围不转为精确人数;中文报道直达未读正文,技术以官方代码补证,厂商任务成本不作公司收入。", + "cohort": "2025年成立(公司公开主页自述)", + "teamBasis": "公开公司主页列11—50人;关联员工数不等于团队总数,保留未知", + "price": "框架Apache-2.0开源;企业服务和支持合同收费待核", + "stage": "公开开源产品;商业收费、采用与收入待核", + "sourceType": "中文检索发现、公司公开主页与官方仓库", + "evidenceIds": [ + "PS-PROFILE", + "PS-ORG", + "PS-CODE", + "PS-HOME", + "JQ-PRISM" + ], + "revenueStatus": "unknown", + "businessModel": "开源Agent框架与企业工具;商业服务及私有化收费待核", + "entityBasis": "PrismShadow品牌、公开公司主页和代码组织可关联;精确注册日及同名主体关系未另核", + "classificationBasis": "按Agent构建、评估和运行框架归C03;不按媒体成本或准确率宣传排序。", + "technicalReview": { + "level": "public-artifact", + "reviewedAt": "2026-10-30", + "summary": "源码及Apache-2.0许可证可读;未运行基准,厂商自测和媒体转述不作为独立能力验证。", + "evidenceIds": [ + "PS-CODE" + ] + } + }, + { + "id": "AI076", + "name": "Stargate(基础设施合资项目)", + "url": "https://openai.com/index/announcing-the-stargate-project/", + "cat": "C02", + "year": 2025, + "team": null, + "location": "美国基础设施项目;注册地未独立核验", + "business": "由多家合作方共同推动AI数据中心及算力基础设施建设运营。", + "buyer": "OpenAI及基础设施合作方;具体合同买方与结算主体待核", + "delivery": "2026年1月及4月官方披露部分设施训练使用和继续扩张;未独立核实合同、负载及投运情况。", + "notes": "2025成立依据发起方称新公司的公告,精确注册日未核。合资公司、项目品牌及各地区合作实体的收入边界不同;计划投资、融资、容量与就业不是ARR。", + "cohort": "2025宣布新公司(发起方公告);合资项目单列", + "teamBasis": null, + "price": "长期基础设施商业合同与计费方式未取得;不把投资计划作为报价或收入", + "stage": "2025宣布,2026官方披露设施使用;后续实际负载与商业合同待核", + "sourceType": "中文检索发现及发起方成立、进度公告", + "evidenceIds": [ + "SG-START", + "SG-JAN", + "SG-APR", + "JQ-STARGATE" + ], + "revenueStatus": "unknown", + "businessModel": "合资基础设施建设运营;融资、资本投入、长期算力合同和确认收入分开", + "entityBasis": "公告称Stargate为新公司;Stargate品牌项目与场地合作方、地区实体的法律及并表边界待核", + "classificationBasis": "按AI算力与物理基础设施建设运营归C02,合资模式不与轻资产软件订阅直接比较。" } ], "observations": [ @@ -44659,6 +44724,149 @@ "kind": "产品发布平台", "summary": "从年度榜单回查产品页及官网归属;发布年与当前产品名称不单独作为公司成立年。", "limitation": "平台关注、排名与评论不作为独立财务或技术验证。" + }, + { + "id": "JQ-DISCOVERY", + "companyId": null, + "title": "机器之心定向发现与访问边界", + "url": "https://www.jiqizhixin.com/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "媒体访问与检索记录", + "summary": "按2025、2026与成立关键词定向发现四项公司线索;直达三篇仅登录外壳,一篇读取失败,首页也未给完整两年档案。", + "limitation": "搜索摘录不充当全文;此批非全部搜索结果、非两年全站候选池,未读正文和分页继续留缺。" + }, + { + "id": "JQ-PRISM", + "companyId": "AI075", + "title": "PrismShadow / PenguinHarness中文报道发现条目", + "url": "https://www.jiqizhixin.com/articles/2026-08-03-9", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "媒体检索线索", + "summary": "搜索返回团队与开源项目线索,直达文章只返回登录外壳;公司与技术另从公开主页和官方仓库补核。", + "limitation": "未记为阅读全文;不导入检索摘录中的融资、收入、估值、排名或性能数字,URL日期不独自当发布时间。" + }, + { + "id": "JQ-STARGATE", + "companyId": "AI076", + "title": "Stargate中文报道发现条目", + "url": "https://www.jiqizhixin.com/articles/2026-04-11-2", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "媒体检索线索", + "summary": "搜索返回Stargate公司线索,直达读取失败;成立公告和后续进度改从发起方原文核对。", + "limitation": "未记为阅读全文;不导入检索摘录中的融资、收入、估值、排名或性能数字,URL日期不独自当发布时间。" + }, + { + "id": "JQ-SSI", + "companyId": null, + "title": "SSI中文报道发现条目", + "url": "https://www.jiqizhixin.com/articles/2026-08-25-12", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "媒体检索线索", + "summary": "搜索返回SSI报道线索;直达仅登录外壳,成立范围以公司官方历史更新补证。", + "limitation": "未记为阅读全文;不导入检索摘录中的融资、收入、估值、排名或性能数字,URL日期不独自当发布时间。" + }, + { + "id": "JQ-UTOPAI", + "companyId": null, + "title": "Utopai中文报道发现条目", + "url": "https://www.jiqizhixin.com/articles/2026-10-06-4", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "媒体检索线索", + "summary": "搜索返回影视公司与模型报道线索;直达只返回登录外壳,主体与成立证据尚未补齐。", + "limitation": "未记为阅读全文;不导入检索摘录中的融资、收入、估值、排名或性能数字,URL日期不独自当发布时间。" + }, + { + "id": "PS-PROFILE", + "companyId": "AI075", + "title": "PrismShadow公司公开主页", + "url": "https://sg.linkedin.com/company/prismshadow", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司自述公开主页", + "summary": "主页列Founded 2025、新加坡总部、11—50人范围,并以公司账号介绍PenguinHarness,关联prismshadow.com。", + "limitation": "公司自述非注册核验;关联员工数不是团队总数,同名公司及中文品牌法律关系未另核。" + }, + { + "id": "PS-ORG", + "companyId": "AI075", + "title": "PrismShadow官方代码组织", + "url": "https://github.com/Prism-Shadow", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "GitHub组织关联prismshadow.com及新加坡所在地,并列出PenguinHarness仓库。", + "limitation": "用于品牌、域名与代码关联;不能由仓库或贡献者数量推员工、客户或收入。" + }, + { + "id": "PS-CODE", + "companyId": "AI075", + "title": "PenguinHarness官方开源仓库", + "url": "https://github.com/Prism-Shadow/penguin-harness", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "公开源码及Apache-2.0许可证可访问;框架用于Agent构建、评估及自我优化。", + "limitation": "只确认材料可读,未执行安装、复测成本或准确率。厂商任务成本和基准成绩不是公司收入或独立技术排名。" + }, + { + "id": "PS-HOME", + "companyId": "AI075", + "title": "PrismShadow官网读取限制", + "url": "https://prismshadow.com/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官网访问记录", + "summary": "官网标题可识别,但本次文本读取没有正文;公司信息主要由公开公司主页与GitHub交叉关联。", + "limitation": "未将空正文当作已读产品、合同或定价。" + }, + { + "id": "SG-START", + "companyId": "AI076", + "title": "Stargate发起方成立公告", + "url": "https://openai.com/index/announcing-the-stargate-project/", + "publishedAt": "2025-01-21", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2025-01-21公告称Stargate为新公司,发起方包括SoftBank、OpenAI、Oracle与MGX,并提出多年基础设施投资计划。", + "limitation": "发起方公告不是工商注册文件;投资计划不等于已到位资金、已执行资本开支或收入,技术伙伴也不等于付费客户。" + }, + { + "id": "SG-JAN", + "companyId": "AI076", + "title": "Stargate官方2026年1月进度", + "url": "https://openai.com/index/stargate-community/", + "publishedAt": "2026-01-20", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2026-01-20官方称Abilene首个场地已训练和服务模型,其他场地处于开发阶段。", + "limitation": "不同场地与合作方不自动归同一公司收入;官方投运描述未独立核实。" + }, + { + "id": "SG-APR", + "companyId": "AI076", + "title": "Stargate官方2026年4月进度", + "url": "https://openai.com/index/building-the-compute-infrastructure-for-the-intelligence-age/", + "publishedAt": "2026-04-29", + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "2026-04-29原文区分所取得的算力容量与持续投运,并描述Abilene场地承担模型训练。", + "limitation": "secured capacity不等于已投运负载、已出租容量或经常性收入;不将集团模型收入归合资项目。" + }, + { + "id": "SSI-HISTORY", + "companyId": null, + "title": "SSI官方历史更新", + "url": "https://ssi.inc/updates", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司官方材料", + "summary": "官方更新列2024-09-04融资消息,证明2025年前已有该业务。", + "limitation": "仅用于成立范围排除;融资不当收入,也不凭一个更新日期填精确注册年。" } ], "reviews": [ @@ -45606,6 +45814,49 @@ ], "handling": "2026发布不新增公司;不导入履历收入,按2023成立排除本轮新公司样本。", "scope": "excluded-candidate" + }, + { + "id": "PS-R-BENCHMARK", + "type": "技术宣传与财务边界", + "company": "PrismShadow", + "summary": "公开代码可读;中文检索中出现任务成本和性能宣传,但媒体正文直达未读,官方基准亦未独立复测。", + "evidenceIds": [ + "PS-CODE", + "PS-PROFILE", + "JQ-PRISM" + ], + "handling": "不把开源、低任务成本或性能自述当技术排名、公司价格或收入;团队范围不填精确人数。", + "scope": "companies", + "companyIds": [ + "AI075" + ] + }, + { + "id": "SG-R-BOUNDARY", + "type": "投资、设施与收入边界", + "company": "Stargate", + "summary": "2025发起公告及2026进度材料涉及投资计划、设施和容量,不是合资公司经常性收入。", + "evidenceIds": [ + "SG-START", + "SG-JAN", + "SG-APR" + ], + "handling": "区分计划投资、到账资金、资本开支、已投运负载及合同收入;合作公司与各地区项目不重复合并,也不转移OpenAI模型收入。", + "scope": "companies", + "companyIds": [ + "AI076" + ] + }, + { + "id": "JQ-R-UTOPAI", + "type": "中文正文访问与主体缺项", + "company": "Utopai(待核候选)", + "summary": "仅取得检索线索,文章直达未读到正文,成立与主体材料尚未补齐。", + "evidenceIds": [ + "JQ-UTOPAI" + ], + "handling": "保持候选;估值、影视片单和模型排名不作为收入或独立性能验证,后续追溯原始材料。", + "scope": "excluded-candidate" } ], "coverage": { @@ -46169,6 +46420,76 @@ ] } ] + }, + { + "id": "JQ-2026-targeted-1", + "sourceId": "S10", + "url": "https://www.jiqizhixin.com/", + "accessedAt": "2026-10-30", + "scope": "成立年关键词定向检索中选择的4篇2026 URL公司线索;三篇直达仅登录外壳,一篇读取失败。搜索摘录与已读全文分开,关联公司另用原始材料核对;非全部检索结果、非2025—2026全站档案。", + "complete": false, + "records": [ + { + "id": "JQ26-01", + "name": "PrismShadow / PenguinHarness", + "url": "https://www.jiqizhixin.com/articles/2026-08-03-9", + "categoryId": "C03", + "kind": "company", + "profileStatus": "unavailable", + "status": "linked", + "companyId": "AI075", + "evidenceIds": [ + "JQ-PRISM", + "PS-PROFILE", + "PS-CODE" + ], + "note": "直达仅登录外壳;2025成立由公司公开主页补证,代码材料可读;成本和性能宣传未独立验证。" + }, + { + "id": "JQ26-02", + "name": "Stargate", + "url": "https://www.jiqizhixin.com/articles/2026-04-11-2", + "categoryId": "C02", + "kind": "company", + "profileStatus": "unavailable", + "status": "linked", + "companyId": "AI076", + "evidenceIds": [ + "JQ-STARGATE", + "SG-START", + "SG-JAN", + "SG-APR" + ], + "note": "媒体直达读取失败;发起方2025公告称新公司,官方后续进度另列。合资与项目边界待核,投资及容量不当ARR。" + }, + { + "id": "JQ26-03", + "name": "Safe Superintelligence(SSI)", + "url": "https://www.jiqizhixin.com/articles/2026-08-25-12", + "categoryId": "C01", + "kind": "company", + "profileStatus": "unavailable", + "status": "outside-cohort", + "evidenceIds": [ + "JQ-SSI", + "SSI-HISTORY" + ], + "note": "媒体直达仅登录外壳;官方2024已有融资更新,按2025前已存在业务排除,精确注册日未核;融资不当收入。" + }, + { + "id": "JQ26-04", + "name": "Utopai", + "url": "https://www.jiqizhixin.com/articles/2026-10-06-4", + "categoryId": "C08", + "kind": "company", + "profileStatus": "unavailable", + "status": "pending-year", + "evidenceIds": [ + "JQ-UTOPAI" + ], + "note": "搜索摘录有公司与成立线索,但直达仅登录外壳,原始成立、主体和业务材料未补齐,不把估值、片单或模型排名作为公司收入或独立技术验证。" + } + ] } ], "directoryRechecks": [ diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 7655e42..9d01e8a 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-6", + "version": "2026-10-30-7", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -143,16 +143,16 @@ "name": "机器之心", "url": "https://www.jiqizhixin.com/", "role": "reporting", - "status": "pending", + "status": "targeted", "hosts": [ "www.jiqizhixin.com", "jiqizhixin.com", "pro.jiqizhixin.com" ], "initialAccess": "首页可读取", - "boundary": "首页及文章库入口可读,部分内容需会员;当前研究表尚无该站公司级证据,未穷尽两年档案。", - "nextCheck": "建立中文公司候选台账,会员正文不可读时标明。", - "limitation": "部分会员内容;财务数据需追溯", + "boundary": "已登记4篇定向检索线索;三篇直达仅登录外壳,一篇读取失败。2项经公开原始资料补证关联公司,1项范围外,1项仍待核;未阅读全文或穷尽两年档案。", + "nextCheck": "补公开可读文章、2025档案及Utopai原始成立材料;受限正文留缺,不以搜索摘录代全文。", + "limitation": "全文访问受限;仅作发现时明确标识,技术和财务另追原始资料", "accessRecheckedAt": "2026-10-30" }, { diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 7259aa7..0d423b9 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-ph-5", + "sourceVersion": "2026-10-30-cn-1", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business", diff --git a/scripts/audit-ai-research.py b/scripts/audit-ai-research.py index f6fdade..319fdfc 100644 --- a/scripts/audit-ai-research.py +++ b/scripts/audit-ai-research.py @@ -73,10 +73,10 @@ def candidate_register(): rows = batch['records'] counts = Counter(r['status'] for r in rows) assert sum(counts.values()) == len(rows) - lines += ['', f"## {batch['sourceId']} 产品发布候选核对({batch['id']})", '', + lines += ['', f"## {batch['sourceId']} 候选核对({batch['id']})", '', f"[发现页面]({batch['url']}),读取于{batch['accessedAt']}。{batch['scope']}", '', - f"本批{len(rows)}条:{counts['linked']}条关联公司、{counts['existing-outside-cohort']}条关联范围外对照、{counts['outside-cohort']}条范围外不新增公司、{counts['pending-year']}条成立年待核、{counts['promotion']}条推广活动。完整来源覆盖标记:{'已完成' if batch['complete'] else '未完成'}。产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。", '', - '| 发布卡片 | 产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 |', '| --- | --- | --- | --- | --- | --- |'] + f"本批{len(rows)}条:{counts['linked']}条关联公司、{counts['existing-outside-cohort']}条关联范围外对照、{counts['outside-cohort']}条范围外不新增公司、{counts['pending-year']}条成立年待核、{counts['promotion']}条推广活动。完整来源覆盖标记:{'已完成' if batch['complete'] else '未完成'}。主营或产品任务的初分类不计入主公司表数量,只有已关联的公司记录进入对应公司明细。候选与缺项随研究版本保存在文档站同一SQLite的研究元数据中。", '', + '| 发现条目 | 主营或产品任务初分 | 核对状态 | 关联公司 | 核对证据 | 限制 |', '| --- | --- | --- | --- | --- | --- |'] for row in rows: assert row['categoryId'] in categories assert row['status'] in statuses @@ -92,7 +92,10 @@ def candidate_register(): proof = '、'.join(f"[{eid}]({evidence[eid]['url']})" for eid in row.get('evidenceIds', [])) or '成立证据待补,产品页读取状态见候选记录' category = f"[{categories[row['categoryId']]}]({BASE}?category={row['categoryId']})" lines.append(f"| {name} | {category} | {statuses[row['status']]} | {company} | {proof} | {row['note']} |") - lines += ['', '产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。', ''] + if batch['sourceId'] == 'S04': + lines += ['', '产品页可读只表示有可访问的资料;本批未将所有产品页完成公司、技术或财务深查。既有直接HTTP采集返回403,当前采用可读的公开页面响应,不声称取得底层全量列表;后续公开档案与未读页面继续保留缺项。', ''] + else: + lines += ['', '发现条目和可读正文分开记录;登录外壳、读取失败或搜索摘录不充当已阅读全文。关联公司以列出的原始材料补证,仍保留技术、主体与收入未核事项。', ''] return lines From d57e9b77d7254ceb2e0aefa45c799b6550a39577 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 16:23:54 +0800 Subject: [PATCH 10/14] feat: make the site database authoritative for documents and catalog --- .dockerignore | 4 + .gitea/workflows/ci-deploy.yml | 1 + .gitea/workflows/docs-database-verify.yml | 22 ++ .gitignore | 5 + AGENTS.md | 2 +- README.md | 84 +++-- apps/docs/package.json | 3 +- apps/docs/scripts/auth-cli.ts | 34 +- apps/docs/scripts/build-auth.mjs | 5 + apps/docs/scripts/build-doc-images.mjs | 13 - apps/docs/scripts/docs-cli.ts | 44 +++ apps/docs/scripts/test-docs.mjs | 14 + apps/docs/src/lib/docs.ts | 173 +++++++-- apps/docs/src/pages/api/documents/source.ts | 22 ++ apps/docs/src/pages/api/search.ts | 13 +- apps/docs/src/pages/docs/[...slug].tsx | 30 +- apps/docs/src/pages/index.tsx | 11 +- apps/docs/src/proxy.ts | 13 - apps/docs/tests/docs.test.ts | 99 +++++ content/catalog.json | 315 ---------------- content/docs/00-endor-concepts-draft.md | 133 ------- content/docs/01-getting-started.md | 30 -- content/docs/02-mounting-draft.md | 25 -- content/docs/03-figures.md | 42 --- content/docs/04-endor-purpose-draft.md | 337 ------------------ content/docs/05-object-graphs-gc.md | 148 -------- content/docs/06-agent-programming-draft.md | 83 ----- content/docs/07-composable-judgments-draft.md | 180 ---------- .../docs/ai-company-research/00-overview.md | 64 ---- .../ai-company-research/01-income-snapshot.md | 64 ---- .../02-coverage-and-gaps.md | 73 ---- content/docs/language-design/00-overview.md | 50 --- content/docs/language-design/02-questions.md | 196 ---------- content/docs/language-design/03-questions.md | 250 ------------- content/docs/language-design/04-questions.md | 161 --------- content/docs/language-design/05-questions.md | 144 -------- content/docs/language-design/06-questions.md | 173 --------- content/docs/language-design/07-questions.md | 182 ---------- content/docs/language-design/08-questions.md | 157 -------- content/docs/language-design/09-questions.md | 168 --------- content/docs/language-design/10-questions.md | 136 ------- content/docs/language-design/11-questions.md | 168 --------- content/docs/language-design/12-questions.md | 163 --------- content/docs/language-design/13-questions.md | 175 --------- content/docs/language-design/14-questions.md | 136 ------- content/docs/pretext/00-overview.md | 24 -- content/docs/pretext/01-chapter.md | 45 --- content/docs/pretext/02-chapter.md | 61 ---- content/docs/pretext/03-chapter.md | 54 --- content/docs/pretext/04-chapter.md | 56 --- content/docs/pretext/05-chapter.md | 60 ---- content/docs/pretext/06-chapter.md | 52 --- content/docs/pretext/07-chapter.md | 38 -- content/docs/pretext/08-chapter.md | 41 --- content/docs/pretext/09-chapter.md | 94 ----- content/docs/pretext/10-chapter.md | 75 ---- content/docs/pretext/11-chapter.md | 21 -- content/docs/pretext/12-chapter.md | 27 -- content/docs/smalltalk/00-overview.md | 51 --- content/docs/smalltalk/01-messages.md | 53 --- .../docs/smalltalk/02-syntax-and-blocks.md | 81 ----- .../docs/smalltalk/03-classes-and-methods.md | 76 ---- content/docs/smalltalk/04-object-protocol.md | 51 --- content/docs/smalltalk/05-reflection.md | 44 --- .../smalltalk/06-collections-and-streams.md | 58 --- content/docs/smalltalk/07-processes.md | 35 -- content/docs/smalltalk/08-graphics.md | 49 --- content/docs/smalltalk/09-live-environment.md | 47 --- content/docs/smalltalk/10-mvc.md | 61 ---- content/docs/smalltalk/11-reference.md | 68 ---- package.json | 5 +- scripts/audit-ai-research.py | 9 +- scripts/check-container.sh | 1 + scripts/ci.py | 16 +- scripts/deploy.py | 16 + scripts/docs-admin.sh | 9 + scripts/export-legacy-documents.py | 48 +++ scripts/summarize-ai-income.py | 9 +- scripts/test_ci.py | 4 +- 79 files changed, 562 insertions(+), 5222 deletions(-) create mode 100644 .gitea/workflows/docs-database-verify.yml create mode 100644 apps/docs/scripts/docs-cli.ts create mode 100644 apps/docs/scripts/test-docs.mjs create mode 100644 apps/docs/src/pages/api/documents/source.ts create mode 100644 apps/docs/tests/docs.test.ts delete mode 100644 content/catalog.json delete mode 100644 content/docs/00-endor-concepts-draft.md delete mode 100644 content/docs/01-getting-started.md delete mode 100644 content/docs/02-mounting-draft.md delete mode 100644 content/docs/03-figures.md delete mode 100644 content/docs/04-endor-purpose-draft.md delete mode 100644 content/docs/05-object-graphs-gc.md delete mode 100644 content/docs/06-agent-programming-draft.md delete mode 100644 content/docs/07-composable-judgments-draft.md delete mode 100644 content/docs/ai-company-research/00-overview.md delete mode 100644 content/docs/ai-company-research/01-income-snapshot.md delete mode 100644 content/docs/ai-company-research/02-coverage-and-gaps.md delete mode 100644 content/docs/language-design/00-overview.md delete mode 100644 content/docs/language-design/02-questions.md delete mode 100644 content/docs/language-design/03-questions.md delete mode 100644 content/docs/language-design/04-questions.md delete mode 100644 content/docs/language-design/05-questions.md delete mode 100644 content/docs/language-design/06-questions.md delete mode 100644 content/docs/language-design/07-questions.md delete mode 100644 content/docs/language-design/08-questions.md delete mode 100644 content/docs/language-design/09-questions.md delete mode 100644 content/docs/language-design/10-questions.md delete mode 100644 content/docs/language-design/11-questions.md delete mode 100644 content/docs/language-design/12-questions.md delete mode 100644 content/docs/language-design/13-questions.md delete mode 100644 content/docs/language-design/14-questions.md delete mode 100644 content/docs/pretext/00-overview.md delete mode 100644 content/docs/pretext/01-chapter.md delete mode 100644 content/docs/pretext/02-chapter.md delete mode 100644 content/docs/pretext/03-chapter.md delete mode 100644 content/docs/pretext/04-chapter.md delete mode 100644 content/docs/pretext/05-chapter.md delete mode 100644 content/docs/pretext/06-chapter.md delete mode 100644 content/docs/pretext/07-chapter.md delete mode 100644 content/docs/pretext/08-chapter.md delete mode 100644 content/docs/pretext/09-chapter.md delete mode 100644 content/docs/pretext/10-chapter.md delete mode 100644 content/docs/pretext/11-chapter.md delete mode 100644 content/docs/pretext/12-chapter.md delete mode 100644 content/docs/smalltalk/00-overview.md delete mode 100644 content/docs/smalltalk/01-messages.md delete mode 100644 content/docs/smalltalk/02-syntax-and-blocks.md delete mode 100644 content/docs/smalltalk/03-classes-and-methods.md delete mode 100644 content/docs/smalltalk/04-object-protocol.md delete mode 100644 content/docs/smalltalk/05-reflection.md delete mode 100644 content/docs/smalltalk/06-collections-and-streams.md delete mode 100644 content/docs/smalltalk/07-processes.md delete mode 100644 content/docs/smalltalk/08-graphics.md delete mode 100644 content/docs/smalltalk/09-live-environment.md delete mode 100644 content/docs/smalltalk/10-mvc.md delete mode 100644 content/docs/smalltalk/11-reference.md create mode 100644 scripts/docs-admin.sh create mode 100644 scripts/export-legacy-documents.py diff --git a/.dockerignore b/.dockerignore index 557f4ea..a0d3814 100644 --- a/.dockerignore +++ b/.dockerignore @@ -8,3 +8,7 @@ .artifacts apps/docs/public/figures/**/*.webp .env* + +**/*.sqlite +**/*.sqlite-* +**/*.db diff --git a/.gitea/workflows/ci-deploy.yml b/.gitea/workflows/ci-deploy.yml index 59b3211..1b8a614 100644 --- a/.gitea/workflows/ci-deploy.yml +++ b/.gitea/workflows/ci-deploy.yml @@ -22,6 +22,7 @@ jobs: with: github-server-url: ${{ gitea.server_url }} persist-credentials: false + fetch-depth: 0 - name: Verify with persistent caches or reuse verified image run: python3 scripts/ci.py - name: Deploy latest main with health checks and rollback diff --git a/.gitea/workflows/docs-database-verify.yml b/.gitea/workflows/docs-database-verify.yml new file mode 100644 index 0000000..db91bcf --- /dev/null +++ b/.gitea/workflows/docs-database-verify.yml @@ -0,0 +1,22 @@ +name: Verify database-backed documents +on: + pull_request: + branches: [main] + workflow_dispatch: + +jobs: + verify: + if: gitea.head_ref == 'codex/database-docs' || (gitea.event_name == 'workflow_dispatch' && gitea.ref == 'refs/heads/codex/database-docs') + runs-on: ces-control + timeout-minutes: 45 + env: + DOCKER_BUILDKIT: "0" + CI_CACHE_SCOPE: pr-${{ gitea.event.pull_request.number || '0' }} + steps: + - uses: actions/checkout@v4 + with: + github-server-url: ${{ gitea.server_url }} + persist-credentials: false + fetch-depth: 0 + - name: Validate migration and runtime without deployment + run: python3 scripts/ci.py diff --git a/.gitignore b/.gitignore index 785350d..b6504da 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,8 @@ __pycache__/ # Browser raster derivatives are generated on the confirmed remote runner. /apps/docs/public/figures/**/*.webp + +# Application data and content exports belong in private persistent storage. +*.sqlite +*.sqlite-* +*.db diff --git a/AGENTS.md b/AGENTS.md index ab3fbac..bc62dc8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -3,7 +3,7 @@ - 本仓库专门维护 Endor 文档与制图脚本。支持本地开发;CI/CD 使用现有 ces-control Runner,在 main 通过验证后自动部署。不得修改其他项目、共享 Runner 配置或清理共享 Docker 缓存。 - Web 技术栈为 TypeScript、React、Tailwind CSS、Next.js Pages Router;不要切换到 App Router。 - 使用 pnpm 管理 JavaScript workspace,使用 uv 管理 `tools/figures` 的 Python 项目,保留两套锁文件。 -- Markdown 正文放在 `content/docs`,Python 图形源码放在 `tools/figures/src/endor_figures`,可复现的 SVG 输出放在 `apps/docs/public/figures`。 +- 文档正文、目录元数据与修订记录以站点现有 SQLite 数据库为唯一权威源,使用 docs 管理工具直接更新;不得把新正文、目录 JSON、数据库文件或日常内容快照提交到仓库。历史 Git 文档只用于显式的一次性迁移,不作为运行时种子。Python 图形源码放在 `tools/figures/src/endor_figures`,可复现的 SVG 输出放在 `apps/docs/public/figures`。 - 未确认的架构提议明确标注为草案,不能表述为现有实现。 - 本地开发与预览只监听 `127.0.0.1`。部署容器监听 `0.0.0.0:3000`,服务器入口默认 18135,可通过独立 production.env 配置。 - 对 gitea.entroia.com 仅使用 codex-bot,提交身份为 Codex Bot 。SSH 使用隔离配置:`ssh -F /dev/null -o IdentitiesOnly=yes -i /Users/zzyang/.codex/credentials/gitea-entroia/codex_entroia_ed25519 -p 22222`。 diff --git a/README.md b/README.md index ee59b68..1dcc267 100644 --- a/README.md +++ b/README.md @@ -1,55 +1,67 @@ # Endor · Tabularium -Endor 文档与制图 monorepo。Tabularium 取古罗马档案馆之意。支持本地开发,并由 Gitea Actions 在 ces-control 上验证与部署。 +Endor 文档站、研究工作台与制图程序。应用代码在 Git 中评审;全部文档正文、目录元数据和内容修订以站点 SQLite 数据库为唯一权威源。日常写作不需要 commit、构建或部署。 -## 本地开发 +## 存储与读取 -需要 Node.js 22.13+(推荐 LTS)、pnpm 11.25、Python 3.11+ 和 uv。 -首次安装依赖需要访问软件包源。本地开发服务只监听 127.0.0.1。 +沿用 `AUTH_CONFIG_FILE` 同目录的 `login-state.sqlite` 和 `/auth` 持久挂载。`documents` 存正文及分类、合集、分组、摘要、草案与推荐状态;`document_aliases` 保留旧地址;`document_revisions` 保存每次修改;`document_imports` 标记一次性迁移。没有第二套文档数据库。 + +首页、阅读页、目录和全文搜索按请求查询数据库,使用 `private, no-store`。旧文件式地址与改名前的语义地址通过数据库别名跳转,保留查询参数;不再在构建阶段枚举文档。Markdown 原文通过受认证保护的 `/api/documents/source?slug=...` 获取。 + +仓库不保存日常正文、目录 JSON、数据库文件或内容快照;历史 Git 记录仅用于迁移。页面不再读取 `content/docs` 或 `content/catalog.json`。Markdown 与 GFM 表格仍可用,不解析原始 HTML。图片在写入时检查压缩格式;图形程序与版本化静态资源仍在代码仓库,本轮不迁移媒体存储。研究业务数据留待下一步。 + +## 在服务器上管理文档 + +部署安装 `/opt/endorphin-tabularium-docs/docs`,通过当前容器执行管理 CLI。需要服务器的运维权限;不增加可公开写入的 API,不改变现有动态码登录。 ```sh -pnpm install --frozen-lockfile -uv sync --project tools/figures --locked -pnpm dev +sudo /opt/endorphin-tabularium-docs/docs list +sudo /opt/endorphin-tabularium-docs/docs get endor/endor-purpose-draft +sudo /opt/endorphin-tabularium-docs/docs history 04-endor-purpose-draft ``` -访问 http://127.0.0.1:3000 ,先使用验证器动态码登录。首次本地使用需按下文初始化私有认证配置;缺少配置时正文关闭访问。站点无外部字体或 CDN 资源。 +新建或修改使用标准输入传入完整 JSON。必填字段:`slug`、`sourceSlug`、`title`、`category`、`collection`、`group`、`description`、`draft`、`featured`、`content` 和 `revision`。新建时 `revision: 0`;修改时先 get 并使用读到的 revision,避免覆盖别人刚写入的版本。`sourceSlug` 是稳定标识,修改公共 slug 时保持它不变,旧地址继续可用。调整目录直接修改 category、collection、group 等字段。 -```text -apps/docs/ Next.js Pages Router + React + TypeScript + Tailwind CSS -content/docs/ Markdown 文档源,支持目录,路径成为 /docs/ 路由 -tools/figures/ 独立 Python 项目,使用 drawsvg 编程制图 +```sh +sudo /opt/endorphin-tabularium-docs/docs get endor/endor-purpose-draft > /private/work/purpose.json +# 在私有文件中修改正文或目录字段,保留读到的 revision。 +sudo /opt/endorphin-tabularium-docs/docs save < /private/work/purpose.json ``` -## 命令 +路径仅为操作示例,应选择实际存在且受保护的目录。运行成功后刷新网页即可看到正文、导航和搜索更新。版本冲突时重新读取并合并修改;不要把旧 revision 改成新数字强行覆盖。草案是现有展示标记,不是按分支或用户隔离的访问控制。 -- `pnpm dev`:本地开发,修改 Markdown 后刷新页面即可读取新内容。 -- `pnpm figures`:运行 Python 制图,更新 `apps/docs/public/figures`。 -- `pnpm lint` / `pnpm typecheck`:前端静态检查。 -- `pnpm build`:构建文档站。 -- `pnpm start`:在本地预览已构建站点。 -- `pnpm check`:依次执行 lint、类型检查、制图与构建。 +新增正文不提交回 Git。奇思妙想这类内容同样通过数据库写入;代码分支与数据发布是不同动作,不能因为迁移程序合并就自动发布其他未合并分支的内容。 -站点默认浅色,使用本地系统字体。全站搜索支持正文关键词、`⌘/Ctrl K`、方向键与 Enter;代码块提供复制与反馈。桌面提供分组导航和滚动高亮的页内目录,小屏可展开文档菜单与页内目录。首页入口、草案提示、前后篇导航均引用现有 Markdown 内容和资料目录配置。顶部提供文档切换,阅读页左侧只展示当前文档,并有独立图标、名称与返回入口;搜索框标明当前文档范围。界面主要通过留白、轻渐变与状态反馈分层,支持减少动态效果的系统偏好。 +## 首次迁移与备份 -参考设计截图与研究记录保存在 `design/references`;浏览器验收截图与检查说明保存在 `design/verification`。这些文件不作为站点静态资源发布。 +迁移前主线的 50 篇正文及目录可从固定历史提交 `25c5e83d08eae4277fe429a692955bd3bb2e717f` 完整导出: -文档标题取首个 `# 标题`,文档排序按相对路径。支持多层目录(例如 `content/docs/pretext/01-chapter.md` 对应 `/docs/pretext/01-chapter`);旧文档地址保持可用。`content/catalog.json` 管理合集、分类、摘要、草案与推荐,新增资料无需修改页面代码。首页推荐最多3篇,目录每页8条,可按合集与标题筛选;全站搜索仍覆盖全文。相邻篇目限于当前合集。 +```sh +python3 scripts/export-legacy-documents.py --output .artifacts/documents-migration.json +``` -Pretext 教程位于 `content/docs/pretext`,包含导读与12章,来自本地 Pretext 研究成果。源码链接锁定上游研究版本;实验脚本与原始记录位于 `apps/docs/public/materials/pretext`,和正文一样经过登录验证。普通 Markdown 与 GFM 表格可用,嵌入图使用 `/figures/.svg`。不解析原始 HTML。 +导出文件位于 Git 忽略目录、权限 0600,不进入镜像。脚本也支持显式 `--ref`,但不能用未评审分支替换生产迁移基线。它不会在站点读取时执行。CI 使用历史导出验证全部正文与目录的逐项一致性,构建镜像只含程序,不含文档快照或数据库。 -语言设计问题集位于 `content/docs/language-design`,是第三个资料合集,包含总览与原编号02–14的13个分类,共271项议题。原讨论已确认26项,其余保持待讨论;来源映射和本次状态记录位于 `content/language-design-sources.json`。维护时同步章节、总览计数与来源状态;不会自动从聊天同步,也不把设计记录等同于已实现功能。 +首次部署先备份整个共享数据库,再显式事务导入到空文档表。普通部署使用 `import --if-empty`,已有内容时跳过,不以历史数据覆盖数据库编辑;重复同一导入也不会重置内容。导入失败则事务整体回滚,既有登录与研究表保留,部署中止。 -生产构建会生成文档路由;新增或修改文档后重新运行 build。开发模式按请求读取内容。 -main 推送通过 CI 验证后自动部署;Pull Request 只验证,不部署。工作流也支持手动触发。 +```sh +sudo /opt/endorphin-tabularium-docs/docs backup /auth/manual-backup.sqlite +sudo /opt/endorphin-tabularium-docs/docs export /auth/current-documents.json +``` -## Endor 概念图 +backup 是包含登录、研究、正文、别名和修订的完整 SQLite 一致性备份;export 只导出当前正文与目录,作为空库初始化/外部迁移快照,不代替完整备份或恢复修订历史。输出路径均在容器内,文件已存在时拒绝覆盖。备份含认证状态,应留在私有挂载或受控备份位置,不能放到公开静态目录、仓库或日志。 -`content/docs/00-endor-concepts-draft.md` 解释全球入口、区域网关与 Runtime、分片、CDN、身份及跨区恢复的概念设计,页面为 `/docs/00-endor-concepts-draft`。 +代码回退不会撤销数据库编辑,但回退到旧文件式站点会显示旧正文。恢复完整数据库会同时影响登录和研究状态,必须先停止写入、保留当前备份并由管理员明确选择恢复点;部署脚本不会自动恢复数据库或删除新内容。 -图形源码位于 `tools/figures/src/endor_figures/architecture.py`,由 `pnpm figures` 生成 `apps/docs/public/figures/endor-architecture.svg`。Python 负责可复现的节点、全连接和复制路径,正文直接显示图片,点击可放大;大图支持原尺寸查看、滚动和 Escape/空白处关闭。无需外部图标、字体或绘图服务。图中的数量是示意,身份服务/CDN 接入属于建议,所有未实现的关系均以草案说明。 +## 代码验证 -拓扑检查:`uv run --locked --project tools/figures python -m unittest discover -s tools/figures/tests -v`。容器检查流程会运行同一检查。 +使用 React、Next.js Pages Router、TypeScript 和 Tailwind CSS。JavaScript 用 pnpm,制图 Python 用 uv。编译、构建、打包和构建产物全部在已确认的 ces-control Runner 执行;`pnpm test:docs` 等测试脚本会调用 esbuild,也只能在 Runner 执行。 + +迁移 PR 有专用验证工作流,执行 lint、类型检查、数据库事务/版本测试、现有认证与研究测试、图形检查、构建与容器冒烟,不部署。主线验证通过后才沿用既有部署流程,仍等待用户手动合并 PR。 + +冒烟使用隔离数据库卷:完整导入后逐项核对全部正文与目录,验证新建、更新、重命名、搜索立即变化及容器重启后的持久化,并覆盖全部文档地址、认证、媒体和原文端点。测试卷不会触及生产数据库。 + +`tools/figures/src/endor_figures` 与 `apps/docs/public/figures` 仍保存图形源码及可复现的静态资源。图形构建也在远程执行。 ## 动态码登录与二维码 @@ -68,13 +80,7 @@ sudo /opt/endorphin-tabularium-docs/auth verify `qr`只允许交互终端显示;`qr-png`用于通过SSH将PNG直接重定向到私有本地文件,不在CI中运行。二维码等同登录凭据,不放入本仓库或网页。只有明确执行 `auth rotate --confirm` 才更换密钥并使旧二维码、会话失效;重新显示或下载二维码不会轮换。 -本地先构建CLI,再初始化独立的本地测试配置: - -```sh -pnpm build -AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json node apps/docs/.next/standalone/apps/docs/auth-cli.cjs init -AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=false pnpm dev -``` +构建、打包与会触发构建的测试只在用户确认的 ces-control Runner 上执行。本地不执行 `pnpm dev`、`pnpm build`、`pnpm typecheck` 或打包测试。 当前服务器入口为HTTP,与参考项目一致使用 `AUTH_COOKIE_SECURE=false`;配置HTTPS后应在独立production.env设置 `AUTH_COOKIE_SECURE=true`。HTTP本身不加密动态码和会话传输。 @@ -87,7 +93,7 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 公司明细、收入观测、原始证据和数据核查记录。所有页面与 `GET /api/research/ai-companies` 均使用文档站现有的登录认证。 -研究数据与登录状态**共用文档站现有的 SQLite 数据库文件**: +研究业务数据本轮暂不迁移,仍沿用版本化 JSON 导入机制。研究数据、文档与登录状态**共用文档站现有的 SQLite 数据库文件**: `AUTH_CONFIG_FILE` 同目录下的 `login-state.sqlite`。该文件名是历史名称,未创建第二个数据库。 `login_state` 保留登录限流与重放状态,新增的 `research_*` 表保存数据版本、分类、 公司、经营指标、证据与核查记录。沿用现有 `/auth` 持久挂载,数据库不会写入镜像或公开目录。 @@ -123,7 +129,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算 覆盖审计页位于 `/docs/other-research/ai-company-research/coverage`,分类链接 `overview?category=` 的筛选数据。 `python3 scripts/audit-ai-research.py --check` 检查候选池逐条计数与覆盖报告一致性;CI在ces-control运行此检查,未更改触发范围。 收入快照报告位于 `/docs/other-research/ai-company-research/income-snapshot`,样本名称链接 `overview?company=` 的公司明细。 -`python3 scripts/summarize-ai-income.py --check` 独立复核统计与报告一致性;不触发编译或构建。数据变更后先审查方法,再运行不带参数的命令更新固定快照。 +`python3 scripts/summarize-ai-income.py --check` 独立复核统计与报告一致性;不触发编译或构建。数据变更后先审查方法,再运行不带参数的命令生成 `.artifacts/reports` 下的候选正文,使用 docs 管理工具显式更新数据库;不再生成受 Git 管理的正文。 默认7日样本14个产品;90日窗口新增Gojiberry的8月历史点,营销样本的均值和CV随之明显变化。 这提示先核查时间与样本构成,不能将高离散度直接解释为造假。两个近名营养应用按不同App Store ID分别建档。 diff --git a/apps/docs/package.json b/apps/docs/package.json index 2330f52..fa6fcea 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -11,7 +11,8 @@ "lint": "eslint . --max-warnings=0", "typecheck": "NEXT_TELEMETRY_DISABLED=1 next typegen && tsc --noEmit", "test:auth": "node scripts/test-auth.mjs", - "test:research": "node scripts/test-research.mjs" + "test:research": "node scripts/test-research.mjs", + "test:docs": "node scripts/test-docs.mjs" }, "dependencies": { "next": "16.4.3", diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 4224810..0a48be3 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -18,6 +18,7 @@ import { totp, isLoginRedirect, } from "../src/lib/auth"; +import { readDocument, saveDocument } from "../src/lib/docs"; import { consumeCode, initializeStore } from "../src/lib/auth-store"; async function main() { @@ -132,11 +133,6 @@ async function main() { join(__dirname, ".next/BUILD_ID"), "utf8", ).trim(); - const routes = Object.keys( - JSON.parse( - readFileSync(join(__dirname, ".next/prerender-manifest.json"), "utf8"), - ).routes, - ) as string[]; for (const path of [ "/", "/docs/00-endor-concepts-draft", @@ -160,7 +156,7 @@ async function main() { path, ); } - for (const path of ["/api/private", "/api/unknown", "/api/search", "/api/research/ai-companies"]) + for (const path of ["/api/private", "/api/unknown", "/api/search", "/api/documents/source?slug=endor/endor-purpose-draft", "/api/research/ai-companies"]) assert.equal((await request(path)).status, 401, path); assert.equal( ( @@ -209,6 +205,32 @@ async function main() { assert.equal(destination.searchParams.get("from"), "legacy"); assert.ok(legacy.headers.get("cache-control")?.includes("no-store")); } + const routes = ["/", ...searchIndex.map((doc: { slug: string }) => `/docs/${doc.slug}`)]; + const raw = await request("/api/documents/source?slug=endor/endor-purpose-draft", { headers }); + assert.equal(raw.status, 200); + assert.ok((await raw.text()).startsWith("# Endor")); + if (process.env.DOCUMENT_SMOKE_TEST) { + const sourceSlug = "ci-live-document"; + const previous = readDocument(sourceSlug); + if (command === "exercise") { + const first = saveDocument({ slug: "endor/ci-live-document", sourceSlug, + title: "Runtime document", category: "Endor", collection: "Endor 文档", group: "CI", + description: "Isolated smoke test", draft: true, featured: false, + content: "# Runtime document\n\nInitial body" }, previous?.revision ?? 0); + assert.equal((await request(`/docs/${first.slug}`, { headers })).status, 200); + saveDocument({ ...first, slug: "endor/ci-live-document-renamed", content: "# Runtime document\n\nUpdated without rebuilding" }, first.revision); + } + const stored = readDocument(sourceSlug); + assert.ok(stored?.content.includes("Updated without rebuilding"), "DB content survives restart"); + const live = await request(`/docs/${stored.slug}`, { headers }); + assert.equal(live.status, 200); + assert.ok((await live.text()).includes("Updated without rebuilding")); + const alias = await request("/docs/endor/ci-live-document?live=1", { headers }); + assert.equal(alias.status, 308); + assert.ok(alias.headers.get("location")?.includes("ci-live-document-renamed?live=1")); + const updatedIndex = await (await request("/api/search", { headers })).json(); + assert.ok(updatedIndex.some((doc: { searchText: string }) => doc.searchText.includes("Updated without rebuilding"))); + } let home = ""; let purpose = ""; for (const route of routes) { diff --git a/apps/docs/scripts/build-auth.mjs b/apps/docs/scripts/build-auth.mjs index b28a834..b648e0d 100644 --- a/apps/docs/scripts/build-auth.mjs +++ b/apps/docs/scripts/build-auth.mjs @@ -7,3 +7,8 @@ await build({ format: "cjs", outfile: ".next/standalone/apps/docs/auth-cli.cjs", }); + +await build({ + entryPoints: ["scripts/docs-cli.ts"], bundle: true, platform: "node", target: "node22", + format: "cjs", outfile: ".next/standalone/apps/docs/docs-cli.cjs", +}); diff --git a/apps/docs/scripts/build-doc-images.mjs b/apps/docs/scripts/build-doc-images.mjs index 8989bf7..cdedcca 100644 --- a/apps/docs/scripts/build-doc-images.mjs +++ b/apps/docs/scripts/build-doc-images.mjs @@ -23,19 +23,6 @@ for (const name of await files(path.join(root, "apps/docs/public"))) { throw new Error(`Original raster exposed in public: ${path.relative(root, name)}. Move it to tools/figures/assets and run images.`); } } -for (const name of await files(path.join(root, "content/docs"))) { - if (!name.endsWith(".md")) continue; - const content = await readFile(name, "utf8"); - const images = [ - ...content.matchAll(/!\[[^\]]*\]\(]+)/g), - ...content.matchAll(/]*\bsrc=["']([^"']+)/gi), - ]; - for (const [, source] of images) { - if (/\.(?:png|jpe?g|tiff?|bmp)(?:[?#]|$)/i.test(source)) { - throw new Error(`${path.relative(root, name)} embeds an original raster: ${source}. Use the compressed WebP.`); - } - } -} await mkdir(output, { recursive: true }); for (const source of await files(sources)) { diff --git a/apps/docs/scripts/docs-cli.ts b/apps/docs/scripts/docs-cli.ts new file mode 100644 index 0000000..a3f6f50 --- /dev/null +++ b/apps/docs/scripts/docs-cli.ts @@ -0,0 +1,44 @@ +import { readFileSync, writeFileSync } from "node:fs"; +import { openSiteDatabase } from "../src/lib/site-database"; +import { allDocuments, readDocument, saveDocument, importDocuments, documentHistory } from "../src/lib/docs"; + +process.umask(0o077); +const [command, argument] = process.argv.slice(2); +try { + switch (command) { + case "backup": { + if (!argument) throw Error("Provide a private backup filename"); + const db = openSiteDatabase(); + try { db.prepare("VACUUM INTO ?").run(argument); } finally { db.close(); } + console.log("Full site database backup created; existing files are never overwritten"); break; + } + case "list": + console.log(JSON.stringify(allDocuments().map(({ content: _, ...doc }) => { void _; return doc; }), null, 2)); break; + case "get": { + const doc = readDocument(argument ?? ""); + if (!doc) throw Error("Document not found"); + console.log(JSON.stringify(doc, null, 2)); break; + } + case "save": { + const { revision, ...input } = JSON.parse(readFileSync(0, "utf8")); + const doc = saveDocument(input, revision); + console.log(JSON.stringify({ slug: doc.slug, revision: doc.revision })); break; + } + case "history": + console.log(JSON.stringify(documentHistory(argument ?? ""), null, 2)); break; + case "import": { + const bundle = JSON.parse(readFileSync(0, "utf8")); + console.log(JSON.stringify({ imported: importDocuments(bundle, argument === "--if-empty") })); break; + } + case "export": { + if (!argument) throw Error("Provide a private export filename"); + writeFileSync(argument, JSON.stringify({ format: "tabularium-documents-v1", documents: allDocuments() }), + { flag: "wx", mode: 0o600 }); + console.log("Document export created; existing files are never overwritten"); break; + } + default: throw Error("Usage: docs backup | list | get | save < input.json | history | import [--if-empty] < export.json | export "); + } +} catch (error) { + console.error(error instanceof Error ? error.message : "Document operation failed"); + process.exitCode = 1; +} diff --git a/apps/docs/scripts/test-docs.mjs b/apps/docs/scripts/test-docs.mjs new file mode 100644 index 0000000..339d95b --- /dev/null +++ b/apps/docs/scripts/test-docs.mjs @@ -0,0 +1,14 @@ +import { build } from "esbuild"; +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { spawnSync } from "node:child_process"; + +const dir = await mkdtemp(join(tmpdir(), "tabularium-docs-tests-")); +try { + const file = join(dir, "docs.test.cjs"); + await build({ entryPoints: ["tests/docs.test.ts"], bundle: true, + platform: "node", target: "node22", format: "cjs", outfile: file }); + const result = spawnSync(process.execPath, ["--test", file], { stdio: "inherit" }); + process.exitCode = result.status ?? 1; +} finally { await rm(dir, { recursive: true, force: true }); } diff --git a/apps/docs/src/lib/docs.ts b/apps/docs/src/lib/docs.ts index dbdbc27..7f14bcb 100644 --- a/apps/docs/src/lib/docs.ts +++ b/apps/docs/src/lib/docs.ts @@ -1,50 +1,147 @@ -import fs from "node:fs/promises"; -import path from "node:path"; -import catalog from "../../../../content/catalog.json"; +import { randomUUID, createHash } from "node:crypto"; +import { openSiteDatabase } from "./site-database"; -const directory = path.resolve(process.cwd(), "../../content/docs"); -const validSlug = /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/; -type Metadata = { slug?: string; category?: string; collection?: string; group?: string; description?: string; draft?: boolean; featured?: boolean }; export type DocLink = { slug: string; sourceSlug: string; category: string; title: string; searchText?: string; group: string; collection: string; description: string; draft: boolean; featured: boolean; + revision: number; }; export type Doc = DocLink & { content: string }; +export type DocInput = Omit; +export type DocumentExport = { format: "tabularium-documents-v1"; documents: Doc[] }; +export const validSlug = /^[a-z0-9]+(?:-[a-z0-9]+)*(?:\/[a-z0-9]+(?:-[a-z0-9]+)*)*$/; + +function database() { + const db = openSiteDatabase(); + db.exec(` + CREATE TABLE IF NOT EXISTS documents ( + id TEXT PRIMARY KEY, slug TEXT NOT NULL UNIQUE, source_slug TEXT NOT NULL UNIQUE, + revision INTEGER NOT NULL, payload TEXT NOT NULL + ); + CREATE TABLE IF NOT EXISTS document_aliases ( + alias TEXT PRIMARY KEY, document_id TEXT NOT NULL REFERENCES documents(id) + ); + CREATE TABLE IF NOT EXISTS document_revisions ( + document_id TEXT NOT NULL REFERENCES documents(id), revision INTEGER NOT NULL, + payload TEXT NOT NULL, created_at TEXT NOT NULL, PRIMARY KEY(document_id, revision) + ); + CREATE TABLE IF NOT EXISTS document_imports ( + digest TEXT PRIMARY KEY, document_count INTEGER NOT NULL, created_at TEXT NOT NULL + ); + `); + return db; +} + +export function validateDocument(input: DocInput): void { + if (!input || typeof input !== "object") throw Error("Invalid document"); + for (const key of ["slug", "sourceSlug"] as const) + if (typeof input[key] !== "string" || !validSlug.test(input[key])) throw Error(`Invalid ${key}`); + if (input.slug.split("/").some((part) => /^\d+-/.test(part))) throw Error("Use a semantic public slug"); + for (const key of ["title", "category", "collection", "group"] as const) + if (typeof input[key] !== "string" || !input[key].trim()) throw Error(`Missing ${key}`); + if (typeof input.content !== "string" || typeof input.description !== "string" || + typeof input.draft !== "boolean" || typeof input.featured !== "boolean") throw Error("Invalid document fields"); + if (input.content.length > 2_000_000) throw Error("Document exceeds content limit"); + const images = [ + ...input.content.matchAll(/!\[[^\]]*\]\(]+)/g), + ...input.content.matchAll(/]*\bsrc=["']([^"']+)/gi), + ]; + if (images.some(([, source]) => /\.(?:png|jpe?g|tiff?|bmp)(?:[?#]|$)/i.test(source))) + throw Error("Use compressed WebP images instead of original rasters"); +} + +function write(db: ReturnType, input: DocInput, expectedRevision: number): Doc { + validateDocument(input); + const existing = db.prepare("SELECT id, revision FROM documents WHERE source_slug=?") + .get(input.sourceSlug) as { id: string; revision: number } | undefined; + if ((existing?.revision ?? 0) !== expectedRevision) throw Error("Document revision conflict"); + const id = existing?.id ?? randomUUID(); + const doc: Doc = { slug: input.slug, sourceSlug: input.sourceSlug, category: input.category, + title: input.title, group: input.group, collection: input.collection, description: input.description, + draft: input.draft, featured: input.featured, content: input.content, revision: expectedRevision + 1 }; + const payload = JSON.stringify(doc); + // Aliases remain reserved after renaming; collision rolls back the whole write. + db.prepare(`INSERT INTO documents VALUES (?,?,?,?,?) ON CONFLICT(id) DO UPDATE SET + slug=excluded.slug, revision=excluded.revision, payload=excluded.payload`) + .run(id, doc.slug, doc.sourceSlug, doc.revision, payload); + for (const alias of new Set([doc.slug, doc.sourceSlug])) { + const prior = db.prepare("SELECT document_id FROM document_aliases WHERE alias=?") + .get(alias) as { document_id: string } | undefined; + if (prior && prior.document_id !== id) throw Error(`Document alias collision: ${alias}`); + db.prepare("INSERT OR IGNORE INTO document_aliases VALUES (?,?)").run(alias, id); + } + db.prepare("INSERT INTO document_revisions VALUES (?,?,?,?)") + .run(id, doc.revision, payload, new Date().toISOString()); + return doc; +} + +export function saveDocument(input: DocInput, expectedRevision: number): Doc { + if (!Number.isSafeInteger(expectedRevision) || expectedRevision < 0) throw Error("Provide expected revision"); + const db = database(); + try { + db.exec("BEGIN IMMEDIATE"); + try { const doc = write(db, input, expectedRevision); db.exec("COMMIT"); return doc; } + catch (error) { db.exec("ROLLBACK"); throw error; } + } finally { db.close(); } +} + +export function readDocument(slug: string): Doc | null { + if (!validSlug.test(slug)) return null; + const db = database(); + try { + const row = db.prepare(`SELECT d.payload FROM documents d JOIN document_aliases a + ON a.document_id=d.id WHERE a.alias=?`).get(slug) as { payload: string } | undefined; + return row ? JSON.parse(row.payload) as Doc : null; + } finally { db.close(); } +} + +export function allDocuments(): Doc[] { + const db = database(); + try { + return (db.prepare("SELECT payload FROM documents ORDER BY source_slug").all() as { payload: string }[]) + .map((row) => JSON.parse(row.payload) as Doc); + } finally { db.close(); } +} export async function readDoc(slug: string): Promise { - if (!validSlug.test(slug)) throw new Error("Invalid document slug"); - const sourceSlug = Object.entries(catalog.documents).find(([, metadata]) => metadata.slug === slug)?.[0] ?? slug; - const content = await fs.readFile(path.join(directory, `${sourceSlug}.md`), "utf8"); - const title = content.match(/^# (.+)$/m)?.[1]?.trim() ?? slug; - const collection = catalog.collections.find((c) => !c.path || sourceSlug.startsWith(`${c.path}/`))!; - const metadata: Metadata = (catalog.documents as Record)[sourceSlug] ?? {}; - if (!metadata.slug || !metadata.category || !validSlug.test(metadata.slug) || metadata.slug.split("/").some((part) => /^\d+-/.test(part))) { - throw new Error(`Register a semantic slug and category in content/catalog.json: ${sourceSlug}`); - } - return { slug: metadata.slug, sourceSlug, category: metadata.category, title, content, searchText: content, - group: metadata.group ?? collection.title, collection: metadata.collection ?? collection.title, - description: metadata.description ?? collection.description, - draft: metadata.draft ?? false, featured: metadata.featured ?? false, - }; + const doc = readDocument(slug); + if (!doc) throw Error("Document not found"); + return doc; } export async function listDocs(): Promise { - async function walk(folder: string): Promise { - const entries = await fs.readdir(path.join(directory, folder), { withFileTypes: true }); - const files = await Promise.all(entries.map(async (entry) => { - const relative = folder ? `${folder}/${entry.name}` : entry.name; - if (entry.isDirectory()) return walk(relative); - if (entry.isFile() && relative.endsWith(".md") && validSlug.test(relative.slice(0, -3))) - return [relative.slice(0, -3)]; - return []; - })); - return files.flat(); - } - const docs = await Promise.all((await walk("")).sort().map(async (slug) => { - const { content: _, searchText: __, ...doc } = await readDoc(slug); - void _; void __; - return doc; - })); - if (new Set(docs.map((doc) => doc.slug)).size !== docs.length) throw new Error("Duplicate public document slug"); - return docs; + return allDocuments().map(({ content: _, ...doc }) => { void _; return doc; }); +} + +// Explicit, atomic bootstrap only. Runtime reads never import repository data. +export function importDocuments(bundle: DocumentExport, onlyIfEmpty = false): number { + if (bundle?.format !== "tabularium-documents-v1" || !Array.isArray(bundle.documents) || !bundle.documents.length) + throw Error("Invalid or empty document export"); + bundle.documents.forEach(validateDocument); + const digest = createHash("sha256").update(JSON.stringify(bundle)).digest("hex"); + const db = database(); + try { + db.exec("BEGIN IMMEDIATE"); + try { + const imported = db.prepare("SELECT digest FROM document_imports WHERE digest=?").get(digest); + if (imported) { db.exec("COMMIT"); return 0; } + const count = (db.prepare("SELECT COUNT(*) AS n FROM documents").get() as { n: number }).n; + if (count) { + if (!onlyIfEmpty) throw Error("Bootstrap requires an empty document database"); + db.exec("COMMIT"); return 0; + } + for (const doc of bundle.documents) write(db, doc, 0); + db.prepare("INSERT INTO document_imports VALUES (?,?,?)").run(digest, bundle.documents.length, new Date().toISOString()); + db.exec("COMMIT"); return bundle.documents.length; + } catch (error) { db.exec("ROLLBACK"); throw error; } + } finally { db.close(); } +} + +export function documentHistory(sourceSlug: string): Doc[] { + const db = database(); + try { + return (db.prepare(`SELECT r.payload FROM document_revisions r JOIN documents d + ON r.document_id=d.id WHERE d.source_slug=? ORDER BY r.revision`).all(sourceSlug) as { payload: string }[]) + .map((row) => JSON.parse(row.payload) as Doc); + } finally { db.close(); } } diff --git a/apps/docs/src/pages/api/documents/source.ts b/apps/docs/src/pages/api/documents/source.ts new file mode 100644 index 0000000..3ca3a80 --- /dev/null +++ b/apps/docs/src/pages/api/documents/source.ts @@ -0,0 +1,22 @@ +import type { NextApiRequest, NextApiResponse } from "next"; +import { readDocument } from "@/lib/docs"; + +// The proxy protects Markdown just like the rendered document and search index. +export default function handler(request: NextApiRequest, response: NextApiResponse) { + response.setHeader("Cache-Control", "private, no-store"); + if (request.method !== "GET") { + response.setHeader("Allow", "GET"); + return response.status(405).end(); + } + const slug = request.query.slug; + if (typeof slug !== "string") return response.status(400).json({ error: "缺少文档地址" }); + try { + const doc = readDocument(slug); + if (!doc) return response.status(404).end(); + response.setHeader("Content-Type", "text/plain; charset=utf-8"); + response.setHeader("X-Content-Type-Options", "nosniff"); + return response.status(200).send(doc.content); + } catch { + return response.status(503).json({ error: "文档数据库暂时不可用" }); + } +} diff --git a/apps/docs/src/pages/api/search.ts b/apps/docs/src/pages/api/search.ts index e531dde..0dccf33 100644 --- a/apps/docs/src/pages/api/search.ts +++ b/apps/docs/src/pages/api/search.ts @@ -1,5 +1,5 @@ import type { NextApiRequest, NextApiResponse } from "next"; -import { listDocs, readDoc } from "@/lib/docs"; +import { allDocuments } from "@/lib/docs"; // The proxy authenticates this endpoint, including index content. export default async function handler(request: NextApiRequest, response: NextApiResponse) { @@ -8,9 +8,10 @@ export default async function handler(request: NextApiRequest, response: NextApi response.setHeader("Allow", "GET"); return response.status(405).end(); } - const docs = await listDocs(); - const index = await Promise.all(docs.map(async (doc) => ({ - ...doc, searchText: (await readDoc(doc.slug)).content, - }))); - response.status(200).json(index); + try { + const index = allDocuments().map(({ content, ...doc }) => ({ ...doc, searchText: content })); + return response.status(200).json(index); + } catch { + return response.status(503).json({ error: "文档数据库暂时不可用" }); + } } diff --git a/apps/docs/src/pages/docs/[...slug].tsx b/apps/docs/src/pages/docs/[...slug].tsx index dfb7efc..b3a91f7 100644 --- a/apps/docs/src/pages/docs/[...slug].tsx +++ b/apps/docs/src/pages/docs/[...slug].tsx @@ -1,7 +1,6 @@ import type { - GetStaticPaths, - GetStaticProps, - InferGetStaticPropsType, + GetServerSideProps, + InferGetServerSidePropsType, } from "next"; import Head from "next/head"; import dynamic from "next/dynamic"; @@ -15,7 +14,7 @@ import { } from "react"; import ReactMarkdown from "react-markdown"; import remarkGfm from "remark-gfm"; -import { listDocs, readDoc, type Doc, type DocLink } from "@/lib/docs"; +import { listDocs, readDocument, type Doc, type DocLink } from "@/lib/docs"; import { Shell, Navigation } from "@/components/Shell"; import { ArchitectureFigure } from "@/components/ArchitectureFigure"; import { FigureGallery } from "@/components/FigureGallery"; @@ -26,16 +25,17 @@ import { headingsFor } from "@/lib/navigation"; type Props = { doc: Doc; docs: DocLink[] }; const AICompanyResearch = dynamic(() => import("@/components/AICompanyResearch")); -export const getStaticPaths: GetStaticPaths = async () => ({ - paths: (await listDocs()).map(({ slug }) => ({ params: { slug: slug.split("/") } })), - fallback: false, -}); -export const getStaticProps: GetStaticProps = async ({ params }) => { +export const getServerSideProps: GetServerSideProps = async ({ params, res, resolvedUrl }) => { + res.setHeader("Cache-Control", "private, no-store"); const slug = Array.isArray(params?.slug) ? params.slug.join("/") : params?.slug; if (typeof slug !== "string") return { notFound: true }; - const docs = await listDocs(); - if (!docs.some((d) => d.slug === slug)) return { notFound: true }; - return { props: { doc: await readDoc(slug), docs } }; + const doc = readDocument(slug); + if (!doc) return { notFound: true }; + if (slug !== doc.slug) { + const query = resolvedUrl.includes("?") ? resolvedUrl.slice(resolvedUrl.indexOf("?")) : ""; + return { redirect: { destination: `/docs/${doc.slug}${query}`, permanent: true } }; + } + return { props: { doc, docs: await listDocs() } }; }; function textOf(value: ReactNode): string { return Children.toArray(value) @@ -49,7 +49,7 @@ function textOf(value: ReactNode): string { export default function DocPage({ doc, docs, -}: InferGetStaticPropsType) { +}: InferGetServerSidePropsType) { const headings = headingsFor(doc.content); const [active, setActive] = useState(""); @@ -231,9 +231,9 @@ export default function DocPage({