fix(voice-call): emit canonical session keys#89884
Conversation
|
Codex review: needs real behavior proof before merge. Reviewed June 26, 2026, 8:27 PM ET / 00:27 UTC. Summary PR surface: Source +915, Tests +2365, Docs +12. Total +3292 across 43 files. Reproducibility: yes. Source-level checks show current main and v2026.6.10 still return raw generated voice:* / voice:call:* keys, while the PR head changes the resolver path; I did not run tests in this read-only review. Review metrics: 3 noteworthy metrics.
Stored data model Root-cause cluster Members:
Proposal only: this assessment does not dispatch repair, suppress jobs, mutate sibling items, close, or merge anything. Merge readiness Overall follows the weaker of proof and patch quality, so missing proof can cap an otherwise strong patch. Rank-up moves:
Proof guidance:
Risk before merge
Maintainer options:
Next step before merge
Security Review findings
Review detailsBest possible solution: Land a narrow Voice Call fix that emits canonical keys for generated per-phone/per-call sessions, keeps explicit keys stable unless a separate scoped-key migration is explicitly sponsored, and includes current-head upgrade proof for raw generated rows. Do we have a high-confidence way to reproduce the issue? Yes. Source-level checks show current main and v2026.6.10 still return raw generated voice:* / voice:call:* keys, while the PR head changes the resolver path; I did not run tests in this read-only review. Is this the best way to solve the issue? No. Canonicalizing generated keys at the resolver boundary is the right fix, but scoping explicit keys is a compatibility-sensitive contract change that should either be removed from this PR or separately approved and proven. Full review comments:
Overall correctness: patch is incorrect AGENTS.md: found and applied where relevant. Codex review notes: model internal, reasoning high; reviewed against 12ea61a08dbc. Label changesLabel changes:
Label justifications:
Evidence reviewedPR surface: Source +915, Tests +2365, Docs +12. Total +3292 across 43 files. View PR surface stats
What I checked:
Likely related people:
What the crustacean ranks mean
Shiny media proof means a screenshot, video, or linked artifact directly shows the changed behavior. Runtime, network, CSP, and security claims still need visible diagnostics. How this review workflow works
|
|
@clawsweeper re-review |
|
🦞🧹 I asked ClawSweeper to review this item again. Re-review progress:
|
7c89479 to
17c2172
Compare
17c2172 to
9f87e67
Compare
0de8563 to
ab70717
Compare
|
Land-ready verification complete for
No known proof gaps. |
|
Merged via squash.
|
What Problem This Solves
Voice Call could write the same conversation under raw, differently cased, or differently scoped session identities. After a restart, that could split history or—during an unsafe upgrade rewrite—assign an ambiguous row to the wrong agent.
Fixes #83967.
Why This Change Was Made
agent:<agentId>:...identity for generated, explicit, and restored calls. Opaque provider-owned tails, including case-sensitive Matrix room IDs, remain byte-distinct.openclaw doctor --fixuse the generic session migration owner. Proven single-owner rows migrate once; shared stores, filesystem aliases, unknown path identities, and ambiguous plugin/main aliases are preserved with an actionable warning before any write.agent:identities stay opaque and cannot inherit channel delivery permissions.agents.list.This keeps one runtime path: current canonical keys only. Upgrade compatibility remains in doctor/startup migration rather than fallback readers or dual writes.
User Impact
Voice Call conversations keep the same agent-owned session across restarts and upgrades. Existing unambiguous state is retained under the canonical key; uncertain state is left untouched for operator resolution instead of being merged or deleted. Outbound calls still use the top-level Voice Call route, while inbound per-number routes retain their configured agent/model/voice.
Evidence
git diff --checkpass.check:changed: providerblacksmith-testbox, idtbx_01kw32d957z7kq3ej5kr7zfb2v, Actions run28269876364.ab707179f92ebf84dee3c5da16ba16cd522899f4(Actions run28272586915).No live carrier call was required: the changed contract is session identity, persisted-state migration, and local delivery classification; provider transport code is unchanged.
Merge Risk
Session-state migration is compatibility-sensitive. The migration fails closed whenever ownership or filesystem identity is not proven, is idempotent, and has focused hard-link, symlink, shared-store, malformed-key, and partial-write regressions. No config shape, provider API, protocol version, or public Plugin SDK surface is added.