diff --git a/apps/docs/src/components/AICompanyResearch.tsx b/apps/docs/src/components/AICompanyResearch.tsx index 21070d5..bfa40e9 100644 --- a/apps/docs/src/components/AICompanyResearch.tsx +++ b/apps/docs/src/components/AICompanyResearch.tsx @@ -1,6 +1,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useRouter } from "next/router"; import IncomeDistribution from "./IncomeDistribution"; +import ArrDisclosures from "./ArrDisclosures"; import { categorySummary, evidenceUrl, technicalReviewLabels, reviewCompanyIds, type ResearchEvidence, type ResearchReview, type ResearchSnapshot, } from "@/lib/ai-research"; @@ -154,6 +155,7 @@ export default function AICompanyResearch() { } {tab === "revenue" && <> +

企业披露与估算的历史里程碑

这一组包含 {disclosedCompanies} 家公司的披露或估算信号;企业披露含公司或交易当事方公开材料,披露主体与审计状态见证据。多为异时点历史里程碑,期间收入不直接年化,ARR 与年化收入口径仍待核对,暂不计算其同期领域均值。币种未确认的记录仅显示原值,不绘制美元长度条。上面的平台MRR统计与这一组分开。

{observed.map((o) =>
diff --git a/apps/docs/src/components/ArrDisclosures.tsx b/apps/docs/src/components/ArrDisclosures.tsx new file mode 100644 index 0000000..36957df --- /dev/null +++ b/apps/docs/src/components/ArrDisclosures.tsx @@ -0,0 +1,41 @@ +import { useState } from "react"; +import { evidenceUrl, type ResearchSnapshot } from "@/lib/ai-research"; +import { arrDisclosures } from "@/lib/research-statistics"; + +const labels: Record = { + signal: "企业或当事方披露", estimate: "第三方估算", + historical: "历史披露", "historical-estimate": "历史估算", +}; + +export default function ArrDisclosures({ data, onSelect }: { data: ResearchSnapshot; onSelect: (id: string) => void }) { + const [category, setCategory] = useState(""); + const [year, setYear] = useState(""); + const rows = arrDisclosures(data, { category, foundedYear: year ? Number(year) : undefined }); + const companies = new Set(rows.map((row) => row.company.id)); + const categories = new Map(data.categories.map((item) => [item.id, item.name])); + const evidence = new Map(data.evidence.map((item) => [item.id, item])); + return
+

2025—2026 年成立公司的 ARR 披露

+

这是跨时点证据表,共 {companies.size} 家公司、{rows.length} 条记录;同一公司的历史里程碑逐条保留,不能相加或视为独立公司。ARR 标签沿用原始披露,未证明经常性收入定义或审计状态;不纳入 MRR 图表,不计算同期行业均值或造假概率。仅收录明确标注的 ARR;定义冲突、目标、承诺、客户和前雇主收入排除,缺失不作零。

+
+ + +
+
+ + + {rows.map(({ company, observation: item }) => { + const source = evidence.get(item.evidence); + const url = source && evidenceUrl(source.url); + return + + + + + + ; + })} +
金额保留原币种、下界和估算身份;日期栏保留业务截至日缺项
公司 / 分类收费与交付模式原始 ARR 声明时点身份 / 限制证据
{categories.get(company.cat)} · {company.year}{company.businessModel ?? company.price}{item.bound !== "=" && item.bound}{new Intl.NumberFormat("zh-CN", { maximumFractionDigits: 2 }).format(item.value)} {item.unit}{item.kind}{item.timing}{labels[item.selection]}{item.reason}{url ? {item.evidence} ↗ : item.evidence}
+ {!rows.length &&

当前筛选没有符合条件的已记录 ARR 声明;不代表这些公司收入为零。

} +
; +} diff --git a/apps/docs/src/lib/research-statistics.ts b/apps/docs/src/lib/research-statistics.ts index 14e8bb7..28d5466 100644 --- a/apps/docs/src/lib/research-statistics.ts +++ b/apps/docs/src/lib/research-statistics.ts @@ -1,6 +1,20 @@ import type { ResearchCompany, ResearchObservation, ResearchSnapshot } from "./ai-research"; export type IncomePoint = { company: ResearchCompany; observation: ResearchObservation; value: number }; + +/** An evidence ledger, never a comparable sample: retain historical claims and estimates separately. */ +export function arrDisclosures(snapshot: ResearchSnapshot, options: { category?: string; foundedYear?: number } = {}) { + const companies = new Map(snapshot.companies.map((company) => [company.id, company])); + return snapshot.observations.flatMap((observation) => { + const company = companies.get(observation.company); + if (!company || ![2025, 2026].includes(company.year ?? 0) || observation.metric !== "arr" || + !["signal", "estimate", "historical", "historical-estimate"].includes(observation.selection) || + !Number.isFinite(observation.value) || observation.value < 0 || + (options.category && company.cat !== options.category) || + (options.foundedYear && company.year !== options.foundedYear)) return []; + return [{ company, observation }]; + }); +} export type IncomeStats = { n: number; mean: number; median: number; min: number; max: number; sampleDeviation: number | null; cv: number | null; meanMedianRatio: number | null; diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index ce24904..3f286d7 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -11,7 +11,31 @@ import { openSiteDatabase } from "../src/lib/site-database"; import { categorySummary, evidenceUrl, reviewCompanyIds, validateResearch, type ResearchSnapshot } from "../src/lib/ai-research"; import { consumeCode, initializeStore } from "../src/lib/auth-store"; import { newAuthConfig } from "../src/lib/auth"; -import { describeIncome, groupIncome, platformIncomeSample } from "../src/lib/research-statistics"; +import { arrDisclosures, describeIncome, groupIncome, platformIncomeSample } from "../src/lib/research-statistics"; + +test("ARR ledger preserves historical estimates without promoting targets, run rates or outside-cohort claims", () => { + const snapshot = structuredClone(seed) as ResearchSnapshot; + const rows = arrDisclosures(snapshot); + const ids = new Set(rows.map((row) => row.observation.id)); + for (const id of ["O064", "O065", "O066", "O069", "O070", "O071", "O046"]) + assert.ok(ids.has(id), `${id}: historical claims, estimates and unknown currencies remain visible`); + for (const id of ["O050", "O052", "O053", "O055", "SR-O-AI067-runrate", "ROCKET-O-arr", "AQ-O-RUNRATE"]) + assert.ok(!ids.has(id), `${id}: excluded or ambiguous records cannot enter the ARR ledger`); + assert.equal(rows.find((row) => row.observation.id === "O066")?.observation.selection, "historical-estimate"); + assert.equal(rows.find((row) => row.observation.id === "O046")?.observation.unit, "原文$,币种待核"); + const category = snapshot.companies.find((company) => company.id === "AI055")!.cat; + const filtered = arrDisclosures(snapshot, { category, foundedYear: 2025 }); + assert.ok(filtered.length > 0); + assert.ok(filtered.every((row) => row.company.cat === category && row.company.year === 2025)); + // A future mistakenly typed target still must not enter the ledger. + const target = snapshot.observations.find((item) => item.id === "O052")!; + target.metric = "arr"; + target.company = "AI055"; + assert.ok(!arrDisclosures(snapshot).some((row) => row.observation.id === target.id)); + const claim = snapshot.observations.find((item) => item.id === "O065")!; + claim.value = Number.NaN; + assert.ok(!arrDisclosures(snapshot).some((row) => row.observation.id === claim.id)); +}); test("research revisions share the authentication database and preserve replay limits", () => { const dir = mkdtempSync(join(tmpdir(), "site-research-")); diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index d9d6d7e..0e13028 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-31-tc-consumer-1", + "version": "2026-10-31-arr-types-1", "asOf": "2026-10-31", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -36576,7 +36576,8 @@ "selection": "signal", "reason": "统计时点未知,不进入同期ARR排名", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O044", @@ -36591,7 +36592,8 @@ "selection": "historical", "reason": "保留历史里程碑,不与250万美元重复计公司", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O045", @@ -36606,7 +36608,8 @@ "selection": "signal", "reason": "统计时点未知,经常性定义待核", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O046", @@ -36621,7 +36624,8 @@ "selection": "signal", "reason": "投资方资料使用$但未明确USD;更正旧币种推断,未经审计且无具体日历截至日,不进同期比较", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O047", @@ -36636,7 +36640,8 @@ "selection": "signal", "reason": "创始人自述,保留时点不确定性", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O048", @@ -36892,7 +36897,8 @@ "selection": "historical", "reason": "较早披露,保留历史;超过值不当作精确值", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O065", @@ -36907,7 +36913,8 @@ "selection": "signal", "reason": "本轮有明确公告时点的公司美元披露;招聘另有1500万声明但币种与业务截止日待核,非当前10月值", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O066", @@ -36922,7 +36929,8 @@ "selection": "historical-estimate", "reason": "后续估算单列,不覆盖公司披露", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O067", @@ -36967,7 +36975,8 @@ "selection": "historical", "reason": "非2025年末指标;保留历史", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O070", @@ -36982,7 +36991,8 @@ "selection": "historical", "reason": "近似值;后有新披露", "bound": "≈", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O071", @@ -36997,7 +37007,8 @@ "selection": "signal", "reason": "媒体转述,未审计;已收购业务单列", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O072", @@ -37027,7 +37038,8 @@ "selection": "signal", "reason": "投资机构资料,含义及经常性待确认", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "O074", @@ -38058,7 +38070,8 @@ "selection": "signal", "reason": "历史自述,非公告时点当前值;经常性定义与留存待核验", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "RUN-O-FUND", @@ -38133,7 +38146,8 @@ "selection": "signal", "reason": "私测三周里程碑,币种与日期未核;不是当前统一时点值", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR-O-AI063-pipeline", @@ -38163,7 +38177,8 @@ "selection": "signal", "reason": "前11周里程碑,日期及币种未核", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR-O-AI065-arr", @@ -38178,7 +38193,8 @@ "selection": "signal", "reason": "仅表示原文七位数的数量级下界,非精确100万;上界小于1000万,币种与合同口径未知", "bound": "≥", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR-O-AI065-impact", @@ -38283,7 +38299,8 @@ "selection": "signal", "reason": "约五个月后的历史披露下界,币种与日期未核", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR-O-AI068-early", @@ -38298,7 +38315,8 @@ "selection": "historical", "reason": "同一公司较早阶段,不作第二家公司或第二笔收入", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR-O-AI068-customers", @@ -38328,7 +38346,8 @@ "selection": "signal", "reason": "两周里程碑;日期、币种和经常性定义未核", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "TECH-GRAD-O-elo", @@ -38388,7 +38407,8 @@ "selection": "historical", "reason": "转型产品历史里程碑,不能视为前身全部业务或2026当前公司ARR", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "ROCKET-O-subscribers", @@ -38980,7 +39000,8 @@ "selection": "historical", "reason": "招聘自述非独立审计;不由发布日期推业务时点,不与Sacra估算合并或作为同期美元ARR", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "PEEC-JOB-TEAM", @@ -39101,7 +39122,8 @@ "selection": "signal", "reason": "推出8周里程碑,具体截至日、币种、硬件/项目/运维经常性分摊未核", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR26-O-LAZYWEB-ARR", @@ -39116,7 +39138,8 @@ "selection": "signal", "reason": "推出两个月相对里程碑;币种、日历时点、折扣退款与订阅合同未核,不进同期比较", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR26-O-BOTA-CARR", @@ -39176,7 +39199,8 @@ "selection": "signal", "reason": "三周里程碑的下界;合同、币种及具体截至日未知;试点和管线不直接算ARR", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR26-O-PREMAN-ARR", @@ -39191,7 +39215,8 @@ "selection": "signal", "reason": "未给财务截至日、币种与订阅定义;不把创始人旧Surt AI收入归PreMan", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "DAYJOB-O-ARR-LAUNCH", @@ -39371,7 +39396,8 @@ "selection": "signal", "reason": "当前公司三应用合计自述,收入是否扣平台费、币种与时点未核", "bound": "=", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR25-O-DRS-SECOND-APP", @@ -39431,7 +39457,8 @@ "selection": "signal", "reason": "履历明确指当前Loops,仍为自述;币种、具体截至日及软件/部署费拆分未核", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "SR25-O-LOOPS-CUSTOMER-SALES", @@ -39461,7 +39488,8 @@ "selection": "signal", "reason": "公司发布自述,软件与定制部署/服务收入未拆;品牌/法律主体边界、币种和合同底表待核,不进入同期比较", "bound": ">", - "comparisonGroup": null + "comparisonGroup": null, + "metric": "arr" }, { "id": "MR2-O-LLM-MRR", diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 6d07f91..0023df5 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-31-tc-consumer-1", + "version": "2026-10-31-arr-types-1", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index aabf40e..f078671 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-31-tc-consumer-1", + "sourceVersion": "2026-10-31-arr-types-1", "asOf": "2026-10-31", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business",