diff --git a/apps/docs/scripts/auth-cli.ts b/apps/docs/scripts/auth-cli.ts index 9d4e5f3..6dcc78a 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, 1021); + assert.equal(research.companies.length, 1022); assert.equal(research.categories.length, 11); - assert.equal(research.evidence.length, 1242); + assert.equal(research.evidence.length, 1245); 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 c3bb537..419eaf0 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, 1021); - assert.equal(initial.evidence.length, 1242); + assert.equal(initial.companies.length, 1022); + assert.equal(initial.evidence.length, 1245); 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,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, 57); + assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 58); assert.equal(snapshot.reviews.filter((r) => r.scope === "dataset").length, 8); assert.equal(snapshot.reviews.filter((r) => r.scope === "excluded-candidate").length, 26); 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), 1021); + assert.equal(summary.reduce((n, c) => n + c.count, 0), 1022); 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), 978); + assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 979); 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, 14); + assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 15); 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, 9); + assert.equal(snapshot.candidateBatches!.flatMap((b) => b.records).filter((r) => r.status === "pending-year").length, 8); }); 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 f1c35c5..f9fb801 100644 --- a/content/research/ai-companies.seed.json +++ b/content/research/ai-companies.seed.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-lineage-2", + "version": "2026-10-30-goldfish-1", "asOf": "2026-10-30", "scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。", "limitations": [ @@ -28869,6 +28869,47 @@ "WABI-TERMS" ] } + }, + { + "id": "AI078", + "name": "Goldfish", + "url": "https://goldfish.sh/", + "cat": "C09", + "year": 2026, + "team": null, + "location": "公开材料关联旧金山创业项目;法律总部待核", + "business": "桌面个人上下文记忆与写作助手,读取系统辅助功能文本并结合本地记忆生成回复,可为AI工具提供上下文。", + "buyer": "个人知识工作者;企业采购与实际付费客户待核", + "delivery": "官网提供macOS和Windows下载,公开产品文档可读;未安装或独立测试效果、隐私承诺及成本。", + "notes": "成立2026依据Entrepreneurs First投资组合页,创始人与官方社区页一致;精确注册日未核。创始人此前Strawberry收入及VR教育业务ARR不是Goldfish收入。官网点击数不是用户或付费客户数,免费测试不等于公司收入为零。", + "cohort": "2026年成立(投资机构名录);注册日期未独立核验", + "teamBasis": "公开两位创始人不等于完整员工人数,保留未知", + "price": "截至2026-10-30官网称测试期间免费,未来定价与企业合同待核", + "stage": "已公开下载的测试产品;商业收费与财务数据未知", + "sourceType": "Product Hunt发现;官方产品/条款/文档及EF投资组合页补证", + "evidenceIds": [ + "GOLD-HOME", + "GOLD-TERMS", + "GOLD-PRIVACY", + "PH-GOLD", + "GOLD-EF", + "GOLD-CREATORS", + "GOLD-DOCS" + ], + "revenueStatus": "unknown", + "businessModel": "个人AI记忆与助手;当前免费测试,付费模式待核", + "entityBasis": "官方条款与页脚列Goldfish AI Inc.,EF与官方社区页均列Joel Edholm、Kaspian Jakobsson并关联goldfish.sh;不与同名语音产品及创始人旧公司合并。", + "classificationBasis": "按个人桌面上下文与写作场景归C09;MCP为上下文交付方式,不据此归为基础模型或企业开发工具。", + "pricingEvidence": "GOLD-HOME", + "technicalReview": { + "level": "description", + "reviewedAt": "2026-10-30", + "summary": "已读系统辅助功能文本读取、本地存储与外部AI调用的官方文档;没有独立测试或可核源代码,本地记忆不表示推理全部本地运行。", + "evidenceIds": [ + "GOLD-DOCS", + "GOLD-PRIVACY" + ] + } } ], "observations": [ @@ -44755,18 +44796,18 @@ }, { "id": "GOLD-HOME", - "companyId": null, + "companyId": "AI078", "title": "Goldfish官方产品及免费测试状态", "url": "https://goldfish.sh/", "publishedAt": null, "accessedAt": "2026-10-30", "kind": "公司官方材料", "summary": "官网称本地上下文记忆助手,测试期间免费,页脚列Goldfish AI Inc.。", - "limitation": "测试免费不表示公司收入为零;点击计数不是用户数、付费数或MRR,成立年未核。" + "limitation": "测试免费不表示公司收入为零;点击计数不是用户数、付费数或MRR;成立年另由EF名录补证。" }, { "id": "GOLD-TERMS", - "companyId": null, + "companyId": "AI078", "title": "Goldfish条款与运营者", "url": "https://goldfish.sh/tos", "publishedAt": null, @@ -44777,7 +44818,7 @@ }, { "id": "GOLD-PRIVACY", - "companyId": null, + "companyId": "AI078", "title": "Goldfish隐私与数据处理说明", "url": "https://goldfish.sh/privacy", "publishedAt": null, @@ -44821,7 +44862,7 @@ }, { "id": "PH-GOLD", - "companyId": null, + "companyId": "AI078", "title": "Goldfish产品发布线索", "url": "https://www.producthunt.com/products/goldfish-early-access", "publishedAt": null, @@ -45599,6 +45640,39 @@ "kind": "公司公开主页自述", "summary": "公开主页列Founded 2025,并将mgx.dev列为商业平台,关联MetaGPT开源框架与后续Atoms品牌。", "limitation": "自述年份不是注册证明;尚未消歧MetaGPT LLC、DeepWisdom与产品团队的主体关系及官网更早沿革。融资金额不是收入,关注数与页面关联人员数不是员工总人数。Atoms展示页和DeepWisdom关联页本次读取失败。" + }, + { + "id": "GOLD-EF", + "companyId": "AI078", + "title": "EF投资组合Goldfish成立年与创始人", + "url": "https://www.joinef.com/companies/goldfish/?pagenum=2", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "投资机构公司名录", + "summary": "页面标注Founded 2026、Joel Edholm和Kaspian Jakobsson,并链接goldfish.sh。", + "limitation": "机构与投资对象有利益关系,年份非独立注册核验;创始人此前Strawberry收入和VR教育企业ARR不能转作Goldfish收入。无查询参数的入口本次重定向组合首页,保留实际可读URL。" + }, + { + "id": "GOLD-CREATORS", + "companyId": "AI078", + "title": "Goldfish官方社区与创始人对应", + "url": "https://docs.goldfish.sh/community/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司产品文档", + "summary": "官方社区页列Joel Edholm与Kaspian Jakobsson,与EF页面姓名一致。", + "limitation": "两位创始人不等完整员工数;社区加入数与创始人关注者不作客户或收入。" + }, + { + "id": "GOLD-DOCS", + "companyId": "AI078", + "title": "Goldfish官方架构与平台说明", + "url": "https://docs.goldfish.sh/", + "publishedAt": null, + "accessedAt": "2026-10-30", + "kind": "公司产品文档", + "summary": "说明经操作系统辅助功能读取屏幕文字、设备本地存储记忆,运行于macOS与Windows,并提供写作与上下文功能。", + "limitation": "属于产品描述,非独立测试或安全审计;本地记忆不等所有模型推理在本地,不以文档可读判定技术领先。" } ], "reviews": [ @@ -46903,6 +46977,23 @@ ], "handling": "保留年份待核,需补同一法律主体或独立新公司的成立依据;不转移旧产品收入、开源使用量、团队规模或融资为ARR。", "scope": "excluded-candidate" + }, + { + "id": "GOLD-R-COHORT", + "type": "成立依据与财务边界", + "company": "Goldfish", + "companyIds": [ + "AI078" + ], + "summary": "EF名录2026年份、官方创始人与产品域名一致,纳入公司表;公开材料没有Goldfish收入数值。", + "evidenceIds": [ + "GOLD-EF", + "GOLD-CREATORS", + "GOLD-HOME", + "GOLD-PRIVACY" + ], + "handling": "收入、完整团队规模与精确注册日留缺;不将创始人历史业绩、点击数或免费测试推算为当前ARR、客户数或零收入。", + "scope": "companies" } ], "coverage": { @@ -47025,14 +47116,18 @@ "categoryId": "C09", "kind": "product", "profileStatus": "readable", - "status": "pending-year", - "note": "运营者Goldfish AI Inc.,成立年未核;政策生效日不当成立日。测试期间免费不说明收入为零,点击计数不等于客户数或MRR。", + "status": "linked", + "note": "据EF投资组合页Founded 2026及官方创始人/域名关联纳入AI078;精确注册日、完整团队和收入留缺。免费测试不作零收入,创始人旧公司业绩不转移。", "evidenceIds": [ "GOLD-HOME", "GOLD-TERMS", "GOLD-PRIVACY", - "PH-GOLD" - ] + "PH-GOLD", + "GOLD-EF", + "GOLD-CREATORS", + "GOLD-DOCS" + ], + "companyId": "AI078" }, { "id": "PH26-08", diff --git a/content/research/ai-companies.sources.json b/content/research/ai-companies.sources.json index 40771cf..d69e607 100644 --- a/content/research/ai-companies.sources.json +++ b/content/research/ai-companies.sources.json @@ -1,5 +1,5 @@ { - "version": "2026-10-30-15", + "version": "2026-10-30-16", "scopeConfirmedAt": "2026-10-30", "acceptance": "以确认的公开来源清单为边界,逐条核对并标明缺项。", "provenance": "S01—S12恢复自已提交用户的《AI公司研究_来源与分类模板》来源清单;S13—S16单列后续已使用的补充证据渠道,不将使用次数当作全量覆盖。", @@ -60,8 +60,8 @@ "producthunt.com" ], "initialAccess": "官网可读取", - "boundary": "两年公开响应各19条,共38条。当前4条关联公司、2条范围外对照、24条范围外/既有业务、6条年份待核、2条推广。旧版本、品牌与法律主体分开,Tapflow据2024原版记录排除,Happycapy仍待核;非两年全量。", - "nextCheck": "继续补两年其余分页/日期、仅图片位置及6条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。", + "boundary": "两年公开响应各19条,共38条。当前5条关联公司、2条范围外对照、24条范围外/既有业务、5条年份待核、2条推广。旧版本、品牌与法律主体分开,Tapflow据2024原版记录排除,Happycapy仍待核;非两年全量。", + "nextCheck": "继续补两年其余分页/日期、仅图片位置及5条年份待核候选;保留Pazi日期冲突,核清品牌与主体,避免转移历史业绩。", "limitation": "上线时间不等于成立时间", "accessRecheckedAt": "2026-10-30" }, diff --git a/content/research/ai-income-analysis.json b/content/research/ai-income-analysis.json index b9b8d29..4561e7a 100644 --- a/content/research/ai-income-analysis.json +++ b/content/research/ai-income-analysis.json @@ -1,5 +1,5 @@ { - "sourceVersion": "2026-10-30-lineage-2", + "sourceVersion": "2026-10-30-goldfish-1", "asOf": "2026-10-30", "metric": "platform-mrr-usd", "sampleUnit": "product-or-business",