Story-3131 Walkthrough

Outcome: Vani's explicit WhatsApp writing guidance now contains two additional prohibitions: she does not author a matter code, case name, or matter title as a header/footer, and she does not expose internal status values, enum names, or field identifiers to counsel.

Writing surface: WhatsApp. Keep the answer short and in one message.
Do not use tables.
Never write a matter code, case name, or matter title as a header or footer.
Never surface internal status values, enum names, or field identifiers to counsel;
describe the state in their language.
Placement is deliberate. Both rules sit beside D16's existing WhatsApp-only guidance in agents/mira/converse.py. SOUL.md is shared across surfaces; changing it would invalidate the cached prompt prefix fleet-wide and would incorrectly impose a WhatsApp presentation rule on ACP. The status rule may later deserve a broader product decision, but this Story does not silently broaden it.

Cache receipt

MeasurementBeforeAfterDelta
Full explicit-WhatsApp prompt15,074 bytes · 3,529 tokens 15,272 bytes · 3,569 tokens+198 bytes · +40 tokens
Stable prefix790 bytes · 242 tokens 988 bytes · 282 tokens+198 bytes · +40 tokens

Tokens use o200k_base over the same deterministic MiraConverseInput. Explicit ACP and omitted-channel prompt bytes remain unchanged.

Executable proof

RequirementTest
The two rules enter only the explicit WhatsApp stable prefix test_explicit_channel_guidance_reaches_the_model_request_and_stream
Explicit ACP does not receive either rule The same test asserts both strings are absent from the ACP prefix
The cache event is versioned CONVERSE_PROMPT_VERSION == "mira.converse.v12"
Answer-first, heading-free, first-person behavior is not re-specified No pre-existing behavior rule was removed or re-specified. The deterministic suite proves prompt placement, not live-seat behavior; that regression check remains incomplete below.

Live signed-webhook evidence

The final code bytes were deployed by the gated Mira workflow first in pramaan-infra run 30521456082 and again from the final branch in run 30523246117. The signed webhook harness reached the first deployment before the staging binding was revoked. These replies are copied from the immutable conversation archive.

PromptObserved reply/resultAssessment
What is this matter all about? “This matter hasn't been set up yet. The frame is empty — no parties, no forum, no dispute description, no relief sought, no theory of the case. All eight core fields are missing.

You haven't told me anything about it yet. If you want to start, give me the basics: who the parties are, what the fight is about, and where it's being fought. I can then ask Vega to build the Brief from there.”
No self-authored header/footer or enum; answer-first, no headings, first-person.
what are the key dates on this matter? “The frame for this matter is empty — status is "insufficient_input." No parties, no forum, no dispute, no instruments, no dates have been recorded yet.

I have nothing to give you on key dates. If you want me to build the Brief from what you know, tell me and I can ask Vega to propose one.”
Failed the enum criterion because the broker did not send the WhatsApp surface into MiraConverseInput.
tell me about this matterNot launched after the blocker was isolated. Incomplete.
summarise this matter for meNot launched after the blocker was isolated. Incomplete.
Live-verification blocker, outside this repo. In current pramaan-functions, src/whatsapp_consumer/handler.py correctly stamps the command's channel_origin="whatsapp", but src/clerk_worker/runner.py::_stamp_converse_input rebuilds command["input"] without that field. Vani therefore defaults the input to app, model_fields_set does not contain channel_origin, and D16's WhatsApp branch—including this Story's rules—is not present in the model prompt. The staging binding was then revoked; the final clean rerun was refused as revoked_binding before launch. Story-3131 does not modify the functions twin.

Verification

Focused converse tests                         → 26 passed
uv run --all-packages --group dev ruff check . → All checks passed
uv run --all-packages --group dev pytest -q     → 444 passed, 3 dependency warnings