Three-Way Reconciliation

Unit ledger vs quantity ledger vs Shopify available, with an independent human count as a fourth leg. Runs 06:00 Dubai daily. Four legs, each with its own source and observation time. A missing leg is null, never zero.

REC-20260729-01 complete at 06:04 GST. 1,247 keys compared · 1,182 clean · 12 open variances · 31 auto-accepted and posted · 8 suppressed inside the H2 outage window · 14 skipped for coverage below 95%. Value at risk AED 18.2K, down AED 4.1K on yesterday. Largest absolute delta 4 units on MIN-TBL-014 at MCC.
GATE 6: 4 of 7 consecutive passing days. The counted leg resolved on 5 of the last 7 runs, which meets the minimum. 1,118 of 1,247 keys are GATE-6 eligible; 129 are excluded for tag coverage below the live 95% policy and are reported separately, never folded into the clean count.
Unit ledger
1,247 keys · 06:00:12
COUNT of units whose state has counts_as_present, grouped by sku_id, location and stock type.
Quantity ledger
1,247 keys · 06:00:14
inventory_balance from module 02, reconciled rows only. Unreconciled cache keys drop out rather than poison a total.
Shopify available
1,208 keys · 05:52:40
39 keys have no Shopify location mapping, so shopify_qty is null for them and every delta involving it is null. Not zero.
Human count
318 keys · 28-07 20:41
From an approved count session, never from an RFID scan. A second reading of the same RFID data is not an independent leg.
All outcomes 1,247
Variance 12
Auto-accepted 31
Suppressed 8
Skipped coverage 14
Clean 1,182
Unit > ledger 5
Ledger > unit 4
Shopify pair only 3
HQ_319 4
HQ_325 0
MCC 5
YAS 3
CCZ 0
AJM 0
BAS 0
Open in drift

Four legs per key · top 8 variances

null legs drawn as an empty slot
MIN-TBL-014 MCC · unit 10 MIN-TBL-014 MCC · ledger 14 MIN-TBL-014 MCC · shopify 14 MIN-TBL-014 MCC · human count 12 MSR31-07 HQ_319 · unit 41 MSR31-07 HQ_319 · ledger 38 MSR31-07 HQ_319 · shopify 38 MSR31-07 HQ_319 · human count 40 LLW-BAG-051 MCC · unit 2 LLW-BAG-051 MCC · ledger 5 LLW-BAG-051 MCC · shopify 5 LLW-BAG-051 MCC · human count 2 · agrees with RFID, suspected shrinkage PP02 HQ_319 · unit 6 PP02 HQ_319 · ledger 6 PP02 HQ_319 · shopify 9 · Shopify oversold, sync lag PP02 HQ_319 · no human count this cycle · leg is NULL, not zero JRY01 YAS · unit 10 JRY01 YAS · ledger 8 JRY01 YAS · shopify 8 JRY01 YAS · no human count · NULL TNS01 MCC · unit 7 TNS01 MCC · ledger 9 TNS01 MCC · shopify 9 TNS01 MCC · human count 7 · two damaged, write-off not booked FYN01 YAS · unit 6 FYN01 YAS · ledger 5 FYN01 YAS · shopify 7 · three-way split, Shopify stale FYN01 YAS · no human count · NULL ANQ07B MCC · unit 0 ANQ07B MCC · ledger MINUS 1 · a negative balance is a blocking variance ANQ07B MCC · shopify 0 ANQ07B MCC · no human count · NULL
MIN-TBL-014MSR31-07LLW-BAG-051PP02JRY01TNS01FYN01ANQ07B
Unit ledger Quantity ledger Shopify available Human count Leg not observed (null, not zero)

Variance trend · 14 days

trend down
16-07 · 29 open variances 17-07 · 26 18-07 · 28 19-07 · 24 20-07 · 21 21-07 · 19 22-07 · 23 · H1 firmware update day, read rate halved 23-07 · 18 24-07 · 15 25-07 · 19 26-07 · 22 · amber, wave 2 tagging surge 27-07 · 14 28-07 · 16 29-07 · 12 · today auto-accepted per day, 24 to 38 range GATE 6 target: zero open unit-vs-ledger variances
16182022252729
Open variancesAmber day, known causeAuto-acceptedGATE 6 target line

Variances

sorted by absolute delta, then value at risk A dash is a null leg. Zero is a real zero.
CodeSKULocStock typeUnitLedgerShopifyCountd U-Ld U-SCovValue AEDAuthorityLikely causeOutcome
RC-0442MIN-TBL-014MCCSTOCK10141412-4-41005,240undecidedDisplay units not scanned out of STOCKinvestigating
RC-0441MSR31-07HQ_319STOCK41383840+3+31003,180rfid_physicalReturns received, disposition not postedopen
RC-0440LLW-BAG-051MCCSTOCK2552-3-31004,140rfid_physicalSuspected shrinkage, human count agrees with RFIDinvestigating
RC-0439PP02HQ_319STOCK669-0-31001,410shopify_sellableShopify oversold, inventory_levels sync lagshopify only
RC-0438JRY01YASSTOCK1088-+2+2100980rfid_physicalTransfer received early, receive scan not postedopen
RC-0437CDW01HQ_319STOCK62636362-1-1100470rfid_physicalOne unit on the QC bench, untagged moveauto-accepted
RC-0436TNS01MCCSTOCK7997-2-21001,880rfid_physicalTwo damaged, write-off approved but not bookedopen
RC-0435FYN01YASSTOCK657-+1-1100640undecidedThree-way split: all pairs disagree, Shopify staleinvestigating
RC-0434LBA01HQ_319STOCK282826-0+2100890shopify_sellableShopify not updated after GRN-2319shopify only
RC-0433ANQ07BMCCSTOCK0-10-+101000ledgerNegative balance, oversell, needs a correctionblocking
RC-0432MIN-VAS-022MCCSTOCK30282830+2+21001,240rfid_physicalRefund restocked physically before the CSD eventresolved
RC-0431MIN-CSN-031HQ_319STOCK218216216-+2+2100420rfid_physicalCount timing against an in-flight dispatchauto-accepted
RC-0430MST-CRM-42-BLKHQ_319QUARANTINE31--+2-1002,180rfid_physicalTwo carrier-confirmed returns read at the gate, CSD event pendingopen
RC-0429MIN-2159HQ_319STOCK184312312--128-128590n/aTag coverage 59%, below the 95% policyskipped coverage
RC-0428MSR31-07HQ_319DISPLAY_GOOD466--2-21001,060n/aInside the H2 device outage window 13:58 to nowsuppressed
Resolution never edits a balance and never edits history. An accepted variance posts a compensating ledger_entries pair with source_type='unit_recon' and a link back to this run and line. A row cannot be marked accepted without that pair existing (ck_url_posted).

Authority, applied per pair

DisagreementWinner
Unit vs ledger, physical presenceRFID gate reads
Unit vs Shopify, sellableShopify
Unit vs human countHuman count, then re-scan
Ledger vs Shopifyi3 ledger, push to Shopify
Dispatch and AWBops2
Return intentCSD
Physical receiptGRN / IWMS
Write-off approvalFinance
Order existenceShopify
A gate read wins physical existence and only that. It does not decide sellability, ownership or acceptance. A read proves a unit was at a door; it does not prove the receipt was accepted.

Auto-accept policy · live version

Scope
global
Unit bound
absolute delta at or below 2
Value bound
value at risk at or below AED 200
Percent bound
at or below 1.00% of the key balance
Coverage floor
95% tagged, else the key is skipped
Effective from
12-07-2026
Set by
ahmad@minimalist.ae
Reason
"Wave 2 tagging surge, tightened from 3 units after the 22-07 firmware incident"
Both bounds must hold. Two units of an AED 45 candle and two units of an AED 4,200 watch are not the same tolerance. A threshold change is a new dated version with a reason, never an UPDATE: widening a tolerance must be as visible as breaching one.

Run history · GATE 6

29-0712 open · 31 accepted · 14 skippedpass 4/7
28-0716 open · 28 accepted · 15 skippedpass
27-0714 open · 34 accepted · 15 skippedpass
26-0722 open · 38 accepted · 18 skippedamber
25-0719 open · 30 accepted · 19 skippedpass
24-0715 open · 26 accepted · 21 skippedpass
23-0718 open · 29 accepted · 22 skippedpass
22-0723 open · 24 accepted · 24 skippedfail
22-07 failed: an H1 firmware update halved the read rate for four hours and the counted leg did not resolve. The counter reset. GATE 6 needs 7 consecutive passing days with the counted leg on at least 5 of them.

Suppression window

Incident
INC-0284 device_failure
Device
H2 · MC3390xR · HQ_319
Dark since
13:58 GST · 38 minutes
Keys suppressed
8 at HQ_319 zone A3
Value withheld
AED 4,180 not counted as at risk
A dark reader produces an artefact cohort, not a shrinkage event. While a device_failure incident is open at a location, its keys are suppressed, not variance. They are counted and reported, never folded into clean.

Tag coverage · location by SKU class

14 keys below the 95% floor
LocationWatchesJewelleryHandbagsLeatherPerfumeSunglassesComposites
HQ_319 98 96 95 71 59 97 n/a
HQ_325 000000 n/a
MCC 97 96 95 88 41 96 n/a
YAS 96 95 92 84 38 96 n/a
CCZ 000000 n/a
AJM 000000 n/a
BAS 000000 n/a
Coverage 95% to 100% Skipped, below the coverage floor. Not clean, not a variance.

The identity this page proves

-- fully tagged key COUNT(unit_state WHERE key = k AND counts_as_present) == inventory_balance.qty(k) -- partially tagged key tagged_units(k) + declared_untagged(k) == inventory_balance.qty(k)

declared_untagged is declared, not derived. It comes from the tagging campaign's own signed daily counts. If it were computed as qty - tagged the identity would be true by construction and would prove nothing at all. A disagreement between the declared figure and the residual is itself the finding.

A missing leg is null. An earlier implementation set the Shopify leg to a hardcoded zero, which made every SKU a variance of its own full balance and pinned the accuracy metric at 0%. Here a null leg makes every delta involving it null, and a null delta is not a variance.

The human count leg is human. It comes from an approved count session, never from an RFID scan. Reading the same tags twice and calling the second read "physical" produces a leg that agrees with itself by construction.

Nothing here repairs a cache. The unit-state projection carries last_hop_seq, last_hop_hash and hop_count, verified nightly. A mismatch sets is_reconciled = false and the unit drops out of every total until a compensating hop closes it. No process writes to a projection row to fix it.

Connected to

Gates and feed Unit events Mobile scanner Drift workbench Stock count Opening stock SKUs live Stock health Incidents Damages Reports Audit log Policy settings