Skip to content

cluster-026: voice provider response epoch moves into actor turn (typed provider_response_id)#707

Merged
loning merged 7 commits into
auto-refact-devfrom
refactor/iter15-cluster-026-voice-provider-actor-turn
May 19, 2026
Merged

cluster-026: voice provider response epoch moves into actor turn (typed provider_response_id)#707
loning merged 7 commits into
auto-refact-devfrom
refactor/iter15-cluster-026-voice-provider-actor-turn

Conversation

@loning
Copy link
Copy Markdown
Contributor

@loning loning commented May 19, 2026

Summary / 摘要

English

iter15 cluster-026-voice-provider-background-state (severity:medium, rule_ids: AG-ACTOR-EXEC-01, AG-STRONG-TYPING-01).

  • Old: realtime voice provider (OpenAI, MiniCPM) receive-loop writes _responseEpochs dictionary from background thread outside actor event-loop. Provider also owns active/suppressed response state and emits synthetic cancel events.
  • New: provider receive loop posts typed signals (raw provider response ids on lifecycle/audio/function-call events) to VoicePresenceModule actor turn. Actor turn owns provider-response-id → actor response_id mapping AND cancel suppression for stale provider ids. Receive loop no longer mutates shared dict; receive loop signal is callback-only-signal per CLAUDE.

Violated: CLAUDE.md "## Actor 执行模型" — "回调只发信号", "业务推进内聚"; AGENTS strong-typing for response identity.

中文

iter15 cluster-026-voice-provider-background-state(严重度:medium,规则 ID:AG-ACTOR-EXEC-01, AG-STRONG-TYPING-01)。

  • Old: realtime 语音 provider (OpenAI、MiniCPM) receive-loop 在 actor event-loop 外的后台线程上写 _responseEpochs 字典;provider 同时持有 active/suppressed 响应状态并发出合成 cancel 事件。
  • New: provider receive loop 把 typed signal(lifecycle/audio/function-call 事件上的 raw provider response id)投递到 VoicePresenceModule actor turn。actor turn 持有 provider-response-id → actor response_id 映射,同时持有针对陈旧 provider id 的 cancel 抑制。receive loop 不再修改共享字典;receive loop 是 CLAUDE 的 "callback-only-signal"。

违反:CLAUDE.md "## Actor 执行模型" — "回调只发信号"、"业务推进内聚";AGENTS 响应身份强类型。

Scope / 范围

7 files changed, +279 / -133 (net +146).

  • src/Aevatar.Foundation.VoicePresence.Abstractions/Protos/voice_presence.proto (additive typed provider_response_id fields)
  • src/Aevatar.Foundation.VoicePresence.MiniCPM/MiniCPMRealtimeProvider.cs
  • src/Aevatar.Foundation.VoicePresence.OpenAI/OpenAIRealtimeProvider.cs
  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs
  • test/Aevatar.Foundation.VoicePresence.OpenAI.Tests/OpenAIRealtimeProviderTests.cs
  • test/Aevatar.Foundation.VoicePresence.MiniCPM.Tests/MiniCPMRealtimeProviderTests.cs
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs

Validation: build pass; VoicePresence.Tests + OpenAI.Tests + MiniCPM.Tests all pass; arch+stability guards pass.

No new actor type / envelope kind / pipeline phase / core abstraction. proto change is additive typed field on existing messages, NOT a new message.

Phase 9 design source

Closes #682 after merge. Built on Phase 9 #701 round 5 consensus (3/3 unanimous on Auric pipeline + no new abstraction). See implement summary in .refactor-loop/runs/implement-cluster-026-voice-provider-background-state.md.

🤖 Auto-loop / codex-refactor-loop iter15 (Phase 9 consensus → implement)

… turn

Per Phase 9 #701 consensus (Auric architecture, 3/3 unanimous round 5):

- Add typed provider_response_id fields to voice provider event proto so
  provider adapters expose provider-native response identity without
  owning actor response epochs.
- OpenAI provider: remove _responseEpochs / _nextResponseId mapping;
  emit raw provider response ids on lifecycle/audio/function-call events.
- MiniCPM provider: remove provider-owned response counters, active/
  suppressed state, synthetic cancel event emission; cancel sends only
  the provider stop request.
- VoicePresenceModule (actor turn): owns provider-response-id → actor
  response_id mapping; owns actor-side cancel suppression for stale
  provider ids. Receive-loop now posts typed signals to actor turn,
  not background dict writes.
- Disable remote audio input/output handling inside VoicePresenceModule
  so PCM chunks not moved through EventEnvelope; remote setup/close/
  control remains actor-owned.

SCOPE_EXTEND (justified):
- src/Aevatar.Foundation.VoicePresence.OpenAI/OpenAIRealtimeProvider.cs
- src/Aevatar.Foundation.VoicePresence.MiniCPM/MiniCPMRealtimeProvider.cs
- src/Aevatar.Foundation.VoicePresence.Abstractions/Protos/voice_presence.proto
  (typed provider_response_id fields required by design)
- test/Aevatar.Foundation.VoicePresence.{OpenAI,MiniCPM}.Tests/

Diff: 7 files, +279 / -133 (net +146).
Build pass; VoicePresence.Tests + OpenAI.Tests + MiniCPM.Tests all pass;
arch+stability guards pass.

No new actor type / envelope kind / pipeline phase / core abstraction.
proto change is additive typed field on existing message (not new message).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@codecov
Copy link
Copy Markdown

codecov Bot commented May 19, 2026

Codecov Report

❌ Patch coverage is 94.40000% with 7 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.46%. Comparing base (b012a07) to head (ace5211).

Files with missing lines Patch % Lines
...ation.VoicePresence/Modules/VoicePresenceModule.cs 93.75% 4 Missing and 3 partials ⚠️
@@                 Coverage Diff                 @@
##           auto-refact-dev     #707      +/-   ##
===================================================
+ Coverage            82.43%   82.46%   +0.03%     
===================================================
  Files                  939      939              
  Lines                59610    59679      +69     
  Branches              7818     7823       +5     
===================================================
+ Hits                 49139    49215      +76     
+ Misses                7100     7097       -3     
+ Partials              3371     3367       -4     
Flag Coverage Δ
ci 82.46% <94.40%> (+0.03%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

Files with missing lines Coverage Δ
...n.VoicePresence.MiniCPM/MiniCPMRealtimeProvider.cs 84.09% <100.00%> (+1.90%) ⬆️
...ion.VoicePresence.OpenAI/OpenAIRealtimeProvider.cs 90.18% <100.00%> (+0.15%) ⬆️
...ation.VoicePresence/Modules/VoicePresenceModule.cs 88.92% <93.75%> (+0.71%) ⬆️

... and 3 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — architect — PR #707 round 1



pr: 707
role: architect
verdict: comment

Verdict

comment-only: the refactor direction complies with the actor-turn requirement, but the old/new pattern marker is only type-level and is missing on the main refactored methods.

Evidence

  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:337, :405, :485, :509, :523: HandleProviderEventAsync, TryNormalizeProviderEvent, TryNormalizeResponseIdentity, GetOrCreateProviderResponse, and RetireProviderResponse contain the new actor-owned provider-response mapping but do not carry the required method-level // Refactor (iterN/cluster-XXX): Old pattern: ... New principle: ... marker. Checklist clause: "Old/New pattern comment: each refactored type/method has // Refactor (iterN/cluster-XXX): Old pattern: … New principle: …. Missing or vague → comment."
  • src/Aevatar.Foundation.VoicePresence.OpenAI/OpenAIRealtimeProvider.cs:217: MapSessionEvent is refactored from assigning actor response epochs to emitting provider-native ids, but the required marker exists only on the class, not on this refactored method. Same checklist clause.
  • src/Aevatar.Foundation.VoicePresence.MiniCPM/MiniCPMRealtimeProvider.cs:140 and :254: CancelResponseAsync and ReadCompletionStreamAsync are materially refactored to stop owning synthetic cancel/response epoch state, but neither method has the required method-level marker. Same checklist clause.

What would change your verdict (only if comment or reject)

Add the exact old/new refactor marker to the materially refactored methods above, or otherwise make the marker placement unambiguously cover each refactored method expected by the controller.

REVIEW_DONE:707:architect:comment

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — tests — PR #707 round 1



pr: 707
role: tests
verdict: comment

Verdict

Comment: behavior coverage is adequate, but the cluster-specific no-regression rule should be pinned with a source-regression assertion.

Evidence

  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:337 (Provider_response_identity_should_be_mapped_by_module_turn) covers the main behavior: provider-native IDs are mapped to actor response IDs inside the module turn and reused for tool calls/done.
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:370 (Speech_started_should_cancel_active_provider_response_inside_module_turn) covers module-owned cancellation and stale provider response completion suppression after cancel.
  • test/Aevatar.Foundation.VoicePresence.OpenAI.Tests/OpenAIRealtimeProviderTests.cs:139 and test/Aevatar.Foundation.VoicePresence.MiniCPM.Tests/MiniCPMRealtimeProviderTests.cs:84 assert providers emit raw ProviderResponseId with ResponseId == 0, so the tests are behavior assertions rather than bump-only coverage.
  • test/Aevatar.Foundation.VoicePresence.MiniCPM.Tests/MiniCPMRealtimeProviderTests.cs:142 verifies MiniCPM cancel posts stop without a synthetic cancel event, matching the moved ownership boundary.
  • Gap: no touched test adds a source-regression assertion for the cluster invariant "voice provider response epoch moves into actor turn". A future change could reintroduce provider-side epoch state such as _responseEpochs, _nextResponseId, _activeResponseId, _suppressedResponseId, or response ID Interlocked.Increment in OpenAIRealtimeProvider/MiniCPMRealtimeProvider without a direct source guard failing.
  • I found no new Task.Delay/Thread.Sleep, [Skip], manual traits, or polling allowlist changes in the PR diff.

What would change your verdict (only if comment or reject)

Add a focused source-regression test in the matching voice provider/module test area that reads the provider source files and asserts they do not contain provider-owned response epoch state/counter tokens, while allowing the actor module to own the provider ID mapping.

REVIEW_DONE:707:tests:comment

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — quality — PR #707 round 1



pr: 707
role: quality
verdict: comment

Verdict

Readable and focused overall, with one clarity issue around an intentional no-op path.

Evidence

  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:153 leaves RemoteAudioInputReceived as an empty break while adjacent signal cases dispatch to named handlers. Because this PR intentionally disables remote audio envelopes, the branch should make that intent explicit; as written it reads like a forgotten handler deletion or dead switch arm.

What would change your verdict (only if comment or reject)

Add a short why-comment on the no-op branch, or route it through a small named method such as IgnoreRemoteAudioInputReceivedUntilRawTransportExists(...) so future readers understand this is deliberate and not an accidental omission.

REVIEW_DONE:707:quality:comment

@loning loning added the auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) label May 19, 2026
Applied 5 fixes (FIX_DONE:707:round-1:applied-5:rejected-0:blocked-0):
- (A) architect: add method-level Refactor (iter15/cluster-026) markers
  on VoicePresenceModule actor-turn provider event normalization, response
  identity normalization, provider response mapping, retirement
- (A) architect: add method-level Refactor marker on OpenAI provider
  MapSessionEvent (emits provider-native response ids)
- (A) architect: add method-level Refactor markers on MiniCPM provider
  CancelResponseAsync + ReadCompletionStreamAsync
- (A) quality: add why-comment for intentional remote audio input no-op
  until raw host-origin transport path exists
- (A) tests: add source-regression test asserting provider adapters no
  longer own response epoch/counter state; module owns provider response
  mapping

Build pass; VoicePresence.Tests 120/120; OpenAI.Tests 24/24; MiniCPM.Tests
12/12; test_stability_guards pass.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Fix codex round 1 — FIX_DONE:707:round-1:applied-5:rejected-0:blocked-0

Pushed: 6bf2d2b7

English

Round 1 addressed all 3 reviewer comments:

  • Architect comment: added method-level // Refactor (iter15/cluster-026): markers on VoicePresenceModule actor-turn handlers + OpenAI/MiniCPM provider methods that were missing them
  • Quality comment: added why-comment for intentional remote audio input no-op (until raw host-origin transport path exists)
  • Tests comment: added source-regression test asserting provider adapters no longer own response epoch/counter state and module owns provider response mapping

Diff: 4 files, +73. Build pass; VoicePresence.Tests 120/120; OpenAI.Tests 24/24; MiniCPM.Tests 12/12.

Next: re-dispatch 3 reviewers against new HEAD 6bf2d2b7.

中文

Round 1 处理了 3 个 reviewer comment:

  • Architect comment: 在 VoicePresenceModule actor-turn handler + OpenAI/MiniCPM provider 方法上补缺失的 // Refactor (iter15/cluster-026): method 级注释
  • Quality comment: 给故意 no-op 的 remote audio input 加 why-comment(等 raw host-origin transport 路径出现)
  • Tests comment: 加 source-regression 测试,断言 provider adapter 不再持 response epoch/counter 状态,module 持 provider response mapping

diff: 4 文件,+73 行。build 过;VoicePresence.Tests 120/120;OpenAI.Tests 24/24;MiniCPM.Tests 12/12。

下一步:重新派 3 个 reviewer 对新 HEAD 6bf2d2b7 复评。

@loning loning added auto-loop-reviewing Phase 8 reviewer codex round in flight and removed auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) labels May 19, 2026
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — architect — PR #707 round 2



pr: 707
role: architect
verdict: comment

Verdict

comment-only: no blocking CLAUDE/AGENTS architecture regression found, but one changed VoicePresenceModule behavior needs the mandated Old/New pattern comment.

Evidence

  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:153 changes RemoteAudioInputReceived from forwarding host-origin PCM through the module to an EventEnvelope no-op, and src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:400 changes provider AudioReceived handling to a no-op for remote output. This aligns with the cluster goal of keeping PCM off EventEnvelope, but the specific changed concept has only an inline explanatory comment, not the required review-checklist form: // Refactor (iterN/cluster-XXX): Old pattern: ... New principle: ....
  • Anti-pattern scan of the PR additions found no added actor.HandleEventAsync(, SubscribeAsync<EventEnvelope>, actor-state JSON serialization, production Task.Delay(, GetAwaiter().GetResult(), TypeUrl.Contains(...), raw new HttpClient constructor, [Skip], external NyxID/chrono references, or new actor read/write/store split.
  • The added proto fields in src/Aevatar.Foundation.VoicePresence.Abstractions/Protos/voice_presence.proto:55, :56, :61, :66, :71, and :79 are additive field numbers; no field number is reused or renumbered.
  • The new _providerResponseIds / _cancelledProviderResponseIds collections in src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:39 are actor/module runtime state used from the actor event turn and cleared on dispose/session close at :194 and :678, so I do not treat them as a new middle-layer fact registry under CLAUDE's actor execution and middle-layer state clauses.

What would change your verdict (only if comment or reject)

Add an Old/New pattern refactor comment for the remote audio input/output EventEnvelope no-op behavior in VoicePresenceModule, covering the old remote PCM forwarding path and the new principle that host-origin/provider PCM must stay off EventEnvelope until a raw transport path exists.

REVIEW_DONE:707:architect:comment

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — tests — PR #707 round 2



pr: 707
role: tests
verdict: approve

Verdict

Test coverage and test quality are adequate for the voice provider response epoch move into the actor turn.

Evidence

  • test/Aevatar.Foundation.VoicePresence.OpenAI.Tests/OpenAIRealtimeProviderTests.cs:139 Receive_loop_should_map_openai_events_to_voice_provider_events asserts OpenAI provider events now carry provider-native ids on response start, audio, function call, done, and cancelled events while leaving actor ResponseId at 0.
  • test/Aevatar.Foundation.VoicePresence.MiniCPM.Tests/MiniCPMRealtimeProviderTests.cs:84 Receive_loop_should_map_sse_audio_to_voice_provider_events asserts MiniCPM SSE response ids are emitted as ProviderResponseId on start/audio/done events, and ResponseId is not provider-assigned.
  • test/Aevatar.Foundation.VoicePresence.MiniCPM.Tests/MiniCPMRealtimeProviderTests.cs:142 CancelResponse_should_post_stop_without_synthetic_cancel asserts cancel only posts the stop request and no longer emits a synthetic ResponseCancelled provider event.
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:337 Provider_response_identity_should_be_mapped_by_module_turn exercises module-owned provider-id to actor response-id mapping across response start, function call, and done handling.
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:370 Speech_started_should_cancel_active_provider_response_inside_module_turn covers actor-turn cancellation and stale provider response suppression after user speech interrupts an active provider response.
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:395 Provider_adapters_should_not_own_response_epoch_state adds a source-regression assertion against provider-owned response epoch fields/counters.
  • test/Aevatar.Foundation.VoicePresence.Tests/VoicePresenceModuleTests.cs:426 Remote_session_signals_should_not_forward_audio_or_publish_audio_outputs and :674 Remote_session_inputs_and_close_should_ignore_mismatches_and_handle_matches cover the changed remote audio envelope behavior.
  • The changed test diff adds no Task.Delay, Thread.Sleep, WaitUntilAsync, [Skip], manual category, placeholder assertion, or assertion-loosening pattern.

REVIEW_DONE:707:tests:approve

@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Phase 8 Reviewer — quality — PR #707 round 2



pr: 707
role: quality
verdict: comment

Verdict

Readable and focused overall, with clear refactor self-docs, but one new normalization branch looks dead/unclear enough to warrant a cleanup comment.

Evidence

  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:463: TryNormalizeProviderEvent clones AudioReceived and writes a normalized ResponseId at lines 475-477, but the only downstream switch case for AudioReceived immediately does nothing at lines 400-401. This makes the new VoiceAudioReceived.ResponseId normalization path read as dead code; git grep on the PR branch shows no production reader of AudioReceived.ResponseId.
  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:153: the RemoteAudioInputReceived case now intentionally ignores the signal with a useful why-comment. That is clear enough and not a quality issue.
  • src/Aevatar.Foundation.VoicePresence/Modules/VoicePresenceModule.cs:338, src/Aevatar.Foundation.VoicePresence.OpenAI/OpenAIRealtimeProvider.cs:15, and src/Aevatar.Foundation.VoicePresence.MiniCPM/MiniCPMRealtimeProvider.cs:15: required // Refactor (iter15/cluster-026-...) blocks are present and explain the old/new model without placeholder references.

What would change your verdict (only if comment or reject)

Either remove response_id from VoiceAudioReceived plus the normalization assignment if audio response ids are not consumed, or route/use the normalized audio event in the actor turn so the field and branch have an observable purpose.

@loning loning added auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) and removed auto-loop-reviewing Phase 8 reviewer codex round in flight labels May 19, 2026
Applied 3 fixes (FIX_DONE:707:round-2:applied-3:rejected-0:blocked-0):
addresses v2 architect + quality comments.

Diff: 2 files, +6 / -13 (net -7).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@loning loning added auto-loop-reviewing Phase 8 reviewer codex round in flight and removed auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) labels May 19, 2026
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Fix codex round 2 — FIX_DONE:707:round-2:applied-3:rejected-0:blocked-0

Addressed v2 architect + quality comments. Diff: 2 files, +6 / -13. Next: re-dispatch 3 reviewers.

处理 v2 architect + quality comment。diff: 2 文件, +6 / -13。下一步:重派 3 reviewer。

@loning loning added auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) and removed auto-loop-reviewing Phase 8 reviewer codex round in flight labels May 19, 2026
…er-id test (cluster-026)

Applied 2 fixes (FIX_DONE:707:round-3:applied-2:rejected-0:blocked-0).
Diff: 2 files, +80 / -40. Added module-level behavior test for
ResponseCancelled with ProviderResponseId; refactored normalization
for clarity.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Fix codex round 3 — FIX_DONE:707:round-3:applied-2

Added module-level behavior test for ResponseCancelled with ProviderResponseId (v3 tests reviewer's NEW concrete demand). Next: re-dispatch reviewers.

加 module 级 ResponseCancelled+ProviderResponseId 行为测试。下一步:重派 reviewer。

@loning loning added auto-loop-reviewing Phase 8 reviewer codex round in flight auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) and removed auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) auto-loop-reviewing Phase 8 reviewer codex round in flight labels May 19, 2026
…io surface (cluster-026)

Applied 9 fixes (FIX_DONE:707:round-4:applied-9:rejected-0:blocked-0).
Cross-PR note: also touches RemoteActorVoicePresenceSessionResolver
(PR #706 scope). Both PRs delete same dead code → rebase clean either order.

Diff: 7 files, +16 / -181 (net -165). Deletion-positive.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Fix codex round 4 — FIX_DONE:707:round-4:applied-9

Pushed: ab68c9db. Diff: 7 files, +16 / -181 (deletion-positive). Removed dead remote-audio surface per v4 quality reject.

Cross-PR note: also touches RemoteActorVoicePresenceSessionResolver which is in PR #706 scope. Both PRs delete the same dead code, so rebase will be clean either merge order.

Next: re-dispatch v5 reviewers.

删除已死 remote-audio surface(v4 quality reject)。跨 PR 注: 也碰 RemoteActorVoicePresenceSessionResolver(PR #706 scope),两 PR 删的是同样的死代码,任意顺序 rebase 干净。下一步:v5 reviewer。

@loning loning added auto-loop-reviewing Phase 8 reviewer codex round in flight auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) and removed auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) auto-loop-reviewing Phase 8 reviewer codex round in flight labels May 19, 2026
Applied 4 fixes (FIX_DONE:707:round-5:applied-4:rejected-0:blocked-0):
- (A) architect: add Refactor markers on RunTransportRelayAsync + CreateModuleSignal
- (A) tests: add MiniCPM provider test asserting fallback ProviderResponseId
  stays non-empty + stable across started/audio/done when frame.ResponseId is 0

Diff: 3 files, +49.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Fix codex round 5 — FIX_DONE:707:round-5:applied-4

补 RunTransportRelayAsync + CreateModuleSignal Refactor markers + MiniCPM fallback ProviderResponseId 测试。下一步:v6 reviewer。

@loning loning added auto-loop-reviewing Phase 8 reviewer codex round in flight and removed auto-loop-fixing Phase 8 fix codex round in flight (AI iterating to consensus) labels May 19, 2026
@loning
Copy link
Copy Markdown
Contributor Author

loning commented May 19, 2026

🤖 Rebase done — REBASE_DONE:pr707:ok

Merged auto-refact-dev (post-PR #706 + #708) into cluster-026 branch. Cross-PR host overlap resolved: preserved PR #706 host-side cleanup, kept PR #707 provider response identity changes.

Build pass; VoicePresence.Tests 125/125, OpenAI.Tests 24/24 (1 known skip), MiniCPM.Tests 13/13.

Auto-merge eligible (2 approve + 1 quality comment per Phase 8 table) once new CI green.

Rebase done。merge auto-refact-dev (PR #706+#708 已合) 进 cluster-026 分支。跨 PR host 冲突已解。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

auto-loop-reviewing Phase 8 reviewer codex round in flight

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant