Variance distribution
Per-line variance across 4,912 counted lines in 90 days. The shape is the diagnosis: a tall clean spike with thin symmetric tails is a healthy programme, a leaning distribution is systematic process error and not theft.
The counting programme, not one count · five modes · eight session states · the count grain is (sku · location · stock_type), which is the column i2 never had · a clean count posts no ledger row and a balance_verifications row instead, because ruling L14 keeps quantity_delta <> 0
One row per location. Cadence, thresholds and the blind requirement are policy, copied onto a session at freeze so a later edit cannot retroactively change whether a past line needed two signatures.
| Location | Type | Full | Cycle | Since last | Debt | Blind | Thresholds units / pct / value | Coverage 90d by value | Never counted keys | Escalated to | |
|---|---|---|---|---|---|---|---|---|---|---|---|
| HQ_319 | Warehouse | 90d | 7d | 3d | CURRENT | required | 5u · 2.0% · AED 500 | 94.1% | 0 | Ramesh K. | Sessions → |
| HQ_325 | Warehouse | 90d | 14d | 11d | CURRENT | required | 5u · 2.0% · AED 500 | 88.4% | 0 | Ramesh K. | Sessions → |
| MCC | Retail | 90d | 7d | 41d | DUE | required | 5u · 2.0% · AED 500 | 61.2% | 14 | Fatima A. | Sessions → |
| YAS | Retail | 90d | 7d | 34d | DUE | required | 5u · 2.0% · AED 500 | 58.0% | 9 | Mariam K. | Sessions → |
| CCZ | Retail | 90d | 7d | 9d | CURRENT | required | 5u · 2.0% · AED 500 | 81.3% | 0 | Leila R. | Sessions → |
| AJM | Retail | 90d | 7d | 118d | OVERDUE | required | 1u · 2.0% · AED 500 | 22.4% | 37 | Noura S. | Schedule now → |
| BAS | Retail | 90d | 14d | 16d | CURRENT | required | 5u · 2.0% · AED 500 | 66.7% | 0 | Hind A. | Sessions → |
| 3PL_ARAMEX | Third party | 180d | n/a | never | QUARANTINED | statement | 1u · 0.0% · AED 0 | 0.0% | 96 | Mahmoud F. | Open batch → |
| TRANSIT | Virtual | n/a | n/a | derived | DERIVED | not countable | reconciled per transfer | nets to zero per closed transfer | 0 | system | Transfers → |
| SUPPLIER_HOLD | Virtual | n/a | n/a | derived | DERIVED | not countable | reconciled per RTS case | 37 open RTS cases hold 187u | 0 | system | RTS → |
| DISCONTINUED | Virtual | n/a | n/a | zero by definition | SIGNED | not countable | must remain zero | a non-zero balance here is a P1 | 0 | system | Drift → |
Every session carries the stock types it scoped. A session with no stock type in scope cannot post a ledger row, which is exactly why i2's count_lines never posted one.
| Session | Location | Mode | Stock types | State | Counter | Keys | Progress | Var lines | Net units | Net AED | Cover | Started | Age | ||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| SC-2026-0729-HQ319-003 | HQ_319 | RFID SWEEP | STOCK | In progress | RKRamesh K. +2 | 1,412 | 1046/1412 |
31 | -84 | -19,240 | 62% | 29-07 06:10 | 7h 41m | Open | |
| SC-2026-0729-MCC-001 | MCC | BLIND CYCLE | STOCK DISPLAY_GOOD | In progress | FAFatima A. | 88 | 47/88 |
4 | -11 | -3,860 | 18% | 29-07 09:15 | 4h 36m | Open | |
| SC-2026-0728-HQ325-002 | HQ_325 | BLIND | STOCK QUARANTINE | Adjudicating | SPSanjay P. +1 | 214 | 214/214 |
9 | -23 | -8,410 | 11% | 28-07 07:00 | 1d 6h | Adjudicate | |
| SC-2026-0728-YAS-001 | YAS | SPOT | DISPLAY_GOOD | Submitted 0/2 | MKMariam K. | 3 | 3/3 |
2 | -7 | -2,940 | 0.4% | 28-07 16:40 | 19h 8m | Sign | |
| SC-2026-0727-CCZ-004 | CCZ | BLIND CYCLE | STOCK DISPLAY_GOOD | Under review 1/2 | LRLeila R. | 64 | 64/64 |
3 | -5 | -1,780 | 14% | 27-07 10:20 | 2d 3h | Sign 2/2 | |
| SC-2026-0727-HQ319-002 | HQ_319 | RFID SWEEP | STOCK | Approved 2/2 | RKRamesh K. +2 | 1,388 | 1388/1388 |
22 | -61 | -14,120 | 58% | 27-07 06:00 | 2d 7h | Ledger | |
| SC-2026-0726-BAS-001 | BAS | CYCLE | STOCK | Completed 2/2 | HAHind A. | 42 | 42/42 |
0 | 0 | 0 | 9% | 26-07 18:05 | 3d | View | |
| SC-2026-0726-HQ319-001 | HQ_319 | BLIND | non-taggable | Completed 2/2 | SPSanjay P. | 318 | 318/318 |
6 | +14 | +2,180 | 8% | 26-07 07:30 | 3d 8h | View | |
| SC-2026-0725-MCC-002 | MCC | SPOT | DISPLAY_DAMAGED | Completed 2/2 | FAFatima A. | 2 | 2/2 |
1 | -3 | -1,050 | 0.3% | 25-07 14:00 | 4d | Drift | |
| SC-2026-0724-CCZ-003 | CCZ | FULL | STOCK DISPLAY_GOOD RESERVED | Completed 2/2 | LRLeila R. +1 | 962 | 962/962 |
18 | -29 | -9,640 | 100% | 24-07 08:00 | 5d | View | |
| SC-2026-0723-YAS-002 | YAS | BLIND CYCLE | STOCK | Completed 2/2 | MKMariam K. | 51 | 51/51 |
1 | +2 | +340 | 12% | 23-07 11:00 | 6d | View | |
| SC-2026-0722-AJM-001 | AJM | CYCLE | STOCK | Void | NSNoura S. | 36 | 8/36 |
0 | 0 | 0 | 0% | 22-07 09:00 | 7d | abandoned | |
| SC-2026-0721-HQ319-004 | HQ_319 | RFID SWEEP | STOCK | Completed 2/2 | RKRamesh K. +2 | 1,341 | 1341/1341 |
27 | -48 | -11,880 | 56% | 21-07 06:00 | 8d | View | |
| SC-2026-0720-BAS-002 | BAS | BLIND | STOCK DISPLAY_GOOD | Completed 2/2 | HAHind A. | 611 | 611/611 |
11 | -16 | -4,220 | 100% | 20-07 07:00 | 9d | View | |
| SC-2026-0719-MCC-003 | MCC | SPOT | RESERVED | Completed 2/2 | FAFatima A. | 6 | 6/6 |
0 | 0 | 0 | 0.7% | 19-07 13:20 | 10d | View | |
| SC-2026-0718-3PL-001 | 3PL_ARAMEX | SPOT | STOCK | Void | unassigned | 96 | 0/96 |
0 | 0 | 0 | 0% | 18-07 08:00 | 11d | no site access |
Per-line variance across 4,912 counted lines in 90 days. The shape is the diagnosis: a tall clean spike with thin symmetric tails is a healthy programme, a leaning distribution is systematic process error and not theft.
Share of inventory value by the age of its last verification. This is the count-health headline, because a programme that counts four thousand cheap lines and no expensive ones looks busy and proves nothing.
What happened to the 1,060 lines that were not clean
Fraction of independently second-passed lines where pass 1 equalled pass 2 exactly. Speed is recorded and deliberately not ranked.
v2's scope modal offers "Lock SKUs during count window (block Shopify webhooks)". i3 refuses that option. Shopify retries a failed webhook with backoff and then stops, so blocking loses events. And it does not even solve the problem: the physical sale still happened, so the counter still sees a shelf that disagrees with the balance.
Instead every line freezes its own expectation at the instant it is served to the counter, not at session start, and the variance is computed against that watermark plus whatever legitimately moved in between:
-- R-10.1 · variance is a GENERATED column, not one the writer maintains SELECT cl.counted_qty, cl.balance_at_freeze, cl.window_movement, -- signed ledger deltas since frozen_at_entry_id cl.expected_qty, -- GENERATED: balance_at_freeze + window_movement cl.variance -- GENERATED: counted_qty - expected_qty FROM count_lines cl WHERE cl.session_id = 'SC-2026-0729-MCC-001' AND cl.window_movement <> 0; -- 12 lines. Every one would have read as shrinkage in i2.
Ingestion is never interrupted. A line reading counted 24 · frozen 29 · window -5 · expected 24 · variance 0 is a correct count with two sales attached, and the session page shows it that way.
Ruling L14 keeps quantity_delta <> 0 on the quantity ledger. A zero-variance count moves nothing, so it cannot be a ledger row. It writes a balance_verifications row instead, and that row is what flips the key's provenance to counted.
3,852 of 4,912 lines in the last 90 days were clean. If those had needed a ledger row, 78% of all counting effort would have been invisible to provenance.
i2 counted SKUs with no stock type. rfid-app counted tags with no quantity. ops2 IWMS counted cartons and swallowed its own ledger write. ops2's picking area counted SKUs and applied variances with no approval at all. None of the four reconciled to another, and two of them counted the same physical units.
One session table. One grain. count_evidence_sources carries UNIQUE (session_id, source_kind, source_ref) so one carton cannot feed two lines.
Loading sessions. Active sessions continue on each counter's handheld and sync when this page recovers, because the entry loop is offline-first.
Nothing has been counted. That is not a neutral state: every balance in i3 is at best signed or unverified, because only a count can produce counted provenance. Start with the locations carrying the most value.
64 sessions exist in the window. The active combination is location = AJM and mode = RFID sweep, and AJM has no RFID reader assigned to it.
The read replica timed out after 8s. No count was affected: entries are written by the counters' devices against the primary, and approvals are queued rows rather than requests. Error id sc-2026-0729-e4b1.
Your session resolves to role = viewer with rota-effective locations MCC and YAS. Approving a variance needs role >= manager plus the count_approve feature. Personas are derived at login and cannot be granted from this page.
The trigger that enforces distinct approvers is being installed. Counting and submission are unaffected and every queued approval will post in order when the migration completes, roughly 6 minutes. Nothing is lost, because an approval is a row and not a request.
GATE 0 has held 4 of 7 consecutive days. HQ_319, AJM and 3PL_ARAMEX have no signed opening balance, and a count adjustment at a location whose opening balance nobody signed is an adjustment against nothing. Sessions run, variances compute, approvals collect, and every approved session posts the moment the gate closes.