Wednesday · 29 July 2026 · 16:42 GST · i3-minimalist FRA · poll 10s · uptime 14d 03h
A gate passes only when every blocking metric passes on the same day, seven consecutive days. One failing day resets the streak to zero.
| Gate | Blocking metrics · measured vs threshold | Last 7 days | Streak | Best | State | Blocks |
|---|---|---|---|---|---|---|
| GATE-0 Opening balance |
signoff_coverage 10/10 (=10) · chain_valid true · shopify_total_gap 0.62% (≤1.00) |
18 | 18 | passed | Phase 1 open | |
| GATE-1 Sales and cancels |
shopify_divergence 0.04% (≤0.10) · classifier_match 99.7% (≥99.5) · unexplained_negatives 0 (=0) |
6 | 6 | holding | Phase 2 · unlocks 30-07 | |
| GATE-2 Reverse logistics |
reverse_drift 0.41% (≤0.20) · unmatched_returns_scans 17 (=0) · replacement_claims_paired 100% |
0 | 1 | failing | Phase 3 blocked | |
| GATE-3 Inbound and cost |
grn_post_latency_p95 - (≤300s) · po_expected_vs_received - (≤0.5%) · cost_confidence_layered no data (≥95%) |
0 | 0 | not started | Valuation blocked | |
| GATE-4 Transfers and retail |
transit_nets_to_zero - (=0) · store_count_gap - (≤0.5%) · half_pairs_open - (=0) |
0 | 0 | not started | Phase 5 | |
| GATE-5 IWMS physical |
carton_sum_vs_ledger - (≤0.5%) · opened_carton_double_count - (=0) · unregistered_event_types - (=0) |
0 | 0 | not started | Phase 6 | |
| GATE-6 RFID unit ledger |
unit_vs_qty_HQ_319 NULL (=0) · gate_catch_rate 99.2% (≥99.0) · sample_size 0 (>0) |
0 | 4 | regressed | Serial reports | |
| GATE-7 Programs |
influencer_pool_match no source (=0) · damage_incident_coverage - (=100%) |
0 | 0 | not started | Phase 8 | |
| GATE-8 Close reproducible |
close_residual - (=0) · pack_hash_stable - (=true) · netsuite_unexplained - (≤tolerance) |
0 | 0 | not started | Phase 9 cutover |
Silence is never read as zero. A source past its critical interval raises an alert and stamps every dependent report as stale.
| Source | Transport | Last event | Lag | Warn | Crit | Events 1h | Rejected | DLQ | Contract | Owner |
|---|---|---|---|---|---|---|---|---|---|---|
| shopify | webhook | 16:41:52 | 8s | 120s | 600s | 1,284 | 0 | 0 | live | platform@minimalist.ae |
| ops2 · inbound | webhook | 16:39:04 | 3m 03s | 300s | 900s | 312 | 4 | 12 | live | ops@minimalist.ae |
| ops2 · reverse | webhook | - | - | 300s | 900s | 0 | 0 | 0 | not emittable | ops2 PR pending |
| csd | webhook | 16:28:11 | 13m 56s | 600s | 1800s | 46 | 1 | 3 | live | cs@minimalist.ae |
| grn | webhook | 15:12:40 | 1h 29m | 3600s | 14400s | 0 | 0 | 0 | live | wh@minimalist.ae |
| iwms | webhook | 16:35:22 | 6m 45s | 600s | 1800s | 88 | 2 | 9 | shadow | wh@minimalist.ae |
| rfid · gates | webhook | 16:41:12 | 55s | 180s | 600s | 2,103 | 7 | 17 | shadow · G2 down | platform@minimalist.ae |
| rfid · handheld | webhook | 14:02:38 | 2h 39m | 1800s | 7200s | 0 | 0 | 0 | stale | retail@minimalist.ae |
| influencer hub | webhook | never | never seen | 3600s | 86400s | 0 | 0 | 0 | planned | marketing@minimalist.ae |
| sku intel | n8n pull | 04:05:00 | 12h 37m | 90000s | 172800s | 0 | 0 | 0 | live · daily | platform@minimalist.ae |
| netsuite extract | manual | 01-07 09:40 | 28d | monthly | 45d | 0 | 0 | 0 | file drop | finance@minimalist.ae |
| shopify · levels | poll 15m | 16:30:00 | 12m | 1800s | 3600s | 1 | 0 | 0 | live · cross-check only | platform@minimalist.ae |
| Topic | Depth | Oldest | Top error | |
|---|---|---|---|---|
| rfid.gate_read | 17 | 3d | EPC not encoded, unknown sku_id | Replay |
| ops2.carton_moved | 12 | 18h | location code not in registry | Replay |
| csd.case_transition | 9 | 6h | missing line_id on reservation | Replay |
| iwms.qc_outcome | 3 | 2h | bucket value outside the 5-bucket set | Replay |
| shopify.orders_edited | 0 | - | - | clear |
| grn.receipt_line | 0 | - | - | clear |
8 monitored, including RFID hardware, because a dead gate silently stops dispatch verification.
Two blocks. Machine health, then reconciliation health. A green machine can still be completely wrong.
Every job in the estate, whoever runs it. A job with no owner cannot be registered.
| Job | Runner | Schedule | Last run | Took | Status | Next | Covers | Pages | |
|---|---|---|---|---|---|---|---|---|---|
| valuation.nightly | i3 worker | 15 2 * * * | 02:15:04 | 4m 12s | ok | tomorrow | Stable historical valuation | #n8n-updates | Logs |
| costmodel.reconcile | i3 worker | 45 2 * * * | 02:45:11 | 2m 38s | ok | tomorrow | cost_ledger vs cost read models | #n8n-updates | Logs |
| gates.evaluate | i3 worker | 0 3 * * * | 03:00:02 | 58s | partial | tomorrow | 7-day gate streaks | #n8n-updates | Logs |
| balance.full_verify | i3 worker | 30 3 * * * | 03:30:00 | 6m 51s | ok | tomorrow | Balance cache vs balance_after | #n8n-updates | Logs |
| chain.verify | i3 worker | 0 4 * * * | 04:00:01 | 3m 09s | ok | tomorrow | Hash chain, 4 journals | #n8n-updates | Logs |
| shopify.divergence | i3 worker | 0 5 * * * | 05:00:00 | 1m 44s | ok | tomorrow | GATE-1 metric | #n8n-updates | Logs |
| rfid.three_way | i3 worker | 30 5 * * * | 05:30:00 | - | failed | tomorrow | GATE-6 metric | #n8n-updates | Logs |
| netsuite.recon | n8n | 0 6 * * * | 06:00:00 | 22s | skipped | tomorrow | Period delta, 4 buckets | finance@ | Logs |
| cash.position_daily | i3 worker | 30 6 * * * | 06:30:07 | 51s | ok | tomorrow | Cash tied up by stage | #n8n-updates | Logs |
| reports.daily_pack | n8n | 0 7 * * * | 07:00:00 | 1m 18s | ok | tomorrow | Scheduled deliveries | #n8n-updates | Logs |
| secrets.rotation_sweep | i3 worker | 0 8 * * 1 | Mon 08:00 | 4s | 1 overdue | Mon | Overdue secret detection | platform@ | Logs |
| dlq.age_report | i3 worker | 0 9 * * * | 09:00:03 | 7s | ok | tomorrow | DLQ aging, never auto-drops | platform@ | Logs |
| velocity.recompute | i3 worker | 0 1 * * * | 01:00:00 | 2m 02s | ok | tomorrow | Cover with NULL, never 999 | #n8n-updates | Logs |
| ops2.orphan_drain | n8n | */30 * * * * | 16:30:00 | 14s | ok | 17:00 | Half-pair transfers | ops@ | Logs |
| influencer.pool_sync | n8n | 0 10 * * * | never | - | never ran | 10:00 | GATE-7 metric | unowned | Logs |
| shrinkage.weekly | n8n | 0 8 * * 0 | Sun 08:00 | 33s | paused | paused | Awaiting GATE-6 | finance@ | Logs |
| close.propose_dryrun | i3 worker | 0 23 28-31 * * | 30-06 23:00 | 3m 40s | residual | 31-07 | Close residual must be zero | finance@ | Logs |
| fixture.staging_seed | i3 worker | 0 4 * * 1 | Mon 04:00 | 18s | paused | paused | Staging only, never prod | platform@ | Logs |
HeartbeatMissing at i3/ops/collect.py:212 device: FXR90-G2 · location: HQ_319 · antenna_count: 4 last_heartbeat: 2026-07-29T14:38:02+04:00 expected_interval_s: 300 · observed_silence_s: 7401 consequence: gate_metrics(GATE-6, unit_vs_qty_HQ_319) -> NULL rule: a NULL gate metric counts as a FAILING day (R-15.20) correlation_id: 01K1B7Q4ZC9MDF3P2A6TXHY8WR
JobTimeoutException: task exceeded 180s job_code: rfid.three_way · queue: default blocked_on: SELECT ... FROM unit_ledger WHERE location_id = 1 AND state <> 'SOLD' rows_scanned: 139,561 · no index on (location_id, state) retries: 0 (timeouts are not retried) fix: partial index, and raise max_duration_s to 600
ValidationError at /webhooks/shopify/orders/create payload.id: 6234712394876 · order_name: #MIN10482 missing: line_items[2].variant_id (product deleted after order) classifier_rule: shopify_order_v2 · confidence: n/a routed: dlq:shopify:orders · requeue in 15m note: keyed on variant.id per the SKU-rename rule, so no SKU fallback is attempted
DeliveryBounce at i3/reports/deliver.py:88 run_id: 41207 · report_code: valuation_by_location · format: pdf (218 KB) target: finance@minimalist.ae · consecutive_bounces: 3 action: subscription paused, alert.raise emitted at P2 rule: three bounces pauses the subscription; it is never silently retried forever
CloseResidual at i3/finance/close.py:164 period: 2026-07 · location: HQ_319 · residual_qty: 41 uncategorised source_types: ['consignment_partner_sale', 'rfid_found_unexpected'] opening 128,904 + categories 4,182 = 133,086, closing = 133,127, delta 41 rule: a close with uncategorised_qty <> 0 cannot be frozen (R-15.11) this is the exact failure INV1 absorbs silently into next month's opening
ExtractMissing at i3/finance/ns_recon.py:41
period: 2026-07 · last_extract: 2026-06 loaded 01-07 09:40 by finance@
effect: recon status = 'no_extract'. The period may be FROZEN, not FILED.
rule: filing without a reconciliation would make i3 the accounting record,
which ruling L16 forbids.The incumbent ops dashboard measures thirteen things and every one of them is a property of the machines: availability, latency, freshness, job success, cron punctuality. Not one of them measures whether the ledger agrees with anything.
For a system whose founding doctrine is that a phase closes only when its ledger agrees with external truth for seven consecutive days, that is the wrong instrumentation. i3 could be perfectly available, perfectly fast, perfectly on schedule, and completely wrong, and every tile would be green.
So the reconciliation block is a peer of the machine block, not a footnote. It is the block that goes red while the hardware is fine.
All nine sources inside their intervals, no failing jobs, no open incidents, and every measuring gate holding. This is what a quiet day looks like. It is not the same as no data: the collectors ran at 16:42:07 and returned values.
GET /api/ops/health returned 503, last success 4m ago. The gate tracker below is showing the last successful evaluation from 03:00:02 and is labelled stale, not current.
You can read every panel on this page. Run now, Pause and Waive require ops_manager or above. Your derived persona is store manager · MCC, from (role=manager, features=[retail], rota=MCC). Personas are derived at login, never granted.
Postgres minor upgrade, 02:00 to 02:40 GST. Ingestion continues into the inbox and is classified on resume, so no event is lost. Gate evaluation for tonight is deferred to 03:40 and will still record a value for today.
The reconciliation block needs GATE-1 to have held for 7 days before its numbers mean anything. It has held 6. Until then the tiles show shadow measurements marked not authoritative, rather than being hidden, so you can watch them converge.