# 0039 answer-shape transcript — DEV's instrument (specs/evidence/0039/answer_shapes.py)
# generated 2026-09-12 against veracium @ 1e2d3994fd55858d1090a37acb68d15c6e469b25
# RE-PINNED 2026-09-18 after the second v0.26.0 schema-evidence regeneration (the record now names the tag's final commit; JSON under src/, no product code): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-17 after the v0.26.0 schema-evidence regeneration (legacy_stores.json records the new release; no product code): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-15 after the 0041 adoption (src moved by comment text only — the 0040 → 0041 references): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-15 after 0027 v15 (the displacement budget in the fused construction; no policy lane in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-15 after 0027 v14.1 (the policy identity strings bounded at PolicyLane; no policy lane in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24.5 (the persisted producer in the import lineage; the UTC date default — no import and no omitted date in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24.4 (the import boundary resolves conflicting ids before lineage; no import in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0027 v14 (the durable policy receipt: the store's receipt methods, the write in recall; no policy lane in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24.3 (the typed, quote-aware enclosure structure; the lineage helper over every import signal with the inherited producer validated; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24.2 (the parenthetical depth, the established-next rule, the lineage lookup; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24.1 (the fail-closed boundary rule, the import-boundary inheritance check, the doctor's wording; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v24 (the boundary kinds; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v23.1 (doctor and schema comments/message only): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v23 / 0006 v10 (Provenance frozen — eight mutation sites now copy; the producer
# stamp; the export era; the doctor's split; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-14 after 0037 v22 (the whole-sentence rule, no transformation, the type guards; no procedural
# triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0027 v13 (the policy receipt: graph.py's Stage 4-5 helper and receipt_out, recall's
# policy parameter; these answers pass no policy): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after the v21 doc sweep (procedural_gate.py docstrings only): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0037 v21 (ingest derives a captured procedure's gloss; the grammar's new refusals; no
# procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0027 v12 (graph.py's baseline order for the reserve, membership and coverage novelty;
# ingest untouched; these answers never reach the budget): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0037 v20 (the positive-form head in procedural_gate.py; no procedural triple in these
# answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0037 v19 / 0038 v6.2 (the capture gates in ingest.py and procedural_gate.py; correct()
# in __init__.py; the store's V-STAMP-INHERITED guard; no procedural triple in these answers): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-13 after 0037 v18 (the describe attribution; procedures.py and the MCP docstring; ingest
# untouched): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after 0006 v9 / 0037 v17 (the procedure path and the MCP tool; ingest untouched): body
# BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after the doctor's procedural tripwire (doctor.py only; ingest untouched): body
# BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after 0037 v16 (the quote-gated capture path in ingest; the instruments' scripted
# answers carry no procedural triple, so the gate is never reached): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after 0006 v8 (the flip of `require_source_id` to on; the instruments call
# `ingest_event` directly, whose own default is unchanged): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after 0006 v7 `require_source_id` (ingest.py: a refusal branch that is
# default-off and never taken here; no shape change): body BYTE-IDENTICAL again.
# Real ingest_event with a scripted provider. The pin line is asserted by tests/test_0039_answer_shapes.py
# against the tree the test runs in: src/ must be unchanged since this commit, or the transcript is regenerated.
# good rows are unchanged, which is the half a mark-everything fix would have broken.
# REGENERATED at the round-5 fold (the pin above): the seven primary rows the v17 widening had
# moved to `unparseable=True` are back to `unparseable=False`, and the body is BYTE-IDENTICAL to the
# transcript taken before that widening. The outcome now rides `extraction_unusable`, bound by its
# own tests; this instrument's frozen format does not print it.
# REGENERATED 2026-09-11 (the pin above) after the retry handler's cause rule moved to a
# sentinel + an `extracted` flag (9a590d6): body BYTE-IDENTICAL to the round-5 transcript —
# no row that existed moves; the new case (a provider returning None) is a matrix row in
# tests/test_0039_degradation_visibility.py, not a shape this frozen instrument prints.
# RE-PINNED 2026-09-12 after `veracium why` (a new read-only module and a CLI verb, no ingest
# change): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after `veracium doctor` (a new read-only module and a CLI verb, no ingest
# change): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after `remember --dry-run` (a new module and two CLI flags, no ingest
# change): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after the confirmation-episode id fix (store/sqlite.py, no ingest
# change): body BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after 0027 v11's policy lane (graph.py, no ingest change): body
# BYTE-IDENTICAL again.
# RE-PINNED 2026-09-12 after the doctor's sources check (doctor.py, no ingest change): body
# BYTE-IDENTICAL again.

=== PRIMARY answer shapes (the retry answer fixed to a valid empty object) ===
  valid non-empty list             -> RESULT facts=1 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  valid empty list                 -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  missing key                      -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  string                           -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  dictionary                       -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  nested dictionary                -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  null                             -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  number                           -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  boolean                          -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  bare array of dicts              -> RESULT facts=1 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  bare array of scalars            -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  list with malformed members      -> RESULT facts=1 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  list of empty dicts              -> RESULT facts=0 unparseable=False retried=0 recovered=0 residual=0 calls=['distill']
  non-object top-level: string     -> RESULT facts=0 unparseable=True retried=0 recovered=0 residual=0 calls=['distill']
  non-object top-level: number     -> RESULT facts=0 unparseable=True retried=0 recovered=0 residual=0 calls=['distill']
  prose                            -> RESULT facts=0 unparseable=True retried=0 recovered=0 residual=0 calls=['distill']
  instructions wrong type          -> RESULT facts=0 unparseable=True retried=0 recovered=0 residual=0 calls=['distill']
  primary call raises              -> RAISES RuntimeError: 'provider down' calls=['distill']
=== RETRY answer shapes (the primary carries ONE off-vocabulary triple to trigger the retry) ===
  raising                          -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  prose                            -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  bare array of dicts              -> RESULT facts=1 unparseable=False retried=1 recovered=1 residual=0 calls=['distill', 'distill-retry']
  bare array of scalars            -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  triples not a list (string)      -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  triples not a list (dict)        -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  triples null                     -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  triples number                   -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  no triples key                   -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  triples empty list               -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  list of dicts (recovery)         -> RESULT facts=1 unparseable=False retried=1 recovered=1 residual=0 calls=['distill', 'distill-retry']
  list with malformed members      -> RESULT facts=1 unparseable=False retried=1 recovered=1 residual=0 calls=['distill', 'distill-retry']
  non-object top-level: number     -> RESULT facts=1 unparseable=False retried=1 recovered=0 residual=1 calls=['distill', 'distill-retry']
  instructions as a string         -> RESULT facts=1 unparseable=False retried=1 recovered=1 residual=0 calls=['distill', 'distill-retry']
  instructions as a list           -> RESULT facts=1 unparseable=False retried=1 recovered=1 residual=0 calls=['distill', 'distill-retry']
