diff --git a/.agents/skills/saa-graph-orchestration.md b/.agents/skills/saa-graph-orchestration.md index b5e91f99..3c53120d 100644 --- a/.agents/skills/saa-graph-orchestration.md +++ b/.agents/skills/saa-graph-orchestration.md @@ -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 端口也能验大半) diff --git a/.agents/skills/staging-ops.md b/.agents/skills/staging-ops.md index 7eab81fa..95955ed7 100644 --- a/.agents/skills/staging-ops.md +++ b/.agents/skills/staging-ops.md @@ -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 --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= -Daigc.safety.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`。 diff --git a/.agents/skills/ui-walkthrough-cdp.md b/.agents/skills/ui-walkthrough-cdp.md index 4742cb4f..8883fc06 100644 --- a/.agents/skills/ui-walkthrough-cdp.md +++ b/.agents/skills/ui-walkthrough-cdp.md @@ -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', '')") # key 名以前端约定为准(查 utils/auth);有的还需 refreshToken/tenantId + nav("http://localhost:4173/<受保护路由>") # 注入后再导航,路由守卫读 token 即放行 + ``` + 坑:① **必须在同 origin 已开的 target 里 setItem**(localStorage 按 origin 隔离,先 `nav` 到 `:4173` 任一页建立 origin 再 set,空白页 set 不生效);② key 名/附加字段以前端真实约定为准(错名=守卫仍判未登录弹回登录页);③ 仅供**只读走查**,真链路验收(创建→生成→发布)仍要走真登录路径。 ## 4. admin 走查(审核台,链路②) diff --git a/docs/agent-specs/2026-06-16-生成引擎-并行编排.md b/docs/agent-specs/2026-06-16-生成引擎-并行编排.md index 77baed3d..bef32725 100644 --- a/docs/agent-specs/2026-06-16-生成引擎-并行编排.md +++ b/docs/agent-specs/2026-06-16-生成引擎-并行编排.md @@ -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 ...`**(或先确认 `pwd` 在 worktree 内)——**严禁 commit 到主 checkout `/root/games-development-ai`**。主 agent 推送前**逐车道核验 commit 真落在其分支**(`git -C log --oneline -n` / `git log `);若 commit 错落主 checkout 成悬空(HEAD 移走后 `git log` 不见、仅 reflog/`git fsck --lost-found` 可寻)→ 用 `git cherry-pick ` 找回到正确分支再推。来源:Round1 Lane E 子代理把提交错落主 checkout 成悬空 commit(已 cherry-pick 救回)。 ---