From f156406265a45e5ecca24e5913dc6c983c6a4f55 Mon Sep 17 00:00:00 2001 From: Codex Bot Date: Fri, 30 Oct 2026 18:12:52 +0800 Subject: [PATCH] Classify Thrive services rollup and exclude Brila existing operator --- apps/docs/scripts/auth-cli.ts | 4 +- apps/docs/tests/research.test.ts | 16 +-- content/research/ai-companies.seed.json | 133 +++++++++++++++++++-- content/research/ai-companies.sources.json | 10 +- content/research/ai-income-analysis.json | 2 +- 5 files changed, 136 insertions(+), 29 deletions(-) diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index afbc7e7..46f1524 100644 --- a/apps/docs/scripts/auth-cli.ts +++ b/apps/docs/scripts/auth-cli.ts @@ -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, 1022); + assert.equal(research.companies.length, 1023); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1248); + assert.equal(research.evidence.length, 1251); assert.equal(research.observations.length, 189); 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 2854acc..d03f46a 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, 1022); - assert.equal(initial.evidence.length, 1248); + assert.equal(initial.companies.length, 1023); + assert.equal(initial.evidence.length, 1251); assert.equal(initial.observations.length, 189); 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, 58); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 59); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 8); - assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 27); + assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 28); 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), 1022); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1023); 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), 979); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 980); 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, 15); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 16); 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"); @@ -307,7 +307,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, 7); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 5); }); test("product pivots and founder histories do not become new company years or current revenue", () => { diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 8e0bc78..2964c5f 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-utopai-1", + "version": "2026-10-30-thrive-brila-1", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28910,6 +28910,45 @@ "GOLD-PRIVACY" ] } + }, + { + "id": "AI079", + "name": "Thrive Holdings", + "url": "https://www.thriveholdings.com/", + "cat": "C07", + "year": 2025, + "team": null, + "location": "美国纽约;集团官网标注New York City", + "business": "收购并长期运营会计和IT等成熟服务企业,将AI和技术团队嵌入其交付流程。", + "buyer": "被持有企业的会计、IT等服务客户;集团直接软件合同与实际付费结构待核", + "delivery": "已公开描述会计与IT服务平台及合作关系;没有本轮独立交付、成本节约或技术性能测试。", + "notes": "成立2025据公司公开主页,与2025-04-29官方发布公告关联;精确注册日及法律主体链待核。收购/并表带来的规模不等有机AI收入或ARR。ADT交易预计2027年一季度交割,当前不记完成,不合并目标公司历史收入。", + "cohort": "2025年成立(公司公开主页自述);注册日期未独立核验", + "teamBasis": "主页11—50范围、关联档案数与集团所持企业员工口径不同,完整团队保留未知", + "price": "集团没有本轮可核统一软件订阅价;会计、IT项目/托管服务等按子公司合同核实", + "stage": "公开运营会计与IT服务控股平台;按集团/子公司、收购/有机边界另核财务", + "sourceType": "TechCrunch发现;官方业务、发布公告、公司主页和交易/合作当事方材料补证", + "evidenceIds": [ + "TC-THRIVE", + "TH-ABOUT", + "TH-OPENAI", + "TH-ADT", + "TH-LAUNCH", + "TH-PROFILE" + ], + "revenueStatus": "unknown", + "businessModel": "永久资本控股平台收购服务企业,以行业人员加AI改造交付;集团及软件/服务收入拆分待核", + "entityBasis": "thriveholdings.com与公司公开主页、合作方和ADT交易公告相互关联;不与同名乌干达公关企业、其他Thrive Holdings LLC或Thrive Capital历史混合。", + "classificationBasis": "按会计和IT专业服务的运营改造归C07;控股/收购是商业模式,不能当纯软件平台并入同一ARR比较组。", + "technicalReview": { + "level": "description", + "reviewedAt": "2026-10-30", + "summary": "官方材料说明将AI模型与行业人员、流程结合;本轮未测试模型或财务改善,合作关系不替代能力验证。", + "evidenceIds": [ + "TH-ABOUT", + "TH-OPENAI" + ] + } } ], "observations": [ @@ -45049,7 +45088,7 @@ }, { "id": "TC-THRIVE", - "companyId": null, + "companyId": "AI079", "title": "Thrive Holdings报道发现条目", "url": "https://techcrunch.com/2026/10/29/openai-backed-thrive-holdings-acquires-adt/", "publishedAt": "2026-10-29", @@ -45115,18 +45154,18 @@ }, { "id": "TH-ABOUT", - "companyId": null, + "companyId": "AI079", "title": "Thrive Holdings官方业务说明", "url": "https://www.thriveholdings.com/about", "publishedAt": null, "accessedAt": "2026-10-30", "kind": "公司官方材料", "summary": "公司称收购成熟企业,将行业人员经验与技术和运营结合,目前涉及会计与IT服务。", - "limitation": "控股平台、收购组合与原有企业的经营收入须区分;本次未取得明确成立年份或并表收入凭证。" + "limitation": "控股平台、收购组合与原有企业经营收入须区分;年份另据公司主页补证,本次未取得并表收入或注册凭证。" }, { "id": "TH-OPENAI", - "companyId": null, + "companyId": "AI079", "title": "Thrive Holdings合作方2025年公告", "url": "https://openai.com/index/thrive-holdings/", "publishedAt": "2025-12-01", @@ -45137,7 +45176,7 @@ }, { "id": "TH-ADT", - "companyId": null, + "companyId": "AI079", "title": "ADT拟收购交易的原始公告", "url": "https://investor.adt.com/News--Events/news/news-details/2026/ADT-to-be-Acquired-by-Thrive-Holdings-in-15-3-Billion-Transaction/default.aspx", "publishedAt": "2026-10-29", @@ -45181,7 +45220,7 @@ }, { "id": "TH-LAUNCH", - "companyId": null, + "companyId": "AI079", "title": "Thrive Holdings官方2025年发布公告", "url": "https://www.thriveholdings.com/thrive-holdings-launch", "publishedAt": "2025-04-29", @@ -45706,6 +45745,39 @@ "kind": "公司公开主页自述", "summary": "公开主页链接fundraisly.com,称属于Accumulator,结合投资者匹配、引荐路径与外联服务。页面没有成立年份字段。", "limitation": "业务与关联集团关系不能替代Accumulator Fundraising LLC的注册年份;页面2—10人数范围及关联档案数不当精确团队人数,团队筹资和客户融资不当收入。" + }, + { + "id": "TH-PROFILE", + "companyId": "AI079", + "title": "Thrive Holdings公司公开主页年份", + "url": "https://www.linkedin.com/company/thrive-holdings", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司公开主页自述", + "summary": "页面列Founded 2025,链接thriveholdings.com,描述收购并运营会计与IT服务企业。", + "limitation": "非独立注册核验;11—50范围、关联档案数不等集团员工数。所持企业原有收入与收购规模不能当有机AI增长或软件ARR。" + }, + { + "id": "BRILA-ENTITY-HISTORY", + "companyId": null, + "title": "Generated Photos早期政策的同一运营主体", + "url": "https://intercom.help/generated-photos/en/articles/7241273-generated-photos-privacy-policy", + "publishedAt": "2024-02-14", + "accessedAt": "2026-10-30", + "kind": "公司官方历史政策", + "summary": "页面日期2024-02-14,列Generated Media, Inc.及Delaware注册号7627361,与Brila官方政策同名同号。", + "limitation": "早期材料可证明该运营主体并非2025—2026新公司;政策日期和其中2020生效日都不当精确注册年。旧产品收入、人数和品牌历史不直接转作Brila收入。" + }, + { + "id": "BRILA-ENTITY-TERMS", + "companyId": null, + "title": "Generated Photos早期服务条款", + "url": "https://intercom.help/generated-photos/en/articles/7872726-generated-photos-terms-and-conditions", + "publishedAt": "2023-10-16", + "accessedAt": "2026-10-30", + "kind": "公司官方历史条款", + "summary": "官方条款页面日期2023-10-16,服务合同方列Generated Media, Inc.,业务为生成图像许可。", + "limitation": "单看同名条款不唯一识别主体,需与注册号7627361的隐私政策及Brila政策合看;不能把图像许可收入当新建站产品ARR。" } ], "reviews": [ @@ -47040,6 +47112,37 @@ ], "handling": "按既有业务排除;保留中文报道未读全文的访问缺项。品牌、模型、制作平台与区域业务不重复计数,估值、片单及排名不导入收入观测。", "scope": "excluded-candidate" + }, + { + "id": "TH-R-CONSOLIDATION", + "type": "控股平台成立与并表收入边界", + "company": "Thrive Holdings", + "companyIds": [ + "AI079" + ], + "summary": "2025自述成立年与官方发布材料关联,纳入专业服务改造模式;没有可核同口径集团ARR。", + "evidenceIds": [ + "TH-PROFILE", + "TH-LAUNCH", + "TH-ABOUT", + "TH-ADT" + ], + "handling": "精确注册、完整团队、付费合同及并表拆分留缺;收购资金、集团持有公司数、目标公司历史收入、预期交易交割不转为当前有机AI收入或软件ARR。", + "scope": "companies" + }, + { + "id": "BRILA-R-OLD-ENTITY", + "type": "旧运营主体的新产品边界", + "company": "Brila(既有主体产品候选)", + "summary": "Brila与Generated Photos官方政策列同一Generated Media, Inc.注册号7627361,早期材料先于2025。", + "evidenceIds": [ + "PH-BRILA-ENTITY", + "PH-BRILA-TERMS", + "BRILA-ENTITY-HISTORY", + "BRILA-ENTITY-TERMS" + ], + "handling": "归范围外既有主体;保留精确注册日未知,不因产品发布新增公司,不将图像业务收入或团队规模转作Brila建站业务。", + "scope": "excluded-candidate" } ], "coverage": { @@ -47101,11 +47204,13 @@ "categoryId": "C04", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "官网及条款列Generated Media, Inc.运营;注册号不代表日期,母公司成立年待核。网站生成与托管订阅为产品业务,不因2026发布新增独立公司。", + "status": "outside-cohort", + "note": "官方运营者Generated Media, Inc.注册号7627361与Generated Photos的2024政策一致,且有2023旧业务条款;作为既有主体产品排除。政策日期不作精确注册年,旧图像业务业绩不转移给Brila。", "evidenceIds": [ "PH-BRILA-ENTITY", - "PH-BRILA-TERMS" + "PH-BRILA-TERMS", + "BRILA-ENTITY-HISTORY", + "BRILA-ENTITY-TERMS" ] }, { @@ -47768,15 +47873,17 @@ "categoryId": "C07", "kind": "company", "profileStatus": "readable", - "status": "pending-year", + "status": "linked", "evidenceIds": [ "TC-THRIVE", "TH-ABOUT", "TH-OPENAI", "TH-ADT", - "TH-LAUNCH" + "TH-LAUNCH", + "TH-PROFILE" ], - "note": "官方2025-04-29公告证明平台公开发布,不能单独填精确成立年,继续待核。按专业服务收购运营初分C07,控股模式单列;ADT预计2027一季度交割,不记已完成,不将目标历史收入当有机AI收入。" + "note": "公司公开主页Founded 2025,结合官方发布及业务关联纳入AI079。按专业服务控股改造模式单列;收购/并表不等有机AI ARR,ADT拟收购尚未交割,精确注册与收入留缺。", + "companyId": "AI079" } ] } diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 0293dcf..0023b3c 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-17", + "version": "2026-10-30-18", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -28,8 +28,8 @@ "techcrunch.com" ], "initialAccess": "AI栏目可读取", - "boundary": "栏目首页选择的3条公司线索已追溯原始资料:Wabi据公开名录2025年份关联公司;DreamHQ与Thrive Holdings成立年待核,后者2025发布公告另存。不是首页全部条目或两年档案;公开分类接口与RSS普通HTTP请求返回403。", - "nextCheck": "补可公开取得的2025、2026档案及剩余分页;核DreamHQ、Thrive Holdings成立依据及Wabi精确注册、团队和付费口径。", + "boundary": "栏目首页选择的3条公司线索已追溯原始资料:Wabi据公开名录2025年份、Thrive Holdings据公司主页2025自述关联公司,DreamHQ成立年仍待核。Thrive控股改造与收购/有机收入边界单列;非首页全部条目或两年档案,公开分类接口与RSS普通HTTP请求返回403。", + "nextCheck": "补可公开取得的2025、2026档案及剩余分页;核DreamHQ成立依据与Wabi、Thrive Holdings精确注册、团队及收入边界。", "limitation": "需追溯原始披露,部分文章受访问限制", "accessRecheckedAt": "2026-10-30" }, @@ -60,8 +60,8 @@ "producthunt.com" ], "initialAccess": "官网可读取", - "boundary": "两年公开响应各19条,共38条。当前5条关联公司、2条范围外对照、24条范围外/既有业务、5条年份待核、2条推广。旧版本、品牌与法律主体分开,Tapflow据2024原版记录排除,Happycapy仍待核;非两年全量。", - "nextCheck": "继续补两年其余分页/日期、仅图片位置及5条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。", + "boundary": "两年公开响应各19条,共38条。当前5条关联公司、2条范围外对照、25条范围外/既有业务、4条年份待核、2条推广。旧版本、品牌与法律主体分开,Tapflow据2024原版记录排除,Happycapy仍待核;非两年全量。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及4条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 6acde9d..522c22e 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-utopai-1", + "sourceVersion": "2026-10-30-thrive-brila-1", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business",