Classifier statistics

Per-rule hit rates, shadow divergence, never-fired rules as liabilities, and where the unmatched went · the gate metric is match rate ≥ 99.5%

19 rules have never fired. 6 of them cover topics that received traffic this month, which makes them a liability, not healthy silence. The other 13 cover topics the sibling cannot emit yet, which is a sequencing fact and not a rule problem. The two groups are separated below because they need different fixes. Rule catalog →
Rule builder →

Match rate · last 30 days

Denominator is matched plus unmatched. Blocked and noop are excluded and reported separately, because a match rate that hides blocked events flatters itself.

99.7% today
GATE-1 floor · 99.5% 04-07 · 99.48% · below the gate. Streak reset. 29-07 · 99.71%
30-0605-0710-0716-0722-0729-07
match rate GATE-1 floor 99.5% One dip on 04-07 when the ops2 dispatch topic changed shape. The gate streak restarted on 05-07.

Where the unmatched went

31 unmatched in 7 days · 31 drift cases · zero dropped. R-14.13 makes the second number impossible to be smaller than the first.

31 open
ghost exchange (refund, zero line items) · 12 unregistered SKU on a custom line · 8 ops2 payload shape change · 5 CSD case with no matching order anchor · 3 RFID EPC with no encode record · 2 unknown · 1
Ghost exch 12Unreg SKU 8ops2 shape 5CSD anchor 3EPC 2Unknown 1
12
Ghost exchange · the 812-order INV1 class
Refund with monetary transactions and zero refund_line_items. C-27 detects and refuses to guess. Each opens a drift case with the refund amount as evidence.
8
Unregistered SKU on a custom line
"CUSTOM-ENGRAVE", "Upgrade to Flower Box". C-34 covers null SKUs; these carry a SKU string that resolves to nothing. Candidate for a new rule.
5
ops2 payload shape change on 04-07
The dispatch bridge started sending lines[] instead of a flat SKU. Rule C-41 v2 widened on 05-07 and the class stopped.

All 72 rules ranked by 7-day hits

Amber bar = zero hits in 30 days · violet = shadow · click a bar to filter the event stream

C-01 straight_sale_online4,182
C-02 multi_line_sale2,594
C-03 pos_sale2,008
C-70 known_noop1,506
C-41 ops2_dispatch_scan1,214
C-08 split_shipment_line742
C-55 iwms_carton_moved628
C-16 refund_restock462
C-12 bundled_sku_expand378
C-04 draft_order_sale334
C-61 rfid_gate_read296
C-05 cod_sale288
C-13 cancel_pre_fulfilment204
C-51 csd_reservation_place168
C-56 iwms_qc_outcome154
C-33 cross_location_fulfilment122
C-06 foc_zero_price_sale118
C-37 variant_sku_change86
C-25 size_variant_exchange72
C-54 grn_receipt_line64
C-17 refund_no_restock shadow v358
C-27 ghost_exchange44
C-72 unmatched31
C-11 preorder_backorder shadow v122
C-71 blocked18
C-10 b2b_consignment0
C-09 pickup_in_store0
C-21 price_adjustment_only0
C-42 ops2_returns_scan awaiting sibling0
C-44 carrier_status_change awaiting sibling0
30 of 72 shownRule counts are derived from the catalog table, never written as a literal. v2 disagreed with itself: rules.html said 39, classifier-stats said 42, the event detail said 38.

Never fired

Two different problems, deliberately separated

19
Liabilities · 6

The topic received traffic and the rule still never matched. Either the rule is wrong or the scenario is being absorbed by a broader rule that should not be absorbing it.

C-10 b2b_consignmentConsignment: tag has appeared 62 times in 30d, all absorbed by C-01Fix
C-09 pickup_in_storenote_attributes.pickup_location present on 14 ordersFix
C-21 price_adjustment_onlyrefunds with zero line items exist, but C-27 claims them firstFix
C-31 order_edit_add_line5,019 edited orders in the INV1 audit, 0 matches hereFix
C-59 iwms_repack_sessionrepack topic delivered 11 events, all fell to C-55Fix
C-69 sample_classified4 SAMPLE_QC promotions happened via manual adjustmentFix
Awaiting sibling · 13

The topic cannot be emitted upstream yet, so zero hits is correct. These are blocked on an ops2 or CSD change, not on a rule change. Ruling L18.

C-42 ops2_returns_scantopic not in ops2 ALL_EVENT_TYPESL18
C-44 carrier_status_changeno NDR or RTO topic existsL18
C-45 ops2_duplicate_voidnot emittableL18
C-46 ops2_damage_raisednot emittableL18
C-53 csd_replacement_approvedCSD sends one SKU, qty 1, HQ_319 hardcodedD16
i2's classifier UI computed "dead rules" as "active with 0 hits in 30d" and put every one of them in the same bucket. That reads as 19 broken rules when 13 of them are correct.

Shadow mode · 4 rules

A shadow rule writes to classifier_shadow_postings and never to the ledger. The write path checks the mode; the UI toggle cannot leave a rule posting. Promotion needs 7 clean days, ≥30 decisions, worst day < 0.1%, zero P1 divergences and a second approver.

ready C-33 cross_location_fulfilment v2

Uses fulfillments[].location_id instead of order.physicalLocation. This is the 1,205-order attribution defect. Shadow shows 122 decisions where the two differ and the fulfilment location is right every time.

23
24
25
26
27
28
29
7/7 clean · 1,204 decisions · worst 0.0000%
ready C-17 refund_no_restock v3

Posts nothing and opens a drift case, instead of crediting stock. INV1 credits here; the RFID app's own P0 says it must not, because a no-restock refund means the unit was damaged, kept or never returned.

23
24
25
26
27
28
29
7/7 clean · 58 decisions · worst 0.0000%
3 of 7 C-11 preorder_backorder v1

The ruling L17 replacement for v2 scenario 16. Posts no ledger row and records a fulfilment obligation against the inbound PO line. Two thin days block the streak: 22 and 19 decisions, both under the 30-sample floor.

23
24
25
26
27
28
29
3/7 clean · 2 thin days · worst 0.0000%
P1 reset C-01 straight_sale_online v5

Draft v5 emits a zero-quantity RESERVED row alongside the sale. The ledger rejects quantity_delta = 0 under ruling L14, so this would error after promotion. One P1 divergence, streak reset to zero today.

23
24
25
26
27
28
29
0/7 clean · 1 P1 · worst 1.0417% See the divergence

Coverage matrix · rule group × topic

Heat is the 7-day hit concentration. An empty cell means no rule covers that topic at all, which is the only way an uncovered topic becomes visible before it produces an unmatched event.

orders/*fulfillments/*refunds/*products/*inv_levelsops2/*csd/*iwms/*grn/*rfid/*inf/*
Sale 2,296 4,924
Cancel 204 46
Refund 578 62
Exchange 54 38 88 44
Fulfilment 296 368 1,214
Catalog 142 6
ops2 1,214
CSD 168
GRN + IWMS 782 64
RFID 418
Programme 18 0
Terminal 14 6 18 4 8 3 2 2
7d hits topic delivered, rule group never matched Empty cell = no rule in that group covers that topic. influencer/* is red: 3 events arrived and the programme group matched none of them.

Per-rule detail

Rows sorted by 7-day hits · FP is the false-positive rate measured against resolved drift cases

RuleGroupOrigin24h7d30dShareAvg msFPLast matchedModeHealth
C-01 straight_sale_onlinesaleboth6124,18217,90432.6%140.02%14:41live v4healthy
C-02 multi_line_salesaleboth3812,59411,11820.2%210.04%14:39live v2healthy
C-03 pos_salesaleboth2882,0088,60215.6%110.01%14:24live v3healthy
C-70 known_noopterminalINV12071,5066,44411.7%4-14:40live v1healthy
C-41 ops2_dispatch_scanops2v21761,2145,2089.5%280.11%14:38live v2widened 05-07
C-08 split_shipment_linefulfilmentboth1067423,1825.8%190.03%14:31live v1healthy
C-55 iwms_carton_movedgrn_iwmsv2926282,6924.9%340.06%14:29live v1healthy
C-16 refund_restockrefundboth664621,9803.6%240.08%14:22live v3healthy
C-12 bundled_sku_expandsaleINV1543781,6202.9%620.14%14:36live v2recipe pin required
C-61 rfid_gate_readrfidv2442961,2682.3%90.00%14:39live v1authoritative
C-33 cross_location_fulfilmentfulfilmentINV1181225221.0%160.00%13:58shadow v27/7 ready
C-17 refund_no_restockrefundboth8582480.5%180.00%14:20shadow v37/7 ready
C-27 ghost_exchangeexchangeINV16441880.3%22-14:31live v1posts nothing by design
C-11 preorder_backordersalei3 new322940.2%130.00%12:04shadow v13/7 · 2 thin days
C-10 b2b_consignmentsalev20000.0%--neverlive v1liability · 62 tags absorbed by C-01
C-31 order_edit_add_linefulfilmentv20000.0%--neverlive v1liability · 5,019 edited orders in the audit
C-42 ops2_returns_scanops2v20000.0%--neverdisabledawaiting sibling · L18
C-44 carrier_status_changeops2INV10000.0%--neverdisabledawaiting sibling · L18
C-11x preorder_from_productionsaleremoved------never builtremovedruling L17
72 rules · 19 shownThe removed rule stays visible. A removed rule that vanishes from the list is indistinguishable from a rule nobody wrote.

The invariant

R-14.10 and AC-14.6

A shadow rule cannot write to the ledger. The check is in the write path, not in the UI:

-- nightly, must return zero rows
SELECT count(*) FROM ledger_entries l
JOIN classifier_rule_versions v
  ON v.id = l.rule_version_id
WHERE v.mode <> 'live';

i2 offered the same toggle and it did nothing: api_rule_set_state mapped both active and shadow to is_active = TRUE, and the display read a column that does not exist, so the rule rendered as active forever while it kept posting. One row here is a P1.

Rule candidates pending review

Auto-mined from 30 days of unmatched events · approve to promote a candidate into shadow mode, never straight to live

4
CandidatePatternWould coverConfidenceProposed action
cand-114line_items[].sku matches CUSTOM-*80.86noop, record custom line
cand-118refunds[].transactions > 0 AND refund_line_items = 0 AND note contains "exchange"120.74C-27 variant, widen the evidence
cand-121source = csd AND lines[].length > 130.68multi-line reservation, fixes D16
cand-125source = rfid AND epc not in sku_epc_index20.61unmatched read, route to module 12
Next scan 29-07 18:00 GSTA candidate is a draft, never a live rule. It must still serve 7 clean shadow days.

State variants

Eight states, switched from the selector at the top right

Pattern library ↗
Loading
Empty and zero-filter
No decisions in the window.

72 rules are registered and none has been evaluated. Either ingestion is paused or the window is wrong. Zero-filter lists the chips doing the hiding.

Error and permission
Stats query timed out.

Classification is unaffected. Promotion needs role >= manager plus i3.classifier_promote; a viewer sees every number and no buttons.

Gate-blocked and maintenance

Thirteen rules read awaiting sibling rather than dead, because their topic is not emittable upstream. During the nightly chain verify the page is read-only and says so.

Connected to Rule builder Event inbox Event detail Sibling events Drift queue Alert rules Audit log Outbox Rate limits ops2 events CSD events Reports Settings