2.9 KiB
2.9 KiB
Iteration 02 Request
- Task: 20260831-105824-plan-code-ui-audit
- Requested by: build after implementation inspection
- Owner: coder
- Status: changes-requested
Required Corrections
ConversationView.textModeBindinghas a no-op setter, so the visible conversation toggle can no longer change mode. Remove the single-slotSettingsStore.onTextModeChangecallback approach. Prefer normal$settings.textMode/a setter that persists, plus.onChange(of: settings.textMode)inConversationViewso changes from either the conversation or Settings apply to the current session after session replacement.- Transcript UI dedupe remains incorrect. Add a regression test for primary final followed by identical data final asserting both
events.count == 1and history count 1, then fix it. When a data final arrives for a role with an open partial, the documented rule is to replace the appropriate open partial rather than mark a differing partial final and append a second row. Update the differing-partial test to expect one final row containing the final text. - Remove/fix the
appliedDesiredgate. It breaks the required late-audio reconciliation: a state can bedesired=playingwhileaudio_url=nil; when the same track later gainsaudio_url, the source is wired but play is never retried because desired did not change. Preserve idempotence without preventingdesired=playing && source available && player pausedfrom invoking play. - Strengthen
MediaReconcileTests: the current desired-state test only checks that the initial value belongs to a hardcoded list after polling an unreachable server, so it cannot catch the original bug. Expose the smallest reasonable internal seam (or another deterministic approach) and assert reconciling explicit paused/playing/stopped states updatesdesired. Add coverage or a clearly reasoned code-level assertion for the late-audio path. - Make join-mode synchronization independent from voice/model sync failures. A failed
set_voiceor invalid persisted model must not preventset_modefrom being sent. Use separate best-effort operations or route join throughapplyTextMode; avoid duplicate mode sends. - In media reporting, capture
trackIDbefore spawning asynchronous report/publish tasks sostop()does not clear the track before the report reads it. Set localdesiredcoherently on explicit stop/pause/play actions or document why polling latency is intentional. Ensure the correction does not duplicate reports excessively. - Re-run all tests and simulator build. Keep the first-round POST fix and other valid changes.
Deliverables
- Write
iterations/02-implementation.mdwith actual model, exact diffs, tests/tools/results, and residual risks. - Update
implementation.mdsummary to reflect the correction round without erasing prior history. - Do not claim independent approval; reviewer service is currently unavailable.