Jun 10, 2026 · branch base-wobble · verdict
commit ac1e3dd · figure
generated_reports/GNC/c4_chain5_verdict_Jun10.png
Headline: area coverage 0.9990 AND p_e p99 0.1654 m in ONE
configuration, at orbit-progress completion (t = 1064.5 s).
This is the first configuration to pass both mission gates (coverage ≥
0.99, p_e p99 < 0.2) simultaneously — the reactive scorer gave 0.998
/ 0.404, the original orbit-path gave 0.168 / 0.822. The winning
configuration: orbit-synced EE aim driven by achieved orbit
progress, camera aiming from t = 0 (through
the startup window), arm joints clipped to an engineered
envelope, and a full-arm posture pull toward q0 during
INITIAL. Chain records:
daily_log/Jun10_26/CHAIN_{3,4,5}.md; decision log:
high_level_plans/decisions.md.
pin.integrate) ran unconstrained. Now fixed by simple
clipping (CC_Controller._enforce_arm_joint_limits, gated).
Caveat: clipping is an inelastic stop, not contact dynamics; the
NLOPT/capsule paradigm remains the high-fidelity successor.ur3_box_limited_with_capsules.xml carries task-restricted
values from its source (asymmetric, e.g. wrist_1 [−3.665, 0.524]) — the
real UR3 is ±360°/joint. The nominal GNC exceeded them constantly
(wrist_1 out-of-range 75% of path-mode steps; reactive shoulder 39–42%).
Replaced by a data-derived engineered envelope
(healthy-regime support ± 0.15 rad, ∩ ±2π, singularity fences) —
defensible as a software joint envelope, but the thesis should
state the provenance plainly.CHAIN_3 — progress-synced aim (commits 804bf9b…627dce8,
ee02a64): - GNC/guidance/orbit_path.py —
apply_aim_override hook (unused; detour-planner era). -
GNC/guidance/ee_guidance.py — orbit_path_pose
evaluates at _current_progress() · sample_spacing when
orbit_path.progress_sync (the open-loop
step·dt·v_des clock skipped the 90 s startup band and
outran the derated COM by up to 118 m — the entire 0.822 coverage story;
appendage-standoff was a correlate, not a mechanism). -
GNC/breve_controller.py — coverage-marking gate relaxed
during INITIAL (path mode). -
GNC/guidance/detour_planner.py — visibility predictor (the
offline coverage oracle; its calibration falsified the detour premise
and survives as reusable infrastructure).
CHAIN_4 — aim during INITIAL (commits 8f43e6e, 8eadd39,
a053f46, 62c4a2e): - GNC/guidance/ee_guidance.py —
aim_during_initial knob; the INITIAL aim branch in
set_ee_target (step ≥ 1; step 0 seeds the pose filter at
the true EE pose → t = 0 continuity with NO new blend code — the
existing filter caps do the slew); orbit_path_pose(mode=…)
kwarg + kinematic R_prev fallback; mark_during_initial
retied to “mark iff aiming”.
CHAIN_5 — joint limits + posture (commits 804bcef, cccb283,
82f96f7, ac1e3dd): - GNC/com_controller.py —
_enforce_arm_joint_limits (clip + outward-velocity zeroing)
called after pin.integrate, knob
constraints.arm.joint_limits.enforce;
_resolve_arm_joint_limits (config lower/upper override with
fail-loud validation, model-tail fallback). One real bug found
post-commit and fixed: st.v is a column in the Breve loop —
stub-TDD had assumed flat. - GNC/breve_controller.py —
posture.initial_full_arm: lifts the joint6-only mask during
INITIAL (full-arm pull toward q_arm_ref = q0) with
initial_gain_scale. -
YAMLs_by_domain/parameters.yaml — the engineered envelope
(joint_limits.lower/upper): elbow [−2.891, −0.250] (sinθ₃
fences δ = 0.25; trades 19% of unconstrained excursions), pan exempt
(±1e6, winding), wrist_3 widened to ±π (no singularity role).
Validation infrastructure added (validation/):
test_progress_sync.py, test_initial_aim.py,
test_joint_limits.py (16 unit tests total),
detour_predict_calibration.py (offline oracle),
d1_marking_instrumented.py,
d2_full_helix_setdiff.py, d3_branch_probe.py
(diagnostics), p2_progress_sync_diag.py,
g1_progress_sync_verdict.py,
k1_initial_aim_predict.py,
k3_initial_aim_stability.py,
c3a_clip_census.py, c3b_lockin_retest.py,
c3c_envelope_derivation.py,
c4_chain5_verdict.py, wobble_pe_correlation.py
(CHAIN_2 gate).
YAMLs_by_domain/parameters.yaml:
camera_guidance.trajectory.orbit_path.enable: true,
orbit_path.progress_sync: true,
orbit_path.aim_during_initial: true,
constraints.arm.joint_limits.enforce: true,
controller.base.posture.initial_full_arm: true, and
simulation.time.duration: 1100 (the mission completes orbit
progress at ~1064.5 s; runs should be sized by progress-to-completion,
not wall time). The five pinned baselines were deliberately
re-pinned at the adopted defaults. Historical note:
pre-adoption reference numbers (0.404/0.168/0.822/0.874 etc.) were
measured under the old defaults; the verdict scripts that set their own
knobs remain reproducible.
tasks/daily_log/{Jun08,Jun09,Jun10}_26/* duplicate the
canonical root daily_log/;
daily_log/Jun09_26 copy/ should fold into
daily_log/Jun09_26/ (deferred twice, awaiting your OK to
delete).