Commit Graph

981 Commits

Author SHA1 Message Date
lhk229 ca6a3cd4cd 修复M1策划链路可靠性
Project CI / Repository checks (pull_request) Failing after 17s
Project CI / Backend tests (pull_request) Failing after 17s
Project CI / Frontend tests (pull_request) Successful in 2m45s
Project CI / Native shell tests (pull_request) Failing after 11m32s
阻止人工核对中的策划根写入审批回执

在投影恢复前校验项目身份并使用唯一项目ID

增加策划能力停用门禁与既有sidecar只读行为

拒绝非法plan与自主构建档位组合并收紧消费者

补齐前后端回归测试与M1技术决策记录
2026-08-19 09:13:43 +00:00
lhk229 e0dc87b21c 修复M0A-2给做游戏路径引入的两处收束死路
design-foundation 在非 scheduler 路径上恢复 command.run_limited。内部产物验证只在
agent-ready-task-scheduler + Supervisor parent + gui/cli 根的可信 DAG 上发放,而
policy.rs 按 agent_id 单判就拒掉手动验证,委派路径两头落空、无从收束;master 的
白名单含该工具且自身用例断言不拦。判据只对 design-foundation 读绑定,其余三个固定
owner 的委派路径未经核实,维持现状不一并放宽。

game-chat 美术回执去掉本人 canvas.asset_generate 证据等三条必要条件。提示词要求
已有有效同路径资产时不得重复生成,而缺口判据只看非返工那一轮,合法的幂等复用会被
判成尚未交付。

测试恢复 master 断言并删去分支追加的钉桩段,未新增用例。policy 143、
design_foundation 6 全通过,cargo fmt --check 干净。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-19 06:31:21 +00:00
lhk229 6d5afd9f6d 修正M1首页立项入口
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Successful in 2m54s
Project CI / Native shell tests (pull_request) Failing after 6m13s
仅让首页做方案进入立项策划

恢复做游戏和做素材的直接构建路径

同步入口合同与回归测试
2026-08-19 05:27:53 +00:00
lhk229 7eee259cea Merge branch 'feat/five_min_design' into codex/genarrative-isolated
Project CI / Backend tests (pull_request) Failing after 12s
Project CI / Repository checks (pull_request) Failing after 12s
Project CI / Frontend tests (pull_request) Successful in 2m40s
Project CI / Native shell tests (pull_request) Failing after 11m26s
2026-08-18 14:22:00 +00:00
lhk229 e3d318bf45 完成M1E提交拒绝有界收束
为 Fast GDD 提交拒绝新增持久化次数上限与恢复收束。

将既有权威事实的超限和版本边界转入 reconciliation。

同步 M1E 技术方案与项目决策记录。
2026-08-18 14:20:23 +00:00
lhk229 4687807dc1 在hydrate调用点写明投影修复先于身份校验的前提
Project CI / Repository checks (pull_request) Successful in 1m1s
Project CI / Frontend tests (pull_request) Successful in 2m57s
Project CI / Backend tests (pull_request) Successful in 3m58s
Project CI / Native shell tests (pull_request) Successful in 14m46s
裁决为不修,并把改动前提与非重入锁陷阱留在代码旁

第 18.3 节要求身份校验(第 3 步)先于 session 前滚(第 5 步)与 index/pending
重建(第 6 步),而 hydrate 的实际顺序相反。本次裁决为不修,理由与前提写进注释:

现在没有后果,是因为那道比对恒过——App 的全部 init/import 调用点都传同一个常量
seedManifest.projectId(local-project-draft),本机每个项目的 manifest 写的都是它,
projectId 分辨不出任意两个项目。该常量不属本工作包管辖。

触发后的后果也已复核为可忽略:命令仍正确返回 PLAN_PROJECT_ID_MISMATCH,前端拿不
到错数据;报错前写入的 pending/session/index 均为幂等或可重建投影,usage fold 有
按 fact 比对的幂等守卫,session.previous.json 是改名而非删除且只在 primary 缺失时
发生(即本来就该做的恢复)。

一旦 projectId 改成每项目唯一,这道校验才真正开始工作,届时顺序必须一起改,否则
hydrate 会先对一棵属于别的项目的 planning 树做完投影修复才发现认错人。注释里连同
陷阱一并写明:不能把 reconcile 直接挪到 hydrate 取锁之后——它自取项目锁,而
.agent/project.lock 是 create_new(true) 非重入的,调用方持锁再进去会死等满重试预算
然后失败;可行路径是锁外 projectId 预检,或把 reconcile 拆成薄壳 + _at_locked 由
hydrate 在自己的锁内调用(同型拆法见 observe_agent_runtime_agent_delegate)。

把提醒放在代码旁而不是只留在 decision-log,是因为真正会改 projectId 方案的人不在
本领域,不会来读这份文档。

cargo fmt --check、check:encoding 通过;纯注释与文档,无行为改动。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 12:45:46 +00:00
lhk229 d44f930d1f 收口design组展示名,改为设计实现Agent
分组字典、manifest默认名与分组头像字一并改掉

个体Agent名兜底跟进,玩法策划Agent与内部id不动

跟改16处由label派生的断言

第 18.2 节要求 design 组用户名称改为「设计实现组」,与新阶段「立项策划」区分。
bf2185fba 只改了 taskGroupLabels 一本字典,另两本同概念字典没动,于是同一个
design 组在开发者面板/文本汇总里叫「设计实现组」、在工作台状态栏里叫
「策划 Agent」——这个语义不一致是该提交引进来的。

先更正一条此前的判断:曾把这条的严重度建立在「新项目默认主路径上『立项策划』
与『策划 Agent』同屏共存」上。该说法未经验证且不成立——用 appSurface harness
实测策划路径,子 Agent 状态栏根本不渲染,策划 Agent 出现 0 次。结构上二者确在
launcherView === 'project-development' 分支的同一棵树里,但未能把用例驱动到该
分支,故不作为事实主张。若真会撞,也是批准后进入完整制作那一段,比原描述窄
得多。改这条的理由与撞不撞名无关,只是第 18.2 节的要求 + 上述不一致。

口径取最小方案:保持兄弟项的「X Agent」体系,design 取「设计实现 Agent」。
不把 taskGroupLabels 直接塞进 groupConfigs——两本字典命名体系不同(「X组」对
「X Agent」,且音乐组/音频 Agent、运营组/发布 Agent 连词都不一样),直接替换
会连带改掉另外五个分组名;消灭重复字典属视觉改版,单独立项。

改动:agentPresentation.ts 的 groupConfigs、view/project-development/index.tsx
的 summarizeAgent 默认名与同文件分组头像字(策→设)、model.ts 中
agentId.includes('design') 的个体名兜底(design-director 走这里)。
design-foundation 的「玩法策划 Agent」单列在前,不变;内部 agent id 与 design
分组键均未动。

测试量原估「3 处断言」严重低估,实跑发现 project-development.suite.ts 有 16 处
派生断言需跟改——「X 文本回执」由 App.tsx 的 `${candidate.label} 文本回执` 拼出、
「历史成果 · X」由 resourceProjectionModel.ts 拼出、dock 的 article accessible
name 亦然。替换用后行否定守住「玩法策划 Agent」(它含「策划 Agent」子串),
替换前后该串恒为 6 处。agentRuntimeModel.test.ts 与
projectResourceProjectionModel.test.ts 里剩余 4 处是测试自造的输入 fixture、
不由字典派生,保持不动。

验证:appSurface.test.ts 383 passed / 0 failed;agentRuntimeModel、
agentTraceSummary、projectResourceProjectionModel、projectResourceLiveUpdateModel
合计 39 passed;agc:typecheck、ESLint --max-warnings 0、check:encoding、
git diff --check 通过。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 12:20:01 +00:00
lhk229 7ca82ba7aa 修复M1D审查发现的锁错误脱敏与澄清轮次口径
审批卡链路的三处项目锁错误改为脱敏后再进typed错误

阶段进度按等待状态显示真实轮次,不再透传0-indexed值

去掉reconcile错误的重复code拼接

补一条Rust脱敏回归与两条前端轮次回归

锁错误脱敏(方案 §18.3「返回值不包含绝对路径……或内部诊断」):
acquire_project_write_lock 的 Err 内嵌 .agent/project.lock 真实绝对路径。补
redact_agent_runtime_project_paths 的三处是前端审批卡真正会显示的那条链——
reconcile_plan_gdd_approval_projections_at(hydrate 在取自己的锁之前调它)、
hydrate 自己的锁、decide_plan_gdd_at(其错误与 hydrate 的错误渲染在同一个
错误区)。planning 另有 14 个取锁点沿用未脱敏写法,属 M1B/M1C 既有模式,
本次不扩面。脱敏不破坏「项目正在被其他写操作占用:」前缀,project_gates.rs
与 provider_recovery.rs 两处按前缀分类的判据不受影响。

澄清轮次口径:clarificationRound 与 awaitingAnswerFor.round 都由
static_delegate_lineage_counters 派生,该函数排除目标自身,是 0-indexed 的
「已答轮数」;后端判上限用的是 current_round + 1。原样渲染成「轮次 X/3」
整体差一格——问最后一轮时显示「轮次 2/3」,字面暗示还剩一轮。只改前端
文案、不动 DTO 语义:等待回答时显示「第 N+1 轮 / 共 3 轮」(此时
latestDelegationId 就是当前 delivery,+1 恰好等于后端校验用的轮次),
其余状态退回「已完成 N/3 轮澄清」,不猜当前轮。

顺带:planning_hydrate.rs 里 reconcile 的错误原本用同一 code 把 to_string()
当 detail 重包一层,而 PlanningStorageError 的 Display 已是「{code}: {detail}」,
渲染出 CODE: CODE: detail;code 与 detail 均无变化,改为直接 ? 传播,并把
「不重复拼 code」钉进回归。

测试陷阱:写「占住项目锁」的 fixture 必须给锁 JSON 填真实 createdAt。失效锁
回收的年龄判定读的是该 JSON 字段而不是文件 mtime,填 0 会让锁显得约 1.7e9 秒
老、越过 600 秒阈值被当场回收删除,hydrate 反而成功。第一版 fixture 正是这样
自证失败的,注释已写明。

验证:Rust planning_ 组 155 passed / 0 failed(原 154 + 本次 1 条);
appSurface.test.ts 383 passed / 0 failed(378 原有 + 5 条新增);三条新回归均经
变异验证,逆转对应修复即变红。cargo fmt --check、agc:typecheck、ESLint
--max-warnings 0、check:encoding、git diff --check 通过。

撤回一条此前的审查发现:曾判定 hydrate 读 manifest 缺符号链接判定。复核后不
成立——read_manifest 自身在 is_symlink 处即拒,防护在另一层;.agent 目录本身
为符号链接的残差也无窗口,紧随其后的 resolve_planning_path 同样逐段判定。
未据此改动代码。

新记一条既有问题(非 M1D 引入):seedManifest.projectId 是常量
local-project-draft,App 的 5 个 init/import 调用点全传它,因此本机所有项目
projectId 相同。§18.3 第 1 步依赖的 projectId 校验因此分辨不出任意两个项目,
该门当前近乎恒真,须单独立项。

仍未修:hydrate 身份校验排在落盘投影修复之后(修它须注意 reconcile 自取项目
锁、.agent/project.lock 不可重入,不能把检查直接挪到 hydrate 取锁之后);
design 组展示名剩两处硬编码,且与 taskGroupLabels 命名体系不同,需先定口径。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 11:50:43 +00:00
lhk229 abcc393fde 修复M1D审查发现的审批决定失败路径
决定失败也重灌权威状态,顺序钉死为先hydrate后写错误

responseId复用键纳入comment,改写修改意见时换新ID

恢复期门控扩到已打开的评论弹层,保留已输入内容

补appSurface harness的策划command分发与三条变异验证过的回归

审查基线为 14c00017c..bf2185fba(技术方案第 13、18 节)。其后分支已前进到
c6a08ef98,4624fd795 与 c6a08ef98 都不动 src/**,审查结论不受影响。

三条缺陷:

1. decidePlanGdd 只在成功分支 hydrate。后端 decide_plan_gdd_at 有多条真实
   PLAN_STALE_APPROVAL 分支(GDD 不在当前 lineage、identity 不符、版本被取代、
   pending 丢失),命中后卡片停在已失效的 pending 身份上、三个决定按钮仍可点,
   且 recoveryPending 永不翻真导致「重试恢复」入口不渲染,卡内没有恢复路径。
   现按第 18.3 节在失败分支同样 hydrate——该句不区分成功与失败。两句顺序不能反:
   hydratePlanGddState 入口会 setPlanGddError(null),先写错误再 hydrate 会把错误
   擦掉;回归钉死了这个顺序。

2. responseId 复用键为 approvalRequestId:action,不含 comment,违反第 13.2 节
   「改变 action/comment 必须生成新 responseId」。在第 14 节承认的「receipt 已提交
   但 response 丢失」构造下,改写修改意见后重提会带旧 ID,命中后端「同 responseId
   的审批意图不一致」硬拒,改写后的原因永远落不了盘。现按 approvalRequestId 存
   {action, comment, responseId} 全量意图。判据方向为宁可多换不可少换:多换的最坏
   后果是 replayed 降级成 already-decided(都是 Ok,且 already-decided 正是第 18.2
   节要求的刷新态),少换是硬错误。

3. 第 18.2 节「recoveryPending 时不允许提交决定」原来只作用于三个触发按钮,而弹层
   是打开之后才可能被后台 hydrate 翻掉资格的,其提交按钮只看 busy 与非空。现在
   submitComment 与该按钮都判 canDecide。刻意不自动关弹层,否则会丢掉用户已经写好
   的修改意见。

测试:harness 新增 hydrate_game_creator_plan_gdd_state 与
decide_game_creator_plan_gdd 分发分支及 createPlanGddStateView fixture;未配置策划
状态时 hydrate 与接入前一样抛出,既有 378 条行为不变。新增 plan-gdd.suite.ts 三条
回归并逐条变异验证——逆转对应修复后三条各自以自己的断言变红;修复二的变异是部分
逆转(保留新 Map 结构、只删 comment 比对),因此钉住的是 comment 这一维本身。

验证:appSurface.test.ts 381 passed / 0 failed;agentTraceSummary 与 rememberCommand
(另两个 import src/App 的用例文件)13 passed;agc:typecheck 通过;6 个改动文件
ESLint --max-warnings 0 通过;check:encoding 5409 文件通过;git diff --check 干净。
不改 Rust——三条全在前端,后端语义已经正确。

文档:更正第 23.8 节 M1D-1 行误引的合入提交(5b11a0530 是 ESLint 修正,落地是
0052a80da),并补 M1D 审查修复快照。同时更正既有记录里「Shell typecheck / appSurface
受仓库依赖缺失阻断」的说法——在原分支主工作树上两道门都干净,实际是 bf2185fba 改名
taskGroupLabels.design 后自己把 8 个用例文件断言改红,由 c6a08ef98 补修。

未并入的四条审查发现:hydrate 身份校验排在落盘投影修复之后(第 18.3 节固定顺序,
session.previous.json 提升+删除不可逆);锁竞争错误回传项目绝对路径(第 18.3 节);
design 组展示名剩两处字典未改(第 18.2 节);阶段进度轮次差一格。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 11:11:18 +00:00
lhk229 c6a08ef98f 修复M1D前端文案回归断言
Project CI / Repository checks (pull_request) Successful in 1m24s
Project CI / Frontend tests (pull_request) Successful in 2m55s
Project CI / Backend tests (pull_request) Successful in 3m58s
Project CI / Native shell tests (pull_request) Successful in 14m43s
同步立项入口与设计实现组展示文案的测试期望

恢复Frontend tests与Native shell tests中的前端测试覆盖
2026-08-18 09:35:28 +00:00
lhk229 bf2185fba0 完成M1D-2入口分流与阶段进度
Project CI / Repository checks (pull_request) Successful in 1m28s
Project CI / Frontend tests (pull_request) Failing after 2m4s
Project CI / Native shell tests (pull_request) Failing after 2m58s
Project CI / Backend tests (pull_request) Successful in 3m45s
游戏新项目默认进入立项策划并保留直接开建路径

项目总控页面挂载GDD审批卡与阶段进度

同步策划展示名称、定向测试与开发日志
2026-08-18 09:11:38 +00:00
lhk229 9bad7121b5 修复 Native shell tests 既存红:委派用例改调 _at_locked
Project CI / Repository checks (pull_request) Successful in 1m24s
Project CI / Frontend tests (pull_request) Successful in 2m58s
Project CI / Native shell tests (pull_request) Successful in 14m58s
Project CI / Backend tests (pull_request) Successful in 3m56s
CI task 3784 的 Native shell tests 报 2121 passed / 3 failed,三条同因:

  agent.delegate -> failed, "无法取得一致项目快照"
  项目正在被其他写操作占用:$PROJECT_ROOT/.agent/project.lock

- autonomous_direct_child_collaboration_mutations_require_the_current_root
- autonomous_delegate_descendant_inherits_and_enforces_the_current_root_guard
- standard_delegate_collaboration_mutations_remain_compatible

根因是又一次「把动作挪到调用链更前面,改变的不是严格度而是作用范围」。
bc1fe7d8f 写这几个用例时,观察点是「测试先持项目写锁、再调
observe_agent_runtime_agent_delegate」,当时无害:老薄壳压根不碰项目锁,它调的
start_..._with_link_at 只对 planning 身份取锁,其余身份走
..._with_project_lock_at(..., None)。

152cc40c7(完成 M1C-2b 策划澄清与预算接线)为了让 planning 子 session 的投影按
project -> session 取锁,把锁的所有权上提,拆出
observe_agent_runtime_agent_delegate_at_locked,并让同名薄壳在入口无条件取项目写锁。
而 .agent/project.lock 是 create_new(true) 的文件锁、不可重入:调用方已持锁再进薄壳
就死等满 2000x5ms 预算再失败。确定性红,不是抖动——本机复现逐字一致。

这不是生产漏洞。生产侧调 agent.delegate 的只有 action_execution.rs:436 和
pending_recovery.rs:162,两处都持锁后调 _at_locked;取锁的薄壳如今零生产调用方,
只剩测试在用(main_loop_tests、autonomous_completion_contract_tests 那些都不持锁,
所以一直是绿的)。所以改测试面,生产代码零行改动。

- delegation.rs 四处(2515/2584/2678/2740)改调 _at_locked 并传入已持有的
  &project_lock。这不是迁就实现:_at_locked 才是生产唯一的调用形状,改完这三个用例
  覆盖的是真实路径。首处留注释说明为何必须绕开同名薄壳——否则下次「顺手统一」回去
  会复发,而症状是 10s 静默卡顿,很难往锁不可重入上想
- runtime_tools.rs 补一条 #[cfg(test)] pub(crate) 再导出。生产侧靠
  pub(in crate::agent) 的 glob 即可见,测试模块在 crate::agent 之外需单独放行;
  沿用旁边 #[cfg(test)] pub(crate) use delivery::{...} 的既有写法,不动生产可见面

验证:tests::collaboration::delegation 改前 22 passed / 3 failed(18.68s),改后
25 passed / 0 failed(5.54s)。少掉的 13 秒正是三条各自空等 10s 锁预算的量——那三次
等待没再发生,不是断言被放宽。cargo fmt --check 干净。

另记一条前提更正:AGC shell crate 是有 CI 的。project-ci.yml 的 native-shell-tests
job 跑 npm run check:native-shells,本次覆盖 2124 条。此前「这个 crate 在 CI 里从不
编译也不测试」的判断是错的。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 08:35:27 +00:00
lhk229 5b11a05303 修复 M1D-1 带进的 eslint 红:import 排序与 hook 依赖判据
Project CI / Repository checks (pull_request) Successful in 1m28s
Project CI / Frontend tests (pull_request) Successful in 3m45s
Project CI / Native shell tests (pull_request) Failing after 11m46s
Project CI / Backend tests (pull_request) Successful in 4m25s
CI task 3777 的 Repository checks 停在 lint:eslint,前面的 encoding / git-hooks /
rustfmt / spacetime schema / production-ops / preview-deployer / maintenance-page
全绿。三条问题全在 0052a80da 自己动的两个前端文件里。

- simple-import-sort:新加的 PlanGddDecisionAction / PlanGddStateViewV1 插在了
  PendingCommand 前面(ASCII 序 Pending < PlanGdd),ProjectWorkspaceChatPane 里
  GddApprovalCard 也落在同目录组末尾。autofix 修正

- react-hooks/exhaustive-deps 是 warning,但 lint 脚本带 --max-warnings 0,一样退 1。
  这条不能靠补依赖解决:该 effect 的依赖只挖 phase/status/updatedAt 三个标量,正是
  为了避开轮询每轮新建对象的身份变化;把 projectSupervisorRuntime 本体写进依赖会让
  每个 tick 都触发一次 hydrate。改的是判据侧——存在性从整个对象换成必选字段
  status(AgentRuntimeState.status: string 必选,为 undefined 当且仅当 runtime 为
  null),语义等价且不再引用裸对象

本地 npm run lint:eslint(全仓,--max-warnings 0)、npm run typecheck、
npm run check:encoding 均通过。typecheck 是 CI 未走到的下一步。

另记一笔:.husky/pre-commit -> lint-staged -> scripts/lint-staged-eslint.mjs 会拦这
两类(自动修 import,且 errorCount 或 warningCount 非零即置退出码),本 worktree 的
core.hooksPath 也确实指向 .husky/_。这三条能进库说明 0052a80da 绕过了钩子。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 08:08:57 +00:00
lhk229 0052a80dad 完成M1D-1策划状态与审批卡
Project CI / Backend tests (pull_request) Successful in 4m1s
Project CI / Repository checks (pull_request) Failing after 1m0s
Project CI / Frontend tests (pull_request) Successful in 3m2s
Project CI / Native shell tests (pull_request) Failing after 11m50s
新增严格输入的策划状态 hydrate command 与 plan-gdd-state-view.v1 read model

接入 GDD 审批卡、正文详情弹层、决定幂等与恢复重试

补充 M1D-1 开发日志和技术方案状态
2026-08-18 07:56:20 +00:00
lhk229 c85452795d Merge remote-tracking branch 'web/master' into feat/five_min_design
Project CI / Native shell tests (pull_request) Failing after 1m55s
Project CI / Repository checks (pull_request) Successful in 1m56s
Project CI / Frontend tests (pull_request) Successful in 2m55s
Project CI / Backend tests (pull_request) Successful in 3m43s
2026-08-18 06:16:47 +00:00
lhk229 0abdc41c3c M1C-2c 收口:分隔符集合补全角冒号,并钉住 label 与回答的同尺比对
分隔符集合原本只有 `·`/`:`/`-`。prompt 全中文、实测用的是 DeepSeek 系模型,在中文
语境下写 `A:方案名` 是高频输出;漏掉全角冒号的后果不是判错,而是合法信封被判形状
错误、回灌重试,白吃一个未推进回合预算——而第 23.9 节自己就记着无界重试把单次
prompt 撑到 15 万 token 的实测。

- PLAN_OPTION_LABEL_DELIMITERS 补 `:`;prompt 的 label 说明与技术方案 §5.1、§5.2、
  §23.9 三处分隔符合同同步改口,避免两侧各写一份
- 回归 planning_clarification_accepts_fullwidth_colon_option_labels。变异验证:
  去掉 `:` 后该用例立刻红

另外收回一条误报。此前判断「答案走 normalize_plan_text 被 trim、label 是信封原文没
trim,模型吐带尾随空白的 label 会让用户点选 A/B 掉进自由填写分支、台账记成
user_freeform」。写完测试做变异验证时把改动回退,用例照样绿;查下去发现
user_input.rs 的 normalize_single_line_user_input_text 在信封严格解析时就已经 trim
过 label(并拒掉含换行的 label)。两边本来就是同一把尺子,不对称不存在。

- 生产侧只把比较抽成具名函数并在原地写清它依赖的是解析侧那条 trim,不做多余的重复
  规范化——那会把一个不存在的风险写进代码
- 保留 planning_clarification_option_pick_survives_untrimmed_label,它钉的是上游那条
  不变量:解析侧哪天不 trim 了,这条会红
- 测试脚手架加 *_with_labels 变体,让用例能注入自定义 label;原有 helper 转为薄包装

planning_clarification_ 16/0、plan_ 160/0、recovery 107/0,fmt 干净。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 06:15:25 +00:00
lhk229 6234b420fc 修复 HEAD 既存红:策划恢复门用例改建可达状态
planning_recovery_contains_session_identity_conflict_before_provider 自 M1C-2b
(152cc40c7)写下起一天都没绿过:它伪造一个 source=agent-background-task、且没有
Run Profile 绑定的策划任务,而 agent_runtime_tool_policy_snapshot_for_run_at 早在
M1A-2(09c7d7af8,152cc40c7 的祖先,已核对该门在 152cc40c7 当时就一模一样)就按
agent 身份挡死了这种 run。被告造不出来,庭开不了。当时的定向门禁过滤器
planning_clarification_* 恰好匹配不到它的名字,加上本 crate 不在 CI 里编译,两层
网都没接住。

那道创建门不能放宽:放宽后伪造的策划 run 就能拿到默认宽工具面,正是 M1A-2 关掉的
洞。所以改测试而不是改生产代码。

也不删:该用例第四条断言「身份门必须早于任何 Provider lifecycle」是全 crate 唯一
一处该不变量的否定断言(AGENT_RUNTIME_PROVIDER_REQUEST_LIFECYCLE_RECORD_TYPE 共
22 处引用,否定断言仅此一处),且 plan_session_recovery_gate_tests 模块只有这一条
用例,删掉等于整个门失去覆盖。

先试了更贴现实的「事后删父绑定」,实测走不到本门:entrypoints 的 tool policy 收容
(currentAction=Run Profile 工具策略需要人工核对)先把 run 打成 failed,
read_recoverable_... 随即不再认它,审计里只有 agent.runtime.turn。也就是说绑定层的
破坏到不了 session 门;能到这里的只有「绑定完好、task record 自身不满足 D11 契约」
这一类持久不一致——这正是本门存在的理由。

- 改成:supervisor plan 根与 planning child 绑定都合法(创建门放行),但裸 start
  不带 task link,task record 上没有 parentAgentId/delegationId
- 四条断言原样保留:resume 必须 Ok(收容不外溢)、该 run failed/needs-reconciliation
  且 error 含 PLAN_SOURCE_PROFILE_MISMATCH、审计有 plan.session_recovery.
  needs_reconciliation、且没有任何 Provider lifecycle 记录
- 断言失败信息带上实际审计记录类型与 currentAction,下次判因不用再加探针
- 变异验证:把 exact_plan_child_identity_at 的策划识别翻成直接 Ok(None),用例报出
  "PLAN_NEEDS_RECONCILIATION: project-planning 恢复任务未命中 planning session 协调器"
  ——证明它确实在考这道门,而不是碰巧绿
- recovery 107/0、planning_ 151/0、session 88/0、plan_ 160/0、approval 11/0

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 06:02:33 +00:00
lhk229 73816bd512 修复 HEAD 既存红:planning session 恢复块给双锚缺失诊断让路
committed_plan_submit_without_either_anchor_is_publicly_recoverable_and_fails_closed
在 HEAD 上确定性失败(Windows 与 WSL 干净基线一致,与本轮审查修复无关):
phase 确实是 needs-reconciliation,但 error 不是「恢复锚点同时缺失」。

M1C-2b 把 planning session 恢复块插进了同一个循环,位置在
reconcile_missing_plan_submit_anchors_at 之前。该 fixture 用裸
start_game_creator_agent_runtime_task_at 建策划任务,task record 上没有
parentAgentId/delegationId,于是 exact_plan_child_identity_at 判定身份不符、
返回类型化 Err,session 块随即落 needs-reconciliation 并 continue,更具体的双锚
缺失诊断永远轮不到跑。两条都写 needs-reconciliation,谁先写谁赢,而先写的恰恰是
信息量更少的那条。

不是判错,是插在前面的门改变了哪条诊断胜出——与 M1C-1 那五条 CI 失败、与 P4
同一形状。

- session 恢复块加让路条件:该 run 是双锚缺失候选时跳过。本块只服务「将要继续」的
  continuation,而双锚缺失的 run 根本不会继续,修投影没有意义
- 选让路而不是调换两块顺序:调换会让锚点探测对所有 Agent 提前,正是「前移改作用域」
  那个坑本身。探测器只对 project-planning + agent-delegate + standard 返回 Some,
  且对已按双锚缺失收敛过的状态返回 None,因此这道让路既窄又幂等
- recovery 族 105 passed/2 failed -> 106 passed/1 failed,planning_ 150/1、
  session 87/1;剩下的唯一红是 planning_recovery_contains_session_identity_conflict
  _before_provider(另一条既存红,下一个提交处理)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 06:02:05 +00:00
lhk229 c1a70cb37d 审查发现2:验收前置门先识别 Fast GDD 再走绑定父链
ensure_plan_gdd_approval_pending_after_acceptance_locked 先用会遍历并校验整条
祖先链的 read_..._run_profile_binding 读绑定,再检查 binding.source 是否为
project-supervisor-plan。顺序反了:任何祖先绑定的毛病都抢先变成 Err,连「这根本
不是策划根」都来不及说,于是别人的坏链变成了这道门的失败。

这正是 P4(cb5af31e7)在同文件 plan_root_completion_identity_at 修过的形状,当时
漏了这个姊妹函数。而它比完成门更容易被踩到:agent.run_status 每次 status
observation 都会重跑本门(见 runtime_tools/run_status.rs 的
「Re-run the locked gate on every plan-root status observation」),那条路径上没有
任何上游守卫先把带父链的 run 挡掉,适用性完全交给门自己判。

- 识别改用 _once,只看 run 自己那条绑定记录;确认是策划根之后才走完整父链,
  严格度一点没降,只是不再作用到别人身上
- 回归 broken_ancestor_binding_must_not_fail_the_acceptance_gate_for_a_non_plan_supervisor_run:
  复用 P4 的构造(supervisor 的 isolated-join 子 run,删掉父绑定),断言门只能判
  NotApplicable。变异验证:换回链走优先后该用例报出
  Err("Agent Runtime Run Profile 父绑定缺失")

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 05:33:52 +00:00
lhk229 7e3fd411a1 审查发现1:澄清恢复的锁序重排改为让出本轮,不再掐掉整批 resume
M1C-2b 为澄清 pending 新增的「drop 执行锁 -> 取项目锁 -> 重取执行锁」重排块,
两次取锁都用裸 `?`。执行锁的重取只等 25 x 10ms,而用户刚提交澄清回答时那把锁
会被 move 进后台续跑任务、持有整个 Provider 回合,稳超等待上限;错误经
recovery_scan 的裸 `?` 上抛,掐掉 for agent_id 循环里整批 Agent 的恢复,并把一次
纯瞬时的锁竞争直接返回给前端。

锁被占恰恰说明别处正在推进,是最不该判失败的时候。同一个 commit 里的姊妹代码
(planning session 恢复窗口)已经写对:项目锁按 transient 判据 continue,执行锁
用非阻塞 try_acquire 拿不到就 continue。

- AgentRuntimePendingActionResume 新增不带锁的 Deferred,表示两把锁都已释放、
  本轮让出;批量扫描的三处 match 一律 continue
- 项目锁改为 transient 判据让路,其余错误仍带上下文上抛
- 执行锁改用 try_..._with_wait:等待宽限不变,超时是「本轮没轮到」而非「恢复失败」
- Runner 定向续跑不是批量扫描,Deferred 仍如实报错,文案沿用执行锁自己的措辞
- 回归 planning_clarification_recovery_defers_when_execution_lane_is_still_held:
  按住项目锁把恢复卡在重排窗口,抢走执行锁后放开项目锁,断言必须 Deferred。
  变异验证:回退成阻塞版 `?` 后该用例报出
  "Agent Runtime 正在执行该 Agent 的其他任务:project-supervisor"

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 05:33:36 +00:00
lhk229 6e4bd97039 收口M1C-2c决策卡A/B语义
Project CI / Backend tests (pull_request) Failing after 15s
Project CI / Repository checks (pull_request) Failing after 15s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
更新策划决策卡的A/B平行方案与原型验证合同

收紧Runtime选项校验和决定状态映射并保留用户原文

补充必要的自由填写与非法信封回归

同步更新提示词、技术方案与项目决策日志
2026-08-18 04:27:54 +00:00
lhk229 152cc40c7b 完成 M1C-2b 策划澄清与预算接线
接入三轮澄清中转、确定性 continuation/session 投影及恢复锁序

记录并幂等折叠 planning Provider 活跃时间与末次提交 usage

补齐审批后用户修订谱系校验和质量返工失败关闭

补充并发、恢复、重放、usage 回归并同步技术方案与决策日志
2026-08-17 15:01:33 +00:00
lhk229 a8215a5997 P5:把委派栅栏 detail 的「拼串→再解析」锁成等价关系
M1C-1 把 userRevisionPending 同时加进了 StaticDelegateCompletionBarrier::detail()
的输出和 project_gates 的解析门,两边靠一个字段名字符串隔空对齐,中间没有共享 schema。
当时生产侧只有 delegation.rs 一条 detail().contains("userRevisionPending=1"),解析侧
一条测试都没有,两者之间也没有任何东西相连:字段名一改,生产侧那条照过,而三个门静默
返回 false,父 run 就会越过用户修订边界收束。

已核实这条路径是「单一生产者 → 四个解析点」:static_delegate_completion_blocker_at
原样使用 detail: Some(barrier.detail()),main_loop 的四处解析都以
tool == "runtime.delegate_receipts" 为前提。

新增用例锁的是等价关系而不是拼写:对七个计数的全部 128 种 0/1 组合,断言三个门的判定
与 barrier 自己的语义谓词逐一相等;另加多位数计数与「键之间互不为前缀」两条护栏——后者
是 strip_prefix 读对值的隐含前提,等价关系测试抓不到这层前提何时被打破。

鉴别力已用变异验证:把解析器的 userRevisionPending 改名为 userRevisionRequested,
或往 has_waiting() 里加一个解析器不认的计数,两个漂移方向都会被抓住。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 07:24:55 +00:00
lhk229 cb5af31e79 P4:先识别 Fast GDD 再走绑定父链,别让祖先坏掉误伤非策划 run
plan_root_completion_identity_at 读绑定用的是会遍历并校验整条祖先链的入口,
而识别 Fast GDD 只看 run 自己那条记录的 source/profile。链走排在识别前面,于是
任何祖先绑定的毛病都先变成 Err,再被完成门统一翻成 needs-reconciliation——扣在一个
下一行本来就会被判「不是策划根」的 run 头上,让它再也收束不了。

可达:task_start 里 requires_public_start_status 明确把 agent-delegate-receipt 与
agent-isolated-join 排除在「无父的公开启动」之外,带父链的 supervisor run 在生产中
确实存在。新增复现用例在修复前报 Some(NeedsReconciliation)。

改动安全的两条依据:
- 两个入口对同一个 (agent, run) 返回的绑定值完全相同(链走版本最后返回的就是 run
  自己那条记录),链走纯属校验副作用,识别判据一字未变。
- 策划根的严格度一点没降:validate_project_supervisor_plan_root_binding_at 内部读的
  就是链走版本,且强制 parent 必须为空。被移除的只是即将判定「不是策划根」那条路径上
  的链走,顺带消掉同一条绑定被连着走两遍父链。

另外把 PLAN_GDD_APPROVAL_SOURCE 与 AGENT_RUNTIME_SUPERVISOR_PLAN_SOURCE 必须同值钉成
编译期断言:识别用前者、复核用后者,两者分处不同模块各自定义,一旦分叉每个策划根都会
先通过识别再被复核拒掉,全部塌成 needs-reconciliation,而且没有测试会指向这个原因。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 07:08:47 +00:00
lhk229 f8568f77db P3:审批路径统一走 resolve_planning_path,并修正瞬时失败的处理
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Repository checks (pull_request) Has been cancelled
planning_storage 里 M1C-1 新增的六处审批路径绕过了 `resolve_planning_path`,
直接用通用解析器。通用解析器只认 `is_symlink()` 且把结果一律映射成
PLAN_INVALID_PATH;规划解析器认的是 FILE_ATTRIBUTE_REPARSE_POINT 全量重解析
标记,并如实报 PLAN_UNTRUSTED_PATH。审批回执是 GDD 完成门的判据,它的路径
分类必须和 GDD/session 一致。改完后 resolve_local_project_path 在本模块只剩
resolve_planning_path 内部一处调用,成为单一入口。

新增用例用 junction 而不是 symlink_dir 建链接:后者要开发者模式/管理员权限,
普通开发机上建不起来,用例会静默跳过成永远通过的空壳。

delivery.rs 里 user_revision_pending 那条分支是死代码——has_waiting() 已经
把它计入等待,上一道门必然先返回。删掉分支,把语义与跨文件依赖用 debug_assert
钉在使用现场,避免 has_waiting() 日后改动时静默跨过用户修订决策边界。

同时修正上一提交留下的问题:投影恢复失败必须分三路而不是两路。此前把「瞬时」
和「归属不到 run」并成同一个 false,导致瞬时锁争用走了全局上抛,让 resume 这
个可反复调用的恢复入口整轮失败——而锁被占恰恰说明别处正在推进。现在瞬时争用
只跳过本轮投影恢复,其余恢复照常,下一轮重试。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 05:40:00 +00:00
lhk229 34bcd61824 补齐 M1C-1 漏掉的 agent_db 守恒断言,并让审批投影恢复区分瞬时错误
M1C-1 给 agent_db 新增了 planning 决策预留车道并从普通追加额度里扣除,但
ordinary_append_soft_limit_preserves_action_receipt_record_slots 仍断言两车道的守恒
律,差额恰好是新车道的 2_097_280 字节;记录额度同样少算 128 条。master 没有这个常量,
所以 master CI 绿而本分支必红。断言补到三车道,记录额度改为 999_680。

审批投影恢复的收敛此前不分错误性质:`.agent/project.lock` 正被占用这类瞬时错误也会
把策划根 run 永久标成 needs-reconciliation——比收敛出现之前的强传播更糟。现在先过
static_delegate_parent_wake_error_is_transient(复用委派唤醒的既有判据,避免两处分类
漂移),瞬时错误照旧上抛,由调用方转成 recovery_pending 下一轮重试;只有持久不一致
才收敛到那个 run。新增回归覆盖这条分支。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 04:55:38 +00:00
kdletters 38ae9d7d07 完善预览发布记录管理
Project CI / Frontend tests (push) Successful in 2m55s
Project CI / Backend tests (push) Successful in 3m53s
Project CI / Native shell tests (push) Successful in 15m2s
Project CI / Repository checks (push) Successful in 1m6s
发布记录改用 Jenkins 构建编号并展示

失败与停止记录增加自动清理期限

构建详情改为局域网 Jenkins 地址

同步测试、部署配置和运维文档
2026-08-17 12:42:29 +08:00
lhk229 a60f95b554 Merge remote-tracking branch 'web/master' into feat/five_min_design 2026-08-17 04:30:42 +00:00
lhk229 8d5338ce82 P2:reject 不是死路,锁住真正的约束
原判定「reject 后同一 session 无法再次提交,因为 CAS 门只放行 collecting /
revision_requested」不成立。提交门在 phase 判据之前先要求 session 的 activeRunId 等于
当前策划子 run,而 schema 不变量禁止 rejected / revision_requested / approved /
awaiting_* / recovery_required 保留 activeRunId——两者互斥,终态 phase 根本到不了那条
phase 判据。把 rejected 加进允许集只会多一个不可达分支,续跑仍然起不来;连既有的
revision_requested 也已经是不可达的。

真正决定 reject 能否重做的是 M1C-2b 的 continuation 起点 writer:技术方案 §8.6 要求它
「以新 activeRunId 写 revision+1 successor」,而唯一能同时带 activeRunId 又过提交门的
phase 只有 collecting。本提交不改行为,只把这条因果写进门旁注释,并加一条回归锁住它:
终态 session 挂 activeRunId 在指纹阶段就被 PLAN_INVALID_SCHEMA 拒绝,而落回 collecting
的 continuation 能过提交门。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 04:28:49 +00:00
lhk229 1fa56a7aee 修复 M1C-1 打破的两条用户修订委派测试
M1C-1 让 UserRevisionRequested 与 EvidenceReady 共用同一套客观证据要求
(terminal completed、无缺失产物、验证已满足)。这两条测试仍沿用 M1C-0 时期的模拟
方式:拿一条 needs-repair 的 structuredResult 直接翻 contract_status,落盘时被判成
「evidence-ready/user-revision-requested 与客观证据冲突」——构造本身自相矛盾,不是
代码回归。改成先让 expected_artifacts 真实落盘、再按真实证据重建 structuredResult,
语义也更准:用户是在已交付的产物上要求修订。

已确认为既有破坏:两条在 A+B 之前的 c89a13e68 上以相同行号 panic。M1C-1 的验证范围
只写了 planning_submit/planning_storage 定向测试与 cargo check,delegation.rs 改了
+254 行却没跑,破坏就发生在那次改动里。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 04:16:09 +00:00
kdletters abb3912530 增加分支与提交搜索校验
Project CI / Frontend tests (push) Successful in 2m54s
Project CI / Native shell tests (push) Successful in 14m0s
Project CI / Repository checks (push) Successful in 1m6s
Project CI / Backend tests (push) Successful in 3m54s
增加分支和 commit 的输入搜索下拉构建前复核固定仓库中的分支与 commit 归属补充预览控制面接口合同、配置和测试
2026-08-17 12:04:31 +08:00
lhk229 a40080d525 P1:窄投影恢复失败不再掐掉整轮 resume,plan_gdd blocker 改类型化判别
A. reconcile_plan_gdd_approval_projections_at 挂在 resume 的第一行却用 `?` 强传播,
一次 Fast GDD 投影失败会掐掉全项目所有 Agent 的恢复;而它本身正是 receipt 投影失败
后的重试入口,掐掉它等于连兜底一起废掉。改成把 fail-closed 收敛到策划根 Supervisor
这个 run,其余 Agent 照常恢复;无法归属时才退回全局上抛。

B. main_loop 原来用 contains("approvalPending=awaiting_decision") 区分 plan_gdd
blocker 的子状态,而三个 blocked 里只有一个含这个子串——尚未提交(下一步是
agent.delegate)和 receipt 锚点收尾都会掉进 else 被打成 needs-reconciliation,把最
正常的推进态当成故障停掉。改由构造方给出 PlanGddCompletionBlockerKind,消费方穷尽
match,判不出 kind 时保持 fail-closed。这两个推进态不再产生等待态,和
runtime.plan_update 一样让本轮循环继续。

映射抽成纯函数并建起 main_loop 至今没有的 mod tests:四个 kind × 两条映射全覆盖。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 04:02:54 +00:00
lhk229 c89a13e682 把 Fast GDD 审批等待的可恢复判据钉成不变量
判据在 task record 的 status 而不是 phase:审批等待只改 phase、保留
status=running,恢复扫描仍会拉起;真正的澄清等待才会把 status 一并写成
waiting-for-user-input。一旦有人把审批等待也写成后者,审批命令的通用 wake
会静默变成 no-op,用户点完批准/修改/退回不会有任何东西继续跑,且无报错。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-17 03:28:24 +00:00
kdletters ced4b56dee 优化预览发布记录展示
Project CI / Repository checks (push) Successful in 1m22s
Project CI / Frontend tests (push) Successful in 2m55s
Project CI / Backend tests (push) Successful in 3m56s
Project CI / Native shell tests (push) Successful in 14m7s
发布记录增加后端校验后的 Web 端口号

列表隐藏已成功卸载的容器记录

兼容恢复旧运行记录并回填 Web 端口

补充后端、前端测试和技术说明
2026-08-17 10:47:58 +08:00
lhk229 4498c15f90 完成 M1C-2a验收前置门
固定 plan 根 Goal Contract 与唯一 Fast GDD 验收节点。
记录并校验 Supervisor 根 Run 的完整分页 file.read 证据。
接通认领后三态审批前置门、幂等 pending 恢复与完成门。
修复审批后 session 校验及 pending/receipt 优先级边界。
补齐恢复、finalization、身份冲突和工作包边界回归。
同步 Fast GDD 技术方案与项目决策日志。
2026-08-17 02:40:11 +00:00
lhk229 d96fa7b755 Merge remote-tracking branch 'web/master' into feat/five_min_design
Project CI / Repository checks (pull_request) Successful in 1m24s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
2026-08-15 12:03:01 +00:00
lhk229 f45e90e36b M1C-1:落地 Fast GDD 审批闭环与完成门
新增 plan-gdd approval receipt、pending、审批命令及三动作幂等投影。

接入 receipt 恢复、generic submit 锚点精确消费与 terminal observation 完整性校验。

接入 exact plan-root completion blocker,并补充 pending、recovery、作用域和 identity 回归。

同步 Fast GDD 技术方案与项目决策记录。
2026-08-15 12:00:57 +00:00
lhk229 23559b1b1c 修复 CI 五条失败:三处校验的位置错误放大了作用域
Project CI / Repository checks (pull_request) Failing after 8s
Project CI / Backend tests (pull_request) Failing after 9s
Project CI / Frontend tests (pull_request) Successful in 3m10s
Project CI / Native shell tests (pull_request) Successful in 18m42s
撤回 M1B-2 对 tool-plan 交接判据的跨 loop 上提并补正向回归

恢复扫描的锚点探测器不再对不可读 state 强读,交还下游 fail-closed 兜底

planning 存储把链接路径统一分类为 PLAN_UNTRUSTED_PATH

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 09:45:44 +00:00
kdletters 41874ab391 新增内网容器预览部署控制面
Project CI / Repository checks (push) Successful in 1m16s
Project CI / Frontend tests (push) Successful in 3m1s
Project CI / Backend tests (push) Successful in 4m2s
Project CI / Native shell tests (push) Successful in 17m2s
新增分支与指定提交的预览部署 SPA 和 Jenkins 代理服务
新增多实例 Docker 预览流水线、端口租约、实时健康状态和卸载能力
新增 /build 内网路由、systemd 部署资产和运维文档
修正容器 Nginx 健康检查探针
2026-08-15 17:18:10 +08:00
lhk229 f93103760a M1C-0b:合并原分支最新修复
合入 Agent 主循环栈溢出修复

保留 M1C-0b 静态委派状态前向兼容实现
2026-08-15 08:08:01 +00:00
lhk229 53f2ba30c3 修复 Agent 主循环栈溢出:专用 worker 判据从枚举入口改为不变量
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Repository checks (pull_request) Failing after 14s
Project CI / Native shell tests (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
CI 上 background_agent_runtime_recovers_stale_running_before_pending_task 在
tokio-rt-worker 栈溢出。根因是 recovery_scan.rs 手写 tauri::async_runtime::spawn 直接
跑 drain_game_creator_agent_background_tasks——正是仓库规定必须上 16 MiB 专用 worker
的那个 future。pitfalls 2026-08-03 按入口枚举了三个(普通后台任务、静态委派子任务、
manifest ready-task 首次执行),恢复重启是第四个,从未被列进去;漏掉一个入口不会产生
任何信号,故判据改写为不变量:所有会进入 Agent 主循环的 future 必须在
agent-runtime-worker-* 专用线程上轮询。

改动:
- 统一常量 AGENT_RUNTIME_BACKGROUND_WORKER_STACK_BYTES
- spawn_next_*_with_lock 改用专用线程;签名保持 -> (),8 个调用点不动。该入口是
  best-effort 幂等语义(拿不到锁即返回、后续 wake 重试),建线程失败只需记录并随闭包
  释放锁,无需交还锁、也就不需要握手
- recovery_scan.rs 两处手写 spawn 收敛为 helper 调用。恢复重启顺带补上首轮轮询握手:
  原写法把执行锁 move 进一个无人保证会被轮询的 future,运行时关停时 run 会永远停在
  running 且无主

回归钉不变量而非钉余量:drain 入口在 cfg(test) 下记录线程名,用例断言必须以
agent-runtime-worker- 开头。变异验证——改回手写 spawn 且 RUST_MIN_STACK=16MiB(因而不
溢出)时,用例仍以 ["tokio-rt-worker", "tokio-rt-worker"] 失败。

实测(同机、二分 RUST_MIN_STACK,默认栈 2048 KiB):
- started 变体:master 需 1536-1792 KiB,修复前 HEAD 需 2048-2176 KiB
- 队列 drain:master 需 1280-1536 KiB,修复前 HEAD 需 1792-1856 KiB,余量已不足 256 KiB
- 修复后两条用例在 1024 KiB(半个默认栈)下通过

同过滤器 A/B(runtime_actions + collaboration,同一 skip):
- 修复前 HEAD:19 failed,且在 planning_strategy 处栈溢出 abort
- 修复后:289 passed / 0 failed

修复前分支实际有三处溢出点(recovery、response_stream::provider_handoff_*、
planning_strategy::tool_planning::*),CI 只报了最先撞上的那个;三处修复后均通过。
共享 tokio pool 不再被长时间占用,mock LLM 超时类失败同时大幅减少。

需回流 master:master 同样存在恢复重启走默认栈与 drain_next_* 余量偏低,只是尚未触发。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 08:04:06 +00:00
lhk229 89bbfd135a M1C-0b:补齐静态委派状态前向兼容
- 未知 contractStatus 保留为 Unknown(raw) 并接入完成屏障、等待、返工与谱系门禁

- 补齐 planning Provider、自治 liveness 与终态扫描的 fail-closed 消费路径及回归

- 保持已知状态和损坏 sidecar 行为不变,更新技术方案与共享决策记录
2026-08-15 07:04:40 +00:00
lhk229 f45db359bd 合并最新 master 到 feat/five_min_design,并修复 master 的 Windows 构建中断
Project CI / Repository checks (pull_request) Successful in 1m15s
Project CI / Native shell tests (pull_request) Failing after 10m29s
Project CI / Frontend tests (pull_request) Successful in 2m55s
Project CI / Backend tests (pull_request) Successful in 3m58s
master 侧 5 个提交(8e78be766..9f5c84ee7)。仅一处冲突:
src/view/home/index.tsx 的 react import——我们这侧对该文件只有 prettier 格式化
改动,master 新增的 useRef 在合并后正文里用了 2 次,取 master 那行。

修复 master 带来的 Windows 构建中断(E0658):
project/manifest.rs 的 #[cfg(windows)] 分支用了 std 未稳定 API
`MetadataExt::number_of_links`(rust-lang#63010),而 rust-toolchain.toml 锁在
stable 1.96.0。该文件与 origin/master 逐字节相同,即 master 自身在 Windows 上就
构建不过——Linux CI 上 #[cfg(windows)] 整块不参与编译,所以 CI 全绿。
改为本仓库既有写法:自声明 ByHandleFileInformation 调 GetFileInformationByHandle
(另见 runner/endpoint.rs、tool_plan_handoff/storage_windows.rs 等六处)。保留原
错误文案与 fail-closed 语义(取不到句柄信息与确实是硬链接同等拒绝),并按
endpoint.rs 先例一并拒绝 directory / reparse point。
该修复目前只在本分支,须回流 master,否则下次合并会再撞一次。踩坑记录见
pitfalls.md 2026-08-15 条。

验证:
- cargo check --offline --all-targets 通过(修复前 E0658,修复后 Finished)
- cargo fmt --check 通过
- 定向 Rust 测试 project::manifest / godot / static_delegate /
  collaboration::static_deliveries 65 passed / 0 failed
- agc:typecheck 通过;check:encoding 通过(5376 files);git diff --check 干净
- 前端 vitest apps/ai-game-creator-shell/tests:738 passed / 1 failed,唯一失败是
  已知的 Windows symlink EPERM(agentSwarmTestEntry),非本次回归

两条既有环境失败,已核实与本次合并无关:
- command_exec::tests 两条报「找不到受信任的 rg 可执行文件」,该文件相对合并基线
  逐字节相同
- npm run check:native-shells 在合并前的 master worktree 上失败得一模一样
  (spawnSync npm.cmd EINVAL,脚本 spawn npm.cmd 未带 shell: true)

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 05:37:00 +00:00
lhk229 1d4d77ef3d 立项策划:落地 M1C-0 合入复核结论,三条 M1C-1 前置与一条哨兵订正
Project CI / Repository checks (pull_request) Failing after 13s
Project CI / Backend tests (pull_request) Failing after 14s
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled
生产代码零改动(delegation.rs 三个 hunk 全在 mod tests 内),本次只补回归与文档。

复核确认「今天行为零变化」成立且可证:contract_status 生产赋值点只有两处且都从
客观事实派生;StaticDelegateClaimRecord 全仓库唯一构造点是运行时构造,不是 agent
提交的 JSON;durable sidecar 在 .agent/runtime/** 下被 file_ops 与 filesystem 各
三处拒写;前端无 contractStatus 消费者。lineage 三个 fail-closed 出口全部返回
(u32::MAX, u32::MAX),新分支的哨兵检查接得住。

三条 M1C-1 前置写进技术方案第 23.7、23.8 节与 decision-log:
① UserRevisionRequested 不进 repair_required_count / user_input_required_count
   任一 barrier,写入方落地即意味着 Supervisor run 可在用户修订未派出时完成;
② validate_static_delegate_structured_result 对该变体只有否定约束,缺正向一致性
   分支,UserRevisionRequested + failed + 缺产物 能通过校验落盘;
③ 前向兼容失败粒度是整个子系统——list_static_delegate_deliveries_at 逐条 ? 上抛,
   一条解析失败即整个目录枚举失败。bump schema version 救不了(版本校验在 parse 之后)。

文档订正:STATIC_DELEGATE_LINEAGE_MAX_HOPS = 32 限的是链上节点数不是跳数
(判据排在入链之前),真实跳数上限 31,第 23.7 节原写 32 跳已订正。

测试:
- static_delegate_user_revision_preserves_existing_clarification_round 名不副实,
  它把 UserRevisionRequested 放在目标位置,而计数循环只遍历父节点集合,新分支
  从未被执行。改名为 ..._parent_hop_preserves_depth_and_clarification_round,补
  一跳真正以用户修订为父的续跑并加反证;原断言留作对照组并注明性质。
- 新增 concurrent_user_revision_dispatch_creates_exactly_one_delivery,父节点为
  UserRevisionRequested 且 depth 已为 1,两侧同时钉住并发下恰好放行一条。
- user_revision_continuation_... 补兄弟检查断言(depth 门对用户修订失效后,它是
  该路径上唯一剩下的扇出约束)。

变异测试:摘掉 counters 分支 4 条变红(含新增反证 left (2,0) / right (1,1));
摘掉 gate 分支 3 条变红(并发用例 left 0 / right 1)。两处守卫各自有回归覆盖。

验证:定向 41 passed / 0 failed;npm run check:encoding 通过(5374 files);
git diff --check 干净。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-15 05:17:39 +00:00
kdletters 9f5c84ee71 重构AGC项目管理界面
Project CI / Repository checks (push) Successful in 1m40s
Project CI / Frontend tests (push) Successful in 3m27s
Project CI / Native shell tests (push) Successful in 14m20s
Project CI / Backend tests (push) Successful in 4m17s
参考成熟桌面项目管理器重构紧凑项目表、搜索和行尾菜单

支持Windows路径及Godot根目录和一层子目录工程识别与导入

修复1280×720页面溢出、列表滚动和末行菜单裁切

补充项目页回归测试、PRD、技术方案和项目记忆
2026-08-15 11:43:58 +08:00
lhk229 27c3eb847a 立项策划:完成 M1B-2 GDD 提交与恢复
接入 plan.submit_gdd 原生工具及 exact planning Provider 绑定与结构化注入

实现 create-only GDD 提交点、索引 Markdown session 恢复与策划子 run 收口

补齐定向门禁与阶段文档记录,审批 receipt UI 和构建准入留待后续
2026-08-14 14:23:58 +00:00
kdletters 578f8019fc 优化AGC项目入口并识别Godot工作区
Project CI / Repository checks (push) Successful in 1m14s
Project CI / Frontend tests (push) Successful in 3m9s
Project CI / Native shell tests (push) Successful in 14m6s
Project CI / Backend tests (push) Successful in 3m58s
项目页只保留打开项目和新建项目并统一原生目录选择
按根目录及一层子目录识别project.godot并记录相对Godot根
保持.agent位于用户选择的工作区根并补齐Windows构建门禁
补充响应式布局、测试、技术方案和共享项目记忆
2026-08-14 21:53:43 +08:00
lhk229 4d3f87cd39 修复完美像素无法识别自身产物的网格 (#169)
Project CI / Repository checks (push) Successful in 1m21s
Project CI / Backend tests (push) Successful in 3m57s
Project CI / Frontend tests (push) Successful in 2m54s
Project CI / Native shell tests (push) Successful in 14m7s
边缘 profile 用的是跨度 2 的中心差分,硬块边界落在列 b-1|b 之间时
profile[b-1] 与 profile[b] 逐位相等:两者跨的是同一条边,逐行被加数
相同、求和顺序相同。峰值判定两侧都用严格大于,会把这个 2 宽平台的
两端一起丢掉,于是最干净的输入反而 0 个峰、被判为未识别到网格——
完美像素处理不了自己的输出。

estimate_step_size 左邻比较放宽为 >=,右邻保持严格 >:平台只保留
一个索引,且是右端,正好是左闭右开语义下的真实块边。两侧都放宽则
会把长度 K 的常数段整段判为峰。

walk 与 snap_uniform_cuts 的 argmax 同样改为 >=,取等值段的最后一
个索引。取第一个会让每条切线落在真实边界左边 1px,每个 cell 因此
混进 1/4 的邻块。实测在 266x253 的最近邻放大像素画上,切线命中真实
块边从 2.6% 升到 98.5%,左右镜像、上下翻转、180° 旋转下一致;龙图
内容区内 134/134 全中。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>

Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/169
Co-authored-by: Linghong <ink29535@proton.me>
Co-committed-by: Linghong <ink29535@proton.me>
2026-08-14 20:42:58 +08:00
k88936 d901945c77 移除视频快速编辑支持 (#157)
Project CI / Repository checks (push) Successful in 1m20s
Project CI / Backend tests (push) Successful in 3m56s
Project CI / Native shell tests (push) Successful in 14m1s
Project CI / Frontend tests (push) Successful in 2m53s
当前实现: 视频快速编辑错误地复用了图片快速编辑的panel, 然后发起一个实际是生成视频的请求

策划建议删除.

因为后端没有实际意义上的视频快速编辑, 所以api 后端代码没有改动, 只在前端删除入口和处理

---------

Co-authored-by: kdletters <kdletters@qq.com>
Reviewed-on: http://192.168.35.82/git/GenarrativeAI/Genarrative/pulls/157
Co-authored-by: 王德宇 <kvtodev@outlook.com>
Co-committed-by: 王德宇 <kvtodev@outlook.com>
2026-08-14 18:52:56 +08:00
kdletters d155e303bd 实现AGC回车自动创建工作区
Project CI / Repository checks (push) Successful in 1m3s
Project CI / Frontend tests (push) Successful in 3m9s
Project CI / Backend tests (push) Successful in 4m17s
Project CI / Native shell tests (push) Failing after 11m3s
首页普通回车自动分配系统文档目录下的唯一工作区并启动项目总控

保留加号按钮手动选择目录和Shift回车换行语义

统一Windows Linux与macOS默认项目路径解析并移除产品态tmp默认值

补充自动工作区安全测试 首页交互回归与技术方案说明
2026-08-14 17:45:27 +08:00