Summary: ThreadRequest::Message derives response_id as {thread_id}:{input.len()} (crates/core/src/lib.rs:1278) — any two messages of equal byte length in the same thread collide, overwriting hook correlation records. handle_prompt correctly uses resp-<uuid> (line 1330), so this is an inconsistency, not a deliberate scheme.
Impact: hook consumers/ledgers keyed by response_id (app-server events, fleet ledger) lose or overwrite one response record for every equal-length message pair ("go", "go"; "continue", "continue").
Repro: send Message{input:"hi"} twice; observe identical response_id in both event streams.
Found in a read-only v0.9.4 bug hunt (2026-08-02).
Summary:
ThreadRequest::Messagederivesresponse_idas{thread_id}:{input.len()}(crates/core/src/lib.rs:1278) — any two messages of equal byte length in the same thread collide, overwriting hook correlation records.handle_promptcorrectly usesresp-<uuid>(line 1330), so this is an inconsistency, not a deliberate scheme.Impact: hook consumers/ledgers keyed by
response_id(app-server events, fleet ledger) lose or overwrite one response record for every equal-length message pair ("go", "go"; "continue", "continue").Repro: send
Message{input:"hi"}twice; observe identical response_id in both event streams.Found in a read-only v0.9.4 bug hunt (2026-08-02).