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.
| Reader | Before | After |
|---|---|---|
| Wire boundary | RegistrarDocumentInput.document_markdown | required RegistrarDocumentInput.model_view |
| Shared prompt renderer | dereferenced the flat markdown string | dereferences model_view.content |
| Eval grounding check | scanned the flat markdown string | scans model_view.content |
| Manifest read declaration | read_document_markdown | deleted; 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.
{
"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.
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.
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.
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.