Skip to content

domino turns: explore observability (evaluator verdicts, contacts) + fingertip-rule disclosure#81

Merged
yichao-liang merged 5 commits into
masterfrom
pr/turns-observability
Jul 19, 2026
Merged

domino turns: explore observability (evaluator verdicts, contacts) + fingertip-rule disclosure#81
yichao-liang merged 5 commits into
masterfrom
pr/turns-observability

Conversation

@yichao-liang

@yichao-liang yichao-liang commented Jul 19, 2026

Copy link
Copy Markdown
Collaborator

Part 6 of 6, landing the tip of domino-next. Base: #80.

Closes the two observability gaps that burned run_20260718_141716 (the agent's 20/20 explore trials reached the goal atoms while every submission scored solved=False, and nothing showed the arm's body - not the fingertip push - was driving the cascade), plus run-management buttons in the log viewer.

  • Evaluator verdicts on explore trials: sim.run(trials>=2, solved=True) scores each trial with the task evaluator (per-trial solved/reward, headline count, and a route-rejected hint when goal atoms held but the evaluator said no), gated on a pristine init via the same precondition gate refine(require_solved=True) shares.
  • Rollout contact recording: sim.run(contacts=True) reports per-step robot-link/object contact spans from a new opt-in PyBulletEnv recorder (raw ids + relevant-body filter in the hot path, name resolution at stop, static scenery dropped). A failing step reports num_actions=0 while the env genuinely stepped, so the last bucket absorbs uncounted events and a mismatch notice replaces silent blanking of exactly the step under diagnosis.
  • Fingertip-rule disclosure in the goal text: the certificate's counterfactual probe rejects arm-assisted layouts, but the rule was stated nowhere the solve agent could read it. CASCADE_VERIFICATION_NL is appended to every goal-text surface; per-submission probe verdicts stay harness-internal, so the agent knows the rule but still has to reason about each rejection.
  • log_viewer: per-run kill (PID-pinned, descendants included) and log-dir delete from the overview, POST-only and run_*-scoped.
  • Experiment config: seeds reset to 0-2 for the validation sweep below.

Results

With this stack, domino turn tasks are solved reliably: the last 9 runs (3 launches x seeds 0-2 of domino_turns_new_goal-agent_oracle_hybrid_sim_long_python) all solved their test task.

turn tasks

Log-viewer results table for the sweep (all runs done, test results 1/1, $2.26-$9.36 per run):

results table

All nine solves side by side (rows = seeds 0/1/2, columns = the three launches; clips hold their last frame until the longest finishes):

nine solves mosaic

Full-resolution videos (912x912, h264) are attached to the results-domino-turns-9of9-20260719 release:

launch 2026-07-18 23:47:38 launch 2026-07-18 23:47:50 launch 2026-07-19 09:33:47
seed 0 mp4 mp4 mp4
seed 1 mp4 mp4 mp4
seed 2 mp4 mp4 mp4

🤖 Generated with Claude Code

@yichao-liang
yichao-liang force-pushed the pr/session-capture-refine branch from 9f4b81f to 582443d Compare July 19, 2026 11:31
@yichao-liang
yichao-liang force-pushed the pr/turns-observability branch from 3c0e3ce to 139d313 Compare July 19, 2026 11:31
@yichao-liang
yichao-liang force-pushed the pr/session-capture-refine branch from 582443d to 5463518 Compare July 19, 2026 12:22
@yichao-liang
yichao-liang changed the base branch from pr/session-capture-refine to master July 19, 2026 12:34
Hovering a run row now offers a kill button (live runs) and a delete
button. POST /kill SIGTERMs only the PIDs attributed to that run via
the existing ps+lsof pinning, descendants included; POST /delete
removes the run's log dir and mirrored videos dir, pruning now-empty
parents, refusing live runs unless kill=1 (TERM, 5s grace, KILL).
Both endpoints are POST-only, same-origin, and run_*-scoped.
…ording

Two observability gaps burned run_20260718_141716 (seed2 domino_turns):
the agent's 20/20 explore trials reached the goal atoms while every
evaluate_option_plan submission scored solved=False, and nothing showed
that the arm's body - not the fingertip push - was driving the cascade.

- sim.run(trials>=2, solved=True) scores each trial with the task
  evaluator (per-trial solved/reward, headline count, route-rejected
  hint), gated on a pristine init via _require_solved_evaluator, the
  same precondition gate refine(require_solved=True) now shares.
- sim.run(contacts=True) reports per-step robot-link/object contact
  spans from a new opt-in PyBulletEnv recorder (raw ids in the hot path
  with a relevant-body filter, name resolution at stop, static scenery
  dropped). A failing step reports num_actions=0 while the env genuinely
  stepped, so the last bucket absorbs uncounted events and a notice
  flags the step-count mismatch instead of silently blanking exactly the
  step under diagnosis.
The certificate's counterfactual probe rejects arm-assisted layouts, but
the rule was stated nowhere the solve agent could read it: rejections
surfaced only as opaque solved=False verdicts, and run_20260718_141716
burned two 45-minute attempts theorizing about an "unknown evaluator
criterion". Append the disclosure (goal_text.CASCADE_VERIFICATION_NL) to
MIN_BLOCK/HEAVY_GOAL_NL and to the plain generator's evaluator-guarded
goal_nl, so every surface that prints the goal carries the rule. This
deliberately reverses the 2026-07-16 decision to keep the sentence out
of goal_nl; per-submission probe verdicts stay harness-internal. Every
shipped min-block/heavy task attaches a DominoEvaluator, so the
constants never advertise an unenforced rule. Goal-text digest change
regenerates min-block task caches (layouts and K* unaffected).
@yichao-liang
yichao-liang force-pushed the pr/turns-observability branch from 139d313 to dd75efa Compare July 19, 2026 12:34
@yichao-liang
yichao-liang merged commit 20c803f into master Jul 19, 2026
14 checks passed
@yichao-liang
yichao-liang deleted the pr/turns-observability branch July 19, 2026 12:47
yichao-liang added a commit that referenced this pull request Jul 19, 2026
…fingertip-rule disclosure (#81)

* log_viewer: per-run kill and log-dir delete from the overview

Hovering a run row now offers a kill button (live runs) and a delete
button. POST /kill SIGTERMs only the PIDs attributed to that run via
the existing ps+lsof pinning, descendants included; POST /delete
removes the run's log dir and mirrored videos dir, pruning now-empty
parents, refusing live runs unless kill=1 (TERM, 5s grace, KILL).
Both endpoints are POST-only, same-origin, and run_*-scoped.

* agent_sdk: evaluator verdicts on explore trials + rollout contact recording

Two observability gaps burned run_20260718_141716 (seed2 domino_turns):
the agent's 20/20 explore trials reached the goal atoms while every
evaluate_option_plan submission scored solved=False, and nothing showed
that the arm's body - not the fingertip push - was driving the cascade.

- sim.run(trials>=2, solved=True) scores each trial with the task
  evaluator (per-trial solved/reward, headline count, route-rejected
  hint), gated on a pristine init via _require_solved_evaluator, the
  same precondition gate refine(require_solved=True) now shares.
- sim.run(contacts=True) reports per-step robot-link/object contact
  spans from a new opt-in PyBulletEnv recorder (raw ids in the hot path
  with a relevant-body filter, name resolution at stop, static scenery
  dropped). A failing step reports num_actions=0 while the env genuinely
  stepped, so the last bucket absorbs uncounted events and a notice
  flags the step-count mismatch instead of silently blanking exactly the
  step under diagnosis.

* pybullet_domino: state the fingertip-verification rule in the goal text

The certificate's counterfactual probe rejects arm-assisted layouts, but
the rule was stated nowhere the solve agent could read it: rejections
surfaced only as opaque solved=False verdicts, and run_20260718_141716
burned two 45-minute attempts theorizing about an "unknown evaluator
criterion". Append the disclosure (goal_text.CASCADE_VERIFICATION_NL) to
MIN_BLOCK/HEAVY_GOAL_NL and to the plain generator's evaluator-guarded
goal_nl, so every surface that prints the goal carries the rule. This
deliberately reverses the 2026-07-16 decision to keep the sentence out
of goal_nl; per-submission probe verdicts stay harness-internal. Every
shipped min-block/heavy task attaches a DominoEvaluator, so the
constants never advertise an unenforced rule. Goal-text digest change
regenerates min-block task caches (layouts and K* unaffected).

* update common.yaml: reset START_SEED to 0 and NUM_SEEDS to 3

* lint: f-strings for the log-viewer row buttons
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