Compare commits

..

4 Commits

Author SHA1 Message Date
codex-bot 798c6d17d0 docs: add modern Smalltalk-80 study guide 2026-10-30 14:17:39 +08:00
Zayden-Jung c2ea0900e6 Merge pull request '补充AI公司收入、合同与业务规模口径核查' (#12) from codex/ai-research-revenue-scope into main
Verify and deploy Tabularium / verify-and-deploy (push) Successful in 6m30s
Reviewed-on: #12
2026-10-30 06:04:36 +00:00
codex-bot 1cc2c9f97f 补充6家AI公司合同与交易支出口径核查 2026-10-30 13:53:00 +08:00
Zayden-Jung 62bba8d320 Merge pull request '新增AI公司收入分布、证据核查与研究报告' (#11) from codex/ai-research-income into main
Verify and deploy Tabularium / verify-and-deploy (push) Successful in 7m48s
Reviewed-on: #11
2026-10-30 05:48:56 +00:00
21 changed files with 1219 additions and 96 deletions
+6 -6
View File
@@ -98,12 +98,12 @@ AUTH_CONFIG_FILE=/private/tmp/tabularium-auth/config.json AUTH_COOKIE_SECURE=fal
同一版本内容变化会拒绝导入,避免静默读取旧数据。回退代码时继续读取对应旧版本。
所有修改都经过工作分支和 PR,部署仍等待人工合并主线。
当前资料包含 1,015 条公司/产品记录、10 类业务及待分类组、1,086 条证据记录和 170 条经营与技术观测。
其中保留 80 家个案资料、919 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。
当前资料包含 1,015 条公司/产品记录、10 类业务及待分类组、1,091 条证据记录和 183 条经营与技术观测。
其中保留 86 家个案资料、913 条目录基础资料,并新增 16 个平台产品/业务样本;目录项不等于完成财务和技术核验。
补充ThinkWheel与中国NaiveAI;MiroMind成立年未核,公开研发年份单列。保留灵初智能成立年排除、深度原理日期待核和Naive近名实体复核记录。
新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;48条核查中37条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。
新增7条Speedrun个案,保留标题/正文冲突、七位数数量级、币种不明、合同管线与履历归属排除记录;相对日期不充当同期收入时点。核查页优先按人工确认的公司ID关联明细,旧版本保留按证据归属回退;54条核查中43条指向具体公司、3条属于全局方法、8条是未纳入候选。明细反向列出关联核查;币种不明的声明保留原值,不绘制美元收入长度条。
Bud保留为2025成立且YC标记已收购的案例;Rocket.new按前身2021成立、2025产品上线的转型对照记录,历史ARR不混入新成立公司同期统计。
它是定向试样,收入披露不足且统计时点不统一,不代表全部 AI 公司。
验收按2026-10-30确认的公开来源清单边界逐条核对并标明缺项;YC候选池有完整读取台账,其他来源目前为定向补充,不能把来源出现次数当作覆盖完成。收入披露不足且统计时点不统一,不代表全部 AI 公司。
界面将公司自述、第三方估算、融资、客户收入和履历收入分开,未知收入不记为零。
保留被撤回的声明作为核查记录,并排除收入比较;并购后业务、管理层预测与历史里程碑单列。
团队规模下界在列表中显示比较符,商业成熟度展示公开交付证据,不等于技术能力排名。
@@ -137,13 +137,13 @@ MRR×12仅作为显示单位转换,不改写为公司ARR;公司ARR、估算
新增业务分类优先匹配主营简介,再参考目录标签;未匹配者进入待分类组。
初分规则位于 `scripts/classify-ai-profiles.py`,只生成待评审标签,不执行抓取或构建。
目录基础项保留 `classificationBasis` 和 `directoryTags` 供复核。
当前目录基础项中160条已人工复核主营与买家,Contrario及8条收入声明/排除案例已深化为个案。`directoryOrigin`保留原发现来源,`profileOnly`只表示当前资料深度;深化不改变原候选池新增928条的审计分母。
当前目录基础项中160条已人工复核主营与买家,Contrario及14条收入声明/排除案例已深化为个案。`directoryOrigin`保留原发现来源,`profileOnly`只表示当前资料深度;深化不改变原候选池新增928条的审计分母。
分类按主要工作任务和买家判断,例如Paragon归客户与收入运营,Oki归消费者应用,Lucidic归Agent设施。市场支出、采用规模、性能主张及客户收益均不作为公司收入。
其中121条原待分类记录已按YC官方业务介绍人工复核主营业务,分类理由保存在公司字段与对应证据摘要中;
仍有3条因简介不足保留待分类。人工复核分类不代表独立验证技术水平、客户效果或财务数据。
AI 关键词可能出现在业务背景中,收入、买家和交付状态仍须逐家深查,不能把目录项的未知收入当作未披露。
技术专项评审用独立字段记录层级、日期、摘要与证据:未评审、已读技术自述、公开代码/模型材料可访问、有第三方独立评测记录。
当前6条完成该字段的专项记录,其中2条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。
当前7条完成该字段的专项记录,其中3条确认材料可访问、1条记录第三方已发表评测(Gradium TTS Sep 2026);本轮未自行运行模型测试。缺字段不表示无技术能力,代码或模型卡可读不证明性能。
界面支持按资料深度、记录团队规模和技术验证证据筛选;证据列表每页 30 条,避免一次渲染全部来源。
`pnpm test:research` 在远程 Runner 上验证同库持久化、重复读取、版本导入与回退、
+2 -2
View File
@@ -187,8 +187,8 @@ async function main() {
const research = await researchResponse.json();
assert.equal(research.companies.length, 1015);
assert.equal(research.categories.length, 11);
assert.equal(research.evidence.length, 1086);
assert.equal(research.observations.length, 170);
assert.equal(research.evidence.length, 1091);
assert.equal(research.observations.length, 183);
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 });
assert.equal(researchPage.status, 200);
+7 -7
View File
@@ -24,8 +24,8 @@ test("research revisions share the authentication database and preserve replay l
assert.equal(consumeCode(config, "invalid"), "limited");
const initial = readResearchSnapshot();
assert.equal(initial.companies.length, 1015);
assert.equal(initial.evidence.length, 1086);
assert.equal(initial.observations.length, 170);
assert.equal(initial.evidence.length, 1091);
assert.equal(initial.observations.length, 183);
assert.deepEqual(readResearchSnapshot(), initial, "reopening does not duplicate records");
const db = openSiteDatabase();
const tables = db.prepare("SELECT name FROM sqlite_master WHERE type='table'").all() as { name: string }[];
@@ -62,7 +62,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, 37);
assert.equal(snapshot.reviews.filter((r) => r.scope === "companies").length, 43);
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")!;
@@ -84,10 +84,10 @@ test("disclosure counts exclude client income, biographies, targets and duplicat
const snapshot = seed as ResearchSnapshot;
const summary = categorySummary(snapshot);
assert.equal(summary.reduce((n, c) => n + c.count, 0), 1015);
assert.equal(summary.reduce((n, c) => n + c.self, 0), 24);
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), 974);
assert.equal(summary.reduce((n, c) => n + c.unknown, 0), 972);
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 === "公司整体"));
@@ -95,8 +95,8 @@ 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, 6);
assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 2);
assert.equal(snapshot.companies.filter((c) => c.technicalReview).length, 7);
assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "public-artifact").length, 3);
assert.equal(snapshot.companies.filter((c) => c.technicalReview?.level === "independent-test").length, 1);
assert.equal(snapshot.companies.find((c) => c.id === "AI051")?.revenueStatus, "unknown");
assert.match(snapshot.companies.find((c) => c.id === "AI051")!.technicalReview!.testScope!, /Sep 2026/);
+77
View File
@@ -1,5 +1,10 @@
{
"collections": [
{
"path": "smalltalk",
"title": "Smalltalk-80 研究导读",
"description": "从消息、类与集合到图形、开发工具和经典 MVC。"
},
{
"path": "pretext",
"title": "Pretext 源码教程",
@@ -233,6 +238,78 @@
"description": "核对候选池、来源偏差、分类与验证完成度,区分全量读取和定向补充。",
"slug": "other-research/ai-company-research/coverage",
"category": "其他研究"
},
"smalltalk/00-overview": {
"slug": "source-studies/smalltalk/overview",
"category": "源码研究",
"group": "阅读地图",
"description": "Smalltalk-80:从消息到交互系统;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/01-messages": {
"slug": "source-studies/smalltalk/messages",
"category": "源码研究",
"group": "语言核心",
"description": "消息与对象:理解执行模型;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/02-syntax-and-blocks": {
"slug": "source-studies/smalltalk/syntax-and-blocks",
"category": "源码研究",
"group": "语言核心",
"description": "语法与块:读懂一段 Smalltalk;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/03-classes-and-methods": {
"slug": "source-studies/smalltalk/classes-and-methods",
"category": "源码研究",
"group": "语言核心",
"description": "类、方法与元类:行为放在哪里;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/04-object-protocol": {
"slug": "source-studies/smalltalk/object-protocol",
"category": "源码研究",
"group": "对象模型",
"description": "对象协议:身份、复制与依赖;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/05-reflection": {
"slug": "source-studies/smalltalk/reflection",
"category": "源码研究",
"group": "对象模型",
"description": "类的架构与反射:系统怎样描述自己;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/06-collections-and-streams": {
"slug": "source-studies/smalltalk/collections-and-streams",
"category": "源码研究",
"group": "类库与执行",
"description": "基础类库:数值、集合与流;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/07-processes": {
"slug": "source-studies/smalltalk/processes",
"category": "源码研究",
"group": "类库与执行",
"description": "进程与同步:协作执行的对象;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/08-graphics": {
"slug": "source-studies/smalltalk/graphics",
"category": "源码研究",
"group": "交互系统",
"description": "图形系统:坐标、位图与绘制;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/09-live-environment": {
"slug": "source-studies/smalltalk/live-environment",
"category": "源码研究",
"group": "交互系统",
"description": "开发环境:浏览、检查与调试;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/10-mvc": {
"slug": "source-studies/smalltalk/mvc",
"category": "源码研究",
"group": "交互系统",
"description": "MVC 与曲线案例:连接数据和界面;依据原书章节整理,区分历史机制与补充说明。"
},
"smalltalk/11-reference": {
"slug": "source-studies/smalltalk/reference",
"category": "源码研究",
"group": "阅读地图",
"description": "术语、练习与原书对照;依据原书章节整理,区分历史机制与补充说明。"
}
}
}
@@ -19,6 +19,7 @@
| 创意软件与制作服务 | Speel.co、Laper、GetEbook AI、White Glove Content | 软件订阅和交付服务必须分组 | 合格交付的计算与人工成本、返工率、重复购买 | 项目收入占比、人工工时、产能 |
| 小企业综合Agent | Runable(AI059) | 公司披露历史ARR里程碑;[官方公告](https://runable.com/blogs/runable-grow) | 限定一个任务,测完整成功率、收费与执行成本 | 当前付费客户、续费、推理成本、人工接管 |
| 行业专业Agent与服务 | LunaBill、Plena Health、Bizmark | 有合同ARR、数量级或ARR自述,日历截止日和交付拆分不完整 | 采购周期、上线工时、失败处理与验收标准 | 合同、经常性与实施费拆分、使用深度 |
| AI辅助工程与研究服务 | Marengo、Harbor | 有首月收入、待交付或多年服务合同;不直接当ARR | 已验收项目毛利、专业人员工时、返工和责任成本 | 合同收入确认、软件/服务拆分、应收账款和交付集中度 |
| 模型、算力与机器人 | Wafer、Induction Labs、Congruent | 可确定产品方向;团队小或融资多不证明单位经济 | 客户真实负载、性能成本、交付与售后成本 | 同口径收入、资本开支、独立性能测试 |
**对我们商业试验的推论:** 先选择能接触真实买家、结果可验收、成本可计量的工作流,比较软件订阅与服务交付的实际毛利,再评估是否扩成综合Agent。当前证据不足以断定某类必然更赚钱;平台数据更适合帮助选择访谈与试验对象。
@@ -51,6 +52,12 @@
| [Brickwise](/docs/other-research/ai-company-research/overview?company=YC30847#research-company-detail) | 销售管线中有超过100万cARR的企业合同,原文$ | 不确认成已签或已实现ARR;融资及前公司业绩排除 | 大合同集中度和签约到上线的转化需要单独核查 |
| [Radley](/docs/other-research/ai-company-research/overview?company=YC33020#research-company-detail) | 收购诊所带来460万年化收入,另有220万合同,原文$ | 收购、交割与并表边界未核,不当纯软件ARR,不把两项相加 | 医疗服务收入需结合医生工时、收购成本与经营毛利,不能直接与SaaS比较 |
| [Misprint](/docs/other-research/ai-company-research/overview?company=YC30302#research-company-detail) | 创始人此前卖卡50万ARR,原文$ | 发布帖明确早于平台构想,排除平台收入 | 卡牌销售额、交易额、平台佣金与软件订阅是不同口径 |
| [Harbor](/docs/other-research/ai-company-research/overview?company=YC31445#research-company-detail) | 未来十二个月18.7万软件合同、月软件收入1.56万、三年193万CRO合同,原文$ | 软件与服务分开,重叠声明不相加;多年合同不均摊为ARR | 从软件扩至服务后,需核项目履约、人员成本和回款周期 |
| [Marengo](/docs/other-research/ai-company-research/overview?company=YC32981#research-company-detail) | 首月7万收入、400万待交付合同,原文$ | 单月收入不自动年化,待交付合同不当确认收入 | 数据中心设计是专业工程服务,需核工程师审核、返工与验收成本 |
| [Tsenta](/docs/other-research/ai-company-research/overview?company=YC31259#research-company-detail) | 三个月达到约300万Annualized,原文$ | 指标没有展开定义,暂不补成ARR | 按申请额度收费,求职结束后的留存与持续付费需单独测量 |
| [Arbital](/docs/other-research/ai-company-research/overview?company=YC32749#research-company-detail) | 累计13.5亿、月约4.35亿交易量,原文$ | 交易量不当收入;没有费率不反推佣金 | 交易量可能包含重复换手,平台抽成、激励和净收入才决定经济性 |
| [Jcode](/docs/other-research/ai-company-research/overview?company=YC32172#research-company-detail) | 每月100万推理支出吞吐,原文$ | 推理支出不当MRR;源码公开与厂商基准分开标记 | 需核工具收费、推理成本承担方和开发者留存 |
| [NebuSec](/docs/other-research/ai-company-research/overview?company=YC32138#research-company-detail) | 40万漏洞奖金,原文$ | 团队与Agent归属、获奖期及收款主体待核,不当ARR | 奖金与安全服务订阅不同;独立漏洞记录及持续合同需分别验证 |
这批记录补充了收入定义差异,尚未增加同日同币种的可比ARR样本。合同承诺、并购业务或履历混入会使领域均值失真;资料有这些差异本身不证明财务造假。
@@ -2,6 +2,8 @@
截至 2026-10-30,研究表含1,015条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。
验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。
[分类和数据工作台](/docs/other-research/ai-company-research/overview)链接原始证据,[收入样本快照](/docs/other-research/ai-company-research/income-snapshot)展示当前可计算的MRR样本。
## 候选池与公司表的关系
@@ -17,7 +19,7 @@
| AI业务待确认 | 192 | 不强行把背景关键词当主营 |
| 成立年与批次冲突 | 6 | 另保留核查记录 |
全表由919条目录基础项和96条个案或平台记录组成。候选池已匹配项之外另有53条记录,包含其他来源及发布/转型对照;其中已有9条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。
全表由913条目录基础项和102条个案或平台记录组成。候选池已匹配项之外另有53条记录,包含其他来源及发布/转型对照;其中已有15条原目录记录深化为个案,仍保留目录来源。两种统计边界不同。候选池数字只是该镜像快照的覆盖,Bud等后续定向补充不回填为原候选池已覆盖。
## 成立年与证据深度
@@ -27,33 +29,33 @@
| 记录为2026年成立 | 391 | 不将产品发布日期代替成立日 |
| 成立年未知或范围外 | 5 | 发布/转型对照单列,不进入两年成立分组 |
| 目录业务分类人工复核 | 160 | 仅复核主营分类,不代表技术或财务审计 |
| 其他目录基础项 | 759 | 规则初分或资料不足,继续待复核 |
| 其他目录基础项 | 753 | 规则初分或资料不足,继续待复核 |
| 有团队数字 | 945 | 多为自报Team Size或Employees,时点与口径不统一 |
| 专项技术证据记录 | 6 | 其中3条自述、2条公开材料、1条第三方评测 |
| 公司披露收入线索 | 24 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR |
| 专项技术证据记录 | 7 | 其中3条自述、3条公开材料、1条第三方评测 |
| 公司披露收入线索 | 26 | 含历史、下界、币种不明及产品业务声明,不等于可比ARR |
| 仅平台收入线索 | 16 | 同时有公司披露者计入上一行,不重复计数 |
| 仅第三方估算 | 1 | 不与直接披露混合 |
| 暂无可用收入数字 | 974 | 包含尚未逐家搜索的目录项,不代表没有收入 |
| 暂无可用收入数字 | 972 | 包含尚未逐家搜索的目录项,不代表没有收入 |
## 业务分类与数据入口
| 业务类别 | 记录数 |
| --- | --- |
| [基础模型](/docs/other-research/ai-company-research/overview?category=C01) | 29 |
| [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 103 |
| [算力与模型基础设施](/docs/other-research/ai-company-research/overview?category=C02) | 102 |
| [Agent 开发与运行设施](/docs/other-research/ai-company-research/overview?category=C03) | 51 |
| [软件开发](/docs/other-research/ai-company-research/overview?category=C04) | 109 |
| [企业通用工作](/docs/other-research/ai-company-research/overview?category=C05) | 176 |
| [客户与收入运营](/docs/other-research/ai-company-research/overview?category=C06) | 52 |
| [行业专业应用](/docs/other-research/ai-company-research/overview?category=C07) | 321 |
| [内容与创意](/docs/other-research/ai-company-research/overview?category=C08) | 45 |
| [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 45 |
| [消费者个人应用](/docs/other-research/ai-company-research/overview?category=C09) | 46 |
| [机器人及实体产业](/docs/other-research/ai-company-research/overview?category=C10) | 81 |
| [业务待分类](/docs/other-research/ai-company-research/overview?category=C00) | 3 |
## 已使用来源的分布
1,086条证据记录对应1,072个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。
1,091条证据记录对应1,077个不同URL。不同URL不自动构成独立验证;同一声明可能由公司、投资方和媒体重复转述。
| 来源 | 证据记录 | 不同URL | 用途及限制 |
| --- | --- | --- | --- |
@@ -62,7 +64,7 @@
| a16z Speedrun | 11 | 10 | 投资机构中的公司介绍及收入声明;存在利益关系 |
| TechCrunch | 3 | 3 | 原始采访或报道;转述公司数字不等于查账 |
| Sacra | 3 | 3 | 第三方估算;与直接披露分开 |
| 其他官网、评测及公开资料 | 67 | 63 | 按每条来源限制理解,不能统一当作独立证据 |
| 其他官网、评测及公开资料 | 72 | 68 | 按每条来源限制理解,不能统一当作独立证据 |
## 尚未满足的研究条件
+51
View File
@@ -0,0 +1,51 @@
# Smalltalk-80:从消息到交互系统
Smalltalk 把语言、类库和开发工具放进同一个可探索的对象世界。本教程以“消息怎样找到行为”为起点,逐步走到集合、进程、图形与 MVC,帮助你阅读经典系统中的类与方法。
**资料范围**:A. Mével、T. Guéguen 著《Smalltalk-80》,Macmillan Education,1987;英文版编辑 Mario Wolczko,翻译 M. J. Stewart。书中说明以 Xerox Version 2 Virtual Image 为基础。用户提供的扫描 PDF 共 190 页,正文印刷页 1–174 对应 PDF 页 12–185;印刷页 p 的 PDF 页为 p + 11。
这里是按学习任务重组的中文研究导读,覆盖原书 21 章的主要主题,保留章节与页码定位,不是逐页译本或完整 API 手册。补充示例为本文编写,预期值来自语义推演,未在 Smalltalk 镜像运行。本文没有对某个 Smalltalk 实现仓库做逐文件源码核验;“源码研究”是站点分类,阅读原书后仍需进入对应镜像浏览实际方法。
## 选择阅读路线
| 目标 | 路线 | 读完能做什么 |
| --- | --- | --- |
| 初次接触 | 消息 → 语法 → 类与方法 → 集合 | 读懂表达式,分清返回值与接收者 |
| 研究语言机制 | 类与方法 → 对象协议 → 反射 | 追踪查找起点、对象身份和类侧行为 |
| 研究交互系统 | 开发环境 → 图形 → MVC | 追踪一次选择如何改变模型并刷新视图 |
| 对照原书 | 下方映射表 → 各篇来源说明 | 找到对应章、印刷页和扫描页 |
## 教程目录
1. [消息与对象:理解执行模型](/docs/source-studies/smalltalk/messages)
2. [语法与块:读懂一段 Smalltalk](/docs/source-studies/smalltalk/syntax-and-blocks)
3. [类、方法与元类:行为放在哪里](/docs/source-studies/smalltalk/classes-and-methods)
4. [对象协议:身份、复制与依赖](/docs/source-studies/smalltalk/object-protocol)
5. [类的架构与反射:系统怎样描述自己](/docs/source-studies/smalltalk/reflection)
6. [基础类库:数值、集合与流](/docs/source-studies/smalltalk/collections-and-streams)
7. [进程与同步:协作执行的对象](/docs/source-studies/smalltalk/processes)
8. [图形系统:坐标、位图与绘制](/docs/source-studies/smalltalk/graphics)
9. [开发环境:浏览、检查与调试](/docs/source-studies/smalltalk/live-environment)
10. [MVC 与曲线案例:连接数据和界面](/docs/source-studies/smalltalk/mvc)
11. [术语、练习与原书对照](/docs/source-studies/smalltalk/reference)
## 原书与新结构
| 原章 | 印刷页 | PDF 页 | 本教程 |
| --- | --- | --- | --- |
| 1 Introduction;2 Principles | 1–8 | 12–19 | 消息与对象 |
| 3 Classes;5 Methods | 9–12;21–25 | 20–23;32–36 | 类、方法与元类 |
| 4 Syntax | 13–20 | 24–31 | 语法与块 |
| 7 Object | 31–39 | 42–50 | 对象协议 |
| 8 Architecture of Classes | 40–52 | 51–63 | 类的架构与反射 |
| 9 Magnitude;10 Numeric;11 Collection;12 Stream | 53–90 | 64–101 | 基础类库 |
| 13 Processes | 91–95 | 102–106 | 进程与同步 |
| 14 Point/Rectangle;15 Graphics | 96–117 | 107–128 | 图形系统 |
| 6 Interface;16–19 Windows/Browsers | 26–30;118–149 | 37–41;129–160 | 开发环境 |
| 20 User Events;21 MVC | 150–174 | 161–185 | MVC 与曲线案例 |
## 阅读约定
代码使用 `:=` 表示赋值、`^` 表示方法返回,替代扫描版的箭头符号;字符串用单引号,注释用双引号。`smalltalk` 代码块可复制,但页面不执行它们。历史类名与选择子保留原样,所有平台相关操作均以原书镜像为范围。
“现代化”体现在清晰的阅读路线、可搜索文本、代码块、对照表、语义链接与练习。本文不把 1987 年的鼠标操作、字符集、进程调度或 MVC API 当作所有今天实现的共同规范。
+53
View File
@@ -0,0 +1,53 @@
# 消息与对象:理解执行模型
> 原书依据:第 1–2 章,印刷页 1–8,PDF 页 12–19。
Smalltalk 的基本动作是:向一个接收者发送消息,由接收者的类决定执行哪个方法。数字、字符串、集合、类和块都能成为接收者。程序由相互发送消息的对象组成。
## 把表达式拆成三个部分
```smalltalk
8 + 5
'hello' size
#(10 20 30) at: 2
```
| 表达式 | 接收者 | 选择子 | 参数 | 推演结果 |
| --- | --- | --- | --- | --- |
| `8 + 5` | 整数 8 | `+` | 5 | 13 |
| `'hello' size` | 字符串 | `size` | 无 | 5 |
| `#(10 20 30) at: 2` | 数组 | `at:` | 2 | 20 |
消息是请求;方法是为响应请求而执行的实现。选择子标识这次请求的名称。不同类可以实现同一个选择子,因此同一条消息能够触发不同的行为。
## 变量保存引用
```smalltalk
| first second |
first := OrderedCollection new.
second := first.
first add: 8.
second size
```
预期最后得到 1:两个变量指向同一个集合。赋值没有自动复制集合。理解引用关系,是之后理解浅复制、模型共享和对象检查器的基础。
对象的状态与它支持的消息要分开看。调用方通过协议与对象协作;读取某个内部槽位的调试能力,不等于应用程序应依赖那个槽位。
## 表达式可以继续发送消息
```smalltalk
(8 + 5) printString
```
先得到 13,再向结果发送 `printString`。与之不同,`collection add: item` 的结果不一定是集合;链式发送前必须确认方法返回值。[语法篇](/docs/source-studies/smalltalk/syntax-and-blocks)解释如何用级联表达“始终向原接收者发送”。
## 镜像为什么重要
原书描述的 virtual image 是包含对象和类的系统世界。开发时可以浏览类、编译方法、检查运行对象并继续执行。语言工具和应用共享对象体系,使重用既有类库成为日常开发方式。
这是历史系统的组织方式;不能据此推断任意镜像的持久化、发布或隔离策略。研究时要同时记录类的定义和当前镜像状态,避免把一次手工修改当成可复现的工程成果。
## 自检
为何两个对象都能接收 `size`,却不需要有相同的数据布局?因为调用方依赖消息协议,各自的类提供方法。下一篇从词法和优先级说明如何读出真正发送的消息。
@@ -0,0 +1,81 @@
# 语法与块:读懂一段 Smalltalk
> 原书依据:第 4 章,印刷页 13–20,PDF 页 24–31。赋值和返回符号按导读约定规范化。
## 先识别字面量
| 写法 | 含义 |
| --- | --- |
| `42`、`16rFF`、`2.5` | 整数、十六进制整数、浮点数 |
| `$A` | 字符 |
| `'Ada'` | 字符串 |
| `'it''s'` | 包含单引号的字符串 |
| `#size`、`#at:put:` | 符号,常用于表示选择子 |
| `#(2 4 6)` | 字面量数组 |
| `[ :x | x + 1 ]` | 接受参数的块 |
`nil`、`true`、`false`、`self`、`super` 是具有特殊语义的伪变量,不能按普通局部变量赋值。不要把字符串 `'size'` 与符号 `#size` 混用。
## 三种消息与优先级
一元消息没有参数;二元消息接受一个参数;关键词消息通过带冒号的片段标出参数位置。`at:put:` 是一个选择子。
优先级为:**括号内表达式 → 一元消息 → 二元消息 → 关键词消息**。同级按从左到右处理,二元选择子没有传统乘除优先的规则。
```smalltalk
2 + 3 * 4 "推演为 20"
2 + (3 * 4) "推演为 14"
10 raisedTo: 2 + 3 "等价于 10 raisedTo: (2 + 3)"
```
`a at: 1 put: 9` 是一条消息。两个关键词调用连续出现时,用括号明确哪一个结果作为另一个的参数。
## 句点与分号
句点分隔表达式;分号让消息继续发给同一个接收者。
```smalltalk
| values |
values := OrderedCollection new.
values add: 4; add: 9; add: 16.
values size
```
这里三次 `add:` 的接收者都是 `values`。若要在一段级联表达式末尾取得集合本身,可发送 `yourself`:
```smalltalk
OrderedCollection new
add: 4;
add: 9;
yourself
```
## 块把计算推迟
```smalltalk
| square |
square := [ :n | n * n ].
square value: 6
```
创建块不执行块体;`value:` 传入参数并求值,预期结果是 36。无参数块接收 `value`,两个参数可用 `value:value:`。
控制流也可以用消息与块组织:
```smalltalk
| count total |
count := 1.
total := 0.
[count <= 4] whileTrue: [
total := total + count.
count := count + 1].
total
```
推演结果为 10。条件块每轮重新求值;把条件提前算成单个布尔对象,会失去更新后的判断。`ifTrue:ifFalse:` 则把两段待执行的分支交给布尔对象选择。
## 返回的边界
块通常返回最后一个表达式的值。方法若没有 `^` 显式返回,则默认返回接收者。块中的 `^` 涉及从其所属方法返回,不能简单理解成普通函数局部 return。本文示例避免把含非局部返回的块保存到方法退出之后;需要这样的用法时,应核对目标镜像的块实现。
练习:`3 + 4 factorial` 先执行哪条消息?先向 4 发送 `factorial`,再向 3 发送 `+`;按数学结果推演为 27。
@@ -0,0 +1,76 @@
# 类、方法与元类:行为放在哪里
> 原书依据:第 3 章和第 5 章,印刷页 9–12、21–25,PDF 页 20–23、32–36。
## 状态的可见范围
| 名称 | 用途 | 阅读时应问 |
| --- | --- | --- |
| 实例变量 | 每个实例自己的状态槽位 | 是否继承自父类? |
| 类变量 | 由类及相关子类共享的绑定 | 是否存在跨实例影响? |
| 全局变量 | 经系统字典访问的绑定 | 是否形成隐含依赖? |
| 池变量 | 多个类共享的变量集合 | 类定义引用了哪个池? |
| 参数、临时变量 | 一次方法或块计算的局部名称 | 生命周期与可赋值规则是什么? |
原书第 5 章明确限制对方法参数再赋值。本教程沿用不修改参数的写法,不把其他实现的语法扩展套回原书。
## 用一个小类串起语法
以下为本文编写的历史风格定义。类定义在 Browser 或相应定义工具中提交;后续方法分别安装在实例侧,不是把整段当作 Workspace 表达式执行。
```smalltalk
Object subclass: #StudyCounter
instanceVariableNames: 'count'
classVariableNames: ''
poolDictionaries: ''
category: 'Study-Examples'
```
实例侧方法:
```smalltalk
initialize
count := 0
```
```smalltalk
increment
count := count + 1
```
```smalltalk
value
^count
```
工作区中的使用示意:
```smalltalk
| counter |
counter := StudyCounter new.
counter initialize.
counter increment.
counter value
```
这里显式初始化,不依赖 `new` 是否自动发送 `initialize`。这些安装步骤和类定义消息需要在目标镜像核对。`increment` 没有显式返回,所以返回 `counter`;`value` 返回槽位保存的数值。
## 方法查找
普通消息从接收者的类开始找选择子,找不到就沿父类向上查找。原书的根类为 `Object`。整个链中没有对应方法时,进入 `doesNotUnderstand:` 协议。
重写方法只改变行为的选择,不把接收者换成父类对象。`self` 始终指向当前接收者。
## super 改变查找起点
假设 B 继承 A,C 继承 B;方法 `describe` 定义在 B 中。如果该方法发送 `super name`,查找从 A 开始,即便当前接收者是 C 的实例。若发送 `self name`,查找从接收者实际的类 C 开始。
因此 `super` 不是“父对象”。它保留同一接收者,按方法定义位置确定查找起点。
## 实例侧与类侧
`StudyCounter new` 的接收者是类对象;`counter increment` 的接收者是它的实例。类自身也是对象,类侧方法由元类组织。
读类侧构造方法时,要检查它究竟分配实例、初始化状态还是返回缓存对象。`new` 只是发给类对象的消息,不能把它视为所有类都必须遵循的固定语法。
原书的 primitive 方法把部分操作交给虚拟机。追踪执行路径时,需区分 Smalltalk 方法体与 VM 提供的原语;本教程没有验证任何 VM 的原语源码。
@@ -0,0 +1,51 @@
# 对象协议:身份、复制与依赖
> 原书依据:第 7 章,印刷页 31–39,PDF 页 42–50。
`Object` 提供许多基础协议。阅读子类时,既要看它新增了什么,也要看它重写了什么。
## 身份与相等
`==` 判断是否为同一对象;`=` 表达由类定义的相等关系。两个内容相同的集合可以是两个不同对象。修改其中一个是否影响另一个,还取决于它们内部引用是否共享。
`class` 返回所属类。`isMemberOf:` 针对确切的类;`isKindOf:` 包含继承关系。检查 `nil` 通常使用 `isNil` 或 `notNil`。面向协议设计时,不必为了发送每条消息都先做具体类判断。
## 浅复制复制的是哪一层
```text
原容器 ──→ 可变子对象
副本 ──→ 同一个可变子对象
```
浅复制产生新的外层对象,内部引用仍可指向相同子对象。给副本的某个槽位重新赋值,与修改该槽位所指子对象,是两种不同操作:前者改变副本自己的引用,后者可能被原对象观察到。
原书还讨论 `deepCopy` 和可被子类重写的 `copy`。深复制不应简单等同于“任意对象图都可以安全递归复制”:循环、共享关系和外部资源需要实现策略。本文没有对这些情况做运行验证。
## 表示与动态发送
| 消息 | 主要意图 |
| --- | --- |
| `printString` | 得到便于人阅读的表示 |
| `storeString` | 得到用于重建对象的源文本表示 |
| `perform:` | 用符号指定要发送的消息 |
| `perform:with:` | 动态发送带一个参数的消息 |
可读表示不等于持久化格式。动态发送也不是解析任意源代码:`perform:` 选择一个消息,而编译器求值会解释完整表达式。
## 用依赖通知连接对象
原书的依赖协议包含 `addDependent:`、`removeDependent:`、`changed:` 和 `update:`。模型改变后通知依赖者,让视图自行读取需要显示的状态。
```text
视图注册到模型
↓
模型状态修改 → changed: 某方面
↓
依赖者收到 update: → 重新读取模型 → 更新显示
```
通知描述“需要更新”,并不天然携带完整的新状态。实现时要明确通知粒度、订阅解除和是否可能形成递归更新。原书的键盘互斥示例说明对象之间可以靠依赖关系协调状态;最后的 MVC 案例继续使用这套机制。
## 阅读检查点
对一个复制操作,画出复制前后的引用箭头;对一次通知,列出谁订阅、谁修改、谁通知、谁重绘。这两张简图往往比逐个记忆方法名更能暴露误解。
+44
View File
@@ -0,0 +1,44 @@
# 类的架构与反射:系统怎样描述自己
> 原书依据:第 8 章,印刷页 40–52,PDF 页 51–63;结合第 3 章元类介绍。
类既组织实例行为,又作为对象接受消息。把“谁是谁的实例”与“谁继承谁”分成两条关系,才能读懂元类。
## 三个层次的责任
| 类 | 原书讨论的主要责任 |
| --- | --- |
| `Behavior` | 方法字典、实例创建和类层级操作 |
| `ClassDescription` | 变量名、分类、源码组织与编译相关描述 |
| `Class` | 表示通常使用的类对象 |
| `Metaclass` | 表示类对象所对应的元类 |
`Class` 和 `Metaclass` 都属于 `ClassDescription` 的子类体系。对于具体类对象,可以用 `class` 访问其元类;实例侧与类侧的方法分别组织在相应行为对象中。
原书元类部分文字较简略。不能据此把所有具体元类都画成直接继承 `Class` 的平面结构;具体元类的父类关系应在目标镜像中检查。
## 研究一次消息查找
```smalltalk
Integer superclass
Number subclasses
Number allSubclasses
```
这是向类对象发消息,查询系统结构。阅读结果时区分“直接子类”和“全部后代”;枚举顺序不应成为应用逻辑依赖。
方法字典把选择子映射到方法。查找协议从当前类的字典开始,再沿 superclass 关系继续。Browser 的实现者查询、类层级浏览和方法安装,都建立在这类可访问的描述结构上。
## 编译是系统服务
原书把方法编译、分类管理、变量名访问和类的文件导出放进类描述协议。由此可以理解:Browser 中接受一段方法文本,是向运行中的系统安装行为。
应分别记录:源文本、编译后方法、当前类结构,以及镜像中的对象状态。只导出源文本,并不一定包含恢复某个实验状态所需的全部数据。
## 多重继承的边界
第 8 章最后讨论多重继承。阅读时将“讨论的组织方案”与前面实际使用的单一父类查找链分开,不能因为书中出现这一节就宣称标准 Smalltalk-80 类定义普遍支持多重继承。
## 可复现的探索记录
在镜像中选择一个类,记录其父类、实例变量、实例侧选择子与类侧选择子;再选择一个继承而来的方法,注明实际定义类。这个小表可以验证你是否把类对象、实例和元类混在了一起。本文只给出检查路线,尚未在镜像执行。
@@ -0,0 +1,58 @@
# 基础类库:数值、集合与流
> 原书依据:第 9–12 章,印刷页 53–90,PDF 页 64–101。
这些章节适合按“要保存什么、如何比较、如何遍历”阅读。具体消息是否存在仍以书中 Version 2 镜像为范围。
## 有序值与数值
`Magnitude` 抽象可比较对象;原书讨论其下的 `Date`、`Time`、`Character` 与数值体系。日期和时间章节的构造协议具有历史性,不能直接当作时区或国际化指南。字符章节基于当时的有限字符集合,不能扩展成 Unicode 结论。
`Number` 的主要子类包含 `Integer`、`Fraction` 和 `Float`。整数层级还区分小整数与大整数。算术消息的结果可以由不同数值类表示,不能仅根据左操作数认定返回类型。
```smalltalk
1 / 3
7 // 2
7 \\ 2
```
在原书数值模型中,第一条可以表示精确分数,后两条分别体现整除和余数协议。这里的余数选择子写作两个反斜杠;使用其他方言时务必核对拼写和负数规则。浮点计算则要区分显示值和实际精度。
## 选择集合
| 集合 | 关注点 | 典型选择理由 |
| --- | --- | --- |
| `Array` | 固定长度、按位置访问 | 已知元素数量 |
| `OrderedCollection` | 保留顺序、可增删 | 动态列表 |
| `SortedCollection` | 根据排序关系组织 | 持续维护顺序 |
| `Set` | 去重 | 关心是否出现 |
| `Bag` | 保留重复次数 | 计数、频次 |
| `Dictionary` | 键到值的映射 | 命名索引 |
| `IdentityDictionary` | 以身份区分键 | 相等值仍需视为不同键 |
| `Interval` | 规则数列 | 数字范围遍历 |
| `LinkedList` | 链式组织 | 研究链节点协议 |
有索引不代表所有集合都使用相同索引语义;数组和序列类的常见索引从 1 开始。
## 四种遍历意图
```smalltalk
#(2 3 4) do: [ :n | n squared ].
#(2 3 4) collect: [ :n | n squared ].
#(2 3 4) select: [ :n | n > 2 ].
#(2 3 4) inject: 0 into: [ :sum :n | sum + n ]
```
`do:` 强调逐个执行,不收集块结果;`collect:` 映射结果;`select:` 保留满足条件的元素;`inject:into:` 累积一个值。依次推演,后三条分别表达平方序列、筛出 3 和 4、求和 9。结果容器类型取决于接收者协议,不能一概写为 Array。
`add:` 的返回值可能是加入的元素;对 Dictionary,`at:put:` 表示设置键值;对固定数组则是替换槽位。共享选择子并不抹平各类的约束。
## 流把位置与内容分开
`ReadStream`、`WriteStream` 和 `ReadWriteStream` 在底层集合之上维护读取或写入位置。`next`、`nextPut:`、`atEnd` 表达逐项读、逐项写和结束判断。`contents` 用于取得流的内容,`position` 与 `reset` 处理位置。
文件流把同一思路扩展到外部文件;原书还介绍 `FileDirectory`。不要把内存流的生命周期直接套给文件:外部资源需关闭,并明确失败与部分写入的处理方式。本文没有运行文件写入示例。
## 练习
对“保留输入顺序并允许重复”“按名称找对象”“统计同一值出现几次”,依次考虑 OrderedCollection、Dictionary、Bag。再问一层:键相等采用什么语义,修改键会不会破坏查找?带着这些问题去浏览实际类的方法,能比背类名得到更多信息。
+35
View File
@@ -0,0 +1,35 @@
# 进程与同步:协作执行的对象
> 原书依据:第 13 章,印刷页 91–95,PDF 页 102–106。
原书的 `Process` 是 Smalltalk 镜像中的执行活动。不能把这个名字直接解释为操作系统进程,也不能据此推断多核并行。
## 四类对象的分工
| 类 | 作用 |
| --- | --- |
| `Process` | 表示可恢复、可挂起的执行活动 |
| `ProcessorScheduler` | 按调度策略管理执行活动 |
| `Delay` | 表示一定时间的等待 |
| `Semaphore` | 协调活动之间的等待与信号 |
块可以作为执行活动的计算内容。是否立即运行、以什么优先级运行,要看创建和启动协议;不要把“创建 Process”和“已经执行完成”混为一谈。
## 等待不是空转
Delay 表达经过一段时间后再继续。Semaphore 的 `wait` 与 `signal` 表达同步关系。等待活动暂停后,其他可运行活动可以继续推进;反复检查共享变量的循环则可能消耗执行时间。
```text
消费者:等待信号 → 检查共享状态 → 取出结果
生产者:准备结果 → 更新共享状态 → 发出信号
```
这是一张概念顺序图,不是可直接运行的队列实现。仅有信号量不代表共享集合访问自动安全,还要定义互斥、空队列、重复信号和退出条件。
## 阅读调度代码的顺序
先找创建与启动位置,再找可能挂起的位置,最后沿恢复路径检查共享状态。重点记录“此处继续执行时,其他活动可能改过什么”。原书的优先级说明属于该系统调度模型,不是跨实现的性能保证。
## 思考题
如果发送信号后才写入结果,消费者恢复时能否看见完整状态?这取决于调度与同步保证;设计时应先完成状态转换,再通过约定的同步协议通知。研究时也要核对目标 VM 的具体行为。本教程未运行并发或调度测试。
+49
View File
@@ -0,0 +1,49 @@
# 图形系统:坐标、位图与绘制
> 原书依据:第 14–15 章,印刷页 96–117,PDF 页 107–128。
图形对象不是外接的独立语言。坐标、矩形、位图、光标和绘图动作都通过消息协议组织。
## Point 与 Rectangle
```smalltalk
12 @ 18
(12 @ 18) x
(12 @ 18) y
```
`@` 是向数字发送的二元消息,产生一个 Point。后两条分别取 x 与 y。因为 `@` 和 `+` 同为二元消息,混用时最好加括号。
Rectangle 表示矩形区域。阅读构造调用时要分清传入的是角点还是尺寸;阅读几何操作时要区分包含、相交、平移和缩放。边界点是否包含应核对具体方法,不能只凭图形直觉。
## 坐标系必须写在图旁
原书图形环境的屏幕坐标通常从左上向右下增加;数学曲线常要求 y 轴向上。因此绘制之前要说明对象坐标与显示坐标之间的转换。
```text
模型坐标 → 视图变换 → 显示坐标 → 裁剪 → 像素绘制
```
相同点在不同视图中可以对应不同屏幕位置。移动视口时只改变显示映射,不应顺便改变领域模型中的坐标。
## 从存储到绘制
| 对象 | 阅读重点 |
| --- | --- |
| `Bitmap` | 像素位信息的底层存储 |
| `DisplayObject` | 可显示对象的公共概念 |
| `DisplayText` | 文本的图形表示 |
| `Form` | 位图图像、尺寸与显示属性 |
| `Cursor` | 光标图形 |
| `DisplayScreen` | 屏幕显示对象 |
| `Path` | 图形路径 |
| `BitBlt` | 源区域到目标区域的位图传输与组合 |
| `Pen` | 以位置和移动描述绘图 |
研究 BitBlt 时记录源、目标、传输区域、裁剪范围和组合规则。它涉及像素组合,不只是语言层面的对象复制。Form 的副本若共享底层位图,修改像素仍可能影响原图;这与对象协议篇的浅复制问题相连。
## 曲线绘制的最小思路
把函数保存为块,对一系列 x 求 y,转换成显示点,再用线段连接。采样步长越大,细节越容易丢失。固定采样不是精度保证;异常值、坐标越界和不连续曲线都需要额外策略。
这是对原书曲线案例的阅读提示,不是新增的绘图运行时。下一篇先介绍如何借助系统工具观察这些对象,再进入 MVC 的连接过程。
@@ -0,0 +1,47 @@
# 开发环境:浏览、检查与调试
> 原书依据:第 6 章、第 16–19 章,印刷页 26–30、118–149,PDF 页 37–41、129–160。
原书使用三键鼠标与特定窗口菜单。现代阅读时,保留动作的目的:求值、查找行为、检查对象、定位调用现场。具体菜单位置和快捷键以使用的镜像为准。
## 从工作区开始
Workspace 是编辑和求值表达式的空间。原书区分执行选中文本的 `do it` 与执行后显示返回值的 `print it`。检查器则让你观察得到的对象。
```smalltalk
OrderedCollection new inspect
```
这段表达式会请求打开对象检查器;它不是网页中的交互按钮。运行前应准备具有相应 GUI 工具的镜像。
## Browser 看行为,Inspector 看状态
| 工具 | 主要问题 | 需要记录 |
| --- | --- | --- |
| Browser | 方法定义在哪里? | 类侧或实例侧、协议分类、定义类 |
| Inspector | 这个对象现在引用了什么? | 对象身份、槽位、子对象 |
| Debugger | 执行为什么到这里? | 调用链、接收者、参数、临时变量 |
| 文件浏览工具 | 源码怎样导入导出? | 文件内容、导入动作与当前镜像变化 |
| Form/Bit Editor | 图形数据怎样变化? | 图像对象与像素编辑结果 |
Browser 常按类分类、类、协议、方法逐层选择。协议分类是组织方法的标签,不应与消息选择子或语言类型系统混同。
## 沿选择子阅读源码
1. 在 Browser 中找到一个方法,确认实例侧还是类侧。
2. 查看 implementors,比较相同选择子在不同类中的实现。
3. 查看 senders,找出哪些方法发送这条消息。
4. 查实例变量引用,理解状态由谁读写。
5. 对具体对象求值并 inspect,核对静态阅读与实际状态是否一致。
senders 反映可被工具识别的引用;使用 `perform:` 的动态调用可能需要另外追踪。只看到一个实现者,也不能直接推断所有调用都落到它。
## 调试的四个视角
原书 Debugger 把调用链、代码、接收者检查器和局部变量检查器放在一起。某个对象不理解消息时,先检查接收者实际是什么,再检查参数,最后追踪调用者为何给它发送这个选择子。
修改运行系统中的方法可能影响其他窗口。为了复现,单独记录实验类、方法文本、镜像版本和预期结果,不把手工修复后的镜像当作原始系统状态。
## 一个建议实验
创建本教程的 StudyCounter,求值并 inspect;调用 increment 后再看 count;随后在 Browser 中查 value 的实现。实验将“表达式结果、对象状态、方法定义”连成一条路线。此实验尚未在本次任务执行。
+61
View File
@@ -0,0 +1,61 @@
# MVC 与曲线案例:连接数据和界面
> 原书依据:第 20–21 章,印刷页 150–174,PDF 页 161–185。曲线应用位于印刷页 167–174。
Smalltalk-80 的 MVC 是桌面交互对象之间的协作。不要直接把 View、Controller 与 Web 请求处理器或某个现代框架组件一一等同。
## 输入与职责
原书先介绍 `InputState` 与 `InputSensor`,再讨论 View、Controller 和 ControlManager。输入状态、输入读取和交互控制是相邻但不同的责任。
| 角色 | 保存或处理什么 | 对曲线应用的意义 |
| --- | --- | --- |
| Model | 应用数据与状态转换 | 曲线文本列表及当前选择 |
| View | 读取模型并显示,管理视图几何 | 列表显示、曲线图形 |
| Controller | 输入处理与操作协调 | 选择、菜单、编辑动作 |
| ControlManager | 活动控制器的管理 | 协调窗口交互 |
一个模型可以有多个视图。视图和控制器组成显示与交互的配对关系;模型不需要直接包含像素绘制代码。
## window 与 viewport
原书的 View 既有自身坐标范围,也有放到上层视图中的区域。曲线区域将数学坐标映射到窗口子区域,以便 y 轴向上,而屏幕坐标保持其约定。
调试错误显示时,先核对数据,再核对 window、viewport 和显示变换。模型数值正确不等于变换正确。
## 曲线案例的对象结构
原书以 `CurveList` 继承 `OrderedCollection`,增加当前曲线选择;以 `CurveListView` 继承 `View`,重定义绘制行为。列表视图复用 SelectionInListView,并用选择子告诉它如何访问列表、读取选择、改变选择和取得菜单。
```text
窗口 StandardSystemView
├─ 列表子视图 ──读写──→ CurveList
└─ 曲线子视图 ──读取──→ 同一个 CurveList
│
状态变化通知
↓
更新依赖视图
```
类名在扫描 OCR 中存在大小写混淆,本文按语义统一写作 CurveList 和 CurveListView;安装原版代码前应以页面图像与镜像类名复核。
## 追踪一次选择
1. 用户在列表中选择一条曲线。
2. 交互对象通过配置的选择子更新模型的当前选择。
3. 模型发送改变通知。
4. 依赖视图接收更新并重新读取模型。
5. 曲线视图清理绘制区域,将选择的文本求值为块。
6. 对采样点执行块,通过显示变换绘出折线。
这里“文本 → 块”是编译求值,不是普通数据解析。原书在可信镜像中演示原型编程;把这一机制用于接收外部输入的服务,需要另行设计输入语言与隔离策略。本文页面不执行用户代码。
## 增删改也是模型转换
添加曲线会收集文本、追加列表、重置选择并通知;删除会移除当前项、清空选择并通知;修改会替换列表中的相应文本,再使显示更新。无选择时的菜单与有选择时不同。
这说明通知应该位于状态转换之后,让所有视图看到一致状态。曲线文本、当前选择与显示结果应作为三个不同层次检查。
## 迁移设计思想
可以借鉴的组织方式是:将领域状态集中在模型,让输入动作调用明确的状态转换,由订阅者负责刷新显示。原书具体的窗口类、编译器调用和采样算法仍属于历史实现。本教程没有复原完整 GUI 程序或声称它已在当代实现中运行。
+68
View File
@@ -0,0 +1,68 @@
# 术语、练习与原书对照
> 来源范围:全书主要章节;各主题的精确印刷页与 PDF 页见[总览](/docs/source-studies/smalltalk/overview)。本篇练习和术语释义为整理者编写。
## 术语速查
| 原词 | 本文译法 | 区分要点 |
| --- | --- | --- |
| object | 对象 | 有身份、状态和行为的实体 |
| receiver | 接收者 | 本次消息发给谁 |
| message | 消息 | 对接收者的行为请求 |
| selector | 选择子 | 消息的名称,如 at:put: |
| method | 方法 | 某类提供的响应实现 |
| class / instance | 类 / 实例 | 行为组织与由其描述的对象 |
| metaclass | 元类 | 类对象所属的类 |
| protocol | 协议 | 一组协作消息;Browser 中也用于分类 |
| block | 块 | 延迟求值的计算对象 |
| cascade | 级联 | 以分号向同一接收者继续发送 |
| primitive | 原语 | 由虚拟机支持的底层操作 |
| identity / equality | 身份 / 相等 | 同一对象与值意义上的相等 |
| shallow copy | 浅复制 | 复制外层但可能共享内部对象 |
| dependent | 依赖者 | 注册后接收模型变化通知的对象 |
| image | 镜像 | 保存并运行对象系统的状态载体 |
| workspace | 工作区 | 编辑与求值表达式的工具 |
| browser | 类浏览器 | 查看、编辑类与方法的工具 |
| inspector | 对象检查器 | 查看具体对象状态的工具 |
| window / viewport | 坐标窗口 / 视口 | 自身坐标范围与显示映射区域 |
## 预测结果
以下是语义练习,答案为推演,未运行。
| 问题 | 答案与原因 |
| --- | --- |
| `2 + 3 * 4` | 20,二元消息从左到右 |
| `2 + (3 * 4)` | 14,括号改变次序 |
| `[ :x | x + 2 ] value: 5` | 7,value: 触发块求值 |
| 方法只有 `count := 9` 时返回什么? | 接收者,方法无显式返回 |
| B 中的方法对 C 实例发送 super 消息,从哪查找? | 从 B 的父类开始,接收者仍是 C 实例 |
| 浅复制后替换副本某个槽位,是否替换原件槽位? | 不会;修改共享子对象才可能双方可见 |
| do: 能否代替 collect: 收集块结果? | 不能直接代替,两者协议目的不同 |
| 给模型发送 changed: 是否自动修改模型数据? | 不应这样理解;先完成修改,再通知依赖者 |
## 三次源码阅读练习
**消息路线**:选择一个集合的 `size`,找实际定义类,再查看一个发送者;记录“接收者类 → 继承链 → 方法”。
**状态路线**:创建两个指向同一集合的变量,画引用图;再复制外层容器,比较替换槽位与修改子对象的差别。
**界面路线**:对原书曲线案例画出选择、修改模型、通知、重绘与显示变换,注明每一步所在对象。
完成实验时另记镜像名称、版本、源代码、实际输出和差异。本次任务只完成文档整理,没有运行这些实验。
## 扫描校勘与适用边界
| 扫描问题 | 本文处理 |
| --- | --- |
| 箭头被识别成 `<-`、字母或感叹号 | 赋值统一为 :=,返回统一为 ^ |
| Smalltalk-80 被识别成 Smalltalk-SO | 依据书名与语境规范化 |
| 选择子被拆开、类名大小写混淆 | 行文合并;具体 API 安装前再核对原页 |
| 第 4 章个别科学计数法示例数位不一致 | 不沿用异常数值作为例题 |
| 后部 GUI 源码嵌在截图中 | 解释调用结构,不将 OCR 文本冒充可运行源码 |
原书是学习 Smalltalk-80 系统的资料,不是本文对所有 Smalltalk 方言兼容性的承诺。全文以语义重述和新增短例组织;没有把原始扫描件、OCR 全文或本机下载路径发布到网站。
## 后续核验清单
准备目标镜像后,可分别验证类定义消息、初始化约定、块返回边界、数值除法、集合返回类型、信号量时序,以及 MVC 选择子与坐标变换。核验结果应与本文的语义推演分别记录,避免把“读过”写成“运行通过”。
+433 -71
View File
@@ -1,5 +1,5 @@
{
"version": "2026-10-30-depth-3",
"version": "2026-10-30-depth-4",
"asOf": "2026-10-30",
"scope": "全球公开资料研究:保留首批个案,并扩展核查2025—2026八个YC批次候选池;成立年份以官方公司页面字段为依据。",
"limitations": [
@@ -15803,32 +15803,36 @@
"id": "YC31259",
"name": "Tsenta",
"url": "https://www.ycombinator.com/companies/tsenta",
"cat": "C07",
"cat": "C09",
"year": 2026,
"team": 2,
"location": "San Francisco",
"business": "公司简介:AI career agent that finds matching jobs & applies on your behalf",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "为求职者匹配岗位、改写材料并自动提交申请。",
"buyer": "求职者",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "自述三个月达到约300万Annualized,但未明示该指标定义、币种代码或日历截止日,不补成ARR。9万多求职者不等于付费客户。",
"cohort": "2026年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"price": "Starter每月19起(原文$,币种待核);按申请额度分档",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-31259"
"YC-E-31259",
"DEPTH-FLOW-TSENTA-SITE"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "目录标签的规则初分",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:为求职者匹配岗位、改写材料并自动提交申请。 按主要买家与交付任务归类。",
"directoryTags": [
"Marketplace",
"Consumer",
"Recruiting",
"HR Tech",
"AI"
]
],
"directoryOrigin": "yc-2025-2026",
"businessModel": "按申请额度分档收费的个人应用,支持免费起步",
"pricingEvidence": "DEPTH-FLOW-TSENTA-SITE"
},
{
"id": "YC31260",
@@ -18089,22 +18093,26 @@
"year": 2025,
"team": 4,
"location": "San Francisco",
"business": "公司简介:AI-native CRO for clinical trial operations",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "提供临床试验数据软件,并扩展为全流程合同研究服务。",
"buyer": "医疗器械、生物医药公司及试验申办方",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "未来十二个月18.7万软件合同收入、发布帖月软件收入1.56万及三年193万CRO合同分别保存;服务总合同额不充当ARR。",
"cohort": "2025年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"price": "商业研究每月2000起(原文$,币种待核);企业量价,学术档免费",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-31445"
"YC-E-31445",
"DEPTH-FLOW-HARBOR-SITE"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "主营简介的规则初分",
"directoryTags": []
"revenueStatus": "self",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:提供临床试验数据软件,并扩展为全流程合同研究服务。 按主要买家与交付任务归类。",
"directoryTags": [],
"directoryOrigin": "yc-2025-2026",
"businessModel": "按研究付费的软件与多年CRO服务,分别核算",
"pricingEvidence": "DEPTH-FLOW-HARBOR-SITE"
},
{
"id": "YC31447",
@@ -20438,28 +20446,30 @@
"year": 2026,
"team": 4,
"location": "San Francisco",
"business": "公司简介:Autonomous AI defense system for cyber attack",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "提供漏洞发现、代码监控、根因分析及补丁生成安全Agent。",
"buyer": "需要代码和系统安全审查的企业",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "40万漏洞奖金在团队与VEGA表述中并存,获奖主体、时期和公司归属待核;奖金不作ARR,排名和漏洞能力尚未独立复核。",
"cohort": "2026年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-32138"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "主营简介的规则初分",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:提供漏洞发现、代码监控、根因分析及补丁生成安全Agent。 按主要买家与交付任务归类。",
"directoryTags": [
"B2B",
"Security",
"Cybersecurity",
"Enterprise",
"AI"
]
],
"directoryOrigin": "yc-2025-2026",
"businessModel": "安全Agent与审计服务;价格及经常性收费未知"
},
{
"id": "YC32154",
@@ -20764,25 +20774,38 @@
"year": 2026,
"team": 1,
"location": "San Francisco",
"business": "公司简介:High performance coding agents",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "提供支持多Agent并行工作的Rust编程Agent运行工具。",
"buyer": "软件开发者与工程团队",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "每月100万是推理支出吞吐,不是公司MRR;YC星数自述和代码可访问不证明付费收入或性能领先。",
"cohort": "2026年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-32172"
"YC-E-32172",
"DEPTH-FLOW-JCODE-SITE",
"DEPTH-FLOW-JCODE-CODE"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "主营简介的规则初分",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:提供支持多Agent并行工作的Rust编程Agent运行工具。 按主要买家与交付任务归类。",
"directoryTags": [
"Developer Tools",
"AI"
]
],
"directoryOrigin": "yc-2025-2026",
"businessModel": "开源编程工具与商业产品;平台自有收入未知",
"technicalReview": {
"level": "public-artifact",
"reviewedAt": "2026-10-30",
"summary": "官方工具与公开Rust代码可访问;已读厂商性能表和版本说明,但未复测,不视为第三方能力排名。",
"evidenceIds": [
"DEPTH-FLOW-JCODE-SITE",
"DEPTH-FLOW-JCODE-CODE"
]
}
},
{
"id": "YC32187",
@@ -22531,28 +22554,30 @@
"year": 2025,
"team": 3,
"location": "San Francisco",
"business": "公司简介:The social trading app for stocks, memes, and perps",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "提供股票、加密资产和永续合约交易及自动策略终端。",
"buyer": "个人交易者",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "累计13.5亿和月4.35亿为交易量,不是收入;AI角色主要来自目录标签,正文未具体说明。",
"cohort": "2025年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-32749"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "目录标签的规则初分",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:提供股票、加密资产和永续合约交易及自动策略终端。 按主要买家与交付任务归类。",
"directoryTags": [
"Fintech",
"Crypto / Web3",
"Investing",
"Trading",
"AI"
]
],
"directoryOrigin": "yc-2025-2026",
"businessModel": "交易平台;费率、平台抽成和净收入未确认"
},
{
"id": "YC32750",
@@ -22882,31 +22907,34 @@
"id": "YC32981",
"name": "Marengo",
"url": "https://www.ycombinator.com/companies/marengo",
"cat": "C02",
"cat": "C07",
"year": 2026,
"team": 2,
"location": "San Francisco",
"business": "公司简介:AI-Native Engineering Firm designing Data Centers",
"buyer": "本轮未逐一核验",
"delivery": "公开YC公司资料;交付与付费使用待核验",
"notes": "目录基础资料;AI相关描述与业务分类均待进一步人工复核。收入、定价和技术能力未逐一核验。",
"business": "用内部AI工具和专业工程师交付数据中心选址及许可设计。",
"buyer": "数据中心开发商、neocloud与大型云运营商",
"delivery": "已读公司自述;实际交付、合同和财务尚未独立验证。",
"notes": "首月7万收入与400万待交付合同分项保存;未明确经常性,不年化首月收入为ARR。团队履历和投资方AUM排除。",
"cohort": "2026年成立",
"teamBasis": "YC官方页面Team Size;2026-10-30访问快照,业务截至日未注明",
"price": "本轮未逐一核验",
"stage": "目录公开,商业成熟度待核验",
"stage": "有公开业务及量化声明;收入可用性见核查",
"sourceType": "YC官方页面中的公司自述",
"evidenceIds": [
"YC-E-32981"
"YC-E-32981",
"DEPTH-FLOW-MARENGO-SITE"
],
"revenueStatus": "unknown",
"profileOnly": true,
"classificationBasis": "主营简介的规则初分",
"revenueStatus": "self",
"profileOnly": false,
"classificationBasis": "2026-10-30人工复核YC官方业务介绍:用内部AI工具和专业工程师交付数据中心选址及许可设计。 按主要买家与交付任务归类。",
"directoryTags": [
"Construction",
"Design",
"Energy",
"AI"
]
],
"directoryOrigin": "yc-2025-2026",
"businessModel": "AI辅助工程服务;交付设计成果,不按算力销售归类"
},
{
"id": "YC32985",
@@ -31349,6 +31377,201 @@
"reason": "未给合同期限、确认进度或经常性定义,不视为已实现收入或ARR",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31259-annualized",
"company": "YC31259",
"name": "Tsenta",
"kind": "原文Annualized,指标定义未明",
"value": 3000000,
"unit": "原文$,币种待核",
"timing": "三个月内,日历截止日未知;2026-10-30读取",
"evidence": "YC-E-31259",
"scope": "公司声明,收入定义待核",
"selection": "excluded",
"reason": "不能仅凭Annualized补成ARR;未列日历截止日及经常性定义",
"bound": "≈",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31259-users",
"company": "YC31259",
"name": "Tsenta",
"kind": "公司自述求职者规模",
"value": 90000,
"unit": "名求职者",
"timing": "日历截止日未知;2026-10-30读取",
"evidence": "YC-E-31259",
"scope": "使用者",
"selection": "adoption",
"reason": "不等于付费客户或留存用户;发布帖较小采用数不充当同日冲突",
"bound": ">",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31445-softwarecontract",
"company": "YC31445",
"name": "Harbor",
"kind": "未来十二个月软件合同收入",
"value": 187000,
"unit": "原文$,币种待核",
"timing": "合同覆盖随后十二个月,起算日未知;2026-10-30读取",
"evidence": "YC-E-31445",
"scope": "软件业务合同",
"selection": "excluded",
"reason": "未来合同额不等于已实现收入;不默认ARR",
"bound": "≈",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31445-monthly",
"company": "YC31445",
"name": "Harbor",
"kind": "发布帖月软件收入",
"value": 15600,
"unit": "原文$,币种待核",
"timing": "发布帖未给日历业务截止日;2026-10-30读取",
"evidence": "YC-E-31445",
"scope": "软件业务",
"selection": "historical",
"reason": "未明确MRR定义与截止日,不直接乘12为ARR;与18.7万软件合同可能重叠不相加",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31445-cro",
"company": "YC31445",
"name": "Harbor",
"kind": "三年CRO服务合同总额",
"value": 1930000,
"unit": "原文$,币种待核",
"timing": "合同覆盖三年,起算日未知;2026-10-30读取",
"evidence": "YC-E-31445",
"scope": "全流程临床试验服务",
"selection": "excluded",
"reason": "多年服务交付合同,不平均摊成ARR,也不与软件合同重复确认",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-31445-trials",
"company": "YC31445",
"name": "Harbor",
"kind": "软件支持试验数",
"value": 7,
"unit": "项试验",
"timing": "日历截止日未知;2026-10-30读取",
"evidence": "YC-E-31445",
"scope": "软件业务",
"selection": "adoption",
"reason": "试验数不等于独立付费客户数",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32981-firstmonth",
"company": "YC32981",
"name": "Marengo",
"kind": "公司自述首月收入",
"value": 70000,
"unit": "原文$,币种待核",
"timing": "首月,日历月份未知;2026-10-30读取",
"evidence": "YC-E-32981",
"scope": "工程服务公司",
"selection": "historical",
"reason": "单月工程服务收入,不是MRR;不自动乘12",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32981-backlog",
"company": "YC32981",
"name": "Marengo",
"kind": "待交付合同总额",
"value": 4000000,
"unit": "原文$,币种待核",
"timing": "日历截止日未知;2026-10-30读取",
"evidence": "YC-E-32981",
"scope": "工程服务待交付合同",
"selection": "excluded",
"reason": "合同周期、里程碑、取消条款及收入确认进度未知",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32749-totalvolume",
"company": "YC32749",
"name": "Arbital",
"kind": "累计交易量",
"value": 1350000000,
"unit": "原文$,币种待核",
"timing": "前七个月,日历截止日未知;2026-10-30读取",
"evidence": "YC-E-32749",
"scope": "客户交易",
"selection": "excluded",
"reason": "交易量不等于公司收入;没有费率不能反推佣金",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32749-monthvolume",
"company": "YC32749",
"name": "Arbital",
"kind": "月交易量",
"value": 435000000,
"unit": "原文$,币种待核",
"timing": "日历月份未知;2026-10-30读取",
"evidence": "YC-E-32749",
"scope": "客户交易",
"selection": "excluded",
"reason": "原文月度交易量,不是MRR;交易量可包含重复换手",
"bound": "≈",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32749-traders",
"company": "YC32749",
"name": "Arbital",
"kind": "公司自述交易者",
"value": 2700,
"unit": "名交易者",
"timing": "前七个月,日历截止日未知;2026-10-30读取",
"evidence": "YC-E-32749",
"scope": "交易者",
"selection": "adoption",
"reason": "不是付费订阅人数,不能与交易量直接反推收入",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32172-spend",
"company": "YC32172",
"name": "Jcode",
"kind": "每月推理支出吞吐",
"value": 1000000,
"unit": "原文$,币种待核",
"timing": "日历月份未知;2026-10-30读取",
"evidence": "YC-E-32172",
"scope": "通过工具发生的推理支出",
"selection": "excluded",
"reason": "inference spend不是厂商收入;不按MRR或ARR统计",
"bound": "=",
"comparisonGroup": null
},
{
"id": "DEPTH-FLOW-32138-bounty",
"company": "YC32138",
"name": "NebuSec",
"kind": "漏洞奖金声明",
"value": 400000,
"unit": "原文$,币种待核",
"timing": "日历累计区间未知;2026-10-30读取",
"evidence": "YC-E-32138",
"scope": "团队或VEGA成果,归属待核",
"selection": "excluded",
"reason": "奖金不是经常性ARR;需核获奖名单、时期和收款主体,不与个人履历奖金相加",
"bound": "=",
"comparisonGroup": null
}
],
"evidence": [
@@ -38048,8 +38271,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2026年,批次为Summer 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "为求职者匹配岗位、改写材料并自动提交申请。 自述三个月达到约300万Annualized,但未明示该指标定义、币种代码或日历截止日,不补成ARR。9万多求职者不等于付费客户。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-31260",
@@ -38961,8 +39184,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2025年,批次为Spring 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "提供临床试验数据软件,并扩展为全流程合同研究服务。 未来十二个月18.7万软件合同收入、发布帖月软件收入1.56万及三年193万CRO合同分别保存;服务总合同额不充当ARR。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-31447",
@@ -39907,8 +40130,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2026年,批次为Summer 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "提供漏洞发现、代码监控、根因分析及补丁生成安全Agent。 40万漏洞奖金在团队与VEGA表述中并存,获奖主体、时期和公司归属待核;奖金不作ARR,排名和漏洞能力尚未独立复核。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-32154",
@@ -40028,8 +40251,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2026年,批次为Summer 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "提供支持多Agent并行工作的Rust编程Agent运行工具。 每月100万是推理支出吞吐,不是公司MRR;YC星数自述和代码可访问不证明付费收入或性能领先。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-32187",
@@ -40688,8 +40911,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2025年,批次为Summer 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "提供股票、加密资产和永续合约交易及自动策略终端。 累计13.5亿和月4.35亿为交易量,不是收入;AI角色主要来自目录标签,正文未具体说明。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-32750",
@@ -40820,8 +41043,8 @@
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司目录基础资料",
"summary": "页面标注成立于2026年,批次为Summer 2026。团队人数与主业务简介见公司表。",
"limitation": "成立年份、团队人数、AI标签及简介均为公司自述;页面访问日不是收入时点。规则初分尚待人工复核,未据此认定技术水平或收入。"
"summary": "用内部AI工具和专业工程师交付数据中心选址及许可设计。 首月7万收入与400万待交付合同分项保存;未明确经常性,不年化首月收入为ARR。团队履历和投资方AUM排除。",
"limitation": "公司自述,非财务审计或独立技术测试;日历截止日、币种及收入归属缺项保留。"
},
{
"id": "YC-E-32985",
@@ -43297,6 +43520,61 @@
"kind": "公司自述",
"summary": "官方隐私通知以DhiWise US Inc指代Rocket,并同时列dhiwise.com与rocket.new。",
"limitation": "仅用于公开品牌/主体联系,不据此认定所有地区法人同一成立日或收入合并范围。"
},
{
"id": "DEPTH-FLOW-TSENTA-SITE",
"companyId": "YC31259",
"title": "Tsenta官方产品与收费页",
"url": "https://tsenta.com/",
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司官方材料",
"summary": "官网展示自动申请、材料审核与跟踪功能,按申请额度分档,Starter每月19(原文$)起。",
"limitation": "2026-10-30可读页面,未试用,不据标价反推收入;页面不同章节ATS覆盖数不同。"
},
{
"id": "DEPTH-FLOW-HARBOR-SITE",
"companyId": "YC31445",
"title": "Harbor官方软件与定价页",
"url": "https://runharbor.com/",
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司官方材料",
"summary": "官网展示EDC构建、数据采集与监控;商业研究起价每月2000(原文$),学术/非营利档免费,企业按量报价。",
"limitation": "软件标价不代表已实现客单价;客户评价与合规主张未独立复核,不替代CRO服务合同。"
},
{
"id": "DEPTH-FLOW-MARENGO-SITE",
"companyId": "YC32981",
"title": "Marengo官方工程交付介绍",
"url": "https://marengox.com/",
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司官方材料",
"summary": "官网列出选址、可行性、概念设计与FEED/许可成果,称由持证工程师审核内部AI工具的输出。",
"limitation": "时间和成本改善是公司自述,未运行项目复测;网站未披露公司收入。"
},
{
"id": "DEPTH-FLOW-JCODE-SITE",
"companyId": "YC32172",
"title": "Jcode官方产品与性能说明",
"url": "https://jcode.sh/",
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司官方材料",
"summary": "官方展示Rust编程工具、内存与启动时间对比,并注明测试版本;链接开源仓库及复现材料。",
"limitation": "基准由厂商提供,未复测;不将不同测试条件下的内存倍数当作整体编码能力或财务证据。"
},
{
"id": "DEPTH-FLOW-JCODE-CODE",
"companyId": "YC32172",
"title": "Jcode公开源代码仓库",
"url": "https://github.com/1jehuang/jcode",
"publishedAt": null,
"accessedAt": "2026-10-30",
"kind": "公司官方材料",
"summary": "公开仓库可访问,包含Rust源码、测试、脚本和MIT许可证说明。",
"limitation": "仅确认公开材料可访问;未编译、运行或验证安全和性能。星数是动态采用信号,不是付费客户。"
}
],
"reviews": [
@@ -44016,6 +44294,90 @@
"companyIds": [
"YC33020"
]
},
{
"id": "DEPTH-FLOW-31259-R",
"type": "收入与业务规模边界",
"company": "Tsenta",
"summary": "自述三个月达到约300万Annualized,但未明示该指标定义、币种代码或日历截止日,不补成ARR。9万多求职者不等于付费客户。",
"evidenceIds": [
"YC-E-31259"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC31259"
]
},
{
"id": "DEPTH-FLOW-31445-R",
"type": "收入与业务规模边界",
"company": "Harbor",
"summary": "未来十二个月18.7万软件合同收入、发布帖月软件收入1.56万及三年193万CRO合同分别保存;服务总合同额不充当ARR。",
"evidenceIds": [
"YC-E-31445"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC31445"
]
},
{
"id": "DEPTH-FLOW-32981-R",
"type": "收入与业务规模边界",
"company": "Marengo",
"summary": "首月7万收入与400万待交付合同分项保存;未明确经常性,不年化首月收入为ARR。团队履历和投资方AUM排除。",
"evidenceIds": [
"YC-E-32981"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC32981"
]
},
{
"id": "DEPTH-FLOW-32749-R",
"type": "收入与业务规模边界",
"company": "Arbital",
"summary": "累计13.5亿和月4.35亿为交易量,不是收入;AI角色主要来自目录标签,正文未具体说明。",
"evidenceIds": [
"YC-E-32749"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC32749"
]
},
{
"id": "DEPTH-FLOW-32172-R",
"type": "收入与业务规模边界",
"company": "Jcode",
"summary": "每月100万是推理支出吞吐,不是公司MRR;YC星数自述和代码可访问不证明付费收入或性能领先。",
"evidenceIds": [
"YC-E-32172"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC32172"
]
},
{
"id": "DEPTH-FLOW-32138-R",
"type": "收入与业务规模边界",
"company": "NebuSec",
"summary": "40万漏洞奖金在团队与VEGA表述中并存,获奖主体、时期和公司归属待核;奖金不作ARR,排名和漏洞能力尚未独立复核。",
"evidenceIds": [
"YC-E-32138"
],
"handling": "保留声明的周期、主体和用途。交易量、推理支出、奖金、未交付合同和定义未明年化数字不纳入ARR比较;软件与人工服务分开核验。",
"scope": "companies",
"companyIds": [
"YC32138"
]
}
],
"coverage": {
+1 -1
View File
@@ -1,5 +1,5 @@
{
"sourceVersion": "2026-10-30-depth-3",
"sourceVersion": "2026-10-30-depth-4",
"asOf": "2026-10-30",
"metric": "platform-mrr-usd",
"sampleUnit": "product-or-business",
+1
View File
@@ -37,6 +37,7 @@ def render():
assert len({x['ycId'] for x in AUDIT['records']}) == len(AUDIT['records'])
lines = ['# AI 公司资料覆盖与缺项', '',
f"截至 {DATA['asOf']},研究表含{len(companies):,}条公司或产品记录。YC候选池有逐条读取审计;其他来源为定向补充。清单尚不能作为全球AI公司普查,也不能将收入未知解释为零。", '',
'验收范围已于2026-10-30确认为:以确认的公开来源清单为边界,逐条核对并标明缺项。下方区分已逐条审计的候选池与定向补充来源;已使用某来源不代表该来源已被完整覆盖。', '',
f"[分类和数据工作台]({BASE})链接原始证据,[收入样本快照](/docs/other-research/ai-company-research/income-snapshot)展示当前可计算的MRR样本。", '',
'## 候选池与公司表的关系', '',
'| 环节 | 记录数 | 含义 |', '| --- | --- | --- |',