pybullet_domino+code_sim_learning: heavy-turn tasks at true friction, robust rollout objective, block type (sysID stack 6/8) - #101
Merged
Conversation
…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.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
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