games-development-ai/docs/agent-specs/_archive/2026-06-12-自研偏误全链审计-报告.md
zizi 7f24a344d0 docs(agent-specs): B2 归档——64 个闭线工作记录移入 _archive/,热目录顶层 90→26
承接目录治理:上轮只压缩内容未减文件数,闭线工作记录仍平铺致目录看着仍一堆(创始人指出)。本次执行 B2 归档。

64 个 ≤06-15 闭线档(25 压缩桩 + 闭线 review/report/纪要/edit-plan)git mv 入 docs/agent-specs/_archive/(文件名不变、仍 git 跟踪可查)。热目录 ≤06-15 仅留 13 活档(决策/纲领/SoT/活spike)+13 个 06-16 在飞。

活资产 20 处旧路径引用(.agents/docs/memory/_index)同步改 _archive/,引用断裂复测=0;_index 活地图 + 治理档状态收口。约束:0 个 06-16 被移、orchestrator 等未跟踪在飞档零误纳。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-16 13:26:19 +00:00

25 KiB
Raw Blame History

自研偏误(NIH/build-vs-buy)全链架构审计 · 报告(HJ-AUDIT-NIH-001)

审计主体=Fable 只读架构 agent(2026-06-12,创始人指令);主会话整理落盘。两起定罪案+一起现行案;预防规则已定稿入 .agents/rules/build-vs-buy.md。

自研偏误(NIH / build-vs-buy 失误)全链架构审计报告

仓库:/root/games-development-ai | 审计日:2026-06-12 | 全程只读


① 病理定义与根因排序(Q1)

病理定义:这不是教科书式 NIH

教科书 NIH 是"情感性排斥外来代码"。本仓反证充分:后端是 huijing 整体 fork、JSON Schema 校验用 networknt(game-cloud/.../GameConfigSchemaValidator.java:4-7)、音频合成 vendored ZzFX/ZzFXM 源码(game-runtime/src/plugins/audio-music/impl.js:10)、模型网关买 new-api、美术音乐买 mmx-cli、agentic 基建终裁 AgentScope,总原则明文"用开源生态组合替代烧钱自研"(/root/games-development-ai/.agents/knowledge/tech-decisions.md 总原则行)。【已验证】

真实病理是切面性的:凡是"agent 顺手能写出来"的层(JS 运行时、测试 harness、编排器、校验器、静态 serve),系统性滑向自研;凡是"agent 写不动、错了赔钱"的层(Java 后台、支付、审核),系统性复用。病不在偏好,在成本结构与流程闸门。【推断,证据见下】

根因排序(高→低,逐条对照卷宗)

R1【主放大器】= 候选④ AI 写码边际成本≈0,把天平结构性压向 build。

  • 843 行自研壳、5,725 行自研编排器(docs/agent-specs/2026-06-09-agent-loop-v1/orchestrator/ 实测 wc)、448 行自研 CDP 客户端、1,637 行 player_cdp.py、130 行手写 schema 校验器——全部数小时~数天等效写成;T1b-α 九件插件+协议+harness 时间盒仅"≤3 天等效"。【已验证】
  • 协议层"复用优先"只指向仓内:AGENTS.md §8-3 原文 "search skills/, knowledge/ and existing code"——检索序列里没有生态现货这一级。对 agent 而言"写出来"确实比"调研现货"更快出活,流程恰好奖励这个方向。【已验证】
  • 判定:其余根因在人类团队也存在,但会被人力成本天然刹车;agent 团队没有这道刹车,所以它是放大器之王。【推断】

R2 = 候选② 薄壳幻觉/形态终点测试缺失。

  • 第一案原始论证只估 v1:"Tier1 薄壳约 0.5–1.5 人月(可行,且必须自研以控沙箱/SDK/三容器预加载)"(tech-decisions.md:42),v2+ 成本(juice/失败态/逐模板手搓)未入账;重设计 review §1.2 验尸结论"「好玩工时」逐模板线性增长,每一分都花在重造 40 年前就成熟的轮子上"。【已验证】
  • 两案的终裁语言完全同构:引擎案"自研+微库的形态终点=亲手再造一个 LittleJS"(2026-06-11-Tier1运行时重设计-review.md §4.1-2);agentic 案"自研 agent 内核的形态终点=重造更差的框架"(2026-06-12-agentic基建框架选型-review.md 头注)。"形态终点测试"是事后才被发明的武器,事前流程里不存在。【已验证】

R3 = 候选⑥ 评审流程缺"现货尽调前置门"——口号有,闸门无。

  • grep -r "尽调" .agents/ 零命中;ai-development-protocol.md §1 步骤 4 的评审版 spec 九要素(背景/目标/非目标/推荐方案/关键权衡/影响面/风险兼容/验收标准/待确认项)无现货候选必答项;两轮评审审的是 spec 框定的问题——spec 框成"怎么建 X",评审就只审建法。实证:T1b-α 执行版过 Codex 评审"13 条全采纳",P0 全是流程类(Gate0 启动序/禁 node-canvas),没有一条问"LittleJS 自带粒子,为什么重写"。【已验证】
  • 技术决策版 ADR 表有"放弃的备选(why-not)"列——是好实践,但只覆盖"进了 ADR 表的决策";波次内新生的平台件(编排器/harness/插件库/CDP 客户端)根本不过 ADR。Doc B 自己登记过病灶:"未编目实存组件(2026-06-10 审计登记)"(技术架构与模块.md:353)。【已验证】
  • 两次纠错全部来自创始人体外动作("专门会话""复议"),不是流程产物——闸门=创始人本人,单点且晚触发(第一案晚到存量 50 款,第二案晚到 GC9 已终审冻结后次日推翻,见 commit 8509bfd→430f832)。【已验证】

R4 = 候选③ 错误约束传导——已定罪,且是活跃惯犯,不是孤例。

  • 主案:15KB 系 srcdoc 内联架构衍生约束被当产品需求传导(2026-06-11-tier1-runtime-constraints-requirements.md Problem Frame),反向锁死"只能自研"。【已验证】
  • 现行新实例三起:(a) "本机零 npm 依赖纪律"(T1b-α 执行版 §1,本质是 lane 同步纪律)→手写 JSON Schema 校验器,文件头自供"draft-07 全量校验需 ajv——违纪"(game-runtime/scripts/validate-manifest.mjs:7-10);(b) agent-loop 执行 spec"标准库优先"→ 1,637 行手写 CDP 玩家客户端(orchestrator/README.md:8-9);(c) 取证像素哈希确定性 → 受控面只给 Canvas2D → 引擎内建 WebGL 粒子被墙 → 自研粒子(QA 约束反向塑造运行时架构,无人显式裁决)。【已验证,(c) 因果链为推断】
  • 最刺眼的传导残留:AGENTS.md:54 至今仍写 "in-house lightweight Canvas Runtime (<15KB, Tier1)"——红线废除、引擎终裁均已落锤,但全仓单一事实源入口文档仍在向每个新 agent 会话传导死约束。KD6 文档回填三分治执行了 tech-decisions 却漏了 AGENTS.md。【已验证】

R5 =(补充根因,候选①的真实形态)护城河叙事错位:"自研=护城河"光环让 build 免检。

  • 技术决策版 §2 预划"自研只做 feed/telemetry/runtime/SDK/变现链路"——runtime 整层被预判为护城河;重设计 review §1.3 纠正:"真护城河成分是沙箱+SDK+三容器+契约,不是渲染循环本身"。护城河边界划粗一寸,自研面就虚胖一层,且带免检光环。【已验证】

R6 = 候选⑤ spike 沉没成本转正——被制度化的机制而非根因。

  • "spike 钱花两次用""获胜实现直接转正为模板五"(重设计 §5)、channel-spike 资产"随 W-CH 转正"。spike 豁免尽调合理,但转正不重过选型:agent-loop 编排器从 spike 长成生产 QA 闭环(golden 回归/金丝雀发布/熔断),至今物理上活在 docs/agent-specs/ 目录里——文档目录长出生产系统,就是该机制的标本。【已验证】

R7 = 候选① 经典 NIH 情感偏误——证据不足,降权垫底。(反证见病理定义节)【已验证-反证】

附:AI 开发特有的第二放大器——"文档即指令"。 agent 把 AGENTS.md/knowledge 当事实源,回填滞后=错误以会话为单位批量复制。除 15KB 外,AGENTS.md §4.1 仍将"agentic 编排引擎"列为"全项目最重自研框架"待 Fable 设计(T-STU-05/10+T-AGC-18)——AgentScope 终裁后此行已成自研复发的种子。【已验证】


② 自研组件全盘点表(Q2)

判定口径:✅自研合理 / ⚠️自研嫌疑(须补尽调或登记) / 🔴疑似在犯。

# 组件 位置 判定 理由与证据 建议动作
1 "LittleJS 增强发行版"插件层(粒子/物理/后处理三件)+ 引擎零接线 game-runtime/src/plugins/{particles-juice,physics-lite,palette-post}/impl.js、game-runtime/host-dev/host.js:15、game-runtime/games/wanglanmei-ref/src/main.js:15 🔴 终裁后的 LittleJS 至今 0 字节进入运行路径:host.js:15 "α 阶段不接 littlejsengine(裁定留痕)",参考件 main.js:15 "不 import littlejsengine",受控面铁律"禁直透 littlejsengine 裸对象"(src/core/plugin.js:21)。而按本仓自己的尽调(重设计 review §4.1),LittleJS 内置粒子(含编辑器)/屏震/后处理 shader/街机物理——三件插件在裸 Canvas2D 上平行重造了引擎内建能力;创始人亲玩过门的旗舰参考件实跑在"RAF+tick+裸 canvas"自研宿主上。重设计 §2 目标 1 原文是"juice 成为引擎自带能力",实际落成"juice 成为自研插件能力"。这正是被淘汰的"自研+微库"路线换壳复活——形态终点测试自己点过名。注意:有创始人"α 不接"裁定留痕,collision(空间哈希/SAT)/gamefeel(输入缓冲/coyote)确为引擎缺件,故判"疑似"而非"确犯"。【已验证;"平行重造"定性为推断】 T1b-β 设引擎真接线门:bundle 内 grep 实证含 littlejsengine;出"插件×引擎内建能力重叠清单",粒子/物理/后处理三件要么改为引擎包装层,要么由创始人书面裁决"有意替代"并同时砍掉引擎对应部分的字节预算(现状是 25.9KB 引擎+13.3KB 插件双份记账,SIZES.md 实测)
2 agent-loop-v1 自研编排器(批跑/账本/裁决/熔断/发布) docs/agent-specs/2026-06-09-agent-loop-v1/orchestrator/(5,725 行 Python) ⚠️ 2026-06-09 立项时框架未选型,作 spike 合理;AgentScope 终裁(2026-06-12)后=遗留迁移项,但作战清单 W-G1 只写"建在终选框架上",无此件的冻结/迁移/退役条目;生产 QA 闭环活在 docs 目录。继续投入=违反"全平台只养一套"终裁。【已验证】 W-G1 spec 增列:本件冻结只修 P0;判定哪些资产(judge 决策表/ledger 幂等语义/预算闸常量)以契约形式迁入 AgentScope worker;给退役时间点
3 自研 CDP 客户端 ×2 game-runtime/test/harness/browser-evidence.cjs(448 行,node)、orchestrator/player_cdp.py(1,637 行)+admin_walk.py(同款 CDP 类) ⚠️ 蓝图明确选了现货:技术决策版:1356 与 Doc B T-RT-27 均写 Playwright;实现层被"标准库优先/零依赖/6c6g 禁 headless Chrome"纪律悄悄改成手搓(browser-evidence.cjs:168-178 自述 mirror admin_walk.py 接法)。puppeteer-core 仅 connect 既有 :9222 Chrome、零浏览器下载,与机器红线不冲突,未见排除记录。缓解:同一 CDP 类已被 e2e-input.cdp.cjs 复用,未三次重写;取证哈希断言为域特定。【已验证】 补一次 10 分钟尽调记录(puppeteer-core/playwright 排除理由落档);若维持自研,把两份实现(py/node)收敛为单一权威+另一侧薄移植,登记进 Doc B 正式 T-id
4 零依赖 JSON Schema 校验器 game-runtime/scripts/validate-manifest.mjs(130 行) ⚠️ 文件头自供"为什么不引 ajv:本机零 npm 依赖纪律——违纪"。约束错位标本:lane 同步纪律(衍生约束)压倒工具正确性;已自认"schema 改动须同步本校验器"=双源漂移债。集成段(mini-desktop)本就跑 npm(esbuild/ws),ajv 在集成段零成本。【已验证】 校验挪到集成段用 ajv 做权威门,本机手写版降级为"开发期快检"或删除;"零依赖纪律"按 Q4-R3 补血统标注(适用范围=lane 源码,不及工具链)
5 零依赖静态 serve game-runtime/test/harness/static-serve.cjs(59 行) ✅(边缘) 59 行无状态胶水:mime 表+防穿越+systemd 日志,密度低于引入依赖的协调成本;python3 -m http.server 可替但差 mime/日志细节。属 Q4-R5(b) 豁免面。【已验证】 无;若再长(缓存/范围请求)即触发升格重审
6 插件协议+注册器(core-protocol-v0) game-runtime/src/core/plugin.js ✅(协议本体)/⚠️(墙厚) 协议=域特定薄层(注册/生命周期/错误隔离/受控面),无现货对应物,且为 9a 契约实体——自研天经地义。但"受控面禁直透引擎"的墙厚直接导致 #1:可换性买成了"不使用"。【已验证;墙厚代价为推断】 协议保留;受控面 v1 增"引擎能力透传白名单"通道(经裁决暴露引擎粒子/物理句柄),把"可换"从"全隔离"降为"边界可审计"
7 FNV-1a 取证哈希链(P10 runtime-probe / channel-probe) game-runtime/src/plugins/runtime-probe/、docs/agent-specs/2026-06-12-channel-spike/shared/channel-probe.js ✅ 运行在 CSP connect-src 'none' 沙箱 iframe 内的离线确定性取证,OTel 类 tracing 物理进不来也不该进;FNV-1a 十行级。域特定成立。【已验证】 守边界:工厂侧 9d trace 按终裁走 AgentScope OTel,禁止把 FNV 链向工厂侧延伸成第二套 tracing
8 Prompt Registry(Git 化第 8 契约) contracts/prompts/ + prompt-governance.md ✅(边缘) 文件即契约、零服务运维、四道闸接自有 golden 集,契合"1 创始人+自托管+合规尽调要许可洁净"姿态;LangSmith=商业 SaaS(agentic 尽调中已被列为 LangGraph 减分项),Langfuse 自托管=多养一个服务。未见显式 why-not 记录是瑕疵。【已验证;"现货不优"为推断】 补三行 why-not(LangSmith/PromptLayer/Langfuse)入 registry README,免后人重问
9 feed 推荐自研(规则打分 w1..w6) game-cloud/game-module-feed/.../FeedServiceImpl.java(531 行) ✅ 规则公式+MySQL 直查(MVP 决策#3),无 ML;推荐数据闭环=明文护城河承重墙;Gorse 类现货对此规模属过度工程。【已验证】 增长期上 A/B 框架(T-FED-12)时再过一次现货门(实验平台类现货多)
10 game-cloud 13 业务模块 vs huijing game-cloud/game-module-* ✅ 复用纪律良好实证:限流用 huijing @RateLimiter(AdController.java:13-14)、passport 直注 huijing SmsCode/OAuth2(tech-decisions §8)、pay=复用 huijing-pay、BPM 降级轻量状态机、schema 校验 networknt。未发现与 huijing 既有能力重复造轮。【已验证】 无
11 studio "agentic 任务链编排引擎"(T-STU-05) game-cloud/game-module-studio/.../StudioServiceImpl.java(317 行)+ AGENTS.md §4.1 ⚠️(纸面在犯) 现实现只是"委托 aigc+轮询"薄状态机(无害);但 AGENTS.md §4.1 仍把它列为"全项目最重自研框架"待 Fable 设计、Doc B 仍挂 T-AGC-18"DAG 工作流引擎"——AgentScope 终裁后这两处是自研复发种子。【已验证】 回填:AGENTS.md §4.1 该行改为"编排=AgentScope 原语,Fable 只设计五资产契约边界";T-AGC-18/T-STU-10 打墓碑或改注
12 WanxiangGameSDK(<8KB 零依赖) game-studio/src/host/sdk/(288 行) ✅ 自有平台 SDK+postMessage 信封=契约本体,无现货对应;<8KB 为独立约束且有血统(随 GamePackage 每局支付)。【已验证】 无
13 自研壳 1.x(已定罪)残件 game-studio/src/host/runtime/index.ts(113 行占位)、inject.ts(srcdoc+toString 仍在) ✅(处置中) W-CLEAN 已清玩法逻辑;但 srcdoc+toString 注入机制仍是现行加载面,β 才改 URL(W-T1b review Q3:"退役=三件套架构改写,CDP 走查门必做")。【已验证】 按 β 计划执行,勿拖——拖一波,新人就照 inject.ts 学一波旧范式
14 小游戏 adapter(wx/tt 双端垫片) docs/agent-specs/2026-06-12-channel-spike/lane-littlejs-adapter/src/ ✅(spike 内) 自述"weapp-adapter 模式"=认得现货范式;官方 weapp-adapter 仅 wx 单端,本件做 wx/tt 双端 PlatformInterface 抽象,体量小、21 测、有假绿红线声明。转正时须重过尽调(Q4-R4)。【已验证】 W-CH 转正 spec 里补"为何不直接 vendor 官方 weapp-adapter"一行
15 微观惯犯记录:llm_client 客户端计费估算 new-api 集成 review §1 背景 ✅(已自纠) 原文自供:"在 llm_client 做了客户端 token 估算——这是在重造 new-api 已有的权威计费"。微观尺度 NIH 实锤,靠评审事后抓回。说明模式在小尺度持续发生。【已验证】 作为 Q4-R4 prior-art 步的教材案例入 rules
16 反向错误:买而不用/壳残留 contracts/dify-workflow-io.json、game-cloud/.../DifyCallbackService*.java、tech-decisions §1"AI 生成引擎"行 ⚠️(反向) Dify+OpenGame 作为 ADR 主选被买入,C2 裁定后从未部署、降级远期,但契约 #6、回调代码面、ADR 主行仍在——"名义采购"残骸污染决策面(与 #1 的"名义采用"互为镜像)。AgentScope"零可点名生产用户"属已记录的受控风险(换轨触发写死),不算错。【已验证】 按 Q4-R7 盘点:契约 #6 挂 deprecated 横幅,DifyCallback 代码面标注"未接线",ADR 行升主格为现行 new-api 主线

③ 决策链漏洞图(Q3,文字版)

产品需求层(Doc A)
  │  按纪律不含技术词——本层无 build/buy 决策,干净。
  │  漏洞 L1【约束铸币无血统】:产品 SLO(P75<3s)向下铸出工程红线时无登记机制,
  │  衍生约束(15KB)可冒充产品需求向下传导且无失效条件。AGENTS.md:54 至今带毒。
  ▼
技术架构层(Doc B / 技术决策版 / tech-decisions.md)
  │  build-vs-buy 名义主战场:ADR 表有"放弃的备选"列(好实践)。
  │  漏洞 L2【ADR 覆盖面=立项时点快照】:wave 内新生平台件(编排器/harness/插件库/
  │  CDP 客户端)不过 ADR;Doc B:353 自录"未编目实存组件"。
  │  漏洞 L3【why-not 无作用域标签】:"Phaser 3 全栈"否决(全 Tier 语境)被当通用否决
  │  沿用到 Tier1 单层(重设计 §1.3 自纠)——旧否决无复审触发器。
  │  漏洞 L4【护城河预划过粗】:"自研只做 …runtime…"一句把渲染循环错捆进护城河,自研获免检光环。
  │  漏洞 L5【蓝图选购被执行层静默覆写】:蓝图写 Playwright(技术决策版:1356/T-RT-27),
  │  实现手搓 CDP,无人对照蓝图,无 diff 告警。
  ▼
spec/评审层(ai-development-protocol §1 步骤4-6,双 spec+两轮评审)
  │  把关人:两轮评审(Codex/Claude)+ 高危波 Fable 终审票 + 创始人拍板。
  │  漏洞 L6【spec 模板九要素无"现货候选"必答项】:spec 框成"怎么建",评审只审建法;
  │  T1b-α 过审 13 条全采纳,零条挑战"为何不用引擎内建粒子"。
  │  漏洞 L7【唯一有效闸门=创始人体外复议】:两案均靠创始人专门会话/复议翻案,
  │  且都晚(存量 50 款后 / GC9 终审冻结后)。单点、晚触发、不可复制。
  ▼
实现层(agent 执行,模型三档分流)
  │  漏洞 L8【复用检索只到仓内】:效率原则 #3 检索序列=skills/knowledge/existing code,
  │  无生态级;"零依赖/标准库优先"纪律把 build 设为默认路径。
  │  漏洞 L9【体量不触发升档】:448 行 harness 属"实现细节"(Opus 档),永远到不了
  │  "架构裁决"(Fable 档)的雷达;升档判据(锁死≥3模块/不可逆)对基建件全不命中。
  ▼
沉淀层(wave-close 七步 + .agents 蒸馏)
  │  漏洞 L10【复利机器不分良莠】:自研范式被蒸馏成配方批量复制(add-game-template
  │  曾教 toString 注入+15KB 门);spike 转正制度化("钱花两次用")但转正不重过选型;
  │  文档回填半途(tech-decisions 改了,AGENTS.md 没改)→ 死约束借"文档即指令"复活。

一句话:build-vs-buy 在本系统里没有固定发生地——它散落在 wave/spike/lane 纪律里随手发生,唯一闸门是创始人的事后品味。


④ 预防规则草案(Q4,可直接落 .agents/rules/build-vs-buy.md)

定义:基建类组件 = 承担平台级横切职责(编排/运行时/引擎能力/协议实现/网关/存储/追踪/测试 harness/构建工具)的新组件,或预计 >300 行,或预计被 ≥2 个波次复用。三者命中其一即是。

R1 现货尽调前置门(硬门) 基建类组件开工前,评审版 spec 必含「Build-vs-Buy」一节:≥3 个具名现货候选(或附检索证据声明"生态位为空"),每个候选给排除理由,理由必须落入枚举:{许可/体积预算/沙箱与 CSP 约束/维护健康度/集成成本/数据主权}。两轮评审的第二轮 checklist 增设此项为必查;缺失=评审 fail,不得进执行版。

R2 形态终点测试(spec 必答项) 评审版 spec「关键权衡」节增必答题:"此自研件 12 个月/v3 形态长什么样?届时需要哪些它今天没有的能力?" 若 v3 形态趋同于某个已存在的现货品类(引擎/agent 框架/测试驱动器/schema 校验器/tracing),默认裁决=采购;坚持自研须创始人在 spec 内留具名签字行(非"按默认拍"可覆盖)。

R3 约束血统登记(数字红线铸币税) 任何进入 rules/spec/验收门的数字红线(体积/时延/行数/依赖数)必须三件套:来源(由哪个架构前提推导)、失效条件(前提变化即自动失效待复审)、复审触发(谁、何时)。无血统的红线不得阻断或强制任何设计决策。存量回填清单(立即执行):SDK<8KB、B1 350KB、"本机零 npm 依赖"、"标准库优先"、harness RSS≤2G。配套硬规:架构终裁落锤后 48 小时内,AGENTS.md 与 .agents/knowledge/ 全链回填,列为 wave-close 第三步(回填)的显式子项并 grep 验收(当前反例:AGENTS.md:54 的 "<15KB in-house")。

R4 AI 放大器对冲(prior-art 强制步) agent 动手写任何 ≥100 行的新工具/harness/协议实现前,执行版 spec 或任务卡必含三行「prior-art」记录:① 仓内已有同类?(grep/finding-duplicate-functions 证据)② npm/PyPI/GitHub 现货?(检索词+前 3 结果)③ 采纳或拒绝的一句话理由。缺此三行,评审/收口直接打回。配套:spike 豁免 R1,但 spike 产物转正必须补过 R1——"钱花两次用"只豁免重写,不豁免选型。效率原则 #3 同步改写为:"复用优先 = 先仓内、再生态现货、后自研"三级次序。

R5 适用豁免面(防误杀) 以下自研免尽调:(a) 契约/协议/schema 定义本体(域特定,如 9 组契约、插件协议形状);(b) ≤100 行无状态胶水脚本(static-serve 级);(c) 安全边界物理禁止外部代码的场景(CSP 沙箱 iframe 内的 SDK/probe);(d) 已有在案尽调记录的延续性迭代;(e) 创始人书面豁免。升格触发器:(b) 类被第 3 处复制或单文件突破 300 行,自动升格补 R1(薄层长厚即重审)。

R6 名义采用禁令(既买必用,不用即清) 凡终裁采购的组件,首个消费它的波次必须出「真接线证据」:构建产物 grep 实证含该组件(当前反例:"LittleJS 增强发行版"产物 0 字节 LittleJS)。声称"基于 X"的交付物产物里没有 X = 验收 fail。反向同理:已采购但 ≥2 波未接线的组件(Dify/OpenGame 契约面),收口时强制三选一:接线/挂 deprecated 横幅/删除——禁止无状态悬挂。

R7 抽象墙审计(对冲"可换性"过度工程) 任何以"X 可换"为由建的隔离层,spec 必须列「被墙掉的 X 内建能力清单」及替代成本;若清单里出现"将自研重造"项,该项须单独过 R1+R2。(直接针对受控面禁直透引擎→平行重造粒子/物理的现行案。)


⑤ 给创始人的直话

这个团队最该警惕的不是"爱自研"——你们买东西很果断——而是**"把'可替换'当成'不依赖',为可换性砌墙砌到宁可在墙这边重造一遍,也不真用墙那边买来的东西"**。15KB 案你已经看清了;但同样的剧本此刻正穿着你亲自终裁的 LittleJS 马甲重演:你拍板的引擎至今没有一个字节跑进运行路径,你亲玩过门的"暖阳小卖部"跑在一个 RAF+裸 canvas 的自研宿主上,粒子、物理、后处理——你买引擎就是为了这些 juice——被"受控面禁直透"的铁律墙在外面,由插件重写了一遍。每一步都有裁定留痕、都有体面理由,合起来就是尽调里你否决过的那条路:"自研+微库,形态终点=再造 LittleJS"。更要紧的是结构问题:全系统唯一真正起作用的 build-vs-buy 闸门是你本人的事后复议,它每次都灵、但每次都晚,而你的 agent 团队写码近乎免费、读文档当圣旨——AGENTS.md 里那行没删干净的"<15KB 自研运行时"会比任何人都勤奋地替你复制错误。把你的复议变成流程里的前置门(④-R1/R2/R6),否则第三案只是时间问题。


审计中最关键的事实坐标(供主会话核对)

  • /root/games-development-ai/game-runtime/host-dev/host.js:15 — "α 阶段不接 littlejsengine(裁定留痕)"
  • /root/games-development-ai/game-runtime/games/wanglanmei-ref/src/main.js:15 — 参考件不 import littlejsengine
  • /root/games-development-ai/game-runtime/src/core/plugin.js:21 — 受控面禁直透引擎铁律
  • /root/games-development-ai/game-runtime/scripts/validate-manifest.mjs:7-10 — "为什么不引 ajv:零依赖纪律"
  • /root/games-development-ai/AGENTS.md:54 — 死约束 "<15KB in-house Canvas Runtime" 仍在单一事实源
  • /root/games-development-ai/docs/architecture/技术架构与模块.md:147,353 — T-RT-27 蓝图选 Playwright;"未编目实存组件"
  • /root/games-development-ai/docs/agent-specs/2026-06-09-agent-loop-v1/orchestrator/README.md:8 — "标准库优先"纪律
  • /root/games-development-ai/.agents/knowledge/tech-decisions.md:42 — "0.5–1.5 人月、必须自研以控沙箱"原判与推翻注记

Critical Files for Implementation

  • /root/games-development-ai/.agents/workflows/ai-development-protocol.md(R1/R2/R4 落点:spec 模板与评审 checklist)
  • /root/games-development-ai/AGENTS.md(§3.1 死约束回填、§4.1 编排引擎行改写、§8-3 复用次序改写)
  • /root/games-development-ai/.agents/rules/engineering-conventions.md(新增 build-vs-buy 硬规则的挂靠处,或新建 .agents/rules/build-vs-buy.md)
  • /root/games-development-ai/.agents/skills/wave-close-checklist.md(R3 48h 回填子项、R6 接线证据、spike 转正重过选型)
  • /root/games-development-ai/game-runtime/src/core/plugin.js(R7 抽象墙审计与引擎透传白名单的技术落点)