product-recognition-demo/recognization/docs/research/2026-09-29-shelf-intelligence/evidence/anytime-policies.json
tngo 0cf64a18bf Coverage-first live labelling, merged catalog, shelf-intelligence decision
The live path abstained too much: a detected product whose best candidate
missed the accept line was left blank, so a shelf where 59% of in-catalog
facings were shown read as broken. Show the best candidate immediately as
`provisional`, keep the track re-classifiable so a later attempt upgrades or
corrects it, and never blank a label already on screen.

- identity.py / identity_lanes.py: every decision now carries
  `provisional_sku` - the row the evidence supports well enough to show,
  separate from `best_sku`, which still means "cleared the gate". The accept
  line does not move: far-unknown false accepts stay at 0.066%.
- live.py: a below-gate candidate labels the track with
  `identity_level: provisional` and `confirmed = False`, so the planner and
  the crop lane keep offering it. Accepted labels stay frozen. Inherited
  provisional labels stay re-classifiable.
- Clients render provisional distinctly (amber chip, dashed box) via
  `LiveScanOverlayPolicy.isProvisional(identity)`, which now reads the wire
  level instead of only the state.
- build_stock_all.py merges stock, stock-lopia, stock-mediya and
  stock-milk150 into stock-all (111 images, 60 SKUs). The server could only
  read one folder, so anything outside it came back blank. stock-demo is
  byte-identical to mediya+milk150 and is not a source.

Measured on add/image6.jpg at live resolution: in-catalog facings shown
59.4% -> 86.0%, correct shown 38 -> 55, precision 97.4% -> 87.3%. On the
wire at 8fps 0.5x: 65 of 79 tracks labelled, 742 accepted + 309 provisional
observations, first label 1.27s.

docs/research/2026-09-29-shelf-intelligence/ carries the experiments and the
decision: group signals (combined AUC 0.991 sibling / 0.990 unrelated),
OCR scheduling (group representatives cut calls 4.4x and wall 3.3x), and the
finding that group propagation damages more labels than it rescues on this
shelf, so groups schedule compute rather than overwrite labels.

331 tests pass.
2026-09-29 13:45:14 +09:00

725 lines
No EOL
23 KiB
JSON

{
"clock": "Measured local/OCR completion; frozen appearance edges are precomputed, grouping and transport time excluded. Diagnostic counterfactual, not live deployment.",
"policies": {
"strict/individual": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 39,
"correct": 38,
"wrong": 1,
"visible_coverage": 0.3577981651376147,
"correct_coverage": 0.59375,
"precision": 0.9743589743589743,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6422018348623852,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 31,
"correct": 31,
"wrong": 0,
"visible_coverage": 0.28440366972477066,
"correct_coverage": 0.484375,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.7155963302752293,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 32,
"correct": 32,
"wrong": 0,
"visible_coverage": 0.29357798165137616,
"correct_coverage": 0.5,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.7064220183486238,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 37,
"correct": 37,
"wrong": 0,
"visible_coverage": 0.3394495412844037,
"correct_coverage": 0.578125,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6605504587155964,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 14.775583054870367,
"first_per_facing_p50_ms": 88.42595806345344,
"time_to_final_correct_p50_ms": 85.3563750279136,
"identity_flips": 0,
"wrong_to_correct_events": 0,
"blank_facing_ms": 243097.88916585967,
"wrong_facing_ms": 1237.2076249448583,
"wrong_sibling_facing_ms": 0.0,
"loss_proxy": 0.6847073949299143,
"horizon_ms": 3323.5481249867007
},
"strict/grouped": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 51,
"correct": 50,
"wrong": 1,
"visible_coverage": 0.46788990825688076,
"correct_coverage": 0.78125,
"precision": 0.9803921568627451,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.5321100917431192,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 40,
"correct": 40,
"wrong": 0,
"visible_coverage": 0.3669724770642202,
"correct_coverage": 0.625,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6330275229357798,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 41,
"correct": 41,
"wrong": 0,
"visible_coverage": 0.3761467889908257,
"correct_coverage": 0.640625,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6238532110091743,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 50,
"correct": 50,
"wrong": 0,
"visible_coverage": 0.45871559633027525,
"correct_coverage": 0.78125,
"precision": 1.0,
"false_label_rate": 0.0,
"unknown_false_accepts": 0,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.5412844036697247,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 14.775583054870367,
"first_per_facing_p50_ms": 114.48554205708206,
"time_to_final_correct_p50_ms": 114.48554205708206,
"identity_flips": 0,
"wrong_to_correct_events": 0,
"blank_facing_ms": 205600.77199933585,
"wrong_facing_ms": 1237.2076249448583,
"wrong_sibling_facing_ms": 0.0,
"loss_proxy": 0.581200469109323,
"horizon_ms": 3323.5481249867007
},
"balanced/individual": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 41,
"correct": 40,
"wrong": 1,
"visible_coverage": 0.3761467889908257,
"correct_coverage": 0.625,
"precision": 0.975609756097561,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6238532110091743,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 38,
"correct": 36,
"wrong": 2,
"visible_coverage": 0.3486238532110092,
"correct_coverage": 0.5625,
"precision": 0.9473684210526315,
"false_label_rate": 0.01834862385321101,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 1,
"blank_ratio": 0.6513761467889908,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 38,
"correct": 36,
"wrong": 2,
"visible_coverage": 0.3486238532110092,
"correct_coverage": 0.5625,
"precision": 0.9473684210526315,
"false_label_rate": 0.01834862385321101,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 1,
"blank_ratio": 0.6513761467889908,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 42,
"correct": 41,
"wrong": 1,
"visible_coverage": 0.3853211009174312,
"correct_coverage": 0.640625,
"precision": 0.9761904761904762,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.6146788990825688,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 14.775583054870367,
"first_per_facing_p50_ms": 82.28679199237376,
"time_to_final_correct_p50_ms": 80.85418748669326,
"identity_flips": 1,
"wrong_to_correct_events": 0,
"blank_facing_ms": 230677.1714988863,
"wrong_facing_ms": 3862.650291994214,
"wrong_sibling_facing_ms": 0.0,
"loss_proxy": 0.6799624189707845,
"horizon_ms": 3323.5481249867007
},
"balanced/grouped": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 52,
"correct": 51,
"wrong": 1,
"visible_coverage": 0.47706422018348627,
"correct_coverage": 0.796875,
"precision": 0.9807692307692307,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.5229357798165137,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 45,
"correct": 43,
"wrong": 2,
"visible_coverage": 0.41284403669724773,
"correct_coverage": 0.671875,
"precision": 0.9555555555555556,
"false_label_rate": 0.01834862385321101,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 1,
"blank_ratio": 0.5871559633027523,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 45,
"correct": 43,
"wrong": 2,
"visible_coverage": 0.41284403669724773,
"correct_coverage": 0.671875,
"precision": 0.9555555555555556,
"false_label_rate": 0.01834862385321101,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 1,
"blank_ratio": 0.5871559633027523,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 52,
"correct": 51,
"wrong": 1,
"visible_coverage": 0.47706422018348627,
"correct_coverage": 0.796875,
"precision": 0.9807692307692307,
"false_label_rate": 0.009174311926605505,
"unknown_false_accepts": 1,
"unknown_total": 45,
"sibling_confusions": 0,
"wrong_catalog": 0,
"blank_ratio": 0.5229357798165137,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 14.775583054870367,
"first_per_facing_p50_ms": 101.45575006026775,
"time_to_final_correct_p50_ms": 114.48554205708206,
"identity_flips": 2,
"wrong_to_correct_events": 1,
"blank_facing_ms": 198906.68479132,
"wrong_facing_ms": 3797.012208029628,
"wrong_sibling_facing_ms": 0.0,
"loss_proxy": 0.5920905968176576,
"horizon_ms": 3323.5481249867007
},
"coverage-first/individual": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 56,
"correct": 49,
"wrong": 7,
"visible_coverage": 0.5137614678899083,
"correct_coverage": 0.765625,
"precision": 0.875,
"false_label_rate": 0.06422018348623854,
"unknown_false_accepts": 5,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 2,
"blank_ratio": 0.4862385321100917,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 60,
"correct": 47,
"wrong": 13,
"visible_coverage": 0.5504587155963303,
"correct_coverage": 0.734375,
"precision": 0.7833333333333333,
"false_label_rate": 0.11926605504587157,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 4,
"blank_ratio": 0.4495412844036697,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 60,
"correct": 47,
"wrong": 13,
"visible_coverage": 0.5504587155963303,
"correct_coverage": 0.734375,
"precision": 0.7833333333333333,
"false_label_rate": 0.11926605504587157,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 4,
"blank_ratio": 0.4495412844036697,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 62,
"correct": 51,
"wrong": 11,
"visible_coverage": 0.5688073394495413,
"correct_coverage": 0.796875,
"precision": 0.8225806451612904,
"false_label_rate": 0.10091743119266056,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 2,
"blank_ratio": 0.4311926605504587,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 13.799707987345755,
"first_per_facing_p50_ms": 82.28679199237376,
"time_to_final_correct_p50_ms": 73.84883298072964,
"identity_flips": 2,
"wrong_to_correct_events": 1,
"blank_facing_ms": 172579.93904012255,
"wrong_facing_ms": 30759.05395997688,
"wrong_sibling_facing_ms": 3306.7995419260114,
"loss_proxy": 0.7943018770048237,
"horizon_ms": 3323.5481249867007
},
"coverage-first/grouped": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 61,
"correct": 55,
"wrong": 6,
"visible_coverage": 0.5596330275229358,
"correct_coverage": 0.859375,
"precision": 0.9016393442622951,
"false_label_rate": 0.05504587155963303,
"unknown_false_accepts": 5,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 1,
"blank_ratio": 0.44036697247706424,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 62,
"correct": 49,
"wrong": 13,
"visible_coverage": 0.5688073394495413,
"correct_coverage": 0.765625,
"precision": 0.7903225806451613,
"false_label_rate": 0.11926605504587157,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 4,
"blank_ratio": 0.4311926605504587,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 62,
"correct": 49,
"wrong": 13,
"visible_coverage": 0.5688073394495413,
"correct_coverage": 0.765625,
"precision": 0.7903225806451613,
"false_label_rate": 0.11926605504587157,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 4,
"blank_ratio": 0.4311926605504587,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 65,
"correct": 55,
"wrong": 10,
"visible_coverage": 0.5963302752293578,
"correct_coverage": 0.859375,
"precision": 0.8461538461538461,
"false_label_rate": 0.09174311926605505,
"unknown_false_accepts": 9,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 1,
"blank_ratio": 0.4036697247706422,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 13.799707987345755,
"first_per_facing_p50_ms": 88.42595806345344,
"time_to_final_correct_p50_ms": 82.28679199237376,
"identity_flips": 4,
"wrong_to_correct_events": 3,
"blank_facing_ms": 160348.0866663158,
"wrong_facing_ms": 28053.20287507493,
"wrong_sibling_facing_ms": 3306.7995419260114,
"loss_proxy": 0.7317643767039906,
"horizon_ms": 3323.5481249867007
},
"near-argmax/individual": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 60,
"correct": 50,
"wrong": 10,
"visible_coverage": 0.5504587155963303,
"correct_coverage": 0.78125,
"precision": 0.8333333333333334,
"false_label_rate": 0.09174311926605505,
"unknown_false_accepts": 8,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 2,
"blank_ratio": 0.4495412844036697,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 67,
"correct": 48,
"wrong": 19,
"visible_coverage": 0.6146788990825688,
"correct_coverage": 0.75,
"precision": 0.7164179104477612,
"false_label_rate": 0.1743119266055046,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 7,
"blank_ratio": 0.3853211009174312,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 67,
"correct": 48,
"wrong": 19,
"visible_coverage": 0.6146788990825688,
"correct_coverage": 0.75,
"precision": 0.7164179104477612,
"false_label_rate": 0.1743119266055046,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 7,
"blank_ratio": 0.3853211009174312,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 66,
"correct": 52,
"wrong": 14,
"visible_coverage": 0.6055045871559633,
"correct_coverage": 0.8125,
"precision": 0.7878787878787878,
"false_label_rate": 0.12844036697247707,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 2,
"blank_ratio": 0.39449541284403666,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 13.799707987345755,
"first_per_facing_p50_ms": 79.42158298101276,
"time_to_final_correct_p50_ms": 75.28845797060058,
"identity_flips": 5,
"wrong_to_correct_events": 4,
"blank_facing_ms": 158024.130997248,
"wrong_facing_ms": 42189.443835872225,
"wrong_sibling_facing_ms": 3306.7995419260114,
"loss_proxy": 0.8819879587235034,
"horizon_ms": 3323.5481249867007
},
"near-argmax/grouped": {
"final": {
"facings": 109,
"catalog_facings": 64,
"shown": 64,
"correct": 55,
"wrong": 9,
"visible_coverage": 0.5871559633027523,
"correct_coverage": 0.859375,
"precision": 0.859375,
"false_label_rate": 0.08256880733944955,
"unknown_false_accepts": 8,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 1,
"blank_ratio": 0.4128440366972477,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"timed": {
"250": {
"facings": 109,
"catalog_facings": 64,
"shown": 68,
"correct": 49,
"wrong": 19,
"visible_coverage": 0.6238532110091743,
"correct_coverage": 0.765625,
"precision": 0.7205882352941176,
"false_label_rate": 0.1743119266055046,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 7,
"blank_ratio": 0.37614678899082565,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"500": {
"facings": 109,
"catalog_facings": 64,
"shown": 68,
"correct": 49,
"wrong": 19,
"visible_coverage": 0.6238532110091743,
"correct_coverage": 0.765625,
"precision": 0.7205882352941176,
"false_label_rate": 0.1743119266055046,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 7,
"blank_ratio": 0.37614678899082565,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
},
"1000": {
"facings": 109,
"catalog_facings": 64,
"shown": 68,
"correct": 55,
"wrong": 13,
"visible_coverage": 0.6238532110091743,
"correct_coverage": 0.859375,
"precision": 0.8088235294117647,
"false_label_rate": 0.11926605504587157,
"unknown_false_accepts": 12,
"unknown_total": 45,
"sibling_confusions": 1,
"wrong_catalog": 1,
"blank_ratio": 0.37614678899082565,
"rescued_correct": 0,
"corrected_wrong": 0,
"damaged_correct": 0
}
},
"first_any_ms": 13.799707987345755,
"first_per_facing_p50_ms": 77.35222950577736,
"time_to_final_correct_p50_ms": 82.28679199237376,
"identity_flips": 7,
"wrong_to_correct_events": 6,
"blank_facing_ms": 148948.3510403661,
"wrong_facing_ms": 39452.93850102462,
"wrong_sibling_facing_ms": 3306.7995419260114,
"loss_proxy": 0.8278239993391047,
"horizon_ms": 3323.5481249867007
}
}
}