Bounded geometry diagnostics — 2026-10-06
This synthetic geometry diagnostic used a one-hour cumulative evaluation cap, up to 300 cases. This is development screening, not fresh calibration, independent validation or a production eligibility policy.
Complete: all 300 evaluations finished in 1,838.56 charged seconds (30m39s), with six "no fit" results, all retained. No new attempts are authorized by the unused time budget. review.json verifies the original source/environment/runner/input freeze, case identities, lossless compressed journal and recomputed scores.
None of the 25 geometries passes every intended contrast across all twelve truth/scenario/ crab-model evaluations. The exact 75-minute control passes all six dynamic-crab cases but none of its six wind-crab cases. Wind-crab fits lose the still-globe versus disc contrast: the control's worst retention margin is -0.31137, versus +0.08401 for dynamic crab. This does not establish that every possible schedule is infeasible.
Across the stress matrix and controls, dynamic/wind fits respectively have 133/130 rank-zero results, eight/thirteen rank-one results, six/four rank-two results and three/three no-fit results. All six failures are mixed-bias cases at latitude -65°, two poorly separated headings, 180 minutes, 270 m/s and no turns. No convergence failures were reported among the 294 returned fits. Rank stability alone does not establish contrast identifiability.
The saved-record audit and subsequent protocol comparison below examine the wind nuisance tangent/anchor assumptions and stress-cell rank loss. The restricted dynamic- crab proposal remains unrun and does not certify the wider nuisance-model set. This single-seed diagnostic supplies neither calibrated tail probabilities nor a real-flight geometry guarantee.
The prepared matrix supplies 24 synthetic cells spanning latitude, headings/separation, duration, speed and mount turns. Each is evaluated under three truths, two nuisance scenarios and dynamic/wind crab fits: 288 cases, plus 12 exact 75-minute protocol controls, 300 total. Controls run first, then the prepared cell order. All cases share fresh development seed 600500 for paired comparisons. A single seed cannot establish a geometry guarantee or calibrated power. The seven observed position tracks are outside this batch; replay integration is still pending.
Saved-record and tangent audit
audit.json, generated by audit_geometry.py, preserves the historical freeze and reports a new, separately identified analytic audit. No flight, optimizer or bootstrap runs are used by that audit. It found:
- Nuisance SVD rank depended on parameter units because weighted columns were not normalized. Independent column rescaling changed a fixture's science rank from one to two. Unit-column normalization fixes this, including extreme scales and zero columns; the gate cutoff is unchanged.
- Six-heading 60-minute fixtures give every leg exactly ten minutes, equal to the cruise minimum. Turn smoothing can disqualify intermediate legs: the +35° control retains only 25 bins and two of six headings even without watchdog exclusions. Qualifying dwell must exceed the minimum.
- All six no-fit records have
mount_slip_detected,magnetic_yaw_change_ambiguousandno_bins: watchdog selection removed every bin. Do not reinterpret them as optimizer failures or remove gates. - The 180-minute/six-heading/three-turn analytic fixture stays rank zero with all headings available; removing dynamic bias diagnostically restores rank two at all anchors. Slow signals can be absorbed by unpenalized 15-minute bias knots, so longer duration alone does not establish better design.
- All six exact-control wind cases change worst-anchor rank under a ±10% cutoff shift. Seven of 300 evaluations change worst-anchor rank overall. A subthreshold direction is discarded, making contrast retention discontinuous; new reports show pre-cutoff information alongside retained values.
- Wind Jacobians agree with finite differences at all three anchors. Removing crab, bias or forward nuisance directions can improve analytic information; these ablations do not justify relaxing gates.
Design anchors do not use fitted science coefficients or residual gyro weights, but the retained bins and measured forward/mount axes can still depend on gyro preprocessing. New reports state that conditioning explicitly. Analytic fixtures do not reconstruct historical Jacobians or prove the scaling defect caused the recorded wind failures. Historical results are not overwritten.
Two 90-minute proposals use 15-minute legs and six spaced mount turns. Both pass all three
anchors under both crab models in idealized tangent fixtures; the opposing/repeated-heading
candidate has worst retention margin +0.12936, versus +0.08558 for the other candidate. This
is candidate selection from development fixtures, not a real-flight guarantee. The
72-case paired simulator comparison completed
with fresh seeds and a new 15-minute/two-thread freeze: zero fit failures, 8m37s charged time,
and neither protocol passing every comparison. The revised protocol's IMU turn at minute 20
overlaps an aircraft turn; the causal effect remains untested. Source changed to
27e73b122c3a073357d4a03112da11779969a710bb3a6cc3eb06c333da52ad51;
the old restricted calibration proposal must be reviewed/refrozen before use.
Worker: geometry_campaign.py. It performs zero bootstrap replicates, retaining convergence, design-anchor SVD/contrast retention, free-fit rank/stability, watchdog exclusions and failure records. Geometry scores require all twelve evaluations before certification within this diagnostic: all intended contrasts estimable, then worst estimability margin, then worst contrast information. The separate rank-2/10% margin report uses the free-fit SVD, matching the existing operational stability gate. No threshold or significance claim is derived from the diagnostic model-test output.
Documented artifacts, created by the worker:
manifest.json: source, policy, numerical environment, runner/input hashes, case order and budget.records.jsonl,records.jsonl.gz: fsynced completed evaluations, including failures.budget.json: cumulative charged evaluation time and outstanding reservation.status.json,summary.json: atomic progress and worst-case geometry scores.review.json: completed-result counts, control comparison and archive/freeze verification.audit.json,protocol-comparison-plan.json: saved-record/analytic audit and prospective comparison input.launch.json,worker.log,run.lock: launch details, durable output and single-worker lock.case-input.json,case-output.json: temporary child request/result for the active case.recovery.jsonl: exact preserved bytes when repairing an incomplete final journal write.
Each case runs in a child process, bounded by the smaller of 300 seconds and the remaining authorized time. A 300-second timeout is a completed computational failure, never rerun for better acceptance. The final budget-limited incomplete case is not counted as completed. The parent stops and terminates the child at the deadline; termination/IO cleanup can add a few seconds. Reservations are persisted before execution and settled after journal fsync. An abrupt crash conservatively charges the entire reserved slice (at most five minutes), so resuming cannot silently refill the budget. Pauses between workers do not consume time. Source/environment/input/runner changes prevent resume and are checked between every case. Missing original journals require recovery, not restarting from an empty campaign.
The default for future work is up to two total compute threads. This completed batch retains its frozen one-thread environment. New two-thread campaigns need a new environment manifest and timing measurement; calibration and validation must use the same freeze.
Launch outside the per-command sandbox to survive disconnections:
env OPENBLAS_NUM_THREADS=1 OMP_NUM_THREADS=1 MKL_NUM_THREADS=1 /home/sweisman/venv/bin/python analysis/tests/geometry_campaign.py --wall-time-minutes 60 --detach
This batch is complete; do not launch or resume it. The following describes recovery of an
interrupted batch, not permission to restart these completed cases.
On interruption, inspect status.json and the actual outside-sandbox PID first. Resume the
same command with --resume, preserving the original cap; successes and failures are skipped.
budget_exhausted needs a new explicit budget and reviewed new campaign, not an automatic
larger cap on the existing freeze. Neither completed 1,000-attempt pilot may be resumed.
After completion, review every cell across both nuisance models, retain failed/weak cells,
update the next-stage readiness and handoff, and refreeze any revised scientific domain
before estimating the calibration campaign's cost.