# Validation checks - 03_Simulated

Run: 2026-10-22 12:40 | **PASS**: 22 **WARN**: 2

| ID | Check | Result | Detail |
|---|---|---|---|
| S01 | Every simulated/inferred table carries a basis label column | PASS | missing: [] |
| S02 | Parameters: base within [low, high]; every Researched parameter cites a source in the register | PASS | researched without source: []; bad basis: []; 41 parameters, 40 sources |
| S03 | Billable volumes in the simulated P&L equal Actual counts in 02_Cleaned (Binzagr revenue codes; case pick in cases) | PASS | differences: {}; cases picked 2,957,408 |
| S04 | Session rules: paid >= legal hours; 0 <= recoverable <= observed; savings only on eligible shifts; >12h sessions split | PASS |  |
| S05 | Monthly P&L labour cost reconciles to session cost + paid days without a scan (head-count basis), and its scan-day part to the sessions | PASS | P&L 6,146,784 = sessions 4,630,232 + paid days without a scan 1,516,551 |
| S06 | Baseline EBIT margin equals the benchmark margin parameter (cost-recovery construction) | PASS | 6.5000% |
| S07 | Monte Carlo quantiles ordered; Base scenario inside the P10-P90 band | PASS | recoverable P10 491,647 / Base 639,485 / P90 805,806 |
| S07b | Scenario ordering Conservative < Base < Stretch | PASS |  |
| S08 | Rate card positive and ordered (low <= base <= high) for every billed activity | PASS | 9 activities |
| S08b | Case-pick labour per loose case on the days people worked is not above the highest case rate Binzagr quoted (otherwise every client would be priced below labour) | PASS | worked-time labour SAR 0.77 per loose case vs client rates SAR 0.50-0.80: at SAR 0.50 the price would not cover it (question V12); incl. paid days without a scan SAR 1.02 (facility basis, to compare with Binzagr cost per case, V11) |
| S08c | Information: full cost-recovery case-pick rate vs Binzagr's example rates (differs because storage and other charges are not modelled) | WARN | cost-recovery SAR 2.17 per case vs client SAR 0.50-0.80 |
| S08d | Information: receiving rate vs US survey conversion (US handling fee only; ours carries inbound admin and the opex gross-up) | WARN | receiving base SAR 34.35 vs external SAR 13.46 (+155%) |
| S09 | Receivables: balance = allocated + unexplained; open <= invoice; due >= invoice date; item totals = customer totals | PASS | 1,616 customers, 6,011 open items |
| S10 | Outlet activity: one row per customer in the master, status always set | PASS | 18,983 rows |
| S11 | Official Eid dates fall inside the event windows and the warehouse data shows closures on them | PASS | observed closures: ['2026-03-21', '2026-03-22', '2026-03-23', '2026-05-26', '2026-05-27', '2026-05-28', '2026-09-23'] |
| S12 | Client typing consistent with item-code matching | PASS | {'binzagr_business_unit': 26, 'external_3pl_client': 5} |
| S13 | Badge-sharing risk: every session tiered; all >16h sessions are high risk | PASS | {'none': 22476, 'low': 488, 'medium': 427, 'high': 198} |
| S15 | Labour cost posted to activities reconciles to session labour cost (to the riyal) | PASS | posted 4,630,232 vs sessions 4,630,232 |
| S16 | Only activities Binzagr marks 'Revenue Generation' are billed, and each of them has a rate | PASS | billed [153, 172, 183, 204, 206, 350, 391, 400, 410]; Binzagr revenue codes in the log [153, 172, 183, 204, 206, 350, 391, 400, 410] (code 100 excluded: log says Item Import, mapping says Picked Volume) |
| S17 | Every session has a cost tier from the WMS role; supervisory and bulk-posting sessions carry no savings | PASS | bulk-posting sessions 871; supervisory 14 |
| S18 | No employee names from the WMS user list appear in any simulated table | PASS | [] |
| S19 | Splitting outbound cost by billed lines matches the split by actual pick time (Picking scans linked to their Case Pick / Pallet Pick row) within 5 points | PASS | case pick share: 80.4% by lines vs 80.1% by pick time; 100.0% of 516,761 Picking scans linked |
| S20 | Head count: scan-day FTE <= payroll head count <= all employee ids each month; payroll people scanning <= active people in Binzagr's user list; person-month costs reconcile to the sessions | PASS | FTE 115 / 161 / 199; employee ids scanning 202 a month; user-list active people 269 |
| S14 | Every parquet has a CSV twin with equal rows; no file over 29 MB | PASS | [] |
