Skip to content

chore: auto-refact-dev → dev 自动同步 (22 commits)#1167

Merged
loning merged 174 commits into
devfrom
chore/sync-trunk-to-dev-20260528-125254
May 31, 2026
Merged

chore: auto-refact-dev → dev 自动同步 (22 commits)#1167
loning merged 174 commits into
devfrom
chore/sync-trunk-to-dev-20260528-125254

Conversation

@loning
Copy link
Copy Markdown
Contributor

@loning loning commented May 28, 2026

daemon 双向同步 auto-refact-devdev 共 22 commits。CI 绿后 GitHub auto-merge。冲突或 CI fail 由 daemon 派 codex 在独立 worktree 解决。

⟦AI:AUTO-LOOP⟧

loning added 27 commits May 28, 2026 13:30
… Script outcome channel)

Phase 9 r3 consensus(framing=structural; 3/3 unanimous propose option A):
Script run actor 内发 actor-owned ScriptRunOutcomeRecordedEvent committed fact;
caller 通过 existing projection-session observation 获取 outcome,不在 dispatch
callstack 内 wait outcome;不 touch handled-dispatch files;不新增 readmodel / query port。

8 files (+442/-50). Includes integration test flake fix (Scenario2_CreateAgentTree
parallel race after r2 staged changes — fixed in r3 with deterministic fixture isolation).

Phase chain:r1 escalate cross-cluster-coupling → reflector r1 wait-for-#1132-merge
→ #1132 merged → r2 narrow(reflector ruling)→ r2 judge converge round-3 → r3 三 solver
unanimous propose option A → r3 judge consensus → implement r1 死(API 503)→
r2 resume from staged → partial:1 flake → r3 fix flake → ok.

closes #1133

⟦AI:AUTO-LOOP⟧
…tcome test + marker

addresses architect+tests reject:
- atomic batch persist:facts+outcome 一次 PersistDomainEventsAsync,outcome StateVersion 用自己的 committed version
- 加 ScriptExecutionSessionEventProjector iter149/cluster-1133 refactor marker
- 加 validation-failure path tests:mismatched definition/scope/revision branches assert exactly one ScriptRunOutcomeRecordedEvent(Status=Failed)+ RunId/CommandId/CorrelationId/ScopeId/CommittedFactCount=0/error text

FIX_DONE:1143:round-1:applied-3:tests-pass(full slnx build+test 0 fail per hard rule 10)

⟦AI:AUTO-LOOP⟧
…528-085535

chore: dev → auto-refact-dev 自动同步 (2 commits)
…duplicated prose)

Phase 9 r4 consensus(framing=structural,3/3 hybrid 后 reflector r1 retry-fix:hybrid):
- 新建 prompts/_shared.md(hard rules,sentinel/红线,~30 行)
- spawn-codex.sh 启动前 prepend _shared.md(幂等)
- 删 prompts 内重复 prose(bilingual EN+ZH / rationale / 事故段 / 重复 GitHub post rules)
- soft refs(_github-post-rules.md / SKILL.md)保留 references,不 prepend

17 files (+300/-869, 净 -569 LOC, ~65% size reduction)。spawn-codex.sh + 共 16 prompt template slim。

closes #1148

⟦AI:AUTO-LOOP⟧
…dit + stale refs

addresses tests+quality reject:
- 新建 scripts/test_spawn_codex.sh(3 case:prepend / 幂等 no-double-prepend / --dry-run)
- 加入 tools/ci/test_stability_guards.sh 自动调用
- spawn-codex.sh 加 Refactor (#1148) Old/New self-doc 注释
- _shared.md 移除 gh pr edit 禁令(controller 仍可 edit,与 _github-post-rules.md 调和)
- 改 4 处 stale "see GitHub post section below" → "see _github-post-rules.md"

FIX_DONE:1155:round-1:applied-4:tests-pass

⟦AI:AUTO-LOOP⟧
…token-slim-hybrid

skill #1148: codex prompt token-slim hybrid(_shared prelude + delete duplicated prose,-65% size)
最近 3 design issue(#1084 PR1151 / #1156 / #1157)全被 reflector ruled re-cluster,
浪费 ~90 codex on cluster-scope misalignment。

audit prompt 收紧:
- rule_ids 数量 ≤2(优选 1),多 rule 命中同代码 → 拆 cluster
- files_touched_estimate 严格上限 6(从 ≤30/≤15 收紧)
- Sub-concern detection self-check:emit 前自问 implementer 能否一 PR 修完
- Pre-check:rule_ids.length>2 OR estimate.max>6 → split,未通过禁止 emit

audit-iter-155/156 in-flight 仍用旧 prompt(已 spawn);iter-157+ 用新 prompt 应避免再 re-cluster。

⟦AI:AUTO-LOOP⟧
…-tighten-cluster-scope

skill: audit prompt 收紧 cluster scope(防 reflector 连续 re-cluster)
…first + judge no-new-core branch)

per retro `.refactor-loop/runs/reflector-pattern-retro-2026-05-28.md`,3 改进:

1. **spawn-codex.sh placeholder guard**:render 后 grep `cluster ''`/`audit-iter-.md`/未替占位符 → exit non-zero(防 #1156/#1157 类 blank-placeholder leak 已现)
2. **Solver split-first obligation**:solver-minimal/structural/delete 必答 "Can this split into no-new-abstraction first slice + later design slice?";structural 不应 monolithic bundle
3. **Meta-judge no-new-core-slice branch**:solvers 同意违反真实 AND 至少 1 solver 提出 first-slice → 必须 emit `split:<first>:<later>` 而非 `escalate-human`
4. SKILL.md 路由表加 `split` verdict 处理(controller close 当前 issue + open 2 sub-issue)

6 files changed。skill prompt only,无 dotnet test 需求。

⟦AI:AUTO-LOOP⟧
addresses tests reject:
- test_spawn_codex.sh 加 4 个 case(case4 cluster placeholder reject / case5 audit-iter-MISSING reject / case6 envsubst 未替占位符 reject / case7 valid prompt --dry-run pass)
- spawn-codex.sh placeholder guard 块加 Refactor (#1159) Old/New 注释(addresses architect comment)

bash test_spawn_codex.sh 全 case pass。

FIX_DONE:1159:round-1:applied-2:tests-pass

⟦AI:AUTO-LOOP⟧
… regex

r1 commit 含未解析的 <<<<<<<= conflict markers(stash pop 后没解,直接 commit),
spawn-codex.sh 直接 shell syntax error 不能跑,test_spawn_codex.sh 全 fail。

修法:
- 合并 stashed 与 upstream 两个 placeholder guard 块为单一统一版本
- 使用更完整的 UNRESOLVED_PROMPT_PATTERN(cluster ''/``,audit-iter-MISSING-NUM.md,dollar-brace VAR,double-brace name)
- 改用 single-quoted 字符串避免 bash 把 \$ 转成 $(原 double-quoted 让 $ 变 end-of-line anchor,case6 不能触发 reject)

bash test_spawn_codex.sh 全 case pass。

⟦AI:AUTO-LOOP⟧
…improve-3-changes

skill: Phase 9 self-improve 3 changes(防 re-cluster pattern 再发)
per loning: 简化为通用脚本,本质就是双向 sync,不要特殊逻辑:
- 删 admin bypass / direct push trunk(走正常 PR)
- 删 18h threshold(任何 ahead 都同步)
- 删 rule 10/11 verify(GitHub CI 自己验)
- 删 force-push rollup hack / try_finalize_codex_merge
- 删 codex_resolved_head_ready_to_push 复杂状态机
- 删 update-branch 在 has_open_pr 内 inline 调用(简化为独立 helper 触发)
- 删 SQUASH method(改 merge commit 保 hash reachability)

通用模型:每 tick 两方向各 sync_direction(source, target, wt, prefix, label):
  - 无 PR + ahead > 0 → push sync branch + 开 PR base=target + auto-merge
  - PR DIRTY → 派 codex 在独立 worktree 解冲突,push 回 PR head
  - PR BEHIND → gh api update-branch trigger CI re-run
  - PR CI fail → 派 codex 在独立 worktree 修 CI,push 回 PR head
  - PR clean → 等 GitHub auto-merge

forward / reverse 用同 helper,只是 source/target/wt/prefix/label 不同。

⟦AI:AUTO-LOOP⟧
per loning 2026-05-27 反馈:必须先保证 dev → trunk OK,trunk 是 superset of
dev 时才开 reverse rollup PR 回 dev。否则 reverse PR 必 DIRTY(dev 新 commits
没进 trunk → trunk → dev 反推冲突)。

tick 改:
- forward 总跑
- reverse 仅 count_ahead(trunk, dev) == 0 才跑

⟦AI:AUTO-LOOP⟧
per loning 2026-05-27: PR1129 CI fail 但 daemon 没派 codex 修(等 600s tick)。
缩短周期到 120s,2 分钟内 detect failing check 派 codex fix-ci。

⟦AI:AUTO-LOOP⟧
之前 grep 'sync-{label}-codex' match 0 因 codex exec 用 stdin 读 prompt
+ spawn-codex.sh 把 log redirect,ps 命令行只显示 -C <worktree>。改 grep
worktree path 准确判 in-flight,避免同 label 重派 codex。

⟦AI:AUTO-LOOP⟧
per loning 2026-05-27:之前两 daemon 同时跑(老 kill 前 + 新启)各派一个
codex 同 worktree 同 PR,资源浪费 + race。fcntl exclusive lock on
.refactor-loop/dev-sync-daemon.lock 启动时获取,失败则 exit。

⟦AI:AUTO-LOOP⟧
per loning 2026-05-27 "auto-refact-dev pr 回 dev 不自动 merge,等人 review":
- forward(dev→trunk): enable auto-merge,CI 绿即合
- reverse(trunk→dev): 不 enable auto-merge,等 maintainer review

trunk → dev rollup 是把累积重构推回主分支,该走人 review;
dev → trunk sync 是把 dev 新提交带进 trunk,可自动 merge。

⟦AI:AUTO-LOOP⟧
…tomerge 行为)

forward 派 auto-merge,reverse 不派(per loning 等 maintainer review)。
之前 log 默认 '等 GitHub auto-merge' 对 reverse 误导。

⟦AI:AUTO-LOOP⟧
Phase 9 r2 consensus(3/3 propose delete,hybrid structural+delete):
- 删 StreamActorOutcomeChannel.cs(违反「stream request-reply 冒充 RPC」)
- 删 DefaultCommandOutcomeDispatchService.cs(违反「ACK 诚实」)
- 删 ServiceCollectionExtensions.cs DI 注册
- 删 CqrsCoreDefaultsTests.cs / StreamActorOutcomeChannelTests.cs
- 不新增 replacement abstraction

9 files (-579 LOC,纯删)。SCOPE_EXTEND:test_stability_guards.sh 跑过。

closes #1161

⟦AI:AUTO-LOOP⟧
…write-generic-bidirectional-sync

skill: dev_sync_daemon 重写为通用双向 PR 同步(715→309 行)
addresses quality reject(missing Refactor self-doc):
- src/Aevatar.CQRS.Core.Abstractions/Commands/ICommandDispatchService.cs:加 Refactor 注释
- src/Aevatar.CQRS.Core/DependencyInjection/ServiceCollectionExtensions.cs:加 Refactor 注释

FIX_DONE:1165:round-1:applied-2:tests-pass

⟦AI:AUTO-LOOP⟧
addresses tests reject(missing regression test):
- tools/ci/architecture_guards.sh:加 stream-RPC reintroduction guard
- grep src/ 不出现 StreamActorOutcomeChannel / DefaultCommandOutcomeDispatchService 等被删抽象

bash tools/ci/architecture_guards.sh 通过。

FIX_DONE:1165:round-2:applied-1:tests-pass:regression-guard-added

⟦AI:AUTO-LOOP⟧
…528-120933

chore: dev → auto-refact-dev 自动同步 (3 commits)
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 30, 2026

🤖 fix r1 报告 — PR 1167

TL;DR

  • 这是什么: 修复 coverage-quality 失败暴露出的 workflow draft run current-state 未进入 completed 的问题。
  • 现在结论: 已补 projection bridge 与 behavior tests,本地 coverage_quality_guard.sh 通过,filtered line coverage 为 88.8%
  • 下一步: controller 可重新触发 PR CI;本地变更已 git add -A staged,未 commit/push。

详细说明

CI 里的直接失败不是 Codecov 阈值,而是 coverage-quality 运行测试时先失败:ScopeDraftRunWorkflowActorCurrentStateIntegrationTests.DraftRunEndpoint_ShouldExposeCompletedWorkflowActorCurrentStateViaWorkflowActorCurrentState 期望 current-state snapshot 为 Completed,实际仍是 Running

根因是 interactive workflow session 已经观察到 committed terminal state event,但 actor-scoped WorkflowExecutionCurrentStateDocument 没有被同步覆盖写入。修复是在统一 projection pipeline 里新增 WorkflowExecutionSessionCurrentStateBridgeProjector,它只消费 root workflow actor 发布的 terminal committed state event,并用权威 state_event.Version 写入 current-state read model;child relay 事件会跳过,避免子 actor 状态覆盖 root actor current-state。

新增/调整的 case:

case 覆盖点
WorkflowExecutionSessionCurrentStateBridgeProjector_ShouldMapTerminalCommittedState terminal committed state 会写出 completed current-state document
WorkflowExecutionSessionCurrentStateBridgeProjector_WhenCommittedStateIsRelayedFromChild_ShouldSkipWrite child relay 不覆盖 root actor current-state
targeted integration test draft-run endpoint 能读到 completed workflow actor current-state

验证结果:

命令 结果
dotnet test test/Aevatar.Workflow.Host.Api.Tests/Aevatar.Workflow.Host.Api.Tests.csproj --filter "FullyQualifiedName~WorkflowExecutionProjectionProjectorTests" --no-restore --nologo 通过,22 tests
dotnet test test/Aevatar.GAgentService.Integration.Tests/Aevatar.GAgentService.Integration.Tests.csproj --filter "FullyQualifiedName~ScopeDraftRunWorkflowActorCurrentStateIntegrationTests" --no-restore --nologo 通过,1 test
bash tools/ci/query_projection_priming_guard.sh 通过
bash tools/ci/projection_state_version_guard.sh 通过
bash tools/ci/projection_state_mirror_current_state_guard.sh 通过
bash tools/ci/test_stability_guards.sh 通过
bash tools/ci/coverage_quality_guard.sh 通过,line 88.8%, branch 72.5%

📎 完整 codex 原始输出(存档备查)

FIX_DONE:1167:round-1:applied-4:rejected-0:blocked-0

⟦AI:AUTO-LOOP⟧

loning added a commit that referenced this pull request May 30, 2026
PR #1167 coverage-quality 失败根因: workflow session projection
pipeline 缺 session→current-state 桥, draft-run 集成测试读到
Running 而期望 Completed。新增 projector + DI 注册 + 覆盖测试。

⟦AI:AUTO-LOOP⟧
@loning loning force-pushed the chore/sync-trunk-to-dev-20260528-125254 branch from 0a22d4d to 076889e Compare May 30, 2026 19:00
per /loop 2026-05-31 'bug 必须修'。

根因: dev_sync_daemon 派 sync-reverse-fix-ci codex 到 PR1167
worktree, prompt step 5/6 要求 git commit/push, 但 spawn-codex.sh
注入的 shared hard rules 含 'Do not run git commit/push'。矛盾下
codex 一致选 conservative 不 push, 输出
SYNC_FIX_CI_BLOCKED:commit-push-prohibited-by-shared-hard-rules,
daemon 见 BLOCKED 再派 → 死循环 6h+ 浪费 codex, PR1167 永远红。

修法: daemon prompt 开头加 'SHARED HARD RULE EXCEPTION' 块, 显式
说明本 role 例外允许 git add/commit/push (覆盖 shared rules)。
codex 看到此块会 override hard rules 执行 push, 触发 CI rerun。
同时仍禁止 checkout/branch/force push/disable test 等。

resolve-conflict 与 fix-ci 两个 action 都加例外。

⟦AI:AUTO-LOOP⟧
@loning loning force-pushed the chore/sync-trunk-to-dev-20260528-125254 branch from 005bb7a to d6764eb Compare May 30, 2026 19:41
* feat(issue1444): Team workbench 状态诚实修正(first-slice)

per Phase 9 #1397 split → #1444 first-slice。Team workbench 不再把 run completion 显示为 deployment serving stability;raw facts 分离。

改动:
- home.tsx / detail.tsx:run completion / deployment serving / readmodel freshness 作为分离 raw facts 展示
- home.test.tsx / detail.test.tsx:断 raw facts 分离 + 不再合成 'stable' status

⟦AI:AUTO-LOOP⟧

* fix(pr1446/r2): 补 refactor self-doc on formatRunStatusLabel

per Phase 8 r1 architect comment:formatRunStatusLabel 加 Old/New refactor self-doc 注释。

⟦AI:AUTO-LOOP⟧

* fix(pr1446/r2): console-web ScriptsWorkbenchPage.tsx + test 修(per maintainer review r1)

- ScriptsWorkbenchPage.tsx: 修 status label render(formatRunStatusLabel 调用)
- ScriptsWorkbenchPage.test.tsx: 补对应 test 覆盖

fix codex r2 marker: FIX_DONE:1446:round-2:applied-1:rejected-0:blocked-0

⟦AI:AUTO-LOOP⟧

* fix(pr1446/r3): console-web test 补 tests reject demand(per Phase 8 r3)

r3 verdict: architect=comment / tests=reject / quality=comment。
fix codex applied 1: ScriptsWorkbenchPage.test.tsx 补 r3 reviewer 要求的
behavior assertion(per fix-pr1446-r3 marker applied-1:rejected-0:blocked-0)。

⟦AI:AUTO-LOOP⟧

* fix(pr1446/r4): console-web index.test.tsx CI fix(per Phase 8 r4)

fix codex r4 诊断 console-web 单 test 538s timeout 后 applied-1:
针对 src/pages/studio/index.test.tsx waitFor 写法优化(详情见
.refactor-loop/runs/fix-pr1446-r4.md)。

⟦AI:AUTO-LOOP⟧
@loning loning force-pushed the chore/sync-trunk-to-dev-20260528-125254 branch from a21f4b0 to 6cee333 Compare May 30, 2026 20:12
loning added 9 commits May 31, 2026 05:21
)

* refactor(issue1378): 删除 Lark reply/react 当前消息 bypass(first-slice)

来源 #393 Phase 9 split first-slice consensus(3/3 unanimous propose)。

变更:
- LarkMessagesReplyTool / LarkMessagesReactTool:删除 ResolveOrCurrent
  对 reply/react 的当前消息 bypass;message_id 缺失时返回结构化 error,
  不再 fallback 到当前消息(默默吃错误)。
- LarkToolHelpers:补 ResolveExplicitMessageIdOrError 共享路径。
- LarkToolsTests:同步测试,新增 missing message_id 的 behavior assertion;
  保留 explicit external tools 路径覆盖。

不新增 actor / envelope / proto / canon。typed-reply-delivery-mode design
留 #393 later-slice 处理。

closes #1378
refs #393

⟦AI:AUTO-LOOP⟧

* fix(pr1480-r1): refactor self-doc 注释改为 SKILL 强制模板

Phase 8 r1 reviewer comment(architect / quality):新增 refactor 注释
说明意图但格式不符 SKILL 强制的 `// Refactor (iterN/cluster-XXX):
Old pattern: …  New principle: …`。

修 3 处 self-doc(LarkMessagesReplyTool.cs / LarkMessagesReactTool.cs /
LarkToolHelpers.cs),使用 `// Refactor (issue1378/first-slice):` 前缀
+ Old pattern + New principle 段。本轮无 logic 改动。

⟦AI:AUTO-LOOP⟧

* fix(pr1480-r2): self-doc 改紧凑 Old:/New: 行格式(quality reject 终修)

Phase 8 r2 reviewer quality 仍 reject:r1 的 self-doc 句子被换行
拆碎成 awkward fragment;要求紧凑 `// Old: <一句话>` / `// New:
<一句话>` 行格式。

修 3 file 的 self-doc 为:
- 第一行:`// Refactor (issue1378/first-slice):`
- 第二行:`// Old: <≤100 chars 单行>`
- 第三行:`// New: <≤100 chars 单行>`

无 logic 改动。

⟦AI:AUTO-LOOP⟧

* fix(pr1480-r3): self-doc 改字面 Old pattern:/New principle:(SKILL 模板)

Phase 8 r3 reviewer architect + quality 仍 comment(non-blocking):
要求严格字面 SKILL hard rule 3 格式 `Old pattern:` 与 `New principle:`,
不是 `Old:` / `New:` 缩写。

修 3 source file + 测试 file 5 处 self-doc(applied-5),
字面替换 `Old:` → `Old pattern:`,`New:` → `New principle:`。
无 logic 改动。

⟦AI:AUTO-LOOP⟧
…e /init (#1481)

来源 #512 Phase 9 split first-slice consensus(minimal+structural propose,
delete abstain)。

变更(no-new-core):
- unbound sender 检测后 disable 工具调用(不发 tool dispatch)
- unknown slash command → gate 到 /init 引导
- non-slash 纯文本 → 维持 owner-LLM chat fallback(无改动)

不新增 typed channel admission decision / NeedsLlmReplyEvent execution_mode
(那是 #512 later-slice)。不新增 actor / envelope / proto / canon。

测试:补 8 处 behavior test(unbound sender disable tools / unknown slash gate)。

closes #1318
refs #512

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "/loop 10min /codex-refactor-loop 强制主动做任何优化这个流程的事, 有bug必须修"。

根因:Step A 用 `[ -f "$log" ] || continue` 在 implement log 不存在时直接跳过。
#1369 (labeled 🛠️ phase:implementing) 从未派过 implement codex → log 不存在 → 误判"无积压"。

修法:`-f "$log"` false 时检查 PR;
- 无 PR → flag "未派" + ACTION: dispatch implement
- 有 PR → 跳(implement 可能在其他 worktree 跑过,不该 false-flag)

Smoke test 通过:#1369 现在正确出现在 Step A ACTION 列表。

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "/loop 10min /codex-refactor-loop 强制主动做任何优化这个流程的事, 有bug必须修"。

根因:Step E "未处理 open issue 3h+ 加 auto-loop-triage" 的 jq exclusion list 漏 `milestone:*` label。
maintainer 标的 milestone:p0:v1-target issue (#1399/#1398/#1387) 当 untouched
触发误判,会加 auto-loop-triage label —— 但这些是显式目标 issue,不是未分类入口。

修法:jq filter 加 `any(startswith("milestone:")) | not` —— milestone-labeled issue
全程跳过 Step E triage 路径,由 Step 0 MILESTONE 独占处理。

Smoke test:wakeup-check.sh 现在 Step E 报 "(none — no untouched issues older than 3h needing triage)",
不再误推 #1399/#1398。

⟦AI:AUTO-LOOP⟧
…rs/Metadata (#1359)

* [refactor] #1353 first slice: 停止 aevatar_start_workflow/aevatar_invoke_team 把 trusted facts 写入 Headers/Metadata

per Auric 2026-05-30 #1327 r2 split first-slice.

aevatar_start_workflow / aevatar_invoke_team 停止把可信 caller/control facts
new-write 到 Headers/Metadata,改走 typed AgentToolExecutionContext +
LLMControlContext 字段。Metadata/Headers 只保留 protected-key-filtered
外部 payload headers。

⟦AI:AUTO-LOOP⟧

* fix r1: 处理 PR #1359 r1 reject(narrow)

per Auric 2026-05-30 Phase 8 fix-retry.

applied: 处理 tests/quality reject(coverage gap + self-doc/naming/dead surface)。

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "/loop 强制主动做任何优化这个流程的事, 有bug必须修"。

根因:`ps -ef | grep "$d"` 子串匹配过宽
- "comment-monitor" 子串可能匹配 codex prompt 里 "comment-monitor.sh" 提到的进程
- "concurrency_monitor" / "dev_sync_daemon" 子串可能匹配 cross-repo daemon
  wrappers(/Users/auric/newmath、/Users/auric/chrono-ai-ceo)— 它们在 argv 里
  embed daemon 名称作为 wrapper 参数,实际跑的是 consensus-rnd-cli,与 aevatar
  daemon 完全无关

事故:之前 wakeup-check.sh 报 "comment-monitor.sh: 2 OK" 是 false positive
(实际 1 个),让 controller 误判违反 SKILL "多 daemon 实例必须 = 1" 单例规则。

修法:`ps -eo args | grep -E "(bash|python[0-9.]*|Python) (\.|/.+)?\.claude/skills/codex-refactor-loop/scripts/$d( |$)"`
- 必须 bash/python/Python 起头(invocation 而非提及)
- 路径 .claude/skills/codex-refactor-loop/scripts/$d 完整匹配(相对 + 绝对)
- 后续 token 边界 ( |$) 防 daemon-foo.sh 被 daemon.sh 匹配

Smoke 测试:
- 之前:comment-monitor.sh: 2 OK (false positive)
- 现在:concurrency_monitor.py: 1 OK / comment-monitor.sh: 1 OK
        / codex-progress-reporter.sh: 1 OK / dev_sync_daemon.py: 1 OK
        / triage-monitor.sh: 1 OK

⟦AI:AUTO-LOOP⟧
…_id+ACCEPTED receipt (#1482)

* implement #1369: 删 dev_sync_daemon self-spawn + spawn-codex execution_id+ACCEPTED receipt

来源:#1338 Phase 9 r2 split first-slice (3/3 unanimous propose)。

skill-internal no-new-core cleanup:
- dev_sync_daemon.py: 删 detached subprocess.Popen + nohup self-spawn 路径,改写 .controller-pending-events.log dispatch-codex 一行(action/prompt/log/worktree/add_dir/timeout/issue_or_pr),由 controller 用 spawn-codex.sh 派发(harness 跟踪 + task-notification)。
- spawn-codex.sh: 加 --execution-id <id>,缺省自动生成;ACCEPTED 接受时 stdout 打印 execution_id+ack_stage=accepted+prompt+log+timeout;写 markers/<id>.running.json + <id>.done.json(execution_id/ack_stage/prompt/log/timeout/started_at/done_at/exit_code);legacy SPAWN/DONE banner + verdict/base/log_path 字段保留兼容。
- SKILL.md: 同步 spawn section + Phase 6 dev-sync daemon DIRTY/CI-fail 段(改为 pending event materialization + controller dispatch)。

Smoke 全过:
- python3 ast.parse dev_sync_daemon.py: pass
- bash -n spawn-codex.sh: pass
- dry-run + execution-id smoke 写 .running/.done.json marker 正确
- legacy reader 不破坏

closes #1369
refs #1338(later-slice 留 package cli state contract design-pending)

⟦AI:AUTO-LOOP⟧

* fix r1: spawn-codex.sh 默认 execution_id=log basename(backward compat)

CI fail (fast-gates / test_spawn_codex.sh case 9):
  FAIL: case 9 done marker missing

根因:r1 实施 auto-generate execution_id 为 UUID,但 test_spawn_codex.sh case 9
期望 `markers/<log-basename>.done.json`(legacy reader 约定)。

修法:execution_id 缺省 = log basename (不带 .log)。callers 仍可 --execution-id
override 用 UUID/ULID 等 distinct lineage tracking。

Smoke:
- bash .claude/skills/codex-refactor-loop/scripts/test_spawn_codex.sh ✓
- bash tools/ci/test_stability_guards.sh ✓(含 case 9 + python tests)

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "强制主动做任何优化这个流程的事, 有bug必须修".

发现:#1198/#1254/#1282/#1384(split)、#1382/#1381(crashed)、#1350(escalate:abstention) 7 个 design-solving issue 静默积压 1-3 天。

根因:Step F 仅检测两种状态:
  1. 完全无 solver log → spawn r1 solvers
  2. 3 solver done + 无 judge log → spawn judge

漏判:judge log 已存在但 marker 需要 controller action 的状态:
  - META_JUDGE_DONE:split → close + open 2 sub-issues
  - META_JUDGE_DONE:converge → spawn r+1 solvers
  - META_JUDGE_DONE:escalate:* → spawn reflector
  - META_JUDGE_DONE:consensus → dispatch implement
  - judge log 有 EXIT 但无 META_JUDGE_DONE → re-spawn (crash)

修法:Step F 加 `if [ -f "$judge_log" ]` 分支,case 解析 marker 类型映射到具体 ACTION 行。所有 case 用 `continue` 保证一个 issue 只产一行 ACTION。

烟测确认 7 stale judge 全部检测到。

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "有bug必须修".

发现:split-batch processor 给 later-slice 加 `⏸️ phase:blocked` + `🔍 phase:design-solving` 双 label。Step F 只 filter `🔍 phase:design-solving`,导致 later-slice 被误判为"NO solver yet — ACTION spawn r1",会误派 5 issue × 3 = 15 solver 浪费资源。

修法:Step F query 加 jq filter `select([.labels[].name] | contains(["⏸️ phase:blocked"]) | not)` — 跳过 blocked。

⟦AI:AUTO-LOOP⟧
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 30, 2026

📊 当前状态 — PR #1167 reverse rollup CI 红 → fix-ci 派出(❌ 不需要人介入)

维度
PR #1167 reverse rollup (auto-refact-dev → dev)
Milestone milestone:p0:v1-target #1398
CI 失败 coverage-quality (latest commit 2026-05-30T23:31)
dev_sync_daemon 已 4 次写 pending fix-ci event;controller 漏读积压
本 turn 处理 派出 fix-ci codex(latest queued prompt + worktree /Users/auric/aevatar-wt-sync-reverse)
预计 ETA 30-90 min;fix push 后 CI 重跑
是否需要人介入 ❌ 否(完全自动)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

@loning loning force-pushed the chore/sync-trunk-to-dev-20260528-125254 branch from 16361fd to 5d7f4dd Compare May 31, 2026 00:06
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 31, 2026

📊 当前状态 — fix-ci 完成,等 CI 重跑(❌ 不需要人介入)

维度
PR #1167 reverse rollup (auto-refact-dev → dev)
Milestone milestone:p0:v1-target #1398
fix-ci 结果 SYNC_FIX_CI_DONE:1167:checks=11(commit 16361fd9d pushed)
验证 dotnet build/test 通过
下一步 GitHub Actions 重跑 11 个 check;daemon 自动监控 + 下次 CI 红再派 fix codex
是否需要人介入 ❌ 否(等 maintainer review + merge — 此 PR 是 reverse rollup,需要 review 不是 auto-merge)

🤖 controller status banner

⟦AI:AUTO-LOOP⟧

loning added 10 commits May 31, 2026 08:28
来源:#1282 r1 split first-slice。

按 first-slice 计划清理 Device/Household command facades + endpoints + tests:
- 类型化 control fields(payload 替换 JSON parser pattern)
- 新增 DeviceEventEndpoints 行为测试

closes #1485
refs #1282 (来源父 issue split)
refs #1486 (later-slice design-pending)

⟦AI:AUTO-LOOP⟧
…data 注入 (#1501)

来源:#1350 r2 split first-slice。

清理 AevatarInvocationDispatcher 中的 static team trusted legacy metadata 注入,补 44 LOC tool source 测试。

closes #1495
refs #1350 (来源父 issue split)
refs #1496 (later-slice: static team AI context 继承决策,设计待定)

⟦AI:AUTO-LOOP⟧
…1500)

* [refactor-impl] #1487 first-slice: typed first-pending tool context

来源:#1254 r2 split first-slice。

在 RoleGAgent 添加 typed first-pending tool context 替代字符串解析,补 138 LOC state coverage 测试。

closes #1487
refs #1254 (来源父 issue split)
refs #1488 (later-slice: field 9 canon + credential whitelist + remote approval,设计待定)

⟦AI:AUTO-LOOP⟧

* [refactor-impl] #1487 first-slice fix r1: 修复 quality reviewer reject

Phase 8 fix r1 applied-1: rejected-0: blocked-0.

⟦AI:AUTO-LOOP⟧
…#1499)

* [refactor-impl] #1493 first-slice: GAgentBase deactivation 清理 finally

来源:#1382 r1 retry split first-slice。

在 GAgentBase.TState 完成 deactivation base cleanup 的 finally 收尾,确保 OCC + non-OCC 路径都有 propagation 保证。150 LOC BDD 回归覆盖。

closes #1493
refs #1382 (来源父 issue split)
refs #1494 (later-slice: runtime-wide deactivation failure contract,设计待定)

⟦AI:AUTO-LOOP⟧

* [refactor-impl] #1493 first-slice fix r1: 修复 tests reviewer reject

Phase 8 fix r1 applied-2: rejected-0: blocked-0.

⟦AI:AUTO-LOOP⟧

* [refactor-impl] #1493 first-slice fix r3: 添加组合失败测试覆盖 lifecycle module DisposeAsync 异常

per Phase 8 r2 tests reviewer reject(combined original-failure + lifecycle-module-failure 覆盖)。
Fix r3 applied-1: rejected-0: blocked-0。

⟦AI:AUTO-LOOP⟧

* [refactor-impl] #1493 first-slice fix r4: 校准 self-doc 异常传播语义

把 GAgentBase.TState.cs:69 的 New principle 改成精确反映 pinned 测试合约:
base cleanup 总会执行;cleanup 成功时传播原 hook/confirm/snapshot 失败;
cleanup 自身失败时按 base cleanup 异常语义暴露(AggregateException pinned by
AgentLifecycleBddTests:167)。

仅 self-doc 注释改动,无业务逻辑变化。
仅修 r3 architect + quality 同点 comment。

⟦AI:AUTO-LOOP⟧
…containment (#1498)

* [refactor-impl] #1489 first-slice: GAgentBase OCC deactivation flush containment

来源:#1381 r2 split first-slice。

在 GAgentBase.TState 添加 OCC-only deactivation flush containment + 189 LOC AgentLifecycleBdd 回归覆盖(OCC + non-OCC propagation)。

closes #1489
refs #1381 (来源父 issue split)
refs #1490 (later-slice design-pending: runtime-wide deactivation failure contract)

⟦AI:AUTO-LOOP⟧

* [refactor-impl] #1489 first-slice fix r2: 校准 refactor self-doc tag 格式

把 GAgentBase.TState.cs:70 的 refactor tag 改成 SKILL Hard rule #3 规范的
`iterN/cluster-XXX` 形式,只动 self-doc 注释 tag 前缀。

仅修 r1 architect + quality 同点 comment。

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "floor最低10, 最高30, 优先处理所有存量issues/pr".

变更:
- SKILL.md Hard floor section: floor=5 → range [10,30],ceiling 行为(>=30 不主动派)
- SKILL.md priority list 11-12 audit 退回 "仅 1-10 全空 + ACTIVE<10 才派"
- wakeup-check.sh FLOOR_REQUIRED=10 → FLOOR_MIN=10 + FLOOR_MAX=30,加 ceiling check
- 优先级铁律重申:audit 是 last-resort backfill,1-12 任一可推进则不允许 audit

⟦AI:AUTO-LOOP⟧
由 Phase 9 split first-slice 产生。详见 GitHub issue #1424 body。

⟦AI:AUTO-LOOP⟧
* #1304 first slice: 显式 NyxRelayAgentBuilderFlow fall-through(no-new-core)

- NyxRelayAgentBuilderFlow 新增本地 outcome/resolution,显式区分:
  known agent-builder command / non-slash 普通文本 / unknown slash pass-to-LLM /
  private-chat rejection
- ChannelConversationTurnRunner 只在 matched known agent-builder command 时进入
  agent-builder direct path
- 补 NyxRelayAgentBuilderFlowTests + ChannelConversationTurnRunnerTests 证明:
  /daily / unknown slash / 普通文本不触发 agent-builder tool execution,
  继续进入 LLM/Ornn skill fallback

实现 #489 split 的 first slice(no-new-core)。

⟦AI:AUTO-LOOP⟧

* fix(pr1306/r1): 补 refactor self-doc marker(architect + quality 评论建议)

per PR1306 r1 architect + quality comment 同建议补 self-doc marker。non-blocking comment 但补齐让审计追踪更清晰。

改动:
- agents/Aevatar.GAgents.Authoring.Lark/NyxRelayAgentBuilderFlow.cs(补 marker)
- agents/Aevatar.GAgents.NyxidChat/ChannelConversationTurnRunner.cs(补 marker)

注:codex 输出 FIX_BLOCKED:env-missing:FIX_OUTPUT_PATH 因 dispatcher 未传 FIX_OUTPUT_PATH env,但实际改动已正确产生(controller verify)。

⟦AI:AUTO-LOOP⟧
per Auric 2026-05-31 "为什么还在持续审计? 在处理完积攒issues之前不开新审计."

根因(两个 bug 合谋让 audit always-available):

1. STEP F query 过滤了 ⏸️ phase:blocked label
   - 3 个 design-solving + blocked issue(#1494/#1488/#1484)被漏检
   - blocked 是"first-slice 未完"提示,不应阻 Phase 9 派 solver
   - solver 不动 code,只产 design plan,可与 first-slice impl 并行

2. 30 个 auto-loop-triage 积压未计入 G_BUSY
   - triage-monitor.sh daemon 11+ 小时未 queue 新 event
   - pending events offset 已对齐,但 30 个 label 仍挂在 issue 上
   - 原 STEP E 只数 untouched issue,不数已 labeled 但未派 codex 的 backlog
   - 导致 STEP G 报 A-F empty → 派 audit-iter-823 至 832 共 10+ 次

修法:
- STEP F:去掉 ⏸️ blocked filter,3 个 Phase 9 backlog 进入 queue
- 新增 STEP E2:统计 auto-loop-triage 数量,列前 5 个 oldest
- G_BUSY 加入 TRIAGE_COUNT,堵住 audit
- HARD GATE queue 新增 P6b:派 triage codex(daemon 跟不上时 controller 自己派)

⟦AI:AUTO-LOOP⟧
…531-080900

chore: dev → auto-refact-dev 自动同步 (1 commits)
@loning loning merged commit 1086fb1 into dev May 31, 2026
12 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto-loop Created by codex-refactor-loop skill 🔧 phase:fixing

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant