feat: add Van's real baseline lane and stop size tokens naming products
Two review findings, both confirmed by measurement. 1. The evaluator had no always-argmax lane, so every "vs Van" claim compared against the *gated* matcher, which is not Van's contract - the original demo answered every crop with its best-scoring SKU and had no accept line. The new 'van' lane is that contract: same scores, no gate. Against it the local lane wins both axes at both resolutions (full 61%/77% vs 52%/29%; live 59%/95% vs 57%/32%), but the live coverage margin is one facing, not seven, and the 95% figure is live-resolution only - at full resolution the same lane reads 77% with 11 false accepts and a hub alarm. 2. A crop reading only "400g" scored 0.667 on three SKUs, above TEXT_ACCEPT, so the text lane named a product from a size line. The fill-in job now requires two non-digit bigrams; the veto is unchanged, so "65%" still contradicts a local answer. The raw OCR read travels with the ranking through score_crop_lanes for that check. Tests: 3 for the size gate (policy + live) and the van lane's own row. Removing the gate fails all three. Suite 276 -> 280.
This commit is contained in:
parent
13ee7426e2
commit
fd72251160
7 changed files with 180 additions and 22 deletions
|
|
@ -453,6 +453,22 @@ class DecisionPolicyTests(unittest.TestCase):
|
|||
decision = self.policy().decide([("sku_a", 3.0), ("sku_b", 5.0)], [])
|
||||
self.assertEqual(decision["best_sku"], "sku_a")
|
||||
|
||||
def test_a_size_only_read_does_not_fill_in(self):
|
||||
"""Size and number tokens are not identity text."""
|
||||
decision = self.policy().decide([], [("sku_b", 0.9)], text_read="400g")
|
||||
self.assertIsNone(decision["best_sku"])
|
||||
|
||||
def test_a_size_only_read_still_vetoes(self):
|
||||
"""The veto keeps "65%" usable: the local lane supplied the evidence."""
|
||||
decision = self.policy().decide(
|
||||
[("sku_a", 5.0)], [("sku_b", 0.9)], text_read="65%"
|
||||
)
|
||||
self.assertIsNone(decision["best_sku"])
|
||||
|
||||
def test_a_named_read_with_a_size_still_fills_in(self):
|
||||
decision = self.policy().decide([], [("sku_b", 0.9)], text_read="コクうま 65%")
|
||||
self.assertEqual(decision["best_sku"], "sku_b")
|
||||
|
||||
def test_text_fills_in_when_local_has_nothing(self):
|
||||
decision = self.policy().decide([], [("sku_b", 0.9)])
|
||||
self.assertEqual(decision["best_sku"], "sku_b")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue