docs(round3): SAA路trace接线split-brain真库收口——verdict落档+saa-graph§6蒸馏+_index注册

- verdict: dispatcher=saa+trace.enabled=true真库验trace_json非空/readiness=74,开关关NULL(additive字节零变),进程内非HTTP非HMAC,live未动
- saa-graph§6: 新增「多派发路·回调可观测字段必须每路都set」铁律(回调trace split-brain,与发布裁决split-brain区分)+字节兼容红线+readiness浮动/firstPlay quirk坑
- _index: SAA段注册execution+verdict为已收口,登记F5/F3/早期boot预热follow-up

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-17 02:06:31 +00:00
parent aff886d192
commit a09a03e91e
3 changed files with 90 additions and 0 deletions

View File

@ -69,6 +69,7 @@ SaverConfig sc = SaverConfig.builder().register(saver).build();
- `GenerationDispatcher.dispatch(job)` 接口 → 两实现 `WorkerDispatchClient`(http) | `SaaGraphDispatcher`(进程内 SAA 图) 经 `aigc.executor.dispatcher`(默认 **http** 非破坏) 二选一**单写**。
- `SaaGraphDispatcher`job→state→后台单线程 `compiledGraph.invoke(threadId=traceId)`→出口组 `DifyCallbackReqVO` **进程内直调 `difyCallbackService.handleCallback`**(消灭 HTTP+HMAC复用唯一三表同事务写链串行真玩门 `Semaphore(1)` 守端口;图执行不包大事务(落库走 handleCallback 内短事务);失败统一归 `llm_error`(图内真因不在契约#6 七值枚举内)。
- 🔴 **铁律「多派发路·回调可观测字段必须每路都 set」回调 trace split-brain与下方发布裁决 split-brain 是两回事)**存在多条派发路http worker / SAA 进程内 / executor 旧路)时,任一落库可观测字段(`trace_json`/`readiness_score`)若只在部分回调构造点 set`dispatcher` 即**静默丢字段**。实证:`SaaGraphDispatcher.buildCallbackReqVO` 原只 set status/engineBundle/failureReason、**漏 setTrace** → `dispatcher=saa`(未来主力路)时 `trace_json` 恒 NULL、组B 9d/D11/D9 在 SAA 路静默失效HTTP 路因 worker `_extract_trace` 不漏)。**修法**:派发器回调构造点**对称镜像** worker 的 `_extract_trace`——从图终态 `OverAllState` 抽与之**字节兼容**的 camelCase 子集 `setTrace`,严格 additive + best-effort整段 try-catch 返 null抽不到绝不打断生成+ 复用同一 `aigc.trace.enabled` flag落库走现成 `persistTraceQuietly`,零改契约/消费侧。**字节兼容红线**:抽出键集必须=worker `_extract_trace` camelCase 子集(`stage_fail→stageFail` 等 snake→camelattempts **不含 per-attempt guards**——SAA 源端三处 appendAttempt 从不写,照 K_ATTEMPTS 注释抽会逼实现造假readiness 读**顶层** `sevenGateVerdict.guards.H_progress` 而非 attempts[].guards否则审核台/D11 两路读不一致。闭合Round3 `703e462c`HJ-AGI-002 线),真库验 task141 `trace_json` 真非空/readiness=74、task145开关关NULLverdict `2026-06-17-round3-SAA-trace-split-brain-real-db-verdict.md`。坑readiness 真值随真跑质量浮动repairs=5→stability 降、cost 缺→efficiency 中性,故 74<HTTP 96`firstPlay` `H_progress` 是嵌套对象喂 `asBool(Map)` 恒中性 0.5 = 组B 既存 bugHTTP/SAA 同病字节兼容仍成立修评分器另立 F5 **严禁**为过测把 SAA H_progress 改裸 bool HTTP 字节兼容)。
- 🔴 **铁律「worker succeeded ≠ 准予发布」split-brain 防线)**SAA worker 跑通九门(`runnableOk` = **机制可玩**:能加载/不崩/有终态)**不等于**准予发布。**发布裁决归治理层**——对抗 P0 安全审查(注入/越权/恶意资源)、金丝雀完玩率、人工二审,是与"机制可玩"正交的另一维。生成路**生产化前**,安全门须由 **W-G1 GP9 合规段接管**10 负例 staging 真验worker 自身只产"机制可玩"信号、**无权置位 published**。两者混为一谈 = split-brainworker 自评准予上架。来源agent-loop-v1 退役登记Lane B
## 7. 验证门(无 harness 端口也能验大半)

View File

@ -0,0 +1,88 @@
# Round3 · SAA 路 trace 接线 split-brain 真库验收 verdict
> 类型staging 真库端到端验收(坐实 split-brain 已闭合)。
> 结论:**split-brain 真库已闭合 ✅**——`dispatcher=saa` 进程内派发路真跑生成后 `trace_json` 真非空、`readiness_score` 真有值;`aigc.trace.enabled=false` 时同路 `trace_json` 真 NULL修前行为字节零变
> 执行环境mini-desktop100.64.0.7x86 权威机隔离实例 `:48090`;连 staging 隔离 MySQL `ruoyi-vue-pro@127.0.0.1:13306`(容器 `game-staging-mysql`**live `:48080` 全程未动**pid 479414 不变,启动 Jun16 20:24验收全程 uptime 持续增长无重启health/feed/admin 全程 200
> 构建源origin/dev/2.0.0 `aff886d1`(含修复 commit `703e462c`mini-desktop `/root/build-lane-s` 同步构建。
> 时间2026-06-17 09:18~10:00CST
---
## 0. 结论先行
| 验证项 | 结论 | 关键证据 |
|---|---|---|
| **修复在可跑产物** | ✅ | `javap` 实证 `game-module-aigc-server.jar`09:19 重建,嵌入 huijing-server.jar BOOT-INF/lib`extractTraceQuietly(OverAllState,Map,String,long)` + `TRACE_MAPPER` 字段 + `buildCallbackReqVO(...,long wallMs)`(签名改)。 |
| **trace.enabled=true 真库(核心断言)** | ✅ **PASS** | task 141dispatcher=saa 进程内回调)真库行:`status=2``trace_json IS NOT NULL``readiness_score=74``pass=true``wallS=679.993``attempts=7 条``sevenGateVerdict.guards` 非空(含 9 门键 H_progress 等)、`gameId="saa-aigc-944d…"``stage="saa"`、versionId=93114。 |
| **trace.enabled=false additive字节零变** | ✅ **PASS** | task 145**同 saa-graph-dispatcher 进程内回调路**,真跑九门 succeeded真库行`status=2``trace_json IS NULL``readiness_score NULL`、versionId=93115。后端日志该 task **无 `[persistTrace]` 行**persistTraceQuietly :254 守卫旁路)。 |
| **进程内路·非 HTTP·非 HMAC** | ✅ | 两 task 回调线程均 `saa-graph-dispatcher-1``图执行完成,进程内回调``handleCallback`→三表写链同线程;该 traceId 全程无 `/dify/callback-internal` 出站、无 HMAC 验签。 |
| **键集字节兼容 `_extract_trace`** | ✅ | task 141 顶层键 `[pass,stage,wallS,gameId,models,player,tokens,repairs,attempts,gatespec,sevenGateVerdict]`camelCaseattempts 全 camelCase、零 snake_case 泄漏;`similarity` 键正确缺省D9 未接 SAA符合 spec §2.2readiness 五读点 `pass`/`gatespec.driver`/`sevenGateVerdict.guards.H_progress`/`repairs` 真连通cost.totalRmb 缺省→efficiency 中性readiness=74 即此故低于 HTTP 路 96。 |
**一句话**:同一进程内 SAA 回调路trace.enabled=true → trace_json 真落split-brain 闭合)、=false → trace_json 真 NULLadditive 字节零变),**两向真库实证 = split-brain 已闭合**。
---
## 1. trace.enabled=true 真库行核心断言·task 141
触发form① 一句话生成打砖块gameId 9319traceId `aigc-944d032b63574b0b85df9b2cbb19f6bc`SAA 图 design→generate(M2.7+deepseek-v4-flash)→esbuild→九门 harness 真玩→repair×5→九门全过 succeededwall=679s
```
-- 后端日志(线程 saa-graph-dispatcher-1进程内
09:37:45.620 [saa-dispatch] 图执行完成,进程内回调 status=succeeded, engineBundleLen=212861, wall=679993ms
09:37:45.620 [handleCallback] 收到 Dify 回调 status=succeeded同线程非 http-nio
09:37:45.645 [createForPackage] 落包建版本成功 versionId=93114
09:37:45.702 [handleCallbackTx] 落包完成 checksum=9bf8035c… bundleSize=217074
09:37:45.714 [persistTrace] 落 trace_json + readiness_score 完成非阻断taskId=141, traceLen=3052, readiness=74 ← 修复点真触发
-- 真库行game_aigc_task id=141
status=2 has_trace=1 readiness_score=74
pass=true wallS=679.993 n_attempts=7 has_guards=1 repairs=5
gameId="saa-aigc-944d032b…" stage="saa" version_id=93114 trace_len=3833
顶层键集=[pass,stage,wallS,gameId,models,player,tokens,repairs,attempts,gatespec,sevenGateVerdict]
sevenGateVerdict.guards 键=[A_boot,B_uncaught,C_frame,D_render,E_live,F_wiring,G_input,H_progress,I_control]
gatespec.driver={"type":"paddle-intercept","paddleY":830,"ballPath":"ball.x"}readiness 读点真连通)
attempts: 角色 design/code/fix×5usage.{in,out} 子集真在;零 stage_fail(snake) 泄漏
```
- 无 `trace 抽取失败` warn → `extractTraceQuietly` 成功;无 `/dify/callback-internal`、无 HMAC进程内路
## 2. trace.enabled=false additive 行task 145
重启隔离实例 `-Daigc.trace.enabled=false``-Daigc.executor.dispatcher=saa` 不变ExecStart 实证触发同款生成gameId 9324traceId `aigc-a15d001e…`SAA 图真跑九门→repair→succeededwall=443s
```
-- 后端日志(同 saa-graph-dispatcher-1 进程内回调路):
09:58:15.664 [saa-dispatch] 图执行完成,进程内回调 status=succeeded, engineBundleLen=211977
09:58:15.664 [handleCallback] 收到回调 status=succeeded同线程
09:58:15.691 [handleCallbackTx] 建版本完成 versionId=93115
09:58:15.740 [handleCallbackTx] 落包完成 checksum=3bcf90b1… bundleSize=216119
09:58:15.746 [handleCallbackTx] 回调 succeeded 三表写入链完成
↑ 无 [persistTrace] 行——trace.enabled=false → persistTraceQuietly 守卫旁路
-- 真库行game_aigc_task id=145
status=2 has_trace=0(trace_json NULL) readiness_score=NULL version_id=93115 failure_reason=空
```
**判据**task 145 走的是与 task 141 **逐字相同的进程内 SAA 回调路**(同线程、同 handleCallback、同三表写链、同样真跑九门 succeeded唯一差别是 `aigc.trace.enabled` 开关——trace_json 从「非空 11 键」翻为「NULL」证修复**严格 additive开关关=修前字节零变**。
## 3. 真库断言对照表
| id | dispatcher | trace.enabled | status | has_trace | readiness | pass | wallS | n_att | has_guards | version |
|----|-----------|---------------|--------|-----------|-----------|------|-------|-------|-----------|---------|
| 141 | saa | **true** | 2 | **1** | **74** | true | 679.993 | 7 | **1** | 93114 |
| 145 | saa | **false** | 2 | **0** | **NULL** | NULL | NULL | NULL | **0** | 93115 |
## 4. 验收期揪出(环境侧,非修复缺陷)
- **早期 boot SAA fast-fail 复现Round2 §7-2 同签名)**:隔离实例重启后首 2~3 个 dispatch fast-failllm_error无 saa-dispatch/图构造日志task 0→3第 4 个起稳态成功task 145 真跑九门 succeeded。= Round2 已登记的早期冷启瞬态(`ensureGraph`/图缓存未热 race**与 trace 修复无关**fast-fail 走 executor.callbackFailed 旁路,根本不触 buildCallbackReqVO。生产 dispatcher=saa 重启后仍可能偶发,建议 dispatch 加 boot 预热/重试(沿 Round2 §7-2 待办)。
- **GP9 并发门正确**:孤儿 RUNNING 任务fast-fail 残留或被外部停的在飞任务)占满 per-creator 在飞=1 上限 → 新任务被 `控制平面 门①并发位满 → 拒`code=1101001001= 设计内正确门控,非缺陷。验收时手动 cancel 孤儿任务 142 释放并发位后续跑。
- **systemd 后台线程日志Round2 §7-3**:早期 fast-fail 窗口 `scheduling-1`/dispatch 错误日志疑被吞(用 shell `> file` 重定向仍偶发);稳态后 scheduling-1 + saa-graph-dispatcher 日志均正常落。DB 状态为权威判据(不依赖日志)。
## 5. 证据 / 隔离实例清理
- 证据日志mini-desktop `/root/round3-saa-true.log`task 141 全链 + persistTrace 行)、`/root/round3-saa-false.log`task 145 全链 + 无 persistTrace 行)、`/root/round3-e2e-*.out`
- 构建:`/root/build-lane-s`HEAD aff886d1含 703e462cjar `game-cloud/huijing-server/target/huijing-server.jar`09:19
- 启动器:`/root/launch-round3-saa.sh`(密钥 NEWAPI_KEY/MYSQL_ROOT_PASSWORD/REDIS_PASSWORD 从 live 进程 environ 注入子 JVM绝不打印/入命令行);断言器 `/root/round3-assert.sh`MySQL `--defaults-extra-file`,禁明文密码)。
- **清理**:隔离实例 `:48090` 已停(无 java 进程、无 systemd 单元、48090 不监听harness 孤儿e2e/serve-and-play/play.cdp/chrome已清**live :48080 未动**pid 479414feed/admin 200。生成入隔离同库的草稿/任务/版本9319/9324 等)入同库不污染 live 运行态feed 过滤未发布)。
> 验证状态trace=true 真库(含键集/guards/readiness 五读点)/ trace=false additive NULL / 进程内非 HTTP 非 HMAC / 修复在可跑 jar = **均带真库行 + 日志实证 + javap全 PASS**。split-brain **真库已闭合**

View File

@ -18,6 +18,7 @@
### agentic 基建(当前主线 HJ-AGI-002 = SAA-only
- `2026-06-15-SAA-AgentScope-agent平台-目标架构-review.md` — 当前 agentic 编排目标架构(决策口径)
- `2026-06-15-SAA-能力API接入-dossier.md` — SAA API / 坑 源码权威档(落地照此)
- `2026-06-17-组B-SAA路trace接线-execution.md` + `2026-06-17-round3-SAA-trace-split-brain-real-db-verdict.md`**已收口**SAA 路回调 trace 观测 split-brain 闭合(`703e462c` 已落+真库验dispatcher=saa `trace_json` 真非空/开关关 NULL组B 9d/D11/D9 可观测在 SAA 主力路生效)。遗留 follow-upF5=组B `ReadinessScorer` H_progress-asBool 既存 bug、F3=SAA cost 折¥、早期 boot SAA fast-fail 预热Round2 §7-2
### 引擎 / Runner v2线已收口留 SoT + 全弧顶层)
- `2026-06-11-T1引擎终裁包.md` — Tier1=LittleJS 选型 SoT含复议权 §4.5