merge: preserve the latest Wabi research in the document database migration
This commit is contained in:
@@ -34,7 +34,7 @@ sudo /opt/endorphin-tabularium-docs/docs save < /private/work/purpose.json
|
||||
|
||||
## 首次迁移与备份
|
||||
|
||||
本次汇总先合入 PR #14、#15、#16,再应用 PR #17 的数据库迁移。最新研究正文及奇思妙想草案合计 51 篇,连同目录可从固定历史提交 `cffca6942b1bc0005321e1685f38593fb0b853d5` 完整导出:
|
||||
本次汇总先合入 PR #14、#15、#16,再应用 PR #17 的数据库迁移。最新研究正文及奇思妙想草案合计 51 篇,连同目录可从固定历史提交 `cffca6942b1bc0005321e1685f38593fb0b853d5` 完整导出;其中 AI 公司研究三篇采用汇总期间追加的 `74af205b2959e1bb6a1fe9f567bc87069ac6d12c` 历史版本,保留 Wabi 更新:
|
||||
|
||||
```sh
|
||||
python3 scripts/export-legacy-documents.py --output .artifacts/documents-migration.json
|
||||
@@ -104,13 +104,13 @@ sudo /opt/endorphin-tabularium-docs/auth verify
|
||||
同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。
|
||||
所有修改都经过工作分支和 PR,部署仍等待人工合并主线。
|
||||
|
||||
当前资料包含 1,020 条公司/产品记录、10 类业务及待分类组、1,197 条证据记录和 187 条经营与技术观测。
|
||||
其中保留 92 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。
|
||||
当前资料包含 1,021 条公司/产品记录、10 类业务及待分类组、1,201 条证据记录和 187 条经营与技术观测。
|
||||
其中保留 93 家个案资料、912 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。
|
||||
Product Hunt两年档案各首批19张、合计38张发布/推广卡片以`candidateBatches`保存;公司成立年待核者不自动新增公司。其中18条仍待核成立年;排除依据区分正式成立字段与2025前已运营证据,精确注册日期未核者明确标注。候选元数据与其他研究记录同库持久化,覆盖报告逐条展示状态、缺项和公司关联。Kilo Code与KiloClaw两项映射一个已被收购的2025公司个案,采用规模、token吞吐及同名健康公司的收入不作为其ARR。
|
||||
机器之心首批4条公司线索以独立候选批次记录:直达正文未读,经公司公开主页、官方代码或发起方公告补核PrismShadow与Stargate;SSI用2024官方历史更新排除,Utopai仍待核。不是两年中文来源全量。
|
||||
TechCrunch栏目首批3条公司候选(DreamHQ、Wabi、Thrive Holdings)已追溯原始材料;成立年仍待核,不自动新增公司。DreamHQ与名录同名摄像头公司区分,ADT拟收购尚待交割,融资、估值和目标公司业绩不当新AI公司的ARR。分类接口与RSS访问403及两年档案缺项保留。
|
||||
TechCrunch栏目首批3条公司候选已追溯原始材料;Wabi据两个公开名录2025年份入表,精确注册日未核。官方条款称当前免费,收入仍未知,不填零。DreamHQ及Thrive Holdings成立年仍待核,后者2025公开发布公告另存。DreamHQ与名录同名摄像头公司区分,ADT拟收购尚待交割,融资、估值和目标公司业绩不当新AI公司的ARR。分类接口与RSS访问403及两年档案缺项保留。
|
||||
补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。
|
||||
新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;67条核查中51条指向具体公司、4条属于全局方法、12条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。
|
||||
新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;68条核查中52条指向具体公司、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。
|
||||
@@ -155,7 +155,7 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算
|
||||
仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。
|
||||
AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。
|
||||
技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。
|
||||
当前12条完成该字段的专项记录,其中6条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。
|
||||
当前13条完成该字段的专项记录,其中6条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。
|
||||
界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。
|
||||
|
||||
`pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、
|
||||
|
||||
@@ -181,9 +181,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, 1020);
|
||||
assert.equal(research.companies.length, 1021);
|
||||
assert.equal(research.categories.length, 11);
|
||||
assert.equal(research.evidence.length, 1197);
|
||||
assert.equal(research.evidence.length, 1201);
|
||||
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 });
|
||||
|
||||
@@ -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, 1020);
|
||||
assert.equal(initial.evidence.length, 1197);
|
||||
assert.equal(initial.companies.length, 1021);
|
||||
assert.equal(initial.evidence.length, 1201);
|
||||
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,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, 51);
|
||||
assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 52);
|
||||
assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 4);
|
||||
assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 12);
|
||||
const review = snapshot.reviews.find((r) => r.id === "R4")!;
|
||||
@@ -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), 1020);
|
||||
assert.equal(summary.reduce((n, c) => n + c.count, 0), 1021);
|
||||
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), 977);
|
||||
assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 978);
|
||||
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,7 +97,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, 12);
|
||||
assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 13);
|
||||
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");
|
||||
@@ -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, 22);
|
||||
assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 21);
|
||||
});
|
||||
|
||||
test("product pivots and founder histories do not become new company years or current revenue", () => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "2026-10-30-tc-1",
|
||||
"version": "2026-10-30-tc-2",
|
||||
"asOf": "2026-10-30",
|
||||
"scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。",
|
||||
"limitations": [
|
||||
@@ -28794,6 +28794,47 @@
|
||||
"businessModel": "合资基础设施建设运营;融资、资本投入、长期算力合同和确认收入分开",
|
||||
"entityBasis": "公告称Stargate为新公司;Stargate品牌项目与场地合作方、地区实体的法律及并表边界待核",
|
||||
"classificationBasis": "按AI算力与物理基础设施建设运营归C02,合资模式不与轻资产软件订阅直接比较。"
|
||||
},
|
||||
{
|
||||
"id": "AI077",
|
||||
"name": "Wabi",
|
||||
"url": "https://wabi.ai/",
|
||||
"cat": "C09",
|
||||
"year": 2025,
|
||||
"team": null,
|
||||
"location": "公开主页与Dealroom列旧金山;Built In列Buenos Aires,办公室/总部口径待核",
|
||||
"business": "面向消费者提供多人共享的AI助手,以及按需生成、分享的小应用。",
|
||||
"buyer": "个人、家庭和朋友群组;具体付费买方及商业合同待核",
|
||||
"delivery": "官网与条款可读;官方介绍移动、桌面及多人协作体验,未独立实测任务完成率、可靠性或安全性。",
|
||||
"notes": "成立2025依据两个公开名录,投资方2025公告交叉关联业务;精确注册日未核,两个名录不保证独立。当前免费服务不等于总收入为零;融资、估值、关联员工数和创始人此前Replika业绩不转为Wabi收入或规模。",
|
||||
"cohort": "2025年成立(第三方公开名录);注册日期未独立核验",
|
||||
"teamBasis": "官方公开主页2—10人范围、22个关联档案,Built In列23;口径及更新时点不统一,保留未知",
|
||||
"price": "2026-10-20官方条款称当前服务免费;未来订阅/付费功能收费待实际公告和合同核实",
|
||||
"stage": "官方发布共享AI助手和小应用产品;商业收费及财务数据待核",
|
||||
"sourceType": "TechCrunch发现,官方产品/条款、投资方与第三方公开名录补证",
|
||||
"evidenceIds": [
|
||||
"TC-WABI",
|
||||
"WABI-HOME",
|
||||
"WABI-INVESTOR",
|
||||
"WABI-PROFILE",
|
||||
"WABI-DEALROOM",
|
||||
"WABI-BUILTIN",
|
||||
"WABI-TERMS"
|
||||
],
|
||||
"revenueStatus": "unknown",
|
||||
"businessModel": "消费者AI助手和个人软件平台;当前免费服务,未来订阅或其他变现待核",
|
||||
"entityBasis": "官方条款列Wabi, Inc.;名录、投资公告和公司主页均关联同一创始人及wabi.ai,不与Replika及其他同名Wabi业务合并",
|
||||
"classificationBasis": "按个人与群组协作使用场景归C09;生成小应用是交付方式,不因使用代码生成即归企业软件开发。",
|
||||
"pricingEvidence": "WABI-TERMS",
|
||||
"technicalReview": {
|
||||
"level": "description",
|
||||
"reviewedAt": "2026-10-30",
|
||||
"summary": "已读官方产品及条款自述;没有独立任务基准、公开权重或源码验证,不据融资或演示排名。",
|
||||
"evidenceIds": [
|
||||
"WABI-HOME",
|
||||
"WABI-TERMS"
|
||||
]
|
||||
}
|
||||
}
|
||||
],
|
||||
"observations": [
|
||||
@@ -44892,7 +44933,7 @@
|
||||
},
|
||||
{
|
||||
"id": "TC-WABI",
|
||||
"companyId": null,
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi报道发现条目",
|
||||
"url": "https://techcrunch.com/2026/10/29/wabi-the-ai-agent-that-builds-mini-apps-now-valued-at-1-25b-after-latest-round/",
|
||||
"publishedAt": "2026-10-29",
|
||||
@@ -44936,7 +44977,7 @@
|
||||
},
|
||||
{
|
||||
"id": "WABI-HOME",
|
||||
"companyId": null,
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi官方当前产品说明",
|
||||
"url": "https://wabi.ai/",
|
||||
"publishedAt": null,
|
||||
@@ -44947,7 +44988,7 @@
|
||||
},
|
||||
{
|
||||
"id": "WABI-INVESTOR",
|
||||
"companyId": null,
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi投资方2025年公告",
|
||||
"url": "https://a16z.com/announcement/investing-in-wabi/",
|
||||
"publishedAt": "2025-11-05",
|
||||
@@ -44958,7 +44999,7 @@
|
||||
},
|
||||
{
|
||||
"id": "WABI-PROFILE",
|
||||
"companyId": null,
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi公开公司主页的团队口径",
|
||||
"url": "https://www.linkedin.com/company/joinwabi/",
|
||||
"publishedAt": null,
|
||||
@@ -44999,6 +45040,50 @@
|
||||
"kind": "交易当事方公告",
|
||||
"summary": "ADT公告预计2027年一季度交割,须股东及反垄断等批准;交割前ADT继续独立运营。",
|
||||
"limitation": "截至本次读取不能记为完成收购;交易金额不是收入,不把目标公司历史收入直接归为新AI平台的有机增长或ARR。"
|
||||
},
|
||||
{
|
||||
"id": "WABI-DEALROOM",
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi公开名录成立年与主体关联",
|
||||
"url": "https://dealroom.co/companies/wabi/",
|
||||
"publishedAt": null,
|
||||
"accessedAt": "2026-10-30",
|
||||
"kind": "第三方公司名录",
|
||||
"summary": "公开名录列Founded 2025、Eugenia Kuyda为创始人,关联wabi.ai与官方公司主页。",
|
||||
"limitation": "第三方名录年份非工商注册核验;员工数字、增长信号及融资不作精确团队人数或公司收入,名录不保证与其他渠道独立。"
|
||||
},
|
||||
{
|
||||
"id": "WABI-BUILTIN",
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi招聘名录的成立年与地点差异",
|
||||
"url": "https://builtin.com/company/wabi-inc",
|
||||
"publishedAt": null,
|
||||
"accessedAt": "2026-10-30",
|
||||
"kind": "第三方招聘公司名录",
|
||||
"summary": "招聘名录列Wabi, Inc.、Year Founded 2025,关联wabi.ai;所在地列Buenos Aires,与其他名录San Francisco标注不同。",
|
||||
"limitation": "不证明精确注册日期;办公室、总部标签与团队数字存在跨来源口径差异,不强行统一或取平均。"
|
||||
},
|
||||
{
|
||||
"id": "WABI-TERMS",
|
||||
"companyId": "AI077",
|
||||
"title": "Wabi官方当前免费服务及未来收费条款",
|
||||
"url": "https://wabi.ai/terms",
|
||||
"publishedAt": "2026-10-20",
|
||||
"accessedAt": "2026-10-30",
|
||||
"kind": "公司官方材料",
|
||||
"summary": "2026-10-20更新条款列运营方Wabi, Inc.,当前服务免费;未来若推出付费功能或订阅,须先告知收费。",
|
||||
"limitation": "通用订阅及付款条款不证明已收费或已实现收入;当前免费服务不等于公司历史、全部业务或其他合同收入为零。"
|
||||
},
|
||||
{
|
||||
"id": "TH-LAUNCH",
|
||||
"companyId": null,
|
||||
"title": "Thrive Holdings官方2025年发布公告",
|
||||
"url": "https://www.thriveholdings.com/thrive-holdings-launch",
|
||||
"publishedAt": "2025-04-29",
|
||||
"accessedAt": "2026-10-30",
|
||||
"kind": "公司官方材料",
|
||||
"summary": "2025-04-29公告发布永久资本平台,用于长期投资、收购及运营企业。",
|
||||
"limitation": "公告日期为公开发布时点,不单独充当工商注册或精确成立年;不将Thrive Capital历史和被收购企业历史并为新AI公司的有机增长。"
|
||||
}
|
||||
],
|
||||
"reviews": [
|
||||
@@ -45989,6 +46074,24 @@
|
||||
],
|
||||
"handling": "保持候选;估值、影视片单和模型排名不作为收入或独立性能验证,后续追溯原始材料。",
|
||||
"scope": "excluded-candidate"
|
||||
},
|
||||
{
|
||||
"id": "WABI-R-ATTRIBUTION",
|
||||
"type": "免费条款、名录年份与履历归属",
|
||||
"company": "Wabi",
|
||||
"summary": "公开名录列2025成立;精确注册日未核。官方最新条款称当前服务免费,同时保留未来付费条款;团队与地点标注也有跨来源差异。",
|
||||
"evidenceIds": [
|
||||
"WABI-DEALROOM",
|
||||
"WABI-BUILTIN",
|
||||
"WABI-TERMS",
|
||||
"WABI-PROFILE",
|
||||
"WABI-INVESTOR"
|
||||
],
|
||||
"handling": "公司收入保持未知,不填零;未来付款模板不当现有订阅。融资、估值和Replika用户/收入不归Wabi;团队数字不取平均,不将多个名录当独立工商验证。",
|
||||
"scope": "companies",
|
||||
"companyIds": [
|
||||
"AI077"
|
||||
]
|
||||
}
|
||||
],
|
||||
"coverage": {
|
||||
@@ -46628,7 +46731,7 @@
|
||||
"sourceId": "S02",
|
||||
"url": "https://techcrunch.com/category/artificial-intelligence/",
|
||||
"accessedAt": "2026-10-30",
|
||||
"scope": "2026-10-30可读栏目首页中选取的3条公司线索;报道正文可读并追溯官方及当事方资料。并非首页全部报道、全部分页或2025—2026完整档案;成立年未获充分证据时不新增主公司记录。公开分类接口与RSS普通请求返回403,保留档案获取缺项。",
|
||||
"scope": "2026-10-30可读栏目首页中选取的3条公司线索;报道正文可读并追溯官方及当事方资料。Wabi由名录年份补证关联公司,DreamHQ与Thrive Holdings成立年仍待核;发布时点与注册年分开。非首页全部报道、全部分页或2025—2026完整档案。公开分类接口与RSS普通请求返回403,保留档案获取缺项。",
|
||||
"complete": false,
|
||||
"records": [
|
||||
{
|
||||
@@ -46654,14 +46757,18 @@
|
||||
"categoryId": "C09",
|
||||
"kind": "company",
|
||||
"profileStatus": "readable",
|
||||
"status": "pending-year",
|
||||
"status": "linked",
|
||||
"evidenceIds": [
|
||||
"TC-WABI",
|
||||
"WABI-HOME",
|
||||
"WABI-INVESTOR",
|
||||
"WABI-PROFILE"
|
||||
"WABI-PROFILE",
|
||||
"WABI-DEALROOM",
|
||||
"WABI-BUILTIN",
|
||||
"WABI-TERMS"
|
||||
],
|
||||
"note": "按面向消费者的共享AI助手及小应用初分C09;2025投资公告证明当时已存在业务,不能单独填成立2025。融资、估值及Replika历史业绩不当Wabi收入;员工范围与关联档案数口径不一致。"
|
||||
"note": "两个第三方公开名录均列2025成立并关联同一官方业务,按归因年份入表,精确注册日未核。官方条款当前免费,收入未知;订阅模板、融资及Replika历史业绩不当收入,团队口径差异保留。",
|
||||
"companyId": "AI077"
|
||||
},
|
||||
{
|
||||
"id": "TC26-03",
|
||||
@@ -46675,9 +46782,10 @@
|
||||
"TC-THRIVE",
|
||||
"TH-ABOUT",
|
||||
"TH-OPENAI",
|
||||
"TH-ADT"
|
||||
"TH-ADT",
|
||||
"TH-LAUNCH"
|
||||
],
|
||||
"note": "按收购并改造专业服务企业初分C07,控股模式须单列;2025合作公告不是成立凭证。ADT交易预计2027一季度交割,当前不能记已完成,亦不将拟收购目标的历史收入当平台有机AI收入。"
|
||||
"note": "官方2025-04-29公告证明平台公开发布,不能单独填精确成立年,继续待核。按专业服务收购运营初分C07,控股模式单列;ADT预计2027一季度交割,不记已完成,不将目标历史收入当有机AI收入。"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"version": "2026-10-30-8",
|
||||
"version": "2026-10-30-9",
|
||||
"scopeConfirmedAt": "2026-10-30",
|
||||
"acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。",
|
||||
"provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。",
|
||||
@@ -28,8 +28,8 @@
|
||||
"techcrunch.com"
|
||||
],
|
||||
"initialAccess": "AI栏目可读取",
|
||||
"boundary": "栏目首页选择的3条公司线索已入候选表并追溯原始资料,成立年仍待核;不是首页全部条目或两年档案。栏目及下一页可读,公开分类接口与RSS普通HTTP请求返回403。",
|
||||
"nextCheck": "补可公开取得的2025、2026档案及剩余分页;核DreamHQ、Wabi、Thrive Holdings的成立依据,去除同名主体与重复报道。",
|
||||
"boundary": "栏目首页选择的3条公司线索已追溯原始资料:Wabi据公开名录2025年份关联公司;DreamHQ与Thrive Holdings成立年待核,后者2025发布公告另存。不是首页全部条目或两年档案;公开分类接口与RSS普通HTTP请求返回403。",
|
||||
"nextCheck": "补可公开取得的2025、2026档案及剩余分页;核DreamHQ、Thrive Holdings成立依据及Wabi精确注册、团队和付费口径。",
|
||||
"limitation": "需追溯原始披露,部分文章受访问限制",
|
||||
"accessRecheckedAt": "2026-10-30"
|
||||
},
|
||||
@@ -44,7 +44,7 @@
|
||||
"app.dealroom.co"
|
||||
],
|
||||
"initialAccess": "官网可读取",
|
||||
"boundary": "已读Tana公开公司档案并记录成立年线索与财务字段不一致;尚未取得2025—2026成立筛选结果集,个案不等于目录全量。",
|
||||
"boundary": "已读Tana与Wabi公开公司档案:前者财务字段不一致留缺,后者2025成立字段与官方业务关联入表;尚未取得两年成立筛选结果集,两个个案不等于目录全量。",
|
||||
"nextCheck": "确认公开可取得的两年成立筛选清单;逐项追溯财务原始凭证及字段口径,受权限限制保留缺项。",
|
||||
"limitation": "完整档案需权限;概览及财务表不能未经勾稽直接导入ARR",
|
||||
"accessRecheckedAt": "2026-10-30"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"sourceVersion": "2026-10-30-tc-1",
|
||||
"sourceVersion": "2026-10-30-tc-2",
|
||||
"asOf": "2026-10-30",
|
||||
"metric": "platform-mrr-usd",
|
||||
"sampleUnit": "product-or-business",
|
||||
|
||||
@@ -7,14 +7,15 @@ import re
|
||||
import subprocess
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
BASELINE = 'cffca6942b1bc0005321e1685f38593fb0b853d5' # Integration snapshot of PRs 14, 15 and 16 before database migration.
|
||||
BASELINE = 'cffca6942b1bc0005321e1685f38593fb0b853d5' # Integration snapshot before database migration.
|
||||
RESEARCH_REVISION = '74af205b2959e1bb6a1fe9f567bc87069ac6d12c' # Final PR 14 update received during integration.
|
||||
|
||||
|
||||
def export(ref):
|
||||
commit = subprocess.check_output(['git', 'rev-parse', '--verify', ref + '^{commit}'], cwd=ROOT, text=True).strip()
|
||||
|
||||
def read(name):
|
||||
return subprocess.check_output(['git', 'show', f'{commit}:{name}'], cwd=ROOT).decode()
|
||||
def read(name, revision=commit):
|
||||
return subprocess.check_output(['git', 'show', f'{revision}:{name}'], cwd=ROOT).decode()
|
||||
|
||||
catalog = json.loads(read('content/catalog.json'))
|
||||
names = subprocess.check_output(['git', 'ls-tree', '-r', '--name-only', commit, '--', 'content/docs'], cwd=ROOT, text=True).splitlines()
|
||||
@@ -23,7 +24,8 @@ def export(ref):
|
||||
source = name.removeprefix('content/docs/').removesuffix('.md')
|
||||
metadata = catalog['documents'][source]
|
||||
collection = next(c for c in catalog['collections'] if not c['path'] or source.startswith(c['path'] + '/'))
|
||||
content = read(name)
|
||||
revision = RESEARCH_REVISION if commit == BASELINE and source.startswith("ai-company-research/") else commit
|
||||
content = read(name, revision)
|
||||
title = re.search(r'^# (.+)$', content, re.M)
|
||||
documents.append(dict(slug=metadata['slug'], sourceSlug=source, category=metadata['category'],
|
||||
title=title[1].strip() if title else source, content=content,
|
||||
|
||||
Reference in New Issue
Block a user