docs(.agents): 蒸馏 3b-B 派发面 HMAC 服务间签名范式 + 便宜模型过九门=moat真壁垒

- ai-generation-pipeline.md §⓪′:@PermitAll 回调路签名 TODO→3b-B 已补;沉淀 HMAC
  服务间签名范式(对原始字节验签/常数时间比对/一次算定既签既发逐字节对账/两侧密钥一致)
  + 真 worker service.py 服务壳 + e2e 真证结论(P0-P4 安全面+管线闭合·P5 生成质量转 L1)
- cheap-model-game-generation.md §5:生产接线已成(3b-B);e2e 确认点击坑=moat 真壁垒
  (三款真生成全卡九门·渲对点击坏·质量门正确拒发不可玩=系统履职非故障)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-14 16:24:28 +00:00
parent c99014c243
commit ff73574538
2 changed files with 5 additions and 2 deletions

View File

@ -29,10 +29,12 @@
**两条红线(门里逮过的真坑·复用必看)**
1. **🔴 非 RBAC 的 HTTP 回调路必须自注入系统身份(部署窗口#3 同根因,换路复发)**worker 是内部服务无登录态,回调走 `@PermitAll` 内网子路由(仿 `SmsCallbackController`/pay-notify 范式解 §6.5 auth 孤儿);但 `@PermitAll` 路在 web 线程无 LoginUser → `DefaultDBFieldHandler` 取不到 userId → `handleCallback` 三表 UPDATE/INSERT 的 `updater/creator` 带 null 直出撞 NOT NULL`DataIntegrityViolation`,任务卡 RUNNING。**修法**:内网回调 controller 内自注入系统身份 `LoginUser().setId(0L).setUserType(ADMIN)``SecurityContextHolder``finally``clearContext()`(镜像 `AigcGenerateExecutor.executeWithSystemIdentity`。RBAC 的 `/dify/callback` 由登录管理员提供身份故无此坑——**任何新免鉴权回调路(真 worker 3b-B/外部接入)都要补这条**。
2. **🔴 @PermitAll 内网回调路上线前必补服务间签名校验**本路由仅恃「内网不可外达」兜底上线前若可被外网路由到任意请求可伪造回调驱动落包安全红线3b-B 真 worker / 外部接入前补 HMAC/共享密钥或 mTLS`/dify/callback`「真 Dify 接入补签名」TODO 同治)。
2. **@PermitAll 内网回调路服务间签名已补(3b-B,关裸缺口)**:原仅恃「内网不可外达」兜底=任意可达请求伪造回调驱动落包(安全红线)。3b-B 补 `CallbackSignatureVerifier`(HMAC-SHA256 对回调**原始字节**验签·`MessageDigest.isEqual` 常数时间比对抗时序·JDK 原生零依赖·空密钥=回退仅内网兜底);controller 接 `@RequestBody String rawBody` **先验签错签真 HTTP 401 再反序列化**(手动校验补 traceId/status 非空·绕过 @Valid);worker 侧 `json.dumps(payload,ensure_ascii=False).encode("utf-8")` **一次算定既签既发**(Content-Type 带 charset=utf-8 使 Spring `@RequestBody String` 同字节还原·`hexdigest()` 小写对齐 Java `Character.forDigit`)。**HMAC 逐字节对账铁律**:签名字节==HTTP 发送字节,两侧密钥(`CALLBACK_SECRET`/`AIGC_CALLBACK_SECRET`)逐字节一致,否则永不匹配。e2e 三态铁证(`evidence-3bB/p4*.txt`):缺签/错签→**401**、正签→**HTTP200 过门走下游**。(`/dify/callback` 真 Dify 接入补签名 TODO 同治。)
**stub worker 配方证管线用3b-B 换真 worker**`game-cloud/scripts/wg1_stub_worker.py`(极简 HTTP收 job→读固定 pong bundle `game-runtime/games/_wg1-gen/pong/bundle.iife.js` 作 engineBundle→回调gameConfig 回 §5.2 最小占位 `{templateId,title,theme,engineDriven:true}`,不调 LLM 不打包。e2e 脚手架:`p3b_scaffold_pong.sql`(建 gameId=9302 四态)→插 generic 任务→回调建新版本→`p3b_publish_flip.sql`(把 feed 翻到回调新版本)→ CDP 复用 `game-studio/evidence/p3-pong/p3-pong.driver.cjs <base> <gameId> <versionId>` 真玩。**配置**`aigc.executor.worker-url`(空=派发面无端点→generic 判 failed(llm_error)不静默卡死staging 经 `.env``AIGC_WORKER_URL`stub 起 durable 单元 `systemd-run --unit=wg1-stub-worker`
**真 worker 服务壳(3b-B,`c99014c`)**`wg1/gen-worker/worker/service.py`=`http.server` 壳包 L2 `run_studio`(design 展开一句话→自产 gatespec→九门真玩),`run.py`/`agent_loop` **逐行不改**;`POST /generate` 收 §6.1 job→立即 202→**后台串行**(全局 Lock·`run_studio` 占 serve 4320/CDP 9222 不可并发)`asyncio.run`→过门读 `_wg1-gen/gen-<gameId>/bundle.iife.js`→HMAC 签名回调(见红线 2)。**e2e 真证结论(2026-06-14,`evidence-3bB/`)**:**✅ P0-P4 安全面+全自动管线闭合**(执行器认领→投 job→worker 真生成真烧模型→HMAC 双向证→`handleCallback` 落库);**❌ P5 终局未达**=三款真生成全 `nine_gate_failed`(截图证真出 on-theme 可渲可动「点击小怪物」游戏,仅点击→计分坏→**九门质量门正确拦截不可玩**)。**判**:plumbing+安全+质量门=L0 易部分已成且证;**便宜模型过九门=moat 真壁垒**→生成质量转 L1(见 [`cheap-model-game-generation.md`](./cheap-model-game-generation.md) §3 点击坑/§8 质量门)。
---
## 目标

View File

@ -37,7 +37,8 @@ brief 题面 → 便宜模型写 `generated-factory.js`(一个 `GameHostFactor
## 5. 边界与未做
- 只消费冻结契约(`game-host.d.ts` / 6 受控面 / `__GameBundle` / `bootGameHost`**零修改**;只在 lane 分支,不推 dev/2.0.0。
- **未做**(创始人并行 / 后续波次):全 20 款 bake-off、四模型横比过门率/重试/¥每过门、AigcGenerateExecutor 生产接线、碰撞穿透门 J、落一个过九门的 flash 正样本v5 因挡板太慢挂 H/I需 prompt 给具体挡板速度 + driver 持续按压 + 阈值校准)——规划见 [`2026-06-14-WG1-bakeoff天花板与Claude-free评估门-review.md`](../../docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-review.md)。
- **✅ 生产接线已成(3b-B 派发面,`c99014c`)**`AigcGenerateExecutor.dispatchGeneric`→真 worker `service.py`(包 `run_studio`)→HMAC 回调→落库入 feed 全链真证闭合(见 [`ai-generation-pipeline.md`](./ai-generation-pipeline.md) §⓪′)。**但 3b-B e2e 确认「点击坑」是 moat 真壁垒**:一句话「点击小怪物」三款真生成全 `nine_gate_failed`——截图证真出 on-theme 可渲可动游戏(Score/3s/monsters),仅点击→计分坏(Score 恒 0)→**九门正确拦截不可玩**(正是 §3 点击坑/harness §7 G-H 门逮的),`run_studio` 自修 `max_repairs` 未救回。**铁律重申**:plumbing 易、**便宜模型把「点击命中→计分」写对=真难点**;质量门拒发不可玩=系统正确履职(可玩性地板),非故障。
- **未做**(创始人并行 / 后续波次):全 20 款 bake-off、四模型横比过门率/重试/¥每过门)、碰撞穿透门 J、**落一个过九门的正样本**v5 挡板太慢挂 H/I;3b-B「点击小怪物」挂点击命中——均需 prompt 给具体参数[挡板速度/命中半径] + driver 持续/精准出招 + 阈值校准)——规划见 [`2026-06-14-WG1-bakeoff天花板与Claude-free评估门-review.md`](../../docs/agent-specs/2026-06-14-WG1-bakeoff天花板与Claude-free评估门-review.md)。
## 6. 官方 latch 终态契约 + 套壳P3 对齐2026-06-14