Funnel evidence from the glm-4.7-flash arm (conv-26, 2026-07-27; store dumped at /root/store-dumps/flash-20260727/):
- Selection kept 264 flagged candidates (plain keeps are not ledgered — unknown denominator). 207 of 264 (78%) have
claim_id NULL — the kept span grounded no claim, including both adoption-agency gold spans for qa/0003 (selection_keep_flagged on "I took the first step towards becoming a mom - I applied to adoption agencies!" with no claim row).
- It is NOT span-copy failure at Selection: 206/207 dead spans are verbatim substrings of the rendered documents (checked against
.benchmark-runs/v4-glm2/documents/conv-26/*.md).
- It is NOT wholesale omission: the 103 decontextualize calls averaged 791 output tokens (min 7, max 6290) yet only 168 claims landed (~1.6/call). The model writes claims; they die after the fact.
- The death happens inside
workers/e2.py where _grounded_claim has three silent return None gates (span not verbatim-findable at anchor; span outside kept ranges — "Selection is enforced, not advisory"; added_context not verbatim in its bundle element), and Claimify-level omission is equally unledgered. _link_flagged_decisions documents the NULL-claim_id invariant but nothing records WHICH gate fired or whether the model simply omitted the span.
Ask: ledger the losses. New decision types (e.g. claimify_omitted, grounding_rejected with a gate/reason enum) written per kept span that produces no claim, so the decision transcript accounts for every keep end-to-end. This extends #147 (candidate coverage) one stage deeper — without it, cross-model extraction comparisons can show THAT a stronger model lands more claims but not WHY, and prompt-vs-code fixes stay guesswork (e.g. tolerant span matching vs Claimify prompt changes).
Sequencing note: wanted BEFORE the next extraction-arm run (glm-5.2-max comparison) so the arm diff explains itself.
Funnel evidence from the glm-4.7-flash arm (conv-26, 2026-07-27; store dumped at
/root/store-dumps/flash-20260727/):claim_id NULL— the kept span grounded no claim, including both adoption-agency gold spans for qa/0003 (selection_keep_flaggedon "I took the first step towards becoming a mom - I applied to adoption agencies!" with no claim row)..benchmark-runs/v4-glm2/documents/conv-26/*.md).workers/e2.pywhere_grounded_claimhas three silentreturn Nonegates (span not verbatim-findable at anchor; span outside kept ranges — "Selection is enforced, not advisory"; added_context not verbatim in its bundle element), and Claimify-level omission is equally unledgered._link_flagged_decisionsdocuments the NULL-claim_id invariant but nothing records WHICH gate fired or whether the model simply omitted the span.Ask: ledger the losses. New decision types (e.g.
claimify_omitted,grounding_rejectedwith a gate/reason enum) written per kept span that produces no claim, so the decision transcript accounts for every keep end-to-end. This extends #147 (candidate coverage) one stage deeper — without it, cross-model extraction comparisons can show THAT a stronger model lands more claims but not WHY, and prompt-vs-code fixes stay guesswork (e.g. tolerant span matching vs Claimify prompt changes).Sequencing note: wanted BEFORE the next extraction-arm run (glm-5.2-max comparison) so the arm diff explains itself.