持续重构集成#690
Conversation
📊 iter17 进展 — 4/4 cluster merged 🎉
iter17 净改动:多 actor / 多 projection / proto schema 演化 + 删 process-local 权威源。 🤖 controller status banner |
📊 iter18 audit 派出iter17 4/4 cluster merged → 自动派 iter18 audit codex(per SKILL '## INFINITE refactor loop')。
剩 open design issue:#720 #722(escalated 等 maintainer)— 不阻 iter18。 🤖 controller status banner |
📊 iter18 bootstrap — 7 cluster 进入工作链
Phase 9 multi-solver 已为 6 design issue 排队,controller 下次 wakeup 触发派出 r1 三 solver。 🤖 controller status banner |
📊 iter18 Phase 9 r1 派出(6 design issue × 3 solver = 18 child codex)
每 solver 3600s 上限。等齐 3 solver per issue → controller 派 meta-judge。 🤖 controller status banner |
📊 iter18 Phase 9 r1 全 18 codex 派出 ✅
后台 in-flight = 19 codex(18 Phase 9 r1 solver + 1 cluster-003 implement)。 🤖 controller status banner |
implement: cluster-003已完成
摘要: |
📊 iter18 Phase 9 r1 结果
后台 in-flight = 13 codex(12 r2 solver + 1 rebase resolve)。 🤖 controller status banner |
📊 iter18 进展更新
iter18 净:2/7 cluster merged;5 escalated 等 maintainer 决策。 Auto-loop 推进无可派任务(全 escalation 路径 + 0 in-flight codex)。下次 wakeup 进入 idle heartbeat 模式。 🤖 controller status banner |
📊 iter19 audit 派出iter18 已 merge 2/7(余 5 escalated 等 maintainer);loop 在 idle 后按 INFINITE 规则派 iter19 audit 拉新工作(独立于 escalation 路径)。 🤖 controller status banner |
📊 状态 — 已收到 maintainer 评论(daemon 识别)
🤖 comment-monitor.sh daemon ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — solver 派出
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
📊 状态卡片 — solver 派出
🤖 controller status banner ⟦AI:AUTO-LOOP⟧ |
|
⟦AI:AUTO-LOOP⟧ iter20 bootstrap complete OPENED:design-issue:cluster-001-studio-host-authoring-orchestration:747 Notes:
|
📊 codex 进展 iter20-bootstrap (⏳ 进行中; 已跑 6 min)
|
Brings in 50 cluster commits from the codex-refactor-loop rollup branch — 368 files, +22120/-12016 net (matches PR #690). Major architectural inflow: - ILLMProvider stream-only contract (cluster-001 deletes ChatAsync; all 25 callsites migrated to ChatStreamAsync+aggregator) - NyxRelay reply-token cleanup → persisted admission claim flow (CaptureNyxRelayReplyToken/RemoveNyxRelayReplyToken/Schedule*Cleanup helpers + NyxRelayReplyTokenCleanupRequestedEvent removed; capped RelayReplayClaimsCap=10000, PendingRelayAdmissionsCap=1000) - Studio authoring port + Host fake actor shell deletion (iter21 cluster-001) - Request-path projection priming via CQRS binders (iter21 cluster-002, supersedes #751) - Projection scope watermark → typed readmodel + committed-state publication hook (cluster-003/006) - Voice host session state / provider response epoch move into actor turn (iter15 cluster-025/026/027) - Workflow scope/channel typed proto fields (cluster-029) Conflicts resolved (3): - agents/.../ConversationGAgent.cs: kept router's chat-route admission reject path (issue #694), replaced the dead RemoveNyxRelayReplyToken call with ClearReplyLifecyclesAsync(..., "chat_route_rejected") to match the new admission-claim flow; merged the runCopy mutations so target_ref + reply_token + transport credentials all flow through to the run actor. - test/Aevatar.AI.Tests/NyxIdChatEndpointsCoverageTests.cs: kept HEAD's generalized NormalizeEndpointArgs (Any-based) with chat-routing stub insertions, dropped auto-refact-dev's legacy length-equality short-circuit. - test/.../ConversationGAgentDedupTests.cs: merged optional ctor params (queryPort + chatRouteResolver + store + eventPublisher) and kept both branches' helper classes (StaticChatRoute* + RecordingEventPublisher). Build: 171 projects, 0 errors. No push.
per Auric 2026-05-21 "完整分析改脚本": 新文件 tools/refactor-loop/controller_lib.sh: - safe_worktree: detect-or-create,消除 "already exists" race - merge_pr <pr>: auto-close linked issue + cleanup phase labels + worktree remove。修复 #2 (Closes # 不 trigger close 因为 base!=master) - open_pr_with_label: 原地 export PR_NUM,消除 bash subshell grep var bug (iter22 #690 reviewer 误发事故) - render_template: 处理 {{var}} + envsubst 双语法 - sweep_stale_labels: 批量清 closed but in-flight phase label - validate_prompt: 派 codex 前 check 0 unresolved {{var}} (iter25 #784 implement blocked 事故) 模板修正:audit.md/implement.md/remote-ci-fix.md/test-add.md/verify.md 全部从 {{var}} 转 ${VAR}(envsubst 兼容)。 SKILL.md 新章节: - Label 生命周期状态机(per kind:design issue / cluster PR / rollup PR) - 强制规则:派 codex 必 validate_prompt;merge 必 merge_pr; worktree 必 safe_worktree;PR num 必 open_pr_with_label ⟦AI:AUTO-LOOP⟧
… lookup contract (#884) * iter49 cluster-049 gagentservice-runtime-attach-existing-side-read: 投影 port 改 typed lookup contract 按 iter49 audit cluster-049-gagentservice-runtime-attach-existing-side-read(low,requires_design:false 机械重构): 1. Projection Core 加 typed attach-existing lease/session lookup contract 2. GAgentDraftRunProjectionPort:71 + GAgentRunTerminalProjectionPort:75 + ScriptServiceAguiProjectionPort:61 改 typed contract,不再 ExistsAsync(ProjectionScopeActorId.Build()) 3. 保留 attach-existing semantics 不引入新 actor / 不复活 actor-id 反查。 ⟦AI:AUTO-LOOP⟧ * test(pr884 r1): 补 coverage-quality patch — projection scope + GAgent attach-existing 5 test files: ProjectionRuntimeRegistrationTests / ProjectionScopeStatusRuntimeRegistrationTests + GAgentDraftRunProjectionInfrastructureTests / ScriptServiceAguiProjectionPortTests / ServiceProjectionInfrastructureTests ⟦AI:AUTO-LOOP⟧
…command service (#886) * iter49 issue-882 script-command-readmodel-activation: 移 activation 出 command service,改 committed-state plan provider 按 issue #882 Phase 9 r1 consensus(meta-judge: structural): - ScopeScriptCommandApplicationService 删 ActivateAsync(definitionActorId/catalogActorId) - 新 scripting committed-state projection activation plan provider(参考 PR #875 HealthProbe pattern) - command receipts accepted-only,不暗示 readmodel visibility 不引入新 actor / 不改外部 contract。 Closes #882 ⟦AI:AUTO-LOOP⟧ * fix(iter49 issue-882): r2 integration test compile fix 按 PR #886 r1 全 3 reject 根本因(CS1729 编译错误): - ScopeScriptCapabilityServiceTests.cs:40 更新 constructor 到新 signature - 删除/更新旧 ActivateAsync 断言(activation 已移到 ScriptingCommittedStateProjectionActivationPlanProvider) applied=1 rejected=0 blocked=0(per fix-pr886-r2 codex) ⟦AI:AUTO-LOOP⟧ * test: cover scripting projection activation gaps
…e-endpoint-direct-runtime-dispatch
…-turn-inline-timeouts
…ice-presence-lease-ack-snapshot iter51 cluster-051 voice-presence-lease-ack-snapshot: typed sentinel + split lease/attach readiness
… facade + actor-owned compensation (#885) * iter47 issue-877 chat-endpoints-own-lifecycle-and-compensation: typed lifecycle facades + actor 拥有 compensation/terminal-state 按 issue #877 Phase 9 r1 consensus(meta-judge: structural,no new actor): 1. NyxIdChatLifecycleFacade.cs(新) + StreamingProxyChatLifecycleFacade.cs(新):typed lifecycle command facade 2. NyxIdChatEndpoints: 删 IActorRuntime / IRegistryCommandPort / IChatHistoryStore 注入,改 facade only 3. StreamingProxyEndpoints: 进一步收窄(与 #874 不冲突) 4. NyxIdChatGAgent / StreamingProxyGAgent: 扩展 lifecycle + compensation events(actor-owned) 5. agent_run.proto: typed lifecycle event 字段 6. ServiceCollectionExtensions: 注册 facade + 删 store injection 7. 测试覆盖 endpoint adapter only + facade dispatch + actor compensation events 不引入新 actor / 不 saga actor。 Closes #877 ⟦AI:AUTO-LOOP⟧ * fix(pr885 r2): review 反馈 — typed lifecycle facade + actor compensation 完整化 3 reviewer r1: architect/tests reject、quality approve。r2 应用 2 处: - NyxIdChat / StreamingProxy chat lifecycle facade 与 actor compensation 全链路对齐 - 测试覆盖 facade dispatch / actor compensation / terminal-state readmodel ⟦AI:AUTO-LOOP⟧ * fix(pr885 r3): review r2 4 处 blocking — explicit CreatedLocally + admission gate + room unregister + real-actor compensation tests 1. ARCHITECT: NyxId create resolver 显式 set CreatedLocally(ForwardToGagent=false / fresh=true);actor 不再从 id prefix 推断 → 既有路由 actor 不会被误销毁 2. QUALITY-1: StreamingProxy room delete 补回 IGAgentActorRegistryCommandPort 注销(facade 漏抄);delete-side fail 时返回失败 3. QUALITY-2: NyxId delete resolver non-accepted admission 时拒绝解析 → 403/404 路径不再触发 actor unregister/delete history 4. TESTS: NyxIdChatGAgentTests 加真 envelope test 覆盖 HandleCreationCompensationAsync(createdLocally=true|false 双 branch)+ HandleDeletionCompensationAsync(registration restore);endpoint helper 不再 short-circuit 修后 lifecycle 127 passed + test_stability_guards passed。 ⟦AI:AUTO-LOOP⟧ * fix(pr885 r4): await actor outcome — replace pre-dispatch ACK with continuation event architect+tests r3 同根 BLOCKER:CreateConversationAsync 返 200 基于 pre-dispatch ACK,actor 后续可 compensate/destroy 不抛 → endpoint 报 success 但 actor 没真注册。 修法 A(continuation): - 新 ICommandDispatchService.DispatchAndAwaitOutcomeAsync<TOutcome> + ActorOutcomeSubscription + CommandOutcomeDispatchResult - NyxIdChatGAgent 完成 create handler 后发 typed NyxIdChatConversationCreationOutcome continuation event(success/RegistrationUnavailable/Destroyed) - NyxIdChatLifecycleFacade 改 await continuation,基于真 actor outcome 构 receipt - endpoint 200 / 503 / 等基于真 outcome - 删 InlineNyxIdCreateLifecycleDispatchService fake → endpoint test 走真 dispatch + 真 actor + 假 registry 注入失败 加 tests: - 真 actor compensation test(真 envelope 经真 CommandDispatchService) - delete admission negative(Denied/ScopeMismatch/Unavailable)— 验证无 actor delete dispatch、无 history delete、无 unregister 副作用 ⟦AI:AUTO-LOOP⟧ * fix(pr885 r5): StreamActorOutcomeChannel + subscribe-before-dispatch + real DELETE pipeline architect r4 3 个 BLOCKER: 1. InMemoryDict 违 actor/distributed 规则 → 改 StreamActorOutcomeChannel(Orleans IStreamProvider) 2. dispatch-before-outcome 顺序倒置 → subscribe-before-dispatch + actor failure 只发 outcome 不 rethrow 3. DELETE endpoint 测试仍 inline fake → 删,走真 dispatch pipeline 修法: - 删 InMemoryActorOutcomeChannel.cs - 新 StreamActorOutcomeChannel.cs(IStreamProvider 后端,multi-silo OK) - DefaultCommandOutcomeDispatchService subscribe 先,然后 dispatch,await outcome(支持 dispatch 异常 fallthrough) - 约束 outcome dispatch 只接受 protobuf 消息 - NyxIdChatGAgent registration failure 时发 unavailable outcome 后**不 rethrow**(endpoint 基于 outcome map 503) - 删 DELETE endpoint inline fake dispatch helper;tests 走真 DefaultCommandDispatchService → ActorCommandTargetDispatcher → NyxIdChatGAgent.HandleDeleteConversationAsync - 加 endpoint 503 assertion(真 outcome 路径) 41/41 + 72/72 PASS,test_stability_guards PASS。 ⟦AI:AUTO-LOOP⟧
…low-up coalesced op for pending omnibus r2 reject:CardKit in-flight `second` continuation 持久化 pending `third` 为 LastFlushedText(未 ack)。 修法:HandleLarkCardStreamContinuationAsync 完成 in-flight 后,基于 ackedText 更新 LastFlushedText;若 pending != ackedText,emit follow-up self-signal 启动 coalesced CardKit op,follow-up 完成才推 LastFlushedText。 更新 ConversationGAgentDedupTests assert serial coalescing 经 follow-up 操作。 ⟦AI:AUTO-LOOP⟧
…ned + callback self-signal (#872) * iter44 issue-866 voice-presence-process-runtime-state: VoicePresenceModule 字段事实改 actor-owned + callback self-signal 按 issue #866 Phase 9 r1 consensus(meta-judge: structural,reuse RoleGAgent voice runtime): 1. VoicePresenceModule 删 _runtimeState/_userTransport/_selfEventDispatcher/_relayCts/_userToProviderRelay/_providerToUserRelay 等参与业务事实的 module field 2. 业务事实改 RoleGAgent voice runtime state 唯一权威(actor-owned typed state) 3. Transport/provider handles 改 volatile byte-only lease(不决定 business state) 4. Provider/transport callback 改 typed self-signal pattern(actor turn validate) 5. WebRtcVoiceTransport lock 收窄到 pure codec buffer(不影响 control/session state) 6. voice_presence.proto / VoicePresenceSession / VoicePresenceSessionDispatch 适配 7. 测试覆盖 typed-only authority + callback self-signal + transport byte-only + lock 收窄 不引入新 actor。 Closes #866 ⟦AI:AUTO-LOOP⟧ * test(pr872 r3): 补 codecov/patch — VoicePresenceModule typed signal + lease validation + provider keying 覆盖 omnibus r2 approve(架构 OK),但 codecov/patch < 80%。补 4 处: - VoicePresenceModuleTests +351 LOC:typed signal handler + lease owner/expiry validation + provider callback keying - VoiceTransportRelayTests:微调 12 LOC 注:codex 也微调 production(voice_presence.proto +9 字段 / VoicePresenceModule +176 LOC)— 应是 codex 补 typed signal 完整化所需 minor 增益(非新功能,架构 surface 完整化)。 本地 Cobertura diff-line for VoicePresenceModule.cs:404/427 = 94.6%。 ⟦AI:AUTO-LOOP⟧
…e-endpoint-direct-runtime-dispatch
…-turn-inline-timeouts
…althProbeStartupService 改 committed-state activation (#875) * iter47 cluster-005 status-dashboard-startup-projection-activation: HealthProbeStartupService 改 committed-state activation plan provider 按 iter47 audit cluster-005(requires_design:false,机械重构): 1. HealthProbeStartupService: 删 _projectionPort.EnsureProjectionForActorAsync 直接 startup priming 2. HealthProbeStartupService: 删 Task.Delay retry,改 hosted scheduling pattern 3. 新增 HealthProbeCommittedStateProjectionActivationPlanProvider(projection-owned lifecycle activation,非 query-time priming) 4. HealthProbeProjectionPort + StatusDashboardServiceCollectionExtensions 适配 5. 测试:HealthProbeStartupServiceTests(+169 行)/ HealthProbeCommittedStateProjectionActivationPlanProviderTests / StatusDashboardServiceCollectionExtensionsTests Note: full test suite has pre-existing failures in scripting/GAgentService integration tests not in this change scope。本 PR 仅含 StatusDashboard 改动 + 测试,本地相关测试 pass。 ⟦AI:AUTO-LOOP⟧ * fix(iter47 cluster-005): r2 codecov coverage gap — 补 HealthProbeCommittedStateProjectionActivationPlanProvider + DI 测试 按 PR #875 codecov-quality fail:patch coverage 不达标。 补测试覆盖: - HealthProbeCommittedStateProjectionActivationPlanProvider 完整 lifecycle path - HealthProbeStartupService 新 path(删 EnsureProjection + Task.Delay 后) - DI 注册改动 applied=3 rejected=0 blocked=0(per fix-pr875-r2 codex) ⟦AI:AUTO-LOOP⟧
…tor-turn-inline-timeouts iter47 issue-878 actor-turn-inline-timeouts: 删 CardKit actor-turn 等待,改 typed continuation
…vice-endpoint-direct-runtime-dispatch iter47 issue-873 device-endpoint-direct-runtime-dispatch: typed facade + 删 callback auto-create + registration admission
Cover VoicePresence typed sentinel endpoint branches and WHIP detach behavior.\n\n⟦AI:AUTO-LOOP⟧
… + dual store,room actor 单事实源 (#893) * iter50 issue-887 streaming-proxy-participant-authority: room actor 单事实源,删 singleton + dual store + readmodel design consensus(Phase 9 r1 unanimous,#887):room-actor-authority-delete-singleton。 删除: - StreamingProxyParticipantGAgent(singleton cluster-scoped actor) - streaming_proxy_participant_messages.proto + State - Projection/projector + studio_projection_readmodels.proto 内 StreamingProxyParticipantCurrentStateDocument - projection readmodel registration + cluster-scoped 启动注册 - ActorBackedStreamingProxyParticipantStore(dual-write surface)+ 应用层 IActorRuntime 注入 保留/重做: - StreamingProxyGAgent per room 作 participant authority(已 own participants 字段) - Endpoint 改 typed application/interaction service 注入,移走 IActorRuntime - 应用层调 room current-state query 替代旧 store - 不动 StreamingProxyNyxParticipantCoordinator(facade 边界,#885 并行) - 不动 NyxID LLM provider / room chat semantics - 不动 chat lifecycle path(那是 #885/#877) 测试:room actor authority + endpoint typed service + 删 singleton 后无引用残留 + projection 物化路径。 31 files +399/-1235(净 -836 LOC,真删除而非空壳)。 ⟦AI:AUTO-LOOP⟧ * fix(pr893 r2): r1 architect+quality 2 BLOCKER — projection activation + actor-owned idempotent join quality+architect r1 2 BLOCKER: 1. Participant readmodel 无 projection activation path → 加 StreamingProxyCommittedStateProjectionActivationPlanProvider + ServiceCollectionExtensions DI 2. Cold/stale projection 漏入 write control flow → 删 service-layer dedupe(read projection 决定 dispatch);dedupe 决策上移 actor 内(StreamingProxyGAgent.HandleGroupChatParticipantJoined 见 participants.Contains(id) → 不 publish event) 更新 stale test: - StreamingProxyCoverageTests:duplicate same-id joins 期望 publish count 1(不再 2),actor-owned idempotent ⟦AI:AUTO-LOOP⟧ * test(pr893 r3): 加 StreamingProxyCommittedStateProjectionActivationPlanProviderTests + DI 注册 + 物化链 omnibus r2 mixed:架构 OK 但缺 activation provider 回归测试。 加 8 tests covering: - Provider 真给出 activation plan - Plan 真覆盖 room state-event types - DI 注册 provider 到 dispatcher chain - committed state-event → projection runs → readmodel populated ⟦AI:AUTO-LOOP⟧
…or,改 typed provisioning port (#883) * iter49 cluster-049 chat-history-index-side-lifecycle: 删 ChatConversationGAgent service-locator,改 typed provisioning port 按 iter49 audit cluster-049-chat-history-index-side-lifecycle(requires_design:false 机械重构): 1. 删 ChatConversationGAgent.cs:118 `Services.GetService(IActorRuntime)` service-locator 反射 resolve 2. 删 inline 创 ChatHistoryIndexGAgent in event handling 3. 改 constructor-injected narrow provisioning/topology port(IChatHistoryIndexProvisioningPort 或类似) 4. ChatHistoryIndexGAgent 由 catalog/manager actor / explicit topology setup 前创建 不引入新 actor / 不改 user-visible behavior。 ⟦AI:AUTO-LOOP⟧ * test(pr883 r1): 补 ChatConversationGAgent lifecycle boundary tests for coverage-quality patch cover ChatConversationGAgent forwarding lines 48 / 73; codex-verified Cobertura hits 已覆盖。注:仓库 coverage_quality_guard.sh 在 PROJECTION_DISABLED 集成测试失败前就 exit,不影响本 PR 实际 coverage。 ⟦AI:AUTO-LOOP⟧
|
host-composition-smoke investigation:
|
…ent facade + 删 UI/layout server fact (#869) * iter42 issue-864 studio-workspace-execution-fact-owner: ServiceRunGAgent readmodel facade + 删 UI/layout server fact 按 issue #864 Phase 9 r2 consensus(meta-judge: delete framing): 1. ExecutionsController/Service backed by IServiceRunQueryPort(bounded facade,scope-filtered + bounded Take + no query-time replay/priming) 2. 删 server-side UI/layout workspace facts(appearance theme / color mode / workflow canvas layout / authoritative HasLayout) 3. 派生 draft index 自 existing StudioWorkspaceGAgent draft map + workflow/service catalog readmodels 4. ScriptEvolutionSessionGAgent / StudioWorkspaceGAgent state 收窄(typed proto field 重排) 5. 新增 guard tools/ci/studio_fact_owner_guard.sh 防 FileStudioWorkspaceStore / StoredExecutionRecord / executions/*.json / StudioExecutionHistory* / DraftIndexActor / workflow-draft-index.json resurrection 6. architecture_guards.sh 接入新 guard 不引入新 actor(retrospective follow-up of #711 reflector "split" 决议的正确收尾)。 Closes #864 ⟦AI:AUTO-LOOP⟧ * fix(iter42 issue-864): r2 polish — 3 comment 处理 按 PR #869 r1 3 reviewer comments(均 non-blocking): - quality: ExecutionService 内重复 refactor banner → 改短 local intent 注释 - tests: studio_fact_owner_guard.sh 缺 negative/fixture test → 新增 StudioFactOwnerGuardTests.cs(在 Architecture.Tests 项目) - architect: minor advisory 处理 applied=4 rejected=0 blocked=0(per fix-pr869-r2 codex) ⟦AI:AUTO-LOOP⟧ * fix(pr869): make studio fact owner guard self-contained
…okup + 4 ports + guard (#903) design consensus(Phase 9 r1 unanimous,#898):structural typed Projection Core lease lookup。 机械扩展 #884 pattern 到 4 个 feature ports: - agents/Aevatar.GAgents.NyxidChat/NyxIdChatProjectionSession.cs - agents/Aevatar.GAgents.StreamingProxy/StreamingProxyRoomSessionProjectionPort.cs - src/Aevatar.Scripting.Projection/Orchestration/ScriptEvolutionProjectionPort.cs - src/workflow/Aevatar.Workflow.Projection/Orchestration/WorkflowExecutionProjectionPort.cs 全部走 IProjectionScopeAttachExistingLeaseLookup<TLease>。新 guard tools/ci/projection_attach_existing_side_read_guard.sh 防 recurrence,挂 architecture_guards.sh。 ⟦AI:AUTO-LOOP⟧
…eceipts + 3 narrow ports (#904) * iter51 issue-900 workflow-actor-port-runtime-object: typed actor-id receipts + 3 narrow ports design consensus(Phase 9 r1 unanimous,#900):actor-id-workflow-receipts-split-ports。 删 Application 层 IActor 暴露: - IWorkflowRunActorPort 拆为 3 个窄端口:IWorkflowDefinitionProvisioningPort / IWorkflowRunProvisioningPort / IWorkflowDefinitionParser - Application 改 typed WorkflowRunCreationReceipt(ActorId, DefinitionActorId, CreatedActorIds) - WorkflowRunCommandTarget 基于 ActorId + dispatch contract,不持 IActor - 一次性替换 caller,不留 backwards-compat shim 35 files +287/-495(净 -208 LOC,删除压倒添加)。 验证:test_stability_guards / workflow_binding_boundary_guard / architecture_guards 全 PASS。 ⟦AI:AUTO-LOOP⟧ * fix(pr904 r2): 删 double-bind regression + 加 integration test omnibus r1 reject:DefaultServiceRuntimeActivator EnsureDefinitionAsync 后又 BindWorkflowDefinitionAsync,real port 内部已 bind → WorkflowGAgent.Version 增 2 次,duplicate committed facts。 修法:删 duplicate Bind 调用;加 real-port integration test 断言 Version 只增 1 次;fix test fake 让其 model bind side effect。 ⟦AI:AUTO-LOOP⟧
…ion proto contract + typed schedule boundary (#880) * iter48 issue-879 runtime-callback-persistent-state-not-proto: Foundation runtime proto contract + typed schedule boundary 按 issue #879 Phase 9 r1 consensus(meta-judge: structural): 1. 新 runtime_callback_scheduler_state.proto:Foundation runtime callback proto contract(actor id / callback id / generation / periodic / due/period / fire index / delivery mode / trigger envelope) 2. 删 RuntimeCallbackSchedulerGrainState.cs(hand-written C# class + Dictionary + byte[] EnvelopeBytes) 3. 替换 IRuntimeCallbackSchedulerGrain / RuntimeCallbackSchedulerGrain 使用 proto-backed state 4. OrleansActorRuntimeDurableCallbackScheduler 改 typed EventEnvelope schedule boundary(无 raw bytes) 5. runtime_callback_guards.sh 更新:阻止非 proto IPersistentState<...State> callback payload 6. 测试:RuntimeCallbackSchedulerStateProtoTests(新) / OrleansActorRuntimeCallbackSchedulerTests / OrleansActorRuntimeForwardingTests / CiTestAuthorityContractTests 更新 不引入新 actor / 新 query surface;保留 actor-scoped Orleans scheduler grain + lease semantics。 Closes #879 ⟦AI:AUTO-LOOP⟧ * chore: trigger CI re-run after gh checkout flake Empty commit to retry actions/checkout@v4 transient failure on PR #880(infrastructure issue, not code). ⟦AI:AUTO-LOOP⟧ * fix(pr880 r1): typed slot_epoch in lease + envelope proto — preserve generation fencing across v2 storage upgrade architect r1 BLOCKER:`SchedulerStateName -v2` 重置 generation fencing,旧 persisted lease 可 cancel 升级后新 schedule。 修法 B(typed epoch): - 新 lease/envelope proto 加 `slot_epoch` 字段 - v2 storage 用新 epoch - cancel/cancel-by-generation 校验 (slot_epoch, generation) 一对 - 旧 epoch 的 lease 不能 cancel 新 epoch 的 schedule 加 regression test:old-epoch-lease-vs-new-schedule-fencing。 ⟦AI:AUTO-LOOP⟧ * Fix runtime callback guard fallback * test: cover runtime callback slot epoch lines * test: cover runtime callback grain fences
… startup materializer + readmodel facade (#902) * iter46 issue-871 workflow-file-catalog-query-port: WorkflowGAgent + startup materializer + readmodel facade 按 issue #871 Phase 9 r1 consensus(meta-judge): 1. WorkflowGAgent per-definition authority(committed definition state) 2. FileBackedWorkflowCatalogPort retire as online query source 3. WorkflowCapabilitiesStartupMaterializer(新)— startup time 一次性 file → readmodel projection 4. WorkflowCapabilitiesCurrentStateDocumentMetadataProvider(新)— typed readmodel projection 5. WorkflowDefinitionCatalog + WorkflowGAgent state proto 适配 6. workflow_state.proto / workflow_execution_messages.proto 扩展 typed events 7. tools/ci/workflow_catalog_query_port_guard.sh(新)— 防 Directory.EnumerateFiles / WorkflowParser.Parse / LoadConnectors / _cacheLock / _workflowFileDiscoveryCache / _parsedWorkflowCache 在 query port 复活 8. WorkflowProjectionMaterializationTests(+84)+ 其他测试覆盖 不引入新 actor type(no WorkflowCatalogActor),复用 WorkflowGAgent。 Closes #871 ⟦AI:AUTO-LOOP⟧ * fix(pr902 r2): GAgentServiceHosting 加 WorkflowCatalog/Capabilities readmodel providers omnibus r1 reject:standalone GAgentService bundle startup 挂(ProjectionStoreDispatcher 抛 No configured projection store bindings),因 AddGAgentServiceProjectionReadModelProviders 不注册 WorkflowCatalogCurrentStateDocument / WorkflowCapabilitiesCurrentStateDocument stores。 修法:Hosting/ServiceCollectionExtensions.cs 补 workflow readmodel store bindings + 加 startup integration test 验证 standalone bundle 真能 startup。 ⟦AI:AUTO-LOOP⟧ * test(pr902): cover workflow catalog readmodels
…try via durable self-callback (#908) * iter53 issue-906 oauth-bootstrap: one-shot bootstrap + actor-owned retry via durable self-callback design consensus(Phase 9 r1 unanimous,#906):actor-owned-oauth-provisioning-retry。 - AevatarOAuthClientBootstrapService 改 one-shot signal publisher,不持 Task.Run/retry loop/Task.Delay - AevatarOAuthClientGAgent 内 own retry/backoff via durable self-callbacks(per CLAUDE 延迟/超时事件化) - Drift reconciliation 同 actor 内 emit OAuthClientDriftReconciled event - 不动 NyxID 外部 surface 6 files +527/-274。27 OAuth tests PASS。 ⟦AI:AUTO-LOOP⟧ * fix(pr908 r2): actor 内 guard 防 duplicate external Ensure 绕过 pending backoff omnibus r1 reject P1:multi-silo bootstrap 每 silo dispatch 一次 EnsureCommand,actor 每次 immediately enter DCR call,bypass pending backoff。 修法:HandleEnsure 加 guard — State.ProvisioningRetryAttempt > 0 且 next-due-time > now 时 no-op;只 self-callback 才 re-enter DCR。 加 regression test:多 broadcast 模拟,verify DCR 只调 1 次直到 self-callback 触发。 ⟦AI:AUTO-LOOP⟧
…ace + projection-owner activation (#907) * iter52 issue-905 public-projection-ensure-ports: 删 public Ensure surface + projection-owner activation design consensus(Phase 9 r1 unanimous,#905):projection-owned activation,public ports attach/query only。 删:public IServiceCatalogProjectionPort / IServiceRunCurrentStateProjectionPort / IServiceDeploymentCatalogProjectionPort / IServiceServingSetProjectionPort / IServiceTrafficViewProjectionPort / ILlmSessionCurrentStateProjectionPort 等 EnsureProjectionAsync(actorId) 接口;ChannelBotRegistrationProjectionPort / DeviceRegistrationProjectionPort / UserAgentCatalogProjectionPort / HealthProbeProjectionPort 等 public port 删除。 保留/迁移: - Activation 移到 startup hosted services 直接持 bootstrap port - public ports 保留 Attach* / Release* / Query* / Read* 操作(#898 typed lookup attach-only pattern) - command target binder 不调 activation(已有 guard) - 加 guard projection_public_ensure_ports_guard.sh 64 files +90/-1041(净 -951 LOC,真删除)。 验证:guard / test_stability / architecture 全 PASS。 ⟦AI:AUTO-LOOP⟧ * fix(pr907 r2): 扩 guard scan + 删剩 ScriptExecution/ScriptEvolution/Studio public Ensure + 更新 docs omnibus r1 reject 2 issues: 1. guard 太窄,漏 ScriptExecution/ScriptEvolution/Studio public Ensure surfaces 2. docs/canon/status-dashboard.md 还文档已删 HealthProbeProjectionPort + EnsureProjectionForActorAsync 修法: - guard 扫所有 production public abstraction/agent/application surfaces,显式 allowlist projection-owned/bootstrap internals - 删 ScriptExecutionProjectionContracts / ScriptEvolutionProjectionContracts EnsureProjectionAsync(actorId);移到 internal port - 删 Studio public Ensure surface - 更新 docs/canon/status-dashboard.md 反映新 startup-dispatch + committed-state activation 模型 ⟦AI:AUTO-LOOP⟧ * fix(pr907 r3): coverage-quality 修 Inspector demo bootstrap path InspectorApplication 直接持 internal projection lifecycle 调用,fix-r2 删 public Ensure 后 demo 编译挂。补 InspectorStudioActorBootstrap startup adapter 代替直接 Ensure。 coverage_quality_guard PASS,line 88.4% branch 72.4%。 ⟦AI:AUTO-LOOP⟧
…ctivationPlanProvider coverage (#909) * iter52 issue-895 provider-coverage-contract: CI guard + 现有 readmodel 加 [ProjectionExempt] / provider design consensus(Phase 9 r1 unanimous,#895):provider-coverage-ci-composition-contract。 - 新 guard tools/ci/projection_activation_provider_coverage_guard.sh:扫所有 *CurrentStateDocument/Projector,要求 IProjectionActivationPlanProvider + DI 注册 + test,或显式 [ProjectionExempt] 分类 - 现有 readmodel(Studio / Channel / Device / Scheduled / Identity)按 case 加 [ProjectionExempt(Reason="...")] 或加 provider - 挂 guard 入 architecture_guards.sh 27 files +143 LOC。验证:projection_activation_provider_coverage_guard / architecture_guards / test_stability_guards / focused provider/DI tests 全 PASS。 ⟦AI:AUTO-LOOP⟧ * fix(pr909 r2): guard per-projector 验证 + 加 GAgentRunTerminalProjectionContext plan omnibus r1 reject 3 issues: 1. guard 太 coarse(同 file 任意 provider 算 covered) 2. ServiceCommittedStateProjectionActivationPlanProvider 不返回 GAgentRunTerminalProjectionContext plan 3. CI red 修法: - projection_activation_provider_coverage_guard.sh 改 per-projector 验证(每个 AddCurrentStateProjectionMaterializer 对应 specific provider plan) - ServiceCommittedStateProjectionActivationPlanProvider 加 GAgentRunTerminalProjectionContext plan - ScriptingCommittedStateProjectionActivationPlanProvider 同样补足 + test 更新 ⟦AI:AUTO-LOOP⟧ * Classify workflow capabilities projection bootstrap * Align activation providers with bootstrap activators * test(pr909 r3): 补 codecov/patch — Projection*Exempt 普查 + provider plan unit tests omnibus r1 reject 3 issues 全 resolved(investigator commit + r2)。codecov/patch 单点 fail。 补 5 test 文件: - ProjectionExemptAttributeTests(attribute 自身覆盖) - StudioProjectionExemptionTests(Studio readmodel 普查) - WorkflowProjectionExemptionTests(Workflow readmodel 普查) - ServiceCommittedStateProjectionActivationPlanProviderTests 扩展(GAgentRunTerminalProjectionContext) - ScriptingCommittedStateProjectionActivationPlanProviderTests 扩展 不动 production。 ⟦AI:AUTO-LOOP⟧
… committer (#913) #894 Phase 9 r2 consensus (3/3 unanimous): - StreamingProxyNyxParticipantCoordinator 收缩为 adapter-only,只 forward Nyx I/O 结果到 typed room request payloads - StreamingProxyGAgent (room actor) 处理 join/post/leave/terminal request,唯一 committer of room facts - IStreamingProxyRoomCommandService 加 LeaveAsync + 新 typed request payloads - 不新增 actor type / envelope kind / Projection phase - Nyx LLM I/O (长 ChatStreamAsync) 仍在 coordinator outside actor turn LOC +433/-176;StreamingProxyGAgent 95.94% / coordinator 86.00% / command service 97.11% coverage test_stability_guards.sh + architecture_guards.sh + StreamingProxy filter 82/82 PASS ⟦AI:AUTO-LOOP⟧
…nk (#915) #912 audit-iter-56 cluster-056-external-link-callbacks-bypass-actor-signal-contract: - 新增 ExternalLinkMessageReceivedSignal + reuse 已有 typed state signal - WebSocketTransport 不再直接 invoke OnMessageReceived/OnStateChanged callback - transport 只 publish typed signal,ExternalLinkManager 在 actor turn 内消费再 emit public event - Telegram external-link transport/fakes/tests 同步迁移 Coverage: WebSocketTransport line-rate 1.0 / branch-rate 0.82 不加 reconnection feature(per cluster boundary) test_stability_guards.sh + architecture_guards.sh PASS ⟦AI:AUTO-LOOP⟧
…ion port (#918) #868 Phase 9 r4 consensus(4 轮收敛达成 IGAgentDraftRunInteractionPort): - 新增 IGAgentDraftRunInteractionPort:DraftRun actor create/reuse/register/rollback 收敛到 Application interaction service - 删除旧 IGAgentDraftRunActorPreparationPort + preparation service surface(被 interaction port 取代) - NyxID stream/approval endpoint 不再直接注入/读取 IActorRuntime - NyxID relay endpoint 改走 INyxIdRelayIngressPort,不再直接 create actor / dispatch envelope - 补 unit + integration + NyxID coverage tests LOC +1005/-1154 net -149(大 cleanup) Patch coverage 238/252 = 94.44% GAgentDraftRun + ScopeGAgentEndpoints + NyxIdChat tests 183 passed test_stability_guards.sh + architecture_guards.sh PASS ⟦AI:AUTO-LOOP⟧
…mitted-state provider (#916) * iter56 cluster-910: 删除 command-path projection activation,改 Studio committed-state provider #910 Phase 9 r1 consensus(3/3 一轮达成 minimal/structural/delete): - 删除 Scripting / Studio 写命令路径 EnsureActorProjectionAsync / ActivateAsync 同步调用 - 删除 Scripting/Workflow 老的 activation port interface + wrapper facade + 未用的 StudioProjectionPort - 新增 StudioCommittedStateProjectionActivationPlanProvider(覆盖 Studio projected actors) - 移除 Studio projector exemption(provider guard 覆盖后无需 exempt) - 不新增 Core types / pipeline phase / docs/canon vocabulary LOC +227/-593 net -366(大 cleanup) test_stability_guards.sh + projection_activation_provider_coverage_guard.sh + architecture_guards.sh PASS Scripting Core + Studio + Workflow Host API tests PASS ⟦AI:AUTO-LOOP⟧ * iter56 cluster-910 r2 fix: 修 InspectorApplication 旧 StudioProjectionPort 引用 + 补 Studio hook 覆盖 omnibus r1 APPROVE 但 coverage-quality CI 因 build break + patch coverage 边界失败: - InspectorApplication.cs:用新 StudioCurrentStateProjectionPort 替代被删的 StudioProjectionPort(build break 修复) - Studio 委托 committed-state hook 路径补 unit test 覆盖 - UserConfigProjectionAndControllerTests:更新 assert "no command-path projection priming" local PASS: - restore_and_build.sh + test_stability_guards.sh + coverage_quality_guard.sh - StudioCommittedStateProjectionActivationPlanProvider line/branch = 1.0/1.0 - 过滤 line 88.7% / branch 72.6% ⟦AI:AUTO-LOOP⟧
iter15 rollup: 6 architecture-cleanup clusters | iter15 rollup:6 个架构清理 cluster
This is the iteration-level rollup of all iter15 auto-refactor clusters landed on
auto-refact-dev. Reviewing this PR is the human-gate point for the entire iteration.本 PR 是 iter15 自动重构所有 cluster 在
auto-refact-dev上的迭代级 rollup。审本 PR 即审整个 iteration 的人工把关点。Cluster ledger | 集群清单
ToolCallLoopmiddleware 持IsStreaming=true;新ChatStreamContentAggregatorhelper 用于 5 处非流式聚合场景_gate/_state/AttachmentState删除;remote audio chunk envelope 路径禁用直到 raw transport;setup/control envelopes 保留_responseEpochs字典从 provider 后台线程移走;actor turn 持 provider-response-id 映射 + cancel 抑制;新 typedprovider_response_idproto 字段TurnStreamingReplySink/SkillRunnerStreamingReplySink被动化;throttle/dedupe/final-flush 移入AgentRunGAgent+SkillRunnerGAgentrun-owned 状态WorkflowArtifactFactBuilder用 typedRoleId字段,不再用 actor id 前缀cluster-028/029 历史 controller 错误直接 PR 到 dev(已在 dev 中);#706/707/708/687 都正确 PR 到
auto-refact-dev(本 PR 涵盖)。Phase 9 meta-design (#701) | Phase 9 元设计 (#701)
cluster-025/026/027 触发 Phase 9 multi-solver design consensus,经 5 轮 solver + meta-judge 收敛,最终采纳 Auric 的架构愿景:
硬约束:一 actor 持一 stream、chunks 永不走 EventEnvelope、function calls 走 EventEnvelope、voice 和 text 用同一 pipeline、无新核心抽象。
cluster-025 boundary 决定 (Option A):remote setup/control envelopes 保留;remote audio chunk envelope relay 禁用直到 raw media transport 出现。
详见已关闭 design issues:#681 #682 #684 #701。
Skill-level improvements landed alongside | 同期落地的 skill 改进
spawn-codex.shprompt+log 双 file +--prompt-text自动 mktemp + SPAWN/DONE bannerauto-refact-dev(只有 rollup PR target dev)Verification per cluster | 各 cluster 验证
每个 cluster PR 都通过 Phase 8 multi-codex review (3 角色: architect / tests / quality),fix-retry 直到 3/3 或 2 approve + 1 non-blocking comment。各 PR 附本地+远程 CI 通过、test_stability_guards.sh 通过、architecture_guards.sh 通过的证据。
详见各 PR 的 round-by-round 评论。
Diff summary | diff 汇总
51 files changed, +3570 / -1803 (net +1767 productive code, mostly deletion-positive at production code level — large pluses are bilingual PR/issue artifacts + new comprehensive behavior tests + Phase 9 prompt files).
Audit trail | 审计追踪
.refactor-loop/runs/audit-iter-15.md.refactor-loop/runs/implement-cluster-*.md.refactor-loop/runs/v{1..5}-review/pr{687,706,707,708}/.refactor-loop/runs/phase9-issue701-r{1..5}-*.md🤖 Auto-loop / codex-refactor-loop iter15 (Phase 1 audit → Phase 9 design → Phase 2 implement → Phase 8 review → Phase 4 rollup)