Date: Jun 12, 2026. Protocol:
tasks/phase00_protocol.md (pre-registered before any run).
Chain: tasks/daily_log/Jun11_26/CHAIN_8.md
(task IDs T0–T9 decoded there; T8 = the user-released round-2 scope
decision referenced at the end of this report).
Runs (full inspection path — a pole-to-pole spiral around the target, 30 revolutions — simulation capped at 1800 s; matched knobs, no per-config tuning). Speed variants below are written in the fixed order nominal (0.90 m/s) / −2% (0.882) / +2% (0.918). “Arm” in this report always means the robot manipulator, never an experiment branch.
| Run | Plain language |
|---|---|
r0_6dof_path |
6-joint arm, orbit path drives the camera (the adopted Mission-1 architecture) |
r0_6dof_minus2pct / plus2pct |
same, cruise speed −2% / +2% |
r1_7dof_path |
7-joint arm, orbit path drives the camera |
r1_7dof_minus2pct / plus2pct |
same, speed −2% / +2% |
r2_7dof_reactive |
7-joint arm, no orbit path — reactive scorer picks targets |
r3_7dof_anchor |
7-joint arm, hybrid — path-scheduled COM-orbit vantage anchors the scorer |
Metrics (direction and gate/stretch for each; EE = end effector, the camera-carrying hand; twist = linear + angular velocity stacked, m/s with rad/s — hence “mixed units”):
| Metric | Meaning | Better | Gate / stretch |
|---|---|---|---|
| pe_p99 [m] | camera position error beaten 99% of the time | lower | GATE < 0.2; stretch < 0.1 |
| coverage | fraction of target surface inspected | higher | GATE ≥ 0.99; stretch 1.000 |
| completion [s] | when the full inspection orbit finished | lower | gate: completed |
| dwell total [s] | time the arm lingered near-singular (singular = a pose where the arm locks up, σ₆ → 0) | lower | — |
| throttled fraction | share of steps the vehicle slowed for poor arm conditioning | lower | — |
| stalled fraction | share of steps with zero forward inspection progress | lower | — |
| ze_p99 | camera pointing-axis error ‖z_e − z_e_des‖ (chord between unit vectors ≈ rad; 0.86 ≈ 51°) | lower | stretch < 0.001 |
| nu_jump_p99 | per-step EE twist change (smoothness witness; mixed units — compare across runs only) | lower | round-2: no >10% regression |
Headline numbers (full console tables:
generated_reports/GNC/phase00_round1_table.txt,
generated_reports/GNC/phase00_round1_with_probe_table.txt;
regen commands at the end):
| r0 nominal | r0 −2% | r0 +2% | r1 nominal | r1 −2% | r1 +2% | r2 | r3 | |
|---|---|---|---|---|---|---|---|---|
| gates | 3/3 | 3/3 | 3/3 | 2/3 | 2/3 | 2/3 | 2/3 | 2/3 |
| pe_p99 [m] | 0.1651 | 0.1703 | 0.1660 | 0.2294 | 0.2804 | 0.3092 | 0.5667 | 0.3531 |
| coverage | 0.9981 | 0.9989 | 0.9981 | 1.0000 | 1.0000 | 1.0000 | 1.0000 | 1.0000 |
| completion [s] | 1070.8 | 1100.2 | 1051.8 | 868.7 | 761.5 | 676.4 | 816.6 | 747.6 |
| dwell [s] | 631.5 | 655.2 | 614.1 | 430.9 | 231.0 | 3.27 | 299.6 | 185.1 |
| throttled | 0.644 | 0.649 | 0.639 | 0.553 | 0.343 | 0.006 | 0.409 | 0.281 |
| stalled | 0.1401 | 0.1486 | 0.1360 | 0.0148 | 0.0016 | 0.0000 | 0.0209 | 0.0031 |
| ze_p99 | 0.0549 | 0.0541 | 0.0559 | 0.8627 | 0.7006 | 0.2815 | 1.7905 | 1.4913 |
| nu_jump_p99 | 0.0594 | 0.0595 | 0.0593 | 0.0844 | 0.0735 | 0.0640 | 0.1021 | 0.1343 |
Rule: 1) gates passed (pe_p99 < 0.2, coverage ≥ 0.99, completed) 2) pe_p99 3) completion 4) dwell. Fragility rule: a winner that loses its gates under ±2% speed is FRAGILE → prefer a robust runner-up.
r0_6dof_path — and it is
ROBUST. The only configuration passing all three gates, and it
keeps all three at both ±2% speed variants (pe_p99 nominal/−2%/+2%:
0.1651 / 0.1703 / 0.1660; coverage ≥ 0.9981; completed in every run).
The fragility rule does not fire.r1_7dof_path fails the pe gate at
every speed (nominal/−2%/+2%: 0.2294 / 0.2804 / 0.3092) —
robustly failing, not marginally: no ±2% nudge rescues it.r3_7dof_anchor third by the rule;
r2_7dof_reactive last (pe_p99 0.567).Tie-break by ze_p99 was not needed.
Who wins what, stated symmetrically: r0 wins the gate discriminator (pe_p99) plus pointing (ze_p99 5–30× lower than every 7-DOF run) and command smoothness (nu_jump_p99 0.059 vs 0.064–0.134). The 7-DOF family wins coverage (1.000, the stretch target), completion (−19% at matched nominal speed, −37% at +2%), and every conditioning metric (dwell, throttled, stalled).
Provenance sanity (the fragility study’s E2 check
applied early: the nominal run should reproduce the adopted headline):
the r0 nominal-speed run reproduces the adopted Mission-1 numbers to
three digits on the gate metric — pe_p99 0.1651 vs the adopted 0.1654,
completion 1070.8 s vs 1064.5 s, coverage 0.9981 vs 0.9990. Residuals
are attributed (not isolated) to the 1800 s cap vs the adopted run’s
1100 s and the Phase 00 runner vs the Jun-10
c4_chain5_verdict script; bit-for-bit determinism holds
only for identical config + script, which this deliberately is not.
r0’s conditioning picture is structurally saturated — and
that is also why it is robust. Throttled ~64% of steps, dwell
~630 s, stalled ~14% — at every speed. This is the known pre-existing
reach/shoulder singular factor of the 6-DOF arm (singular factor = the
arm geometry, here shoulder near full reach, that drives σ₆ toward zero;
reference runs measured ~32% derated, and the adopted Mission-1 config
has run 0.64–0.80 throttled all along —
high_level_plans/decisions.md, CHAIN_5 entry). Saturation
means ±2% cannot meaningfully worsen a regime already pinned at its
conditioning floor. The cost of crawling: completion ~1071 s vs the
7-DOF’s 676–869 s.
r1’s gate failure is consistent with the velocity-lag
mechanism, with an honest gap. Prior art (decisions.md CHAIN_6
entry; trusted log logs/m7_on_s45_freeze.npz): 7-DOF
matched-pace runs at 0.45 m/s hit pe_p99 0.140, and the v_c sweep found
pe median scaling ~linearly with speed. Strict linear scaling
from 0.140 at 0.45 m/s predicts ~0.28 at 0.90 m/s; the observed 0.229 is
better than that, and the probe arms are non-monotone in
speed (−2% 0.2804 > nominal 0.2294 < +2% 0.3092) where
pure lag predicts monotone. So lag is the dominant term but not the
whole p99 story — event-driven contributions (dwell/aim transients) are
plausible and are handed to CHAIN_10’s peak analysis, not explained away
here. (r0 shows the same non-monotone ordering at only ~3% amplitude,
0.1651–0.1703; no replicate-pair noise band exists for these
schedule-confounded runs, so that swing is noted as unquantified rather
than excused. r1’s 35% swing is far outside any plausible band.)
The 7-DOF dwell cliff — the sharpest schedule-sensitivity
signature yet recorded, and it is NOT a clean monotone story.
r1’s dwell at nominal/−2%/+2%: 431 s / 231 s / 3.27 s.
A +2% timetable nudge all but eliminates near-singular dwell (throttled
0.6%, stalled exactly 0.0000, ze_p99 3× better at 0.2815) — consistent
in direction with CHAIN_6 P2 (slower = worse). But the −2% variant (231
s) is better than nominal (431 s), which CHAIN_6’s direction
does not predict: dwell is non-monotone in speed at this operating
point, peaking at nominal. Both facts go to CHAIN_10 as open questions
(tasks/daily_log/Jun12_26/chain10_kappa_forensics_design.md).
The 6-DOF, by contrast, is schedule-INSENSITIVE (dwell 614–655 s across
variants) because it sits on a saturated floor. Schedule sensitivity is
therefore a property of the 7-DOF’s marginal regime — the
timetable decides how closely commanded reach approaches the singular
manifold (the set of arm poses where the arm locks up), and the contrast
pair r1 nominal (431 s) vs r1 +2% (3.27 s) —
differing in ONE knob by 2% — is CHAIN_10’s primary specimen.
Pre-registered levers (protocol): L1 velocity-lag feedforward, L2 σ-gradient null-space pull (σ-gradient pull = steer the spare 7th-joint motion uphill in σ₆), L3 pointing smoothing retune, L4 kernel-freeze thaw policy.
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3 --orbit pose --suppress off --cap 1800 --npz logs/phase00/r0_6dof_path.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3 --orbit pose --suppress off --cap 1800 --speed 0.882 --npz logs/phase00/r0_6dof_minus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3 --orbit pose --suppress off --cap 1800 --speed 0.918 --npz logs/phase00/r0_6dof_plus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose --suppress on --cap 1800 --npz logs/phase00/r1_7dof_path.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose --suppress on --cap 1800 --speed 0.882 --npz logs/phase00/r1_7dof_minus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit pose --suppress on --cap 1800 --speed 0.918 --npz logs/phase00/r1_7dof_plus2pct.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit off --suppress on --cap 1800 --npz logs/phase00/r2_7dof_reactive.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_mission.py run --robot UR3_7 --orbit anchor --suppress on --cap 1800 --npz logs/phase00/r3_7dof_anchor.npz
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_scoreboard.py logs/phase00/r0_6dof_path.npz logs/phase00/r1_7dof_path.npz logs/phase00/r2_7dof_reactive.npz logs/phase00/r3_7dof_anchor.npz > generated_reports/GNC/phase00_round1_table.txt
/Users/antoniahoffman/miniforge3/envs/new-pin-env/bin/python validation/run_scoreboard.py logs/phase00/r0_6dof_path.npz logs/phase00/r0_6dof_minus2pct.npz logs/phase00/r0_6dof_plus2pct.npz logs/phase00/r1_7dof_path.npz logs/phase00/r1_7dof_minus2pct.npz logs/phase00/r1_7dof_plus2pct.npz logs/phase00/r2_7dof_reactive.npz logs/phase00/r3_7dof_anchor.npz > generated_reports/GNC/phase00_round1_with_probe_table.txt
npz files (~25–27 MB each) are NOT committed — provenance via the commands above (deterministic: same config + seed + script reproduces bit-for-bit).