# 0039 answer-shape transcript — DEV's instrument (specs/evidence/0039/answer_shapes.py)
# generated 2026-09-12 against veracium @ a0215d33f4984f00234fcda9d634a0d899ba5ab6
# 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']
