docs(decision): record the catalog corrections and the size gate

The reproduction block still printed the pre-enrollment numbers (catalog 69%,
decision 86%); it now prints what the command actually outputs today, with the
catalog figure's fall from 87% to 83% explained rather than left to look like a
regression.

Adds the three row corrections with their evidence, the near-unknown fix and
its measured effect, and the state of the four unenrolled SKUs - including that
l08's row name and size are themselves unverified, since no retailer listing
for a 30g スパイシーストーム ペリペリミックス exists.
This commit is contained in:
kiyo9w 2026-09-29 03:09:55 +09:00
parent 22db40eb93
commit 30bfe42bf6

View file

@ -722,12 +722,17 @@ The headline number is reproducible from the repo, not from a scratch script:
--labels eval/labels/image6.json \ --labels eval/labels/image6.json \
--image add/image6.jpg --lanes local --live --image add/image6.jpg --lanes local --live
live resolution: catalog 69% · identity 86% · decision 86% · live resolution: catalog 83% · identity 85% · decision 60% ·
end-to-end 59% · precision 95% · 20.6 ms/crop end-to-end 59% · precision 93% · 20.3 ms/crop
false accepts: 2 of 109 scored facings — 0 of the 48 unknowns, and 1 false accepts: 3 of 109 scored facings — 2 of the 45 unknowns and 1
unenrolled in-catalog facing plus 1 enrolled misidentification. The enrolled misidentification; unenrolled_false_accepts 0.
evaluator's own columns: unknown_false_accepts 0, unenrolled_false_accepts 1.
The catalog figure fell from 87% to 83% because three facings were relabelled
from unknown to `sku_l12` once the tare was identified (§ Re-measured
2026-09-29), and `sku_l12` has no enrolled view. That is a catalog gap
reported honestly, not a recognition regression: the same three facings were
unanswerable before and after.
### Re-measured 2026-09-29 ### Re-measured 2026-09-29
@ -767,6 +772,47 @@ Stream, 20 s pan, four runs: 71-79% coverage at 76-84% precision, against
62-71% at 73-75% before. Still-image endpoint: 54 named detections in 2.2 s, 62-71% at 73-75% before. Still-image endpoint: 54 named detections in 2.2 s,
against 41 before. against 41 before.
### Catalog corrections 2026-09-29
Three rows named products the shelf does not hold, all found by reading the
shelf tags and the enrolled packshots rather than by trusting the CSV:
| SKU | Was | Is | Evidence |
|---|---|---|---|
| `sku_l10` | ピュアセレクト マヨネーズ 450g | 400g | Shelf tag reads 400g; Ajinomoto's lineup is 250/400/600/1000g, no 450g. Packshot enrolled (JAN 4901001114030). |
| `sku_l11` | キューピー ハーフマヨネーズ 450g | 400g | Shelf tag reads 〈400g〉; the enrolled packshot's own OCR reads 400g. |
| `sku_l12` | 焼肉のたれ 中辛 | ユーラス 野菜をおいしく食べる旨たれ 380g | Tag under facings #46-48 reads that title at ¥299, the price the row carried; the package reads お子さまOK 甘めテイスト, the opposite of 中辛. |
The l12 row was the dangerous one: the text lane scores a crop against the
row's printed name, so a correct read of the real bottle would have been
vetoed by a row describing a different product. Facings #46-48 were relabelled
from unknown to `sku_l12` to match.
Enrolling l10 took the catalog ceiling from 69% to 87% of in-catalog facings
answerable by image; relabelling the tare facings moved it back to 83%,
because `sku_l12` has no enrolled view. `sku_l04`, `sku_l07` and `sku_l08`
remain unenrolled. l04 and l07 have exact packshots whose name/OCR check is a
false negative, recorded in `data/packshots/research/` with the retailer, JAN
and the reason the check fails. l08 could not be sourced at all: no retailer
listing for a スパイシーストーム ペリペリミックス 30g exists, and the only
corroborated ペリペリミックス is a different brand at 50g, so the row's name
and size are themselves unverified.
### The near-unknown case is now rejected
The documented failure - Kewpie 450g bags the catalog does not hold, labelled
as catalog rows - had no fix in the text ranking. Every mayonnaise row
explains "マヨネーズ" equally, so the ranking ties at 1.0 and the
strict-greater veto never fires; the veto compares two catalog rows and the
crop's product is not one of them.
`DecisionPolicy` now also checks the package size the read prints. Only a mass
in `PACKAGE_MASS_RANGE` counts, because below it are fragments of a longer
number ("20" out of "200g") and above it are two numbers run together ("5210"
out of "210g"), and percentages are excluded because "カロリー 50% カット" is a
claim about the contents. Measured on the corrected labels, full resolution:
precision 86% -> 91%, false accepts 8 -> 5, coverage unchanged at 79%.
Still open, and not implementable from here: Tier 2 held-out labels (F-11), the Still open, and not implementable from here: Tier 2 held-out labels (F-11), the
remaining E-1/E-4..E-9 experiments, and the completion gate G1-G7, all of which remaining E-1/E-4..E-9 experiments, and the completion gate G1-G7, all of which
need a second independent shelf visit. need a second independent shelf visit.