Mira conversation operability and spend

Story-2948 · five synthetic transcripts · agents-only proof
operability/cost: ✅
adversarial safety: ✅ — already owned by the offline corpus
answer quality: not evaluated here; human/UAT only

What runs

Each dataset row is one isolated ConversationSpec. The task drains every mira.converse event stream, carries terminal counsel/Mira history, preserves the session and channel origin, feeds a synthetic server-tool result into a non-terminal tool turn, and continues with the resulting MemoryPack after an explicit context_judge fold.

TranscriptSeam exercised
follow-upterminal history
cross-surface follow-upchannel origin
document requestnon-terminal tool round trip
explicit barriercontext_judge fold → memory pack
warm startpre-existing memory plus new history

What is asserted

no crash
recorded cost <= transcript ceiling
wall latency <= transcript ceiling

There is no answer-quality evaluator and no quality score field in ConversationRun. An empty reply can satisfy these mechanical facts; counsel UAT remains the only answer-quality judgment.

Boundary: this proves the agents-only Mira + context_judge path with explicit memory barriers. It does not prove RFD-AGT-013 D16/D17 end to end. The automatic compaction trigger and persistence live in pramaan-functions/src/clerk_worker/runner.py:1496 and require separate cross-repo proof.

Failure semantics

A typed run.failed is returned as a ConversationRun with its receipts and elapsed time intact. The no-crash assertion then fails the whole case; completed earlier turns never become a partial pass. Cases run with max_concurrency=1, while their matter and session fixtures remain unique.