diff --git a/README.md b/README.md index ad967c7..9db124d 100644 --- a/README.md +++ b/README.md @@ -101,7 +101,7 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal 当前资料包含 1,013 条公司/产品记录、10 类业务及待分类组、1,080 条证据记录和 148 条经营与技术观测。 其中保留 69 家个案资料、928 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。 补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。 -新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页按证据归属链接公司明细,明细反向列出引用其证据的核查;币种不明的声明保留原值,不绘制美元收入长度条。 +新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;36条核查中25条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。 它是定向试样,收入披露不足且统计时点不统一,不代表全部 AI 公司。 界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。 保留被撤回的声明作为核查记录,并排除收入比较;并购后业务、管理层预测与历史里程碑单列。 diff --git a/apps/docs/src/components/AICompanyResearch.tsx b/apps/docs/src/components/AICompanyResearch.tsx index 4ce641c..836687d 100644 --- a/apps/docs/src/components/AICompanyResearch.tsx +++ b/apps/docs/src/components/AICompanyResearch.tsx @@ -2,7 +2,7 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { useRouter } from "next/router"; import IncomeDistribution from "./IncomeDistribution"; import { - categorySummary, evidenceUrl, technicalReviewLabels, type ResearchEvidence, type ResearchSnapshot, + categorySummary, evidenceUrl, technicalReviewLabels, reviewCompanyIds, type ResearchEvidence, type ResearchReview, type ResearchSnapshot, } from "@/lib/ai-research"; const pageSize = 12; @@ -88,11 +88,11 @@ export default function AICompanyResearch() { ...selectedObservations.map((o) => o.evidence), ]); const selectedEvidence = data.evidence.filter((e) => e.companyId === selected || selectedEvidenceIds.has(e.id)); - const evidenceCompanies = new Map(data.evidence.map((e) => [e.id, e.companyId])); - const reviewCompanies = (ids: string[]) => data.companies.filter((c) => - ids.some((id) => evidenceCompanies.get(id) === c.id)); - const selectedReviews = data.reviews.filter((r) => selected && - r.evidenceIds.some((id) => evidenceCompanies.get(id) === selected)); + const reviewCompanies = (review: ResearchReview) => { + const ids = new Set(reviewCompanyIds(data, review)); + return data.companies.filter((c) => ids.has(c.id)); + }; + const selectedReviews = data.reviews.filter((r) => selected && reviewCompanyIds(data, r).includes(selected)); function chooseCategory(id: string) { setCategory(id); setPage(0); setTab("companies"); companySection.current?.scrollIntoView({ behavior: "smooth", block: "start" }); @@ -160,14 +160,14 @@ export default function AICompanyResearch() {

离散度用于筛选值得核查的异常,还需排除公司年龄、口径和披露偏差;不能据此认定财务造假。

} {tab === "sources" && <>

来源链接保留原始位置。相同 URL 的记录可能属于同一披露,不能按记录数计算独立证据数量。

{data.evidence.length > evidencePageSize && }} - {tab === "reviews" && } + {tab === "reviews" && } {selectedCompany &&

{selectedCompany.name}

资料入口 {selectedCompany.extraUrl && 额外核验入口}

主营业务
{selectedCompany.business}
样本组别
{selectedCompany.cohort}
买家
{selectedCompany.buyer}
收费/交付模式
{selectedCompany.businessModel ?? "待进一步核验"}
收费方式
{selectedCompany.price}
交付证据
{selectedCompany.delivery}
团队口径
{selectedCompany.teamBasis ?? "本轮未核验人数"}
分类依据
{selectedCompany.classificationBasis ?? "原有个案分类;随研究复核"}
技术验证证据
{technicalReviewLabels[selectedCompany.technicalReview?.level ?? "unreviewed"]}

{selectedCompany.technicalReview?.summary ?? "本轮未形成专项技术评审记录;不表示公司没有技术能力。"}

{selectedCompany.technicalReview && 评审日期:{selectedCompany.technicalReview.reviewedAt}}{selectedCompany.technicalReview?.testScope &&

测试范围:{selectedCompany.technicalReview.testScope}

}

材料可访问仅确认可查看,不证明性能、可靠性或商业交付质量;不同任务不作统一能力排名。

观测主体
{selectedCompany.entityBasis ?? "公司或经营品牌,法律主体未逐一核验"}
身份与限制
{selectedCompany.notes}

经营与技术观测

- {!!selectedReviews.length &&
引用该公司证据的核查记录({selectedReviews.length})
} + {!!selectedReviews.length &&
关联核查记录({selectedReviews.length})
} {selectedObservations.length ?
{selectedObservations.map((o) => )}
指标 / 归属原始数值数据时点用途及限制证据
{o.kind}{o.scope}{o.bound !== "=" && o.bound}{money(o.value,o.unit)}{o.timing}{useLabels[o.selection] ?? o.selection}{o.reason}{o.evidence}
:

本轮尚未找到可记录的量化经营指标。收入保持未知。

}

原始证据

} diff --git a/apps/docs/src/lib/ai-research.ts b/apps/docs/src/lib/ai-research.ts index 1f48de7..64e8134 100644 --- a/apps/docs/src/lib/ai-research.ts +++ b/apps/docs/src/lib/ai-research.ts @@ -34,6 +34,7 @@ export type ResearchEvidence = { export type ResearchReview = { id: string; type: string; company: string; summary: string; evidenceIds: string[]; handling: string; + scope?: "companies" | "dataset" | "excluded-candidate"; companyIds?: string[]; }; export type ResearchCoverage = { source: string; accessedAt: string; candidateRecords: number; profilesRead: number; @@ -101,10 +102,23 @@ export function validateResearch(snapshot: ResearchSnapshot) { snapshot.companies.filter((c) => c.profileOnly).length !== coverage.newProfiles || !evidenceUrl(coverage.source))) throw new Error("Invalid research coverage accounting"); for (const r of snapshot.reviews) - if (r.evidenceIds.some((id) => !evidence.has(id))) + if (r.evidenceIds.some((id) => !evidence.has(id)) || + (r.companyIds && (new Set(r.companyIds).size !== r.companyIds.length || + r.companyIds.some((id) => !companies.has(id)))) || + (r.scope && !["companies", "dataset", "excluded-candidate"].includes(r.scope)) || + (r.scope === "companies" && !r.companyIds?.length) || + (r.scope && r.scope !== "companies" && !!r.companyIds?.length)) throw new Error(`Invalid research review: ${r.id}`); } +/** Explicit reviewed associations take priority; older revisions use evidence ownership. */ +export function reviewCompanyIds(snapshot: ResearchSnapshot, review: ResearchReview): string[] { + if (review.companyIds) return review.companyIds; + const evidenceIds = new Set(review.evidenceIds); + return [...new Set(snapshot.evidence.flatMap((e) => + e.companyId && evidenceIds.has(e.id) ? [e.companyId] : []))]; +} + export function categorySummary(snapshot: ResearchSnapshot) { return snapshot.categories.map((category) => { const companies = snapshot.companies.filter((c) => c.cat === category.id); diff --git a/apps/docs/tests/research.test.ts b/apps/docs/tests/research.test.ts index 33cc9a6..7482c48 100644 --- a/apps/docs/tests/research.test.ts +++ b/apps/docs/tests/research.test.ts @@ -8,7 +8,7 @@ import coverageAudit from "../../../content/research/ai-companies.coverage.json" import incomeReference from "../../../content/research/ai-income-analysis.json"; import { readResearchSnapshot } from "../src/lib/ai-research-store"; import { openSiteDatabase } from "../src/lib/site-database"; -import { categorySummary, evidenceUrl, validateResearch, type ResearchSnapshot } from "../src/lib/ai-research"; +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"; @@ -60,6 +60,26 @@ test("research validation rejects broken evidence and unsafe source links", () = assert.equal(evidenceUrl("https://example.com/evidence"), "https://example.com/evidence"); }); +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, 25); + 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")!; + assert.deepEqual(reviewCompanyIds(snapshot, review), ["AI007", "AI013", "AI021", "AI034"]); + assert.deepEqual(reviewCompanyIds(snapshot, snapshot.reviews.find((r) => r.id === "CN-R-PSI")!), []); + const oldReview = structuredClone(snapshot.reviews.find((r) => r.id === "TECH-GRAD-R-SCOPE")!); + delete oldReview.scope; + delete oldReview.companyIds; + assert.deepEqual(reviewCompanyIds(snapshot, oldReview), ["AI051"], "old revisions retain evidence-owner fallback"); + review.companyIds = ["unknown-company"]; + assert.throws(() => validateResearch(snapshot), /research review/); + review.companyIds = ["AI007", "AI007"]; + assert.throws(() => validateResearch(snapshot), /research review/); + review.companyIds = []; + assert.throws(() => validateResearch(snapshot), /research review/); +}); + test("disclosure counts exclude client income, biographies, targets and duplicate milestones", () => { const snapshot = seed as ResearchSnapshot; const summary = categorySummary(snapshot); diff --git a/content/research/ai-companies.seed.json b/content/research/ai-companies.seed.json index 140dc37..9f03291 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-benchmark-1", + "version": "2026-10-30-review-links-1", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -42838,7 +42838,11 @@ "E112", "E113" ], - "handling": "按emergent.sh官方页面及YC资料识别实体;不复制冲突身份字段" + "handling": "按emergent.sh官方页面及YC资料识别实体;不复制冲突身份字段", + "scope": "companies", + "companyIds": [ + "AI053" + ] }, { "id": "R2", @@ -42849,7 +42853,11 @@ "E110", "E111" ], - "handling": "该金额排除公司收入统计;保留为数据质量问题,不推断公司造假" + "handling": "该金额排除公司收入统计;保留为数据质量问题,不推断公司造假", + "scope": "companies", + "companyIds": [ + "AI054" + ] }, { "id": "R3", @@ -42859,7 +42867,11 @@ "evidenceIds": [ "E119" ], - "handling": "排除Result收入统计" + "handling": "排除Result收入统计", + "scope": "companies", + "companyIds": [ + "AI001" + ] }, { "id": "R4", @@ -42872,7 +42884,14 @@ "E122", "E123" ], - "handling": "保留原文与排除原因,禁止关键词自动抽取后直接合并" + "handling": "保留原文与排除原因,禁止关键词自动抽取后直接合并", + "scope": "companies", + "companyIds": [ + "AI007", + "AI013", + "AI021", + "AI034" + ] }, { "id": "R5", @@ -42884,7 +42903,11 @@ "E107", "E108" ], - "handling": "不认定为已核验经常性ARR,保留两种原文标签" + "handling": "不认定为已核验经常性ARR,保留两种原文标签", + "scope": "companies", + "companyIds": [ + "AI053" + ] }, { "id": "R6", @@ -42897,7 +42920,14 @@ "E103", "E104" ], - "handling": "可作历史经营信号,不能作2025或2026年末同行排名" + "handling": "可作历史经营信号,不能作2025或2026年末同行排名", + "scope": "companies", + "companyIds": [ + "AI016", + "AI015", + "AI043", + "AI040" + ] }, { "id": "R7", @@ -42907,7 +42937,11 @@ "evidenceIds": [ "E114" ], - "handling": "保留2025年共同范围;精确日期待核,不据此指控财务问题" + "handling": "保留2025年共同范围;精确日期待核,不据此指控财务问题", + "scope": "companies", + "companyIds": [ + "AI044" + ] }, { "id": "R8", @@ -42917,7 +42951,11 @@ "evidenceIds": [ "E126" ], - "handling": "限定北京机智赛博主体,不合并关联主体收入" + "handling": "限定北京机智赛博主体,不合并关联主体收入", + "scope": "companies", + "companyIds": [ + "AI048" + ] }, { "id": "R9", @@ -42930,7 +42968,14 @@ "E117", "E118" ], - "handling": "在经营指标中标明种类与归属" + "handling": "在经营指标中标明种类与归属", + "scope": "companies", + "companyIds": [ + "AI009", + "AI051", + "AI052", + "AI050" + ] }, { "id": "R10", @@ -42938,7 +42983,9 @@ "company": "全样本", "summary": "YC、融资可见公司和英文资料占比较高", "evidenceIds": [], - "handling": "披露率仅描述本次定向样本,不外推全球;本项依据为本版本公司表整体,继续拓展来源。" + "handling": "披露率仅描述本次定向样本,不外推全球;本项依据为本版本公司表整体,继续拓展来源。", + "scope": "dataset", + "companyIds": [] }, { "id": "R11", @@ -42949,7 +42996,11 @@ "E129", "E130" ], - "handling": "采用当前定价条款,不将容量订阅误记为逐事件收费" + "handling": "采用当前定价条款,不将容量订阅误记为逐事件收费", + "scope": "companies", + "companyIds": [ + "AI035" + ] }, { "id": "R12", @@ -42960,7 +43011,11 @@ "E099", "E100" ], - "handling": "原值仅保留追溯,排除收入比较;当前收入未知,不据此推断其他公司。" + "handling": "原值仅保留追溯,排除收入比较;当前收入未知,不据此推断其他公司。", + "scope": "companies", + "companyIds": [ + "AI058" + ] }, { "id": "R13", @@ -42974,7 +43029,11 @@ "E094", "E095" ], - "handling": "各里程碑按实际披露时间记录;收购后业务与独立初创分开。60%毛利率为预期,不当作实现值。" + "handling": "各里程碑按实际披露时间记录;收购后业务与独立初创分开。60%毛利率为预期,不当作实现值。", + "scope": "companies", + "companyIds": [ + "AI056" + ] }, { "id": "R14", @@ -42986,7 +43045,11 @@ "E089", "E090" ], - "handling": "公司值和第三方估算分别保留;未用不同日期计算行业增长或把所有客户当付费客户。" + "handling": "公司值和第三方估算分别保留;未用不同日期计算行业增长或把所有客户当付费客户。", + "scope": "companies", + "companyIds": [ + "AI055" + ] }, { "id": "YC-R-26144", @@ -42996,7 +43059,9 @@ "evidenceIds": [ "YC-X-26144" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-30226", @@ -43006,7 +43071,9 @@ "evidenceIds": [ "YC-X-30226" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-30671", @@ -43016,7 +43083,9 @@ "evidenceIds": [ "YC-X-30671" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-30975", @@ -43026,7 +43095,9 @@ "evidenceIds": [ "YC-X-30975" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-30983", @@ -43036,7 +43107,9 @@ "evidenceIds": [ "YC-X-30983" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-30999", @@ -43046,7 +43119,9 @@ "evidenceIds": [ "YC-X-30999" ], - "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。" + "handling": "本批不新增到成立年份确定的公司表;保留来源供后续核查。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "YC-R-COVERAGE", @@ -43056,7 +43131,9 @@ "evidenceIds": [ "YC-COVERAGE" ], - "handling": "目录记录与原有个案研究分开筛选。未确认AI业务、年份不符、日期冲突不作为本批新增;收入保持未核验,不记为零。" + "handling": "目录记录与原有个案研究分开筛选。未确认AI业务、年份不符、日期冲突不作为本批新增;收入保持未核验,不记为零。", + "scope": "dataset", + "companyIds": [] }, { "id": "MR-R-METHOD", @@ -43066,7 +43143,9 @@ "evidenceIds": [ "MR-METHOD" ], - "handling": "默认取读取日前7天内最后同步的USD MRR;按类别及支付来源分组;列出样本量、均值、中位数、样本CV与去除最大值后的敏感性。统计仅描述本次产品样本,不推断行业分布或造假概率。" + "handling": "默认取读取日前7天内最后同步的USD MRR;按类别及支付来源分组;列出样本量、均值、中位数、样本CV与去除最大值后的敏感性。统计仅描述本次产品样本,不推断行业分布或造假概率。", + "scope": "dataset", + "companyIds": [] }, { "id": "MR-R-STALE", @@ -43079,7 +43158,14 @@ "MR-E-adspirer", "MR-E-trackai" ], - "handling": "按最后同步日期筛选,不以网页访问日期刷新收入时间;连接过期标记保留。TrackAI的历史点仍在7天窗口内,不能声称连接当前有效。" + "handling": "按最后同步日期筛选,不以网页访问日期刷新收入时间;连接过期标记保留。TrackAI的历史点仍在7天窗口内,不能声称连接当前有效。", + "scope": "companies", + "companyIds": [ + "AI016", + "MR014", + "MR013", + "MR006" + ] }, { "id": "MR-R-IDENTITY", @@ -43090,7 +43176,12 @@ "MR-APP-NUTRIA", "MR-APP-CALYRA" ], - "handling": "产品/业务作为观测单位;未确认法律主体独立性,因此不把它们称作已去重的独立公司财报样本。" + "handling": "产品/业务作为观测单位;未确认法律主体独立性,因此不把它们称作已去重的独立公司财报样本。", + "scope": "companies", + "companyIds": [ + "MR007", + "MR008" + ] }, { "id": "MR-R-CASH", @@ -43101,7 +43192,11 @@ "MR-E-speel-co", "MR-METHOD" ], - "handling": "保留原值供核查账期、年付、退款与平台算法;不擅自纠正、不据差异判假,也不为改变统计结果而排除此点。" + "handling": "保留原值供核查账期、年付、退款与平台算法;不擅自纠正、不据差异判假,也不为改变统计结果而排除此点。", + "scope": "companies", + "companyIds": [ + "MR003" + ] }, { "id": "RUN-R-BASIS", @@ -43114,7 +43209,11 @@ "RUN-MARGIN", "RUN-PRICE" ], - "handling": "保留原文ARR并标明日期不确定性,排除同期ARR统计;毛利声明仅作待核查经营线索,不推断造假。" + "handling": "保留原文ARR并标明日期不确定性,排除同期ARR统计;毛利声明仅作待核查经营线索,不推断造假。", + "scope": "companies", + "companyIds": [ + "AI059" + ] }, { "id": "CN-R-NAIVE", @@ -43126,7 +43225,12 @@ "CN-NAIVE-REG", "E003" ], - "handling": "分别记录AI061和AI003,不合并团队、融资、模型表现或收入;成立年暂据二手资料并标明缺口。" + "handling": "分别记录AI061和AI003,不合并团队、融资、模型表现或收入;成立年暂据二手资料并标明缺口。", + "scope": "companies", + "companyIds": [ + "AI061", + "AI003" + ] }, { "id": "CN-R-PSI", @@ -43136,7 +43240,9 @@ "evidenceIds": [ "CN-PSI-YEAR" ], - "handling": "仅保留排除证据和复核记录,不计入公司主样本或ARR比较。" + "handling": "仅保留排除证据和复核记录,不计入公司主样本或ARR比较。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "CN-R-MIRO", @@ -43147,7 +43253,11 @@ "CN-MIRO-2025", "CN-MIRO-PRICE" ], - "handling": "year保持null,公开研发年份单列;不自动匹配同名SEO公司或个体户,不参与成立年2025/2026统计。" + "handling": "year保持null,公开研发年份单列;不自动匹配同名SEO公司或个体户,不参与成立年2025/2026统计。", + "scope": "companies", + "companyIds": [ + "AI062" + ] }, { "id": "CN-R-DEEP", @@ -43157,7 +43267,9 @@ "evidenceIds": [ "CN-DEEP-PENDING" ], - "handling": "不以备案年份代替成立年,本轮暂不纳入成立年主样本。" + "handling": "不以备案年份代替成立年,本轮暂不纳入成立年主样本。", + "scope": "excluded-candidate", + "companyIds": [] }, { "id": "DATE-R-EM", @@ -43169,7 +43281,11 @@ "E106", "E108" ], - "handling": "更新同一观测O050,不重复记作新收入;仍保留原文来源和定义差异,月份精度不补成具体日期。" + "handling": "更新同一观测O050,不重复记作新收入;仍保留原文来源和定义差异,月份精度不补成具体日期。", + "scope": "companies", + "companyIds": [ + "AI053" + ] }, { "id": "DATE-R-RECENCY", @@ -43183,7 +43299,12 @@ "E116", "E105" ], - "handling": "收入、人数与采用规模按各自时点保存;Wonderful现主营归C05,不把异时点人数与估算收入相除形成精确人效。" + "handling": "收入、人数与采用规模按各自时点保存;Wonderful现主营归C05,不把异时点人数与估算收入相除形成精确人效。", + "scope": "companies", + "companyIds": [ + "AI055", + "AI052" + ] }, { "id": "SR-R-VARIANT", @@ -43193,7 +43314,11 @@ "evidenceIds": [ "SR-E-variant-now" ], - "handling": "两种ARR数值均作待核交叉记录,不自动取高值;管线与履历金额排除收入比较。" + "handling": "两种ARR数值均作待核交叉记录,不自动取高值;管线与履历金额排除收入比较。", + "scope": "companies", + "companyIds": [ + "AI066" + ] }, { "id": "SR-R-DEFINITION", @@ -43204,7 +43329,12 @@ "SR-E-abliteration", "SR-E-codos" ], - "handling": "保留原词、上下界和币种缺项,不把数量级当作精确值,不用于同期领域均值。" + "handling": "保留原词、上下界和币种缺项,不把数量级当作精确值,不用于同期领域均值。", + "scope": "companies", + "companyIds": [ + "AI067", + "AI065" + ] }, { "id": "SR-R-PIPELINE", @@ -43217,7 +43347,14 @@ "SR-E-quinn", "SR-E-infragrid" ], - "handling": "建立公司与历史经营信号,但不以访问日充当收入时点;同一公司历史阶段不重复计入横截面。" + "handling": "建立公司与历史经营信号,但不以访问日充当收入时点;同一公司历史阶段不重复计入横截面。", + "scope": "companies", + "companyIds": [ + "AI063", + "AI064", + "AI068", + "AI069" + ] }, { "id": "TECH-GRAD-R-SCOPE", @@ -43228,7 +43365,11 @@ "TECH-GRAD-TTS", "TECH-GRAD-METHOD" ], - "handling": "记录榜单快照与区间,明确第三方评测、本轮未复测;不将Elo当百分比、Samples当客户数或折算价格当毛利。" + "handling": "记录榜单快照与区间,明确第三方评测、本轮未复测;不将Elo当百分比、Samples当客户数或折算价格当毛利。", + "scope": "companies", + "companyIds": [ + "AI051" + ] } ], "coverage": { diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index 1b661a8..ad8b9c3 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-benchmark-1", + "sourceVersion": "2026-10-30-review-links-1", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business",