Husky: repair the seven split-surface failures

OmniLink · 29 October 2026 · Reference-model simulation

93 valid episodes: {'FAIL': 34, 'PASS': 59}. Seven formerly failing inputs repaired under the original task requirements. 11/12 new-input candidate episodes pass; 1 candidate failures remain in this complete protocol. Counts describe constructed tests, not field reliability.

Remaining limit

In case-092, approach speed reaches 0.420247 m/s against the fixed 0.420000 m/s upper bound during the last 0.3 s before the trigger. Path, endpoint, heading and stopped-state checks pass, but the whole episode remains FAIL. Neither the threshold nor the frozen controller was changed after seeing this result.

What changed, and why

The previous wheel mixer surrendered longitudinal authority when yaw correction saturated. The reference repair independently bounds wheel commands, pre-aligns using the known surface map, shapes the approach and turn, lowers the post-trigger turn target to 0.18 m/s, and requires a stopped endpoint before reporting completion. It uses wheel commands only. Pre-alignment changes pose and heading at the turn trigger; both variants start from the same spawn and are judged against the same specified arc. Both variants have the same nominal 0.35 m/s cap, motor limits, physical robot, friction patches, payload, target arc, 24-second observation and pass thresholds. This is a combined reference-controller and mapped-route repair; it assumes localization and a known surface boundary. It is not validated OEM firmware or a friction estimator.

Complete measured approach and turnSeven matched before and after verdicts

Prospective inputs and regressions

Four new low-side coefficients (.025/.065/.14/.30) crossed with three new payloads (2.5/7.5/17.5 kg), both variants: 24 episodes. Inputs and source were frozen before qualification and unopened until repair, confirmations and regressions finished. No tuning uses these results. The study also reruns every unique previously passing capped condition, including braking, crossing, uniform floors and a right turn. The repair activates only for left-turn split surfaces; all other conditions retain the previous driver.

Every new-input result

Stage counts: {'repair': 14, 'confirmation': 28, 'regression': 27, 'holdout': 24}. All seven matched pairs have identical compiled physical-model hashes. Each endpoint is repeated twice in fresh engines. Check the ledger and plan for exact inputs and source hashes.

Unchanged requirements, with a stronger approach check

Turning: qualified last 0.3 s approach (80–120% of selected speed); 90° arc within 0.30 m, final position within 0.25 m, heading within 0.15 rad, completed task and stopped final second at ≤0.025 m/s. Added approach lateral corridor: ≤0.30 m before the trigger, applied to both variants. Stability: tilt ≤0.5 rad and root height ≥0.12 m. No deadline or threshold was relaxed. Braking regression inputs retain their original 0.25 m excursion and 2 s settling requirements. The offline verifier recomputes verdicts from physical poses.

The speed cap is nominal, not a hard measured-speed ceiling. Maximum observed speed over candidate episodes is 0.756 m/s. Full peak-speed metrics and trajectories are supplied, including approach transients. No braking delay, pose/velocity writes, external forces or physics changes.

Physical scope and limitations

Rigid contact patches with imposed coefficients, not calibrated materials, water, mud or deformable soil. Compiled friction, geometry and payload mass are checked. Loads are fixtures, not rated payload capacities. Newton 1.5.0 / MuJoCo 3.11 CPU, 16 ms observations and eight configured substeps, machine 9722d23d12a3. Independent-PC and physical-robot validation remain unverified. No safety certification.

Evidence and reruns

All specifications and metrics · CSV · Full evidence and independent offline verifier · Public OmniSim source add-on · Public reference-source compatibility · Original 76-episode braking and turning study.

Extract evidence.zip and run python verify.py. The source add-on includes all 14 repair endpoints and the entire frozen suite. Reruns start new physics engines; these are not saved-state replay. Different runtime versions are new measurements. The $100 module has this fixed scope; custom OEM integration, additional optimization and hardware correlation are scoped separately.

All 93 episodes

CaseStageReferenceTask/surfaceμkgDriverVerdictReason
case-000repaircase-037turn/split0.040legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-001repaircase-037turn/split0.040traction-routePASS
case-002repaircase-039turn/split0.10legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-003repaircase-039turn/split0.10traction-routePASS
case-004repaircase-041turn/split0.20legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-005repaircase-041turn/split0.20traction-routePASS
case-006repaircase-043turn/split0.0410legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-007repaircase-043turn/split0.0410traction-routePASS
case-008repaircase-045turn/split0.110legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-009repaircase-045turn/split0.110traction-routePASS
case-010repaircase-047turn/split0.210legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-011repaircase-047turn/split0.210traction-routePASS
case-012repaircase-071turn/split0.125legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-013repaircase-071turn/split0.125traction-routePASS
case-014confirmationcase-000turn/split0.040legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-015confirmationcase-000turn/split0.040legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-016confirmationcase-001turn/split0.040traction-routePASS
case-017confirmationcase-001turn/split0.040traction-routePASS
case-018confirmationcase-002turn/split0.10legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-019confirmationcase-002turn/split0.10legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-020confirmationcase-003turn/split0.10traction-routePASS
case-021confirmationcase-003turn/split0.10traction-routePASS
case-022confirmationcase-004turn/split0.20legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-023confirmationcase-004turn/split0.20legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-024confirmationcase-005turn/split0.20traction-routePASS
case-025confirmationcase-005turn/split0.20traction-routePASS
case-026confirmationcase-006turn/split0.0410legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-027confirmationcase-006turn/split0.0410legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-028confirmationcase-007turn/split0.0410traction-routePASS
case-029confirmationcase-007turn/split0.0410traction-routePASS
case-030confirmationcase-008turn/split0.110legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-031confirmationcase-008turn/split0.110legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-032confirmationcase-009turn/split0.110traction-routePASS
case-033confirmationcase-009turn/split0.110traction-routePASS
case-034confirmationcase-010turn/split0.210legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-035confirmationcase-010turn/split0.210legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-036confirmationcase-011turn/split0.210traction-routePASS
case-037confirmationcase-011turn/split0.210traction-routePASS
case-038confirmationcase-012turn/split0.125legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-039confirmationcase-012turn/split0.125legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-040confirmationcase-013turn/split0.125traction-routePASS
case-041confirmationcase-013turn/split0.125traction-routePASS
case-042regressioncase-001brake/crossing0.040traction-routePASS
case-043regressioncase-003brake/crossing0.10traction-routePASS
case-044regressioncase-005brake/crossing0.20traction-routePASS
case-045regressioncase-007brake/crossing0.0410traction-routePASS
case-046regressioncase-009brake/crossing0.110traction-routePASS
case-047regressioncase-011brake/crossing0.210traction-routePASS
case-048regressioncase-013brake/split0.040traction-routePASS
case-049regressioncase-015brake/split0.10traction-routePASS
case-050regressioncase-017brake/split0.20traction-routePASS
case-051regressioncase-019brake/split0.0410traction-routePASS
case-052regressioncase-021brake/split0.110traction-routePASS
case-053regressioncase-023brake/split0.210traction-routePASS
case-054regressioncase-025turn/crossing0.040traction-routePASS
case-055regressioncase-027turn/crossing0.10traction-routePASS
case-056regressioncase-029turn/crossing0.20traction-routePASS
case-057regressioncase-031turn/crossing0.0410traction-routePASS
case-058regressioncase-033turn/crossing0.110traction-routePASS
case-059regressioncase-035turn/crossing0.210traction-routePASS
case-060regressioncase-049brake/uniform-high0.040traction-routePASS
case-061regressioncase-051brake/uniform-low0.040traction-routePASS
case-062regressioncase-053turn/uniform-high0.040traction-routePASS
case-063regressioncase-055turn/uniform-low0.040traction-routePASS
case-064regressioncase-065brake/crossing0.065traction-routePASS
case-065regressioncase-067turn/crossing0.065traction-routePASS
case-066regressioncase-069brake/split0.125traction-routePASS
case-067regressioncase-073brake/crossing0.1515traction-routePASS
case-068regressioncase-075turn/crossing0.1515traction-routePASS
case-069holdout—turn/split0.0252.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-070holdout—turn/split0.0252.5traction-routePASS
case-071holdout—turn/split0.0257.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-072holdout—turn/split0.0257.5traction-routePASS
case-073holdout—turn/split0.02517.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-074holdout—turn/split0.02517.5traction-routePASS
case-075holdout—turn/split0.0652.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-076holdout—turn/split0.0652.5traction-routePASS
case-077holdout—turn/split0.0657.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-078holdout—turn/split0.0657.5traction-routePASS
case-079holdout—turn/split0.06517.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-080holdout—turn/split0.06517.5traction-routePASS
case-081holdout—turn/split0.142.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-082holdout—turn/split0.142.5traction-routePASS
case-083holdout—turn/split0.147.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-084holdout—turn/split0.147.5traction-routePASS
case-085holdout—turn/split0.1417.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-086holdout—turn/split0.1417.5traction-routePASS
case-087holdout—turn/split0.32.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-088holdout—turn/split0.32.5traction-routePASS
case-089holdout—turn/split0.37.5legacyFAILturn_not_completed, turn_corridor_exceeded, turn_goal_error_exceeded, turn_heading_error_exceeded
case-090holdout—turn/split0.37.5traction-routePASS
case-091holdout—turn/split0.317.5legacyFAILturn_corridor_exceeded, turn_goal_error_exceeded
case-092holdout—turn/split0.317.5traction-routeFAILapproach_speed_not_qualified