docs(distill): Lane D2 Round1 学习蒸馏回填——4 处就近落档(split-brain铁律/隔离-D真验/localStorage走查/防悬空提交)
把 Round1 四条已验证学习整合进既有文件(就近插入·保持风格·零孤儿新文件): - saa-graph-orchestration §6:铁律「worker succeeded ≠ 准予发布」(split-brain 防线)——九门 runnableOk=机制可玩 ≠ 准予发布,发布裁决归治理层,生产化前安全门由 W-G1 GP9 接管(来源 Lane B agent-loop-v1 退役登记) - staging-ops §3:配方「隔离实例 + -D 注入真验 feature-flagged 后端改动」——起 :48090 隔离实例、JVM -D 注开关+safety baseUrl/key/model,零改 repo/yaml、live 不动(来源 Lane E G1 GP9 10/10 真验) - ui-walkthrough-cdp §3:小配方「localStorage 注入 token 过 requiresAuth 走查」——免登录直达受保护页只读走查(来源 Lane E G0) - 2026-06-16-生成引擎-并行编排 §3:硬规则#7「ultracode 并行 worktree 防悬空提交」——git ops 必须 git -C <worktree>、禁 commit 主 checkout、主 agent 推送前核验 commit 真在其分支(来源 Lane E 错落成悬空 commit 已 cherry-pick 救回) README 索引无需动(4 处均为既有文件内容补充,非结构性增删改名)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
0e8e36e517
commit
7de582e4c7
@ -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 七值枚举内)。
|
||||
- 🔴 **铁律「worker succeeded ≠ 准予发布」(split-brain 防线)**:SAA worker 跑通九门(`runnableOk` = **机制可玩**:能加载/不崩/有终态)**不等于**准予发布。**发布裁决归治理层**——对抗 P0 安全审查(注入/越权/恶意资源)、金丝雀完玩率、人工二审,是与"机制可玩"正交的另一维。生成路**生产化前**,安全门须由 **W-G1 GP9 合规段接管**(10 负例 staging 真验),worker 自身只产"机制可玩"信号、**无权置位 published**。两者混为一谈 = split-brain(worker 自评准予上架)。来源:agent-loop-v1 退役登记(Lane B)。
|
||||
|
||||
## 7. 验证门(无 harness 端口也能验大半)
|
||||
|
||||
|
||||
@ -30,6 +30,16 @@
|
||||
|
||||
> **高风险/整机重部署安全变体——隔离验证后再切(2026-06-16 整机改新命名空间 `com.wanxiang.huijing` 实证)**:步 4 构建出新 jar 后,**先用新 jar 在隔离端口(如 `:48090`)+ staging profile 起一个实例,live `:48080` 全程不动**;在隔离实例上验全(Flyway 全绿无冲突 / health 200 / **本波新端点逐个 200 code=0** / 免短信登录拿 token)。**隔离验全过才切**:停老 → `start-app.sh` 起新 → 复验(同上 + `smoke-test.sh`)。任一步 fail → 停新、用 `/tmp` 备份 jar 恢复 `:48080` → 确认 live 恢复。**严禁无隔离验证就切 live;备份 jar 留到复验全过再删。** 注:start-app.sh/模块名随命名空间改名已更新(`huijing-server`),重部署前核对 jar 路径与现命名空间一致。
|
||||
|
||||
> **隔离实例 + `-D` 注入「真验 feature-flagged 后端改动」(不切 live、零改 repo/yaml)——2026-06-16 Lane E G1 实证(GP9 10/10 真验即用此法)**:要在 staging 真跑一个**默认关闭的 feature-flag 后端改动**(验它打开后行为对、关着时现行字节不变),**不要改 repo 里的 `application-staging.yaml`、也不要重部署 live**。配方:用**已部署的 jar**(或步 4 新 jar)在**隔离端口**(如 `:48090`)起一个实例,开关与外部依赖**全经 JVM `-D` 注入**,例:
|
||||
> ```bash
|
||||
> java -jar <fat.jar> --server.port=48090 --spring.profiles.active=staging \
|
||||
> -Daigc.control-plane.enabled=true \
|
||||
> -Daigc.safety.base-url=http://100.64.0.8:3000 -Daigc.safety.api-key=<key> -Daigc.safety.model=<model>
|
||||
> ```
|
||||
> Spring 的 `-D`/`--key=val` 优先级高于 yaml,故**开关与 baseUrl/key/model 临时注入即生效,repo 与 live 实例一行不动**。在此隔离实例上跑负例集真验(如 10 条恶意 brief 全被 GP9 拦),验完即停,**flag 在主干仍默认关 = 现行字节零变**。与上一条「整机重部署安全变体」互补:那条是"新 jar 验全过才切 live",这条是"现行字节不动、只临时验一个 flag 行为"。
|
||||
|
||||
> **教训速记(区分两个隔离用法)**:同样起 `:48090` 隔离实例——「重部署安全变体」目标是**最终要切 live**(验全过 → 停老起新);「`-D` 注入真验 flag」目标是**永不切 live**(只验 flag 行为,验完即停,主干字节不变)。混用会误把"只想验 flag"做成了"切 live"。
|
||||
|
||||
## 4. 构建/测试门(红线)
|
||||
|
||||
- **`vue-tsc --noEmit` 是假门禁**,前端验证一律 `npm run build`。
|
||||
|
||||
@ -24,6 +24,12 @@
|
||||
- 入口 `:4173`;受控 textarea 填值 = **原型 setter + dispatch input 事件**(触发 Vue v-model,直接赋值无效);
|
||||
- 点按钮用精确文案匹配防子串误中(`includes('满意')` 会误中「不满意,重做」);
|
||||
- 截图 `cat` 管道拉回本地用 Read 查看;游戏试玩复用 `player_cdp.play()`(批跑必须 `continue_on_demo=False`)。
|
||||
- **localStorage 注入 token 过 `requiresAuth` 走查(免登录直达受保护页只读走查)——2026-06-16 Lane E G0 实证**:只想**只读核实**一个 `meta.requiresAuth` 的页面(如创作页),不必走完整登录表单。先后端拿一枚有效 token(如免短信登录端点 / `test1` token),再用 CDP 在**目标 origin 下**注入 localStorage 后再导航:
|
||||
```python
|
||||
evaljs("localStorage.setItem('ACCESS_TOKEN', '<token>')") # key 名以前端约定为准(查 utils/auth);有的还需 refreshToken/tenantId
|
||||
nav("http://localhost:4173/<受保护路由>") # 注入后再导航,路由守卫读 token 即放行
|
||||
```
|
||||
坑:① **必须在同 origin 已开的 target 里 setItem**(localStorage 按 origin 隔离,先 `nav` 到 `:4173` 任一页建立 origin 再 set,空白页 set 不生效);② key 名/附加字段以前端真实约定为准(错名=守卫仍判未登录弹回登录页);③ 仅供**只读走查**,真链路验收(创建→生成→发布)仍要走真登录路径。
|
||||
|
||||
## 4. admin 走查(审核台,链路②)
|
||||
|
||||
|
||||
@ -97,6 +97,7 @@ flowchart TB
|
||||
4. **契约缝 = 契约先行**:接缝三件(FeedCard `templateName` / `sort_score` 多因子 / streaming SSE)——后端 session 先改 `contracts/` + 实现后端半、**通知 studio session** 接前端半;禁绕过契约直接联调。
|
||||
5. **公平性铁律(Lane D 专属)**:`roles.py` 与 `SaaPrompts.java` 的 gatespec 规则**字符级一致**,改一侧必同步另一侧(Python 先、SAA 逐字跟进)。
|
||||
6. **非阻断/可回滚**:观测类(组B 三件)落库失败一律 best-effort 吞异常不阻断主链;新增列/字段 additive 可空、feature-flag 全关 = 现行字节不变。
|
||||
7. **ultracode 并行 worktree 防悬空提交(Round1 血泪铁律)**:子代理在**预建 worktree** 内做 git 操作,**必须 `git -C <worktree> ...`**(或先确认 `pwd` 在 worktree 内)——**严禁 commit 到主 checkout `/root/games-development-ai`**。主 agent 推送前**逐车道核验 commit 真落在其分支**(`git -C <worktree> log --oneline -n` / `git log <lane-branch>`);若 commit 错落主 checkout 成悬空(HEAD 移走后 `git log` 不见、仅 reflog/`git fsck --lost-found` 可寻)→ 用 `git cherry-pick <sha>` 找回到正确分支再推。来源:Round1 Lane E 子代理把提交错落主 checkout 成悬空 commit(已 cherry-pick 救回)。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user