docs(agents): 蒸馏内部狗粮上线/W-AXIS R1 收口踩坑经验

prompt-governance §11 稳定门在 M3 下 flaky 与治法(anyTerms 同义词补全治本+格式硬约束+几何退避;actor cohort 聚合比 judge 宽松)
gen-path-parity §6.2 跨语言契约版本接缝(Python 切 acceptance/3 必同步升 Node runner /3 否则真浏览器整拒)
staging-ops §2 commit 在途 M 触发 pre-commit 版本漂移闸处置(机械对齐 registry 匹配 frontmatter)+§4 长任务前台串行+孤儿独立复核
ai-development-protocol §4.2 关键 hash 一律主代理独立重算(扩 commit-hash 自验到产物/基线 hash)
均补到既有文件无新建,带本会话实证行号
This commit is contained in:
lili 2026-07-25 19:27:05 -07:00
parent 87777975c7
commit e16c7e833d
4 changed files with 32 additions and 2 deletions

View File

@ -132,3 +132,15 @@ M3a U12026-06-27,`git show 8ea97234:docs/plans/2026-06-27-002-feat-cheap-work
- **复用旧路代码的 import 边界坑**:cheap-worker 的 `_bootstrap` 入 sys.path 的是 `tier2/gen-worker`(其无 dedup/_extract_trace);trace/dedup 参考在 `wg1/gen-worker`(另一棵树、不在 import 路径)。故 **trace 在 result_out 内手写镜像口径**(输入形态不同、不能直接套 `_extract_trace`);**D9 vendor 复制** `dedup.py` 进 cheap-worker(纯模块,`DEDUP_REGISTRY` 设自己 `results/`,比跨树 import + monkey-patch 全局常量干净)。
- **两条回调路都落 trace**(`DifyCallbackTxService` 失败路也调 `persistTraceQuietly`)→ trace 落库可经失败 gen 验证;但 D11 success 路高分需 succeeded(**注入合法 bundle 验机制、不赌便宜档质量**)。`aigc.trace.enabled` 默认 false → 验前必开。
- **玩家试玩边界**:玩家 manifest 端点要求 runtime_package published(status=1),preview(0)返「运行包未发布」→ `publish→feed→玩家真玩` 必经 `reviewProject(APPROVE)`(产品/审核台轨、auth + 项目 REVIEWING 生命周期),非生成线;生成线交付 = 落到可发布的预览包(version + status=0 包 + engineBundle 进 package_json + D11 分)。
## §6.2 跨语言契约版本接缝:一侧升版本,另一侧校验器必同步升(W-GOLD-LIVE 实证)
便宜档 Python `cheap_verify` 与 Node runner `game-runtime/games/_wg1-gen/_shared/playtest-v3.cdp.cjs` 共用一套 `acceptance-request/N` 来源契约。**一侧升了契约版本、另一侧校验器没同步升,真浏览器验收会被整拒,而接线看着是完成的**——这与上节「换 worker 实现别静默退化」同型,只不过这里是「换契约版本别静默整拒」。W-GOLD-LIVE 把 Python 切到 `acceptance-request/3`(v2 字段集之上开口三个可选参照资产字段 `designRef`/`referenceAssetRecordIds`/`consumerRef`,`cheap_verify.py:1726/1774`,加 `consumedReferenceAssets` 来源,:1787-1851)后,Node runner 当时只在版本三元里认 `/1 /2``/3``null` → 整条抛 `profile_contract_error`;且 `assertExactArtifactKeys` 是严格字段集、不含 v3 三可选字段,真 v3 acceptance 全被整拒。
固化成范式(现已是 runner 现行形态):
- **版本三元必带全分支**:`validateProfileProvenance`(`playtest-v3.cdp.cjs:323`)按 `schemaVersion` 派生 `contractVersion`,三元逐版本列全 `/3 ? 3 : /2 ? 2 : /1 ? 1 : null`(:333-335);新版本不补分支就落 `null` 整拒。
- **严格字段集用 optionalKeys 开口,旧调用方零变**:`assertExactArtifactKeys(value, expected, label, optionalKeys=[])`(:311)缺省 `[] = 旧严格行为`;v3 把三可选字段与 `consumedReferenceAssets``optionalKeys` 白名单放行(:343/352),`/1 /2` 调用方不传该参、行为不变。
- **绊线测试随新字段扩**:恢复「篡改 + 重 hash」两段断言(篡改字节 → hash 不一致必拒)并扩到 v3 新字段,防校验器对新增字段静默放行(验法见 `cheap-worker/tests/test_acceptance_v3.py`)。
**消费对账是机器强制,不是 bug**:runner 与 `full_gate.py` 只消费 `lifecycleStatus==active` 的参照资产;声明消费而无 active 匹配 = verified reject(`full_gate.py:187-204`,六项闸:存在/激活/role/consumerRef/版本/缺维度)。迁移窗口里清单全是 `migration_pending`/`candidate` 时,任何 live 消费当场被拒——这是「迁移完成前不得新增 live 消费」的机器强制。

View File

@ -160,9 +160,23 @@ aigc 新增**无状态原子**:输入 GameConfig → 输出可玩性测试脚
|---|---|
| 改了 prompt 没 bump version | CI 卡version 未变拒绝合入(防静默覆盖) |
| Golden 集过拟合 | 样本要覆盖典型+边界bad case 增量补;勿只放"好跑"的样本 |
| registry 与运行时不同步 | 部署强制版本校验DB 镜像只读;改 prompt 必同步 registry.yaml |
| registry 与运行时不同步 | 部署强制版本校验DB 镜像只读;改 prompt 必同步 registry.yamlcommit 在途 M 触发 pre-commit 版本漂移闸的处置见 [`staging-ops.md`](./staging-ops.md) §2 |
| tier2 多 agent prompt 当单次文生代码写 | 它是 AgentScope ReAct 多步有状态编排(工作室设计→单写→软检);改一条只改对应 `09-tier2-richgame/*.md` 正文加升 version不改 Python |
| 把 CI 门焊在化石 prompt 上白花钱 | 段 B 真模型闸只焊 live 面;接门前先查 registry 头部消费面三态对账,非 livefossil/batch-relicSKIP 豁免、live 无金标 fail-closed先用代码坐实「谁真被 live 路径喂 LLM」再决定跑不跑 |
| 单条模型调用失败当成 prompt 退化拦 | 网关 500/限流是基础设施问题,从判定分母排除 + 建议复跑(多数失败才判人工兜底),别让偶发抖动误判 prompt 质量 |
| 运营绕过 eval 直接改 DB | DB 是 git 只读镜像,无写入路径;改 prompt 唯一入口=PR |
| prompt 注入攻击 | guardrails 内置 injection-detect + 输出 Schema 校验,与内容安全双层链路同治理 |
---
## 11. 稳定门在 MiniMax-M3 下的 flaky 与治法2026-07 W-AXIS R1 实证)
段 B 真模型闸之上actor/judge 类 prompt 还叠了一道**稳定门**防单轮侥幸过。judge 要同一请求连续三轮金标全净(`MIN_STABLE_RUNS=3``eval_gate.py:114`;双 judge 各自 6/6、actor 至少 4/5`:12`再加第四轮复跑确认actor 走 cohort 聚合(`evaluate_repeat_stability``:2827`),三轮里 `correct_total≥12` 且每键 `≥2/3``:2884-2885`)。这套门在 MiniMax-M3 下很 flaky——judge-b 跑到第 33 轮才出一个三连净,单轮全净率只有 3545%。
flaky 根因分三层,治法各不同,别混着调:
- **① 金标白名单同义词覆盖不全(主因,治本=补同义词)**。labels 的 `anyTerms`/`requiredConcepts` 是自由文本白名单(`eval_gate.py:1873-1886`M3 常用的近义表达落在白名单外就被判错:净利↔利润/净收益、零单↔0单汉字「零」≠数字「0」、通关↔胜利、time-over/end-state↔game over、缺少证据↔缺证、cannot↔不能、`open shop``open-shop`(连字符差)、`no proving evidence``no evidence`(非连续子串)。补这些进 `requiredConcepts` 同义组**不是放松标准**是让金标覆盖合法的同义表达flaky 的主要来源由此消掉。
- **② 格式类失败(正文加硬约束可消除)**。JSON 尾部多游离 `]`、problems 缺硬证引用、obligation id 笔误(如 sim-business 误写成 sem-business。在 prompt 正文加硬约束即掉:输出 JSON 配平自检、obligation id 逐字复制不得改写、problems 逐条带硬证引用、summary 全引用、反事实视觉判定(文本说营收为正但画面还在开店前 → 判 contradicted不得 accept
- **③ 视觉误判(正文约束仅边际改善)**。把 GAME OVER 帧读成通关、漏 event 引用,属模型读图能力,正文加约束只能边际改善,治不了本。
做法:正文强化格式约束 + 补 `anyTerms` 同义词 + 几何退避等其收敛闭合,**不降阈值、不 cherry-pick 净轮**。actor 判据本就比 judge 宽cohort 聚合而非单轮全净闭合相对容易judge 单轮全净门最硬,补同义词后才收敛。

View File

@ -24,6 +24,8 @@ description: "在 mini-desktop/mini-infra 上做 staging 或内测 dev 的部署
- 远程脚本省心写法:`ssh mini-desktop 'bash -ls' <<'REMOTE' ... REMOTE``-l` 拿 PATH`-s` 读 stdin免引号地狱
- **push 竞态与管道掩码2026-06-12 实翻)**:①大资产 push 在途时再发 push 会撞 Gitea ref 锁(`remote rejected (failed to update ref)`/`failed to push some refs`)——**同仓 push 串行化,等上一笔落地(`git ls-remote` 核)再发**;②`git push 2>&1 | tail -1` 的退出码=tail 恒 0**会吞掉推送失败**——push 不接管道,要么裸跑判 `$?`,要么 `tee`+`PIPESTATUS[0]`。每次 push 后以 `git ls-remote origin <branch>` 实证远端头,不信本地输出。
- **commit 在途 M 触发 pre-commit 版本闸git log 不前进 ≠ commit 成功2026-07 实证)**commit 在途 M 文件(如 `contracts/prompts/registry.yaml`pre-commit 的 Prompt Registry 一致性检查会比暂存 registry 的 version 登记 vs 工作树 prompt 正文 frontmatter version门机制见 [`prompt-governance.md`](./prompt-governance.md) §2 的 `check_registry.py`)。若上个会话升了 prompt frontmatter 版本(如 `04-config/cheap-system.md` 1.8.0→1.8.1)却没同步 registry 登记,这笔 commit 就被拦 `[FAIL]` 版本漂移——**git log 不前进、暂存区保留,极易误以为 commit 成功了**。做法commit 前先机械对齐 registry 登记的 version 值匹配 frontmatter注释标明「同步 frontmatter 在途升版,变更见该文件」,不动 prompt 正文内容)。两条连带纪律:① commit 在途 M 会带上之前会话在同一工作线上的在途修改(同一工作线无法 hunk 分离,合理);② 但导致红测试的根因文件(如文案漂移的 `cheap_roles.py`/`cheap-system.md`、brief 漂移的 `test_match3_gold_batch.py`**不要 commit**,免把红测试入库;量大的 raw 审计产物留 untracked。
## 3. 后端重部署标准序(授权窗口内执行)
> 教训:`~/game-staging/repo` 曾是 stale 克隆,「构建源 ≠ 运行 jar」翻过车——每次部署按此序以字节码实证收口。
@ -58,6 +60,7 @@ description: "在 mini-desktop/mini-infra 上做 staging 或内测 dev 的部署
- huijing 前端game-admin稳定配方**pnpm9**`corepack prepare pnpm@9.15.4 --activate`,一举绕开 pnpm10+ 的 lockfile 镜像校验与构建脚本审批两道坎)+ 前端目录 `.npmrc` 设 npmmirror → `node --max_old_space_size=4096 ./node_modules/vite/bin/vite.js build`(绕 pnpm-run 预检。node_modules 腐化(如混入 vite8 / 杂散 `pnpm-workspace.yaml` 报 packages 缺失)→ 移开杂散文件 → 清装精确回钉版本。
- huijing-module-system 测试:**`SPRING_DATA_REDIS_PORT=26379 mvn test ...`**(宿主 16379 被 staging redis 占用带密码,嵌入式 RedisServer 失败被吞 → NOAUTH 假红)。
- **mini-desktop 长驻 serve/后台进程**2026-06-11 T1-spike 双 lane 实证ssh 会话内 `nohup &`/`setsid` 仍可能随会话 teardown 被 SIGHUP 连带杀(症状=稍后访问 ERR_CONNECTION_REFUSED。稳定配方**首选 `systemd-run --unit=<name>` 起 durable 单元**;次选独立 launcher `setsid bash -c 'exec node serve.cjs'` 双脱离 + **起服后 5×6s 探活门**curl 200 连续过)确认常驻再继续。另:长任务后台进程严禁与 `pkill`/`curl` 写进同一 heredoc 串行(竞态留孤儿进程占 pid 不占端口)。
- **长任务(真模型 eval / CDP 真玩)焊死前台串行 + 孤儿独立复核2026-07 实证)**:这类长任务交给后台代理,它常会再起后台子任务或「起后台等通知」,然后**截断返回中间态**——mini-desktop/开发机上残留孤儿 `python http.server` + headless chrome + `/tmp` profile产物没取回。做法长任务一律焊死前台串行`run_in_background`/`&`/`nohup`/起后台等通知),每步在 finally 杀 serve + chrome、删 profile。收尾不信代理自报「已清理」主代理**独立 ssh 复核孤儿**三项都空才算清:`ps aux | grep -E "http.server|chrome" | grep -v grep``lsof -i:<port>` 查端口占用、`ls /tmp` 查残留 profile。前台串行纪律与 [`gen-path-parity-harness.md`](./gen-path-parity-harness.md) §并发同源;此条补「截断返回中间态」与「独立复核孤儿」两个具体面。)
## 5. 冒烟门

View File

@ -145,12 +145,13 @@ flowchart TD
派子代理执行编码任务、尤其走 subagent-driven-development 时,子代理回报的 DONE 是**未验证声称**controller 不得据以标记完成。一次实录:子代理报「测试 8/8、已提交 commit 6837c8ee」实际测试是 2 failed那个 commit 在 git 里根本不存在——改动只落在工作树、从未提交。
条硬纪律:
条硬纪律:
- **每个报 DONE 的 commit 自验**`git rev-parse HEAD` 与回报的 hash 对得上,真跑关键测试(不信回报的通过数),红线级改动亲读 diff。
- **生成 review 包时的 hash 校验是造假第一道自动拦网**:编造的 commit hash 不在 git 里,一 `git` 就报错。把「生成 review 包 / diff」放在标 complete 之前当强制步,能第一时间撞破。
- **造假子代理弃用、不 resume**它带着「我已做完」的错误认知resume 容易再造假;换 fresh 子代理,只补 controller 诊断出的精确缺口prompt 里明写诚实红线(回传真实 HEAD 与原样测试输出,没全绿一律报 BLOCKED 而非 DONE
- **fix 子代理让其自证**要求「删掉修复→缺陷用例必红」这类反向验证证明测试真在测行为而非桩自证controller 再复核一遍。
- **关键 hash 一律主代理独立重算,绝不抄子代理报的值**:不止 commit hash——`runtime-tree.json` 的 sha256、`artifacts.sha256`、baseline 的 `promptBodySha256` 这类产物/基线 hash子代理报的长度或值也可能是错的一实录子代理报 runtime-tree hash 为 62 位却称 64 位)。主代理对这些 hash 必须自己 `sha256sum` / `git rev-parse` 重算比对,不直接采信报值;`git rev-parse` 验 commit hash 存在是反造假第一道(第一条),产物 hash 同理——报得出 ≠ 算得对。
---