Criteria: tasks/chain13_l3_criteria.md. Metrics =
run_mission.analyze. r0 @ rs0.40, suppress off. OFF = the
rs-0.40 incumbent (r0_reach040.npz), axis defaults
time_scale 0.2 / rate_max 0.25. Adoption = user’s call.
Knobs --axis_ts / --axis_rate (LOAD-time
overrides, default-OFF byte-identical; canary-verified to land on
goal.axis.alpha / goal.axis.rate_max).
The first hypothesis (broadband ze = aim-axis low-pass lag → lower time_scale) barely moved the metric and worsened pe. Apples-to-apples are the cap-200 arms (the OFF ref row is the cap-1800 helix).
| axis_ts | ze_p99 | nu_jump_p99 | pe_p99 |
|---|---|---|---|
| 0.2 (OFF, 200s) | 0.0530 | 0.0588 | 0.1670 |
| 0.1 | 0.0526 | 0.0589 | 0.1684 |
| 0.05 | 0.0523 | 0.0590 | 0.1693 |
| 0.02 | 0.0521 | 0.0592 | 0.1698 |
ze_p99 −1.7% across a 10× knob swing, pe_p99 worse +1.7%. Gate (“ze↓ AND pe not worse”) FAILS. Finding: the broadband pointing error is not a low-pass-lag artifact (steady lag ≈ τ·ω; if speeding the filter 10× barely moves ze, ω is slow enough that filter lag was never the dominant source).
On l3_ts002.npz: aim-axis per-step slew median 0.0056,
p99 = 0.0075 = the cap exactly, 5.7% of steps
pinned at the cap (cap = rate_max·dt = 0.25·0.03). So the
ze_p99 tail is rate-limited, not
filter-limited — time_scale can’t touch the binding steps. Per
the criteria’s reserved-knob rule, rate_max comes into
scope.
time_scale held at 0.2 (OFF); only the slew cap varied.
| rate_max | ze_p99 | nu_jump_p99 | pe_p99 |
|---|---|---|---|
| 0.25 (OFF) | 0.0530 | 0.0588 | 0.1670 |
| 0.5 | 0.0509 | 0.0588 | 0.1640 |
| 1.0 | 0.0311 (−41%) | 0.0423 (−28%) | 0.1235 (−26%) |
| 2.0 | 0.0429 | 0.0559 | 0.1208 |
rate_max 1.0 improves all three at once (ze, smoothness, position) — not a trade. 2.0 over-shoots the knee (ze/nu_jump tick back up). Gate PASSES decisively at 200 s.
Mechanism: the 0.25 cap was over-constraining — binding 5.7% of steps forced the desired pointing axis to lag the target on fast-slew moments; the controller then chased a persistently-behind reference, injecting error into ze, pe AND nu (the EE twist works harder to catch up). Loosening to ~1.0 lets the reference track faithfully → the whole tracking problem eases. Classic over-damping: a smoothing limit so tight it manufactured the roughness it was meant to prevent (Chiaverini’s “hard limits make their own transients”, study §3.4, on the output-smoothing side).
Full helix (cap 1800, rs 0.40, suppress off). OFF =
r0_reach040.
| arm | ze_p99 | pe_p99 | nu_jump | coverage | t_complete | derate | sj_med |
|---|---|---|---|---|---|---|---|
| OFF rm0.25 nom | 0.0495 | 0.1586 | 0.0576 | 0.9978 | 762.6 | 0.637 | 0.0229 |
| OFF rm0.25 −2% | 0.0492 | 0.1581 | 0.0576 | 0.9969 | 775.9 | 0.619 | — |
| OFF rm0.25 +2% | 0.0495 | 0.1586 | 0.0577 | 0.9976 | 753.5 | 0.685 | — |
| ON rm1.0 nom | 0.0398 | 0.1185 | 0.0406 | 1.0000 | 904.8 | 0.971 | 0.0187 |
| ON rm1.0 −2% | 0.0394 | 0.1193 | 0.0402 | 0.9999 | 921.4 | 0.972 | — |
| ON rm1.0 +2% | 0.0402 | 0.1179 | 0.0409 | 0.9999 | 892.5 | 0.975 | — |
| ON rm1.5 nom | 0.0398 | 0.1160 | 0.0401 | 1.0000 | 918.8 | 0.984 | 0.0187 |
Tracking improves ~20–29% and holds under ±2% — but it’s a CRAWL CONFOUND. derate jumps 0.637→0.971, t_complete +19% (762.6→904.8 s), and sj_med (median conditioning) drops 0.0229→0.0187 — the arm genuinely sits nearer the singular wall. pe_med improves 15% while the mission slows 19%: the tracking gain is commensurate with the slowdown (slower vehicle settles better per pose). The sj_med drop is the independent tell — it is NOT a speed artifact; conditioning actually worsened.
Mechanism: the aim-axis slew cap is an implicit singularity guard. Capping aim-axis slew kept the arm out of extension; loosening it (rate_max 1.0) let the arm chase aggressive re-aims into near-singular postures → derate throttles → vehicle crawls → tracking looks better. For a singularity chain this is backwards: it trades the core objective (conditioning margin) for confounded tracking.
Provenance (honest): by the LETTER of the pre-registered bars (ze↓, pe≤0.1586, cov≥0.99, completed, nu_jump≤OFF) rate_max 1.0 PASSES — because the bars guarded tracking but NOT derate/completion. That is an incomplete-criteria lesson, recorded as such; NOT back-fitted to reject. Both the letter-pass and the unregistered derate/completion regression are reported; adoption is the user’s call.
Recommendation: DO NOT ADOPT rate_max 1.0 (or 1.5 — same trade, slightly worse derate 0.984). The slew cap stays at 0.25. Two morning follow-ups if the user wants them: (1) adversarially confirm the crawl confound by a matched-completion-time comparison; (2) if better pointing is wanted without the conditioning cost, the lever is elsewhere (controller pointing authority, not output smoothing) — which echoes the Stage-1 finding that broadband ze is not a smoothing artifact.