You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Wire the attribute-chip casters into an engine; strip the vote from the uncalled wrapper (#654)
The 2026-07-29 composition audit measured `Old Border`, `Modern Border` and
`appropriate-bleed` at ZERO machine rows with no substitute. Cause: the only
code that ever cast them was `local_identify_printing_tags.run_pilot` (a
live-FETCH pilot, one completed run in its history) and
`image_evidence.extract_card_evidence`, which has ZERO production callers -
both engines call `compute_card_evidence` + `persist_evidence` directly. Border
colour survived the same purge only because `local_layout_class_cast`
independently re-derives it, and even that was reachable only from its own
standalone command.
NEW `local_attribute_chip_cast` (`frame-style-cast-v1`/`bleed-edge-cast-v1`):
reads stored `ImageEvidence`, casts frame-style and bleed-edge chips, fetches
NOTHING. Modelled on `local_layout_class_cast`, not on the pilot. Reuses
`classify_frame_style`/`FRAME_STYLE_TO_TAG`/`FRAME_VOTE_CONFIDENCE`/
`BLEED_EDGE_TAG_NAME`/`BLEED_EDGE_VOTE_CONFIDENCE` verbatim so it cannot drift
from the pilot on what a frame class is or what it is worth. Derivable
populations, measured read-only 2026-07-29: 133,627 + 9,006 + 2,786 = 145,419
votes, none of which needs an image fetch.
It does NOT cast border - that would be a THIRD border channel, and the
duplication is the audit's own cull recommendation, not a pattern to extend.
TWO IDENTITIES, not one. The bleed chip is negative-only, so under a shared
identity a card's frame vote would read as "handled" and permanently strand its
bleed chip.
REQUIRED_EXTRACTOR_KEYS PER CHIP FAMILY. The frame chip gates on `artist_ocr`
as well as `collector_line_ocr`: `illus_anchor_fired` is nullable and
`bool(None)` is False, which without the gate classifies every card with no
anchor evidence as `modern`. This is item 4's bug class, applied correctly from
the start.
WIRED INTO THE CONVEYOR. `stage_e_dispatch._run_stage_d` now runs both this
caster and `local_layout_class_cast`, so all three chip families are reachable
from an engine for the first time. Zero fetches means no envelope/fetch-budget
cost. A missing tag seed is caught and logged at ERROR rather than marking a
dispatch FAILED over an advisory chip after the printing votes already landed -
the counters staying at zero is the observable, not a silent swallow.
`extract_card_evidence` -> `fetch_and_compute_card_evidence_for_tests`, and its
`cast_border_attribute_vote(...).save()` is deleted. Its test class inverted
with it: `test_classified_border_casts_one_vote_per_card` was a green test over
a channel that had not existed since the 2026-07-20 fetch/compute decoupling,
which is precisely how the hole stayed invisible.
Claude-Session: https://claude.ai/code/session_013NhYmT1PxCcyemA16dFDxN
Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
0 commit comments