Skip to content

pybullet_domino+code_sim_learning: heavy-turn tasks at true friction, robust rollout objective, block type (sysID stack 6/8) - #101

Merged
yichao-liang merged 8 commits into
masterfrom
sysid-06-heavy-tasks
Jul 30, 2026
Merged

pybullet_domino+code_sim_learning: heavy-turn tasks at true friction, robust rollout objective, block type (sysID stack 6/8)#101
yichao-liang merged 8 commits into
masterfrom
sysid-06-heavy-tasks

Conversation

@yichao-liang

Copy link
Copy Markdown
Collaborator

Sixth of eight PRs landing the domino-sysid branch on master in sequence (after #96, #97, #98, #99, #100). Tree is identical to the corresponding slice of that branch rebased onto current master.

This chunk

  • pybullet_domino: heavy tasks ready at true friction 0.5 - easier turns, off-line gray
  • docs: sysID pipeline diagram with observed failure modes + stage-1 remedies
  • code_sim_learning: disagreement-hull margin sweep + INCONSISTENT rework + fit-data persistence
  • code_sim_learning: Huber-capped residuals + summary-statistic terms in the rollout objective
  • docs: sysID pipeline slide deck + measured landscape figure
  • pybullet_domino: gray blocks become their own agent-facing 'block' type with a block_* physical-param family
  • pybullet_domino: noise-robust displaced-corner detour certification for heavy turn tasks
  • docs: heavy-task examples figure uses the noise-robust probes

The heavy-block task family tuned for true lateral friction 0.5 (displaced-corner dogleg turns, noise-gated certification, strict k_true>k_bel tie gate), the robustness rework of the rollout sysID objective (Huber-capped residuals, endpoint/onset summary terms, disagreement-hull margin sweep, INCONSISTENT-verdict handling with fit-data persistence), a dedicated agent-facing 'block' type with its own physical-param family for the gray blocks, and the pipeline docs.

🤖 Generated with Claude Code

…s, off-line gray

Turn variant: legs sample new shortened heavy bands (entry 0.22-0.28,
exit 0.16-0.22) and the detour certificate now demands one blue of
slack (scan budget capped at num_blues - 1), so no exact-budget tasks
ship. Straight variant: the gray samples a 0.02-0.03 signed lateral
offset off the start-target line - the believed lure becomes a shallow
dogleg through it and the true swerve is gentler on the far side; the
dogleg/swerve probe memo keys gain the gray's signed perpendicular
offset (lengths alone alias off-line grays at second order while the
bend angle changes at first order).

Figure script un-bit-rotted (renamed _believed_physics contextmanager,
drop the stale domino_true_friction 0.1 pin so it matches launches) and
the figure regenerated at 0.5: both turn detours 3 blues, shallower
straight swerves, every believed lure still dies at the gray. The
domino_heavy env entry is parked per the all.yaml convention and the
new exp_domino_heavy.yaml launcher un-skips it with
agent_oracle_hybrid_sim; launch task caches prewarmed for seeds 0-2.
…medies

Four lanes (data, fit orchestration, uncertainty, consumers) with the
implementing modules, red badges for the failure modes observed in
run_20260724_232411 (chaotic per-step SSE, consistency-drop, sigma
floor, INCONSISTENT disarming the margin gate), and the planned
remedies in the legend. Matplotlib script checked in for regeneration.
…rk + fit-data persistence

Stage 1 of the sysID honesty work, driven by run_20260724_232411
(true lateral_friction 0.5; seed1 shipped 1.0358, seed2 0.3236 then
0.6267, both 0/1 while seed0's 0.5033 solved 1/1 - estimator variance,
not data content: offline re-execution of the same explore plans
recovers ~0.5 under the current objective).

- Hull sweep: the consistency loop still drops disagreeing segments
  for the POINT estimate (anchoring on the cleanest data is
  evidence-backed), but now records the pre-drop joint fit and the
  dropped segment's own-best grid values (min_explainable_fits) as
  candidate_values on the report; physics_sigma_points sweeps the
  union of the +-1 sigma band and that hull. Seed1's hull
  [~0.27, 1.04] contains the truth; an inflated sigma centered on the
  survivors' fit ([0.533, 2.013]) does not.
- INCONSISTENT no longer disarms the margin gate: the param stays
  swept across both incompatible fits (seed2's [0.3236, 0.6267]
  contained 0.5 while the gate ran with no margin check at all).
- Hold reference fixed: 'holding the currently-applied value' held
  the very fit it refused (the agent's in-session sim.fit had already
  applied it); the hold now references the last cycle-level applied
  snapshot. A rejected fit waits as pending and is accepted when an
  independent cycle refits within the consistency band, so a real
  jump converges instead of flagging forever.
- Data-health canary: a warning when candidate fits span far beyond
  posterior_std, plus explorer diagnostics and sim.fit report lines
  rendering the hull.
- Fit-data persistence (code_sim_learning_persist_fit_data): raw fit
  trajectories pickled to <log_dir>/fit_data/ per cycle-level fit, so
  the next wrong fit can be replayed offline instead of approximately
  re-executed.
…n the rollout objective

Stage 1b of the sysID honesty work. Per-step SSE through contact is
chaotic in theta: a replay can diverge qualitatively at one grid
candidate and not its neighbors (measured on a recorded topple at true
friction 0.5: SSE 248.7 at theta 0.4746 vs 0.0025 at 0.4743, the spike
a diverged replay sliding 0.22 m vs the recorded 0.09 m), and one such
spike steers the grid fit into a wrong basin.

- Each residual is Huber-capped via a residual transform
  (r' with r'^2 == huber(r)), so SSE, the LM least-squares vector, and
  every RMS threshold share one robust objective
  (code_sim_learning_rollout_huber_delta, 0 disables).
- Per-segment SUMMARY residuals appended with
  code_sim_learning_rollout_summary_weight: the settled endpoint
  features (the rest poses plans actually depend on) and per-object
  motion-onset steps (event timing is smooth in the physical params
  where mid-flight paths are chaos). Offline A/B on the re-executed
  run_20260724_232411 explore episodes: summary terms separate the
  true friction from the neighboring grid point ~21x vs ~1.25x for
  per-step SSE.

Both objectives flow through SysIdConfig; config threads through the
public rollout-objective functions.
Reveal.js deck (docs/sysid/sysid_pipeline_slides.html, same scaffold as
the existing decks) walking the full pipeline: inputs and the
no-velocities constraint, trajectory prep, the free-running objective
and why per-step SSE is treacherous (measured chaos spikes), the new
Huber + summary-statistic objective, grid/LM search, the consistency
loop and disagreement hull, uncertainty verdicts, cross-cycle
pending-confirmation, the consumers (hull margin sweep, capture gate,
explorer), the run_20260724_232411 case study with counterfactuals,
honest limits, and the stage-2 roadmap. New sysid_landscapes.png
(checked-in script, data hardcoded with provenance) shows which
recordings identify friction and which are flat or chaos-spiked.
…pe with a block_* physical-param family

The heavy gray blocks of heavy-block tasks are minted as a distinct
'block'-typed object (same feature layout and body pool; typed options
structurally exclude them), and the physical-param registry exposes
block_mass + block_lateral_friction for that class only - deliberately
neutral names, since whether the gray bodies differ physically from
dominoes is exactly what a learning agent must discover. Renames the
heavy_block_mass override to block_mass everywhere and rewords
agent-facing texts from 'heavy blocks' to 'gray blocks' so no surface
leaks the mass hint.
…or heavy turn tasks

Heavy-turn generation now certifies with placement-noise-robust probes
end to end: the true-detour K* comes from the new displaced-corner
dogleg family (heavy_detour_k_star_robust; corner offsets calibrated by
the 2026-07-25 noise probe), both the detour layouts and the believed
gray-corner lure must survive 5 mm / 0.02 rad blue-pose scatter, and
the robust detour must be STRICTLY dearer than the lure (k_true > k_bel
drop) so a block-minimizing believed planner cannot tie-break away from
the gray and solve with no learning. Heavy-turn leg bands move to the
verified 0.26-0.29 x 0.17-0.20 window from the canonical-anchor design
grid; nominal-only certification accepted knife-edge layouts the real
Place scatter cannot build (2026-07-25 runs: 0/3 turn seeds solved).
The figure's detour and believed-lure searches now run the same
noise-robust bar as generation (displaced-corner dogleg family +
placement-scatter replays), so the rendered solutions are ones the arm
can actually build instead of knife-edge layouts that visually fake a
cost tie; block-typed grays are picked up alongside dominoes.
@yichao-liang
yichao-liang merged commit f9269b5 into master Jul 30, 2026
14 checks passed
@yichao-liang
yichao-liang deleted the sysid-06-heavy-tasks branch July 30, 2026 09:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant