Story-2491 Walkthrough

Change: Blake's classify, govern, label, and classify-critic reads now consume the broker-supplied Model view contract. The stored document.md string is no longer an agent wire input.

Why this exists. The Extraction Record is canonical. Model-facing text is a deterministic, cached view over that record. Blake must therefore receive the versioned view payload, not depend on a separately stored markdown artifact.

A7 reader census

ReaderBeforeAfter
Wire boundaryRegistrarDocumentInput.document_markdownrequired RegistrarDocumentInput.model_view
Shared prompt rendererdereferenced the flat markdown stringdereferences model_view.content
Eval grounding checkscanned the flat markdown stringscans model_view.content
Manifest read declarationread_document_markdowndeleted; the broker supplies the view in the invoke input

The shared renderer fans out to all four affected prompts. Card, segment, and insight passes were excluded from the cutover because their inputs are already anchored page/block DTOs; they do not read stored markdown.

The repo-wide census also found generic documents: list[str] inputs in Vega (FramerInput) and Mira (MiraCommandInput / PanelInput). They carry optional frame-building or command-grounding material and expose no stored-artifact key or Registrar read path. They are not Blake consumers, so changing those contracts here would cross the ticket boundary. The remaining literal document.md matches are four negative doctrine/docstring statements explaining that anchored page inputs do not read it.

Wire contract

{
  "model_view": {
    "documentId": "…",
    "extractionVersion": "…",
    "viewVersion": "model.v1",
    "budgetProfile": "full",
    "content": "```pramaan-document-data\n…\n```"
  }
}

The typed input accepts the producer DTO's camelCase JSON and the equivalent Python field names. Both IDs validate as UUIDs, unknown Model view fields are rejected, and the nested documentId must match the requested document.

Atomic cutover

There is no compatibility field and no fallback branch. A payload containing only the old markdown field fails at Pydantic validation before run.started. The regression test also rejects a Model view fetched for another document.

Verification

uv run ruff check agents/registrar                 → clean
uv run --package registrar pytest agents/registrar/tests -q
                                                    → 380 passed
uv run pytest tests/ -q -m unit                     → 197 passed
all agents/*/tests                      → 1,188 passed
rg 'document_markdown|read_document_markdown' agents --glob '!**/tests/**'
                                                    → no matches

The registrar's offline gate is green. CI remains the merge gate.

Out of scope

The functions-side registrar backend cutover is sibling Story-2490. This PR neither reads nor depends on that sibling's implementation; it consumes the merged Story-2487 Model view DTO contract.