Written by the campaign-critic subagent against the brief's success criteria — read it as the counter-position to the synthesis above.
Self-critical notes (the ablation IS the adversarial test)
This session was designed to attack session-1's confound, and it fired. Remaining caveats so the negative
is not over-claimed: (a) single seed — the matched/wrong closures being within 0.01 of each other is well
inside any seed noise, which is itself the point (no separation), but the smoothing < PINN gap (0.91 vs
1.23) should be seed-replicated before it is load-bearing; (b) lambda_phys was held fixed across priors —
a closure-specific lambda tuning could shift things, though equal lambda is the fair ablation; (c) the
smoothing penalty and continuity penalty have different natural scales, so "smoothing wins" is a
direction, not a calibrated margin; (d) test-lab-synth has low directed-flow structure, the regime most
favourable to mass-conservation — a stronger uni-directional corridor flow is the one place the prior
might still earn its keep. Net: the FD-specific claim is refuted here; the door is left open only for a
strong-directed-flow regime, as a low-priority follow-on.
Addendum — post-hoc statistical re-analysis (2026-07-06, statistics skill, operator session)
Independent recomputation and adversarial verification of the mismatched-FD ablation
(continuity_fd_ablation.py, session 01KW074MN1Q3M0JM2VF9WXGYFC) under the house statistics
contract (.claude/skills/statistics/). Every number in the prior audit reproduces to the digit
from the raw run parquets; the demote of continuity-prior-regularizes-density is upheld.
Corrections below re-size the precision the recompute claims — the direction of the verdict is
not in question, the strength of the evidence is.
-
[HIGH → CORRECTED] The 30-seed CIs are training-noise error bars, not finite-data uncertainty.
All five attached runs carry seed: 0 and fading_seed: 0 (verified in every resolved.yaml);
they differ only in n_agents ∈ {12,24,36,60,80}. There is one physical trajectory
realization. The 30 recompute "seeds" reshuffle only the 70/30 split and the MLP init on a
single fixed (X, ρ), so the paired-t interval for smoothing−weidmann at ρ≥1 (−0.450, SD 0.147)
is a Monte-Carlo interval of half-width 1.96·SD/√n_seeds — 0.053 at n=30, 0.026 at n=120,
0.013 at n=480. It shrinks with the compute budget, carrying no information about generalization
beyond this trajectory. Reporting p=1.9e-16 / dz=−3.05 (huge) / "tightly-bounded, CI excludes
0 by a wide margin" conflates MC error with finite-data uncertainty, which the contract forbids
(test-chooser.md, "Monte-Carlo error is its own error bar … distinct from finite-data
uncertainty — never conflate the two"). This is a milder form of the same pseudo-replication the
audit flags in the session's n=105. Correct phrasing: the smoothing<PINN gap and the
FD-closure indistinguishability are robust to split+init noise (the single-seed numbers were not
an init fluke) — but the effect is established on one trajectory; the recompute rules out an
alternative explanation, it does not strengthen the evidence toward generalization.
-
[HIGH → severity CORRECTED to MEDIUM] n=105 mis-states representativeness, not precision.
Provenance (repro3.py) confirms 105 high-regime cell-frames collapse to 18 distinct
(run, frame) instants, 102 of them from just two runs (crush80 76, crush60 26); adjacent
cells within a corridor instant are a cluster, not independent draws (assumptions.md). The
session, however, ran no inference on n=105 — it shipped bare point estimates — so there is
no naive variance the count corrupts, and the "≈6× precision inflation" figure presumes an
inferential n that was never used. The audit's own recompute infers over seeds, not cells, so it
is likewise immune. Note the reported n=105 is the seed-0 draw and sits below the cross-seed
mean of 128 (range 99–184) — a conservative count, not an inflated one. The defensible reading:
the "crush" evidence rests on two runs / 18 instants; report it as such.
-
[MEDIUM → CONFIRMED] The campaign's originating −11% premise is fragile to seed noise.
unconstrained − pinn_weidmann at ρ≥1: mean 0.076, 95% CI (−0.009, 0.163), p=0.095, dz=0.31 —
covers zero. unconstrained also carries the largest across-seed SD of any prior (0.187 vs
0.09–0.15), and the seed-0 baseline (1.562) that anchored the session-1 headline sits +0.91 SD
above its own mean (1.391). Unlike the point above, this claim is methodologically sound as
stated: showing a result is fragile to split+init noise needs only training-noise analysis
(devore2012_62c8 ch.9). The originating "continuity-PINN beats unconstrained" premise was never
itself shown robust — this compounds, not contradicts, the demote.
-
[MEDIUM → CONFIRMED, caveat added] Low-regime loss corroborates the demote but is not
load-bearing. The notebook computes low/mid RMSE (unpersisted "all" field); at ρ<ρ_lo
unconstrained (0.510) beats pinn_weidmann (0.575): diff −0.066, CI (−0.119, −0.004),
paired-t p=0.038, Wilcoxon p=0.005 — the continuity prior costs accuracy in the dominant
low-density regime, exactly the defeater's low-regime clause. It does not survive BH-FDR
across the 15-test family (rank 7/15), and the uncorrected p is itself a single-dataset
training-noise p (bullet 1 applies). Directionally corroborating, not decisive.
-
[MEDIUM → CONFIRMED] No reproducibility artefact was persisted. Session frontmatter
(figure_count: 0, figures: []) and the S3 listing confirm only four markdown files exist for
this python-ml standalone session — no reduction config, metrics.json, RMSE parquet, or the
bar chart the campaign brief explicitly requested. Recompute was possible only because the
notebook source is in git and the raw run parquets survived under sim/exp-csi-crowd/. A
python-ml notebook session that emits load-bearing numbers must persist its metrics + config to
S3 like sim-launched reductions do.
-
[DESIGN] The FD-agnostic null needs physical seeds, not more reshuffles. "Closures identical"
is an equivalence claim; a pre-declared TOST margin is the rigorous instrument, not a
non-significant difference (SKILL.md §5). Detecting an FD-closure separation smaller than
~0.1 RMSE would need ≈20+ independent physical (JuPedSim) seeds by the paired formula
(diez2015_8380 ch.5); the observed 0.45 smoothing gap is large enough that a handful of physical
seeds would confirm it. The single-seed budget (sim_params.seeds: [0]) cannot discharge the
criticism.md "should be seed-replicated" caveat — the 30-seed recompute quantifies training noise
only and does not substitute for it.
Corpus: wasserman2004_ea08 (bootstrap/MC error ch.8, 24.2), test-chooser.md
(MC-error-is-its-own-error-bar), assumptions.md (correlated-cluster non-independence),
diez2015_8380 ch.5 (paired power), devore2012_62c8 ch.9. Scripts + parquet under the audit dir
(analyze_multiseed.py, bh_fdr.py, effect_sizes.py, repro3.py, multiseed_results.parquet).
Figure: fig-fd-ablation-seeds.png (source beside it) — per-seed grey dots (30 split+init draws) +
bootstrap-CI accent per prior; smoothing separates cleanly, the three PINN closures overlap. The CI
marks on it should be read as training-noise intervals on a single trajectory (bullet 1), not
as finite-data CIs on the effect.