Skip to content

Frame-style and bleed-edge chips have zero rows: 145,419 votes are derivable from stored evidence with no image fetch #619

Description

@WilfordGrimley

What

Frame-style and bleed-edge attribute chips have zero CardTagVote rows, no substitute channel, and no wiring. The audit (PR #616) also measured that the votes are derivable from evidence already stored in the database, with no image fetch at all:

Chip Derivable votes Derivation from stored ImageEvidence
Modern Border 133,627 collector_line_collector_number non-empty
Old Border 9,006 illus_anchor_fired true, collector number empty
appropriate-bleed 2,786 bleed_class = "trimmed"
TOTAL 145,419

Cross-check: against ImageEvidence.artbox_frame_class the counts are 142,469 stored vs 142,633 derived. The 164-row gap is artbox_phash's own fetch failures, i.e. the derivation agrees with the independent classifier everywhere the classifier ran.

Why it matters

  1. These chips are user-facing filter surfaces with nothing behind them. 145,419 votes' worth of signal is sitting in the DB unread.
  2. Border-colour chips survived the same purge only by accident. Two separate identities compute border colour from the same classifier, so culling one left the other. Had that duplication been culled as redundancy, border colour would be at zero rows today too. The purge's selection criterion was not "is this signal available" — it was "does a second copy happen to exist". See OPS-CORR-0008 (identity-vs-channel purge).
  3. The only code path that casts these votes is run_pilot (local_identify_printing_tags.py:1790 cast_frame_style_vote, :1807 cast_bleed_edge_vote). Their other caller, image_evidence.extract_card_evidence, has zero production callers — see Border-color vote parity: bulk/streaming extraction paths do not cast the inline Stage C vote #510.

What this needs — and what it must NOT be

It needs an evidence-reading caster, modelled on local_layout_class_cast: read ImageEvidence rows already in the DB, derive the chip, cast the vote.

It must not be the live-fetch pilot. Running run_pilot over the catalog to obtain these votes would re-fetch ~220,000 images to recompute facts that are already stored. That is the wrong instrument for this job.

This may be subsumed by the monolith: the owner's own scope statement includes "the pilot's relevant features", and carrying the pilot's chip casting into the monolith is precisely what re-wires these chips. If the monolith carries it, this issue closes as part of that work rather than as a separate backfill.

DECISION NEEDED (owner)

Authorise the chip re-derivation? It is a WRITE of 145,419 CardTagVote rows into the production database. Options:

  • (a) Authorise a standalone evidence-reading caster + dry-run + poll, now.
  • (b) Defer, and carry the pilot's chip casting into the monolith so the votes fall out of the first full run.
  • (c) Neither — leave the chips at zero, with the consequence stated above.

Standing constraint: prod DB is read-only without an explicit poll.

What would close it

  • A caster that reads stored evidence (no fetch) and casts frame_style and bleed_edge votes, with the uniqueness/ignore-conflicts guard the other calculators use;
  • a dry-run whose would-cast counts reconcile against the 133,627 / 9,006 / 2,786 figures above;
  • an owner-tapped write poll;
  • non-zero row counts for all three chips afterwards.

LIVE vs LATENT

LIVE. The chips are at zero rows in production today.

Refs

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds-owner-decisionOwner call required before proceeding

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions