== static pickle scan (nothing is imported or executed) file /ssd2/yuanze2/sku_blind2/submission/model.pkl (1,666,198 bytes) opcodes 36,809 total, 32 distinct globals 18 distinct (18 allowlisted, 0 blocked, 0 unresolved) VERDICT: SAFE for the restricted unpickler model.skops present — the grader will prefer it == grading under isolation isolation: userns jail (tmpfs root, selective ro rbinds, pivot_root, network + PID namespaces) [TESTED on this host] reference: rows=78864 AUC=0.88632 Brier=0.048533 ECE=0.00830 PASS [A] sku_risk_scores.csv present PASS [A] a model artifact is present (model.pkl OR model.skops) — model.pkl yes, model.skops yes PASS [A] sku_risk_scores.csv parses as CSV — 78,864 rows PASS [A] required columns present (100%) — 8/8 PASS [A] record count > 0 — 78,864 PASS [A] dtypes coerce cleanly PASS [B] row count == scorable test rows (difference must be 0) — 78,864 vs 78,864 PASS [B] (sku_id, dc_id, fiscal_week_index) is unique — 0 duplicates PASS [B] key set == canonical scorable set — 0 extra, 0 missing PASS [B] submission joins to ground truth — 78,864 joined rows PASS [B] prediction_cutoff_date == week-ending date of the cutoff week — 0 mismatches PASS [B] horizon_days == the SKU's replenishment_cycle_days — 0 mismatches PASS [B] feature_snapshot_id == FS-YYYYMMDD of the cutoff — 0 mismatches PASS [B] feature_snapshot_id is a 1:1 function of the cutoff date — 0 cutoffs with multiple ids PASS [B] stockout_label == derived forward label — 0 of 78,864 mismatches PASS [C] risk scores finite and within [0, 1] — min 0.0001234 max 0.9791 PASS [C] ROC-AUC >= 0.86132 (one-sided) — 0.88446 (delta -0.00185) PASS [C] PR-AUC (reported, not gated) — 0.48169 vs reference 0.47998 PASS [D] Brier <= 0.056533 (one-sided upper bound) — 0.048259 (delta -0.000274) PASS [D] ECE_10bin <= 0.03830 (one-sided upper bound) — 0.00329 (delta -0.00501) PASS [D] mean predicted vs actual base rate — 0.07151 vs 0.07078 PASS [D] reliability_table.tsv parses as TSV — 20 rows PASS [D] reliability_table.tsv has the required columns — 6/6 PASS [D] both equal_width and equal_frequency schemes present — found ['equal_frequency', 'equal_width'] PASS [D] equal_width: exactly 10 bins indexed 0..9, no gaps — 10 rows, indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] PASS [D] equal_width: sum(n) == submitted row count — 78,864 vs 78,864 PASS [D] equal_width: sum(n_pos) == positives — 5,582 vs 5,582 PASS [D] equal_width: sum(n_neg) == negatives — 73,282 vs 73,282 PASS [D] equal_width: sum(bin_weight) == 1 within 1e-9 — 1.000000000034 PASS [D] equal_width: per-bin group-by reproduces n, n_pos, mean_predicted — 0 mismatches (using the submitted bin_equal_width column) PASS [D] equal_frequency: exactly 10 bins indexed 0..9, no gaps — 10 rows, indices [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] PASS [D] equal_frequency: sum(n) == submitted row count — 78,864 vs 78,864 PASS [D] equal_frequency: sum(n_pos) == positives — 5,582 vs 5,582 PASS [D] equal_frequency: sum(n_neg) == negatives — 73,282 vs 73,282 PASS [D] equal_frequency: sum(bin_weight) == 1 within 1e-9 — 0.999999999880 PASS [D] equal_frequency: per-bin group-by reproduces n, n_pos, mean_predicted — 0 mismatches (using the submitted bin_equal_frequency column) info [E] deserialisation control — loaded via skops, no pickle machinery; 2 type(s) checked against the exact allowlist PASS [E] model.skops shipped (lets the grader avoid pickle entirely) — present PASS [E] model loads under the safe-deserialisation policy — source: model.skops PASS [E] model exposes predict_proba PASS [E] model bundles a feature transformer with the classifier — CalibratedClassifierCV info [E] model.pkl independent check — static scan: 18 distinct globals, 0 off-allowlist info [E] model.pkl independent check — sandbox attestation: network isolation: ok (no TCP egress, no DNS) info [E] model.pkl independent check — sandbox attestation: filesystem write isolation: ok (6 paths, all reject a create) info [E] model.pkl independent check — sandbox attestation: filesystem read isolation: ok (5 canaries, none readable) info [E] model.pkl independent check — sandbox attestation: process isolation: ok — 1 PIDs visible info [E] model.pkl independent check — sandbox attestation: declared sandbox mode: userns-jail; attestation PASSED info [E] model.pkl independent check — loaded via restricted unpickler (exact find_class allowlist) inside an attested sandbox PASS [E] model.pkl ALSO loads under the safe policy (both artifacts shipped) — source: model.pkl PASS [E] feature matrix row count == score row count — 78,864 vs 78,864 PASS [E] the loaded model regenerates the delivered scores — exact — max |delta| = 2.220e-16 (as-written order, via model.skops) PASS [E] model.pkl and model.skops are the same estimator — max |delta| between their predictions = 0.000e+00 PASS [F] no post-cutoff / label-derived feature names — clean PASS [F] no single feature is an oracle for the label — strongest single-feature AUC 0.1498 (dos_over_cycle) — within the expected range PASS [F] ADVISORY: lead-time / supplier-risk feature family present — 12 column(s), e.g. ['cycle_days', 'dos_minus_cycle', 'dos_over_cycle', 'dos_pos_over_cycle'] PASS [E] metrics.json ROC-AUC reproduces from the submitted CSV — claimed 0.8844610138533082 vs recomputed 0.884461 PASS [G] machine-readable = true for both graded files — sku_risk_scores.csv parsed (78,864 rows); model loaded via model.skops PASS [G] constraint violations = 0 — 0 blocking check(s) failed above PASS [G] formats remain comparable to the reference — CSV with header and 10 columns; model artifact loadable by scikit-learn 1.4.2 ======================================================================== 51 checks — 51 pass, 0 warn, 0 fail VERDICT: PASS