Repository navigation
Hand any blocked agent to Captain during explore and freesail - #285
Conversation
BlockedError is the base for agents reporting they cannot go on. It carries a short message for the logs and a request for Captain: what the agent was asked, where it stopped, why, and what was already tried. - PlanningBlockedError now extends it. - Navigator throws NavigationBlockedError when it cannot reach a page. - Tester asks the judge whether the open page is where the test can start, and throws TestStartBlockedError when it is not. Captain.resolveBlocker() hands the request to Captain and checks the outcome. It remembers blockers it could not resolve so they are not handed over again. Explore and freesail route through it; the test command skips a blocked test. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
visit() and plan() on ExplorBot ask Captain when the Navigator or Planner reports a BlockedError, so commands no longer wire the handover. Tester asks the Captain it already holds when the judge says the open page is not where the test starts. Captain ignores blockers raised while it is already working. Navigator keeps a single failure reason for both the log message and the Captain request. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Tester no longer holds Captain. A start page the judge rejects throws TestStartBlockedError before the test starts; explore hands it to Captain and runs the test again, or skips it. The test command skips it. User interrupts during a running test reach Captain through a supervisor callback that ExplorBot injects into Tester. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
After signing in, Captain called plan() with the blocker text ("Signing
in with valid credentials...") as the focus, so the page was re-planned
around the sign-in step. While Captain resolves a PlanningBlockedError,
the plan tool uses that error's feature and style instead of the ones the
model passes. Outside a blocked re-plan the tool plans what Captain asks.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Explorbot Self-RegressionCommit
Time is the passing attempt (the last attempt if none passed). Change compares it with the median passing time of the last 1 runs; ±20% or more is flagged. Attempt details
Session analysis — basic (native): Session AnalysisIssue search by text works on the issues list: a matching term narrows the table and the URL carries the query. Creating an issue and empty-title rejection were not cleanly confirmed, because their form steps failed in automation, and the status filter and empty-search state passed only after failed steps. Coverage
What works
Execution Issues
Session analysis — slow (native): Session AnalysisCreating an issue from the toolbar saves it, and the new row shows the entered title, status, and priority in the issues list. Coverage is limited to this single creation flow. Coverage
What worksDefectsUX issuesExecution Issues
Session analysis — gated (native): Session AnalysisIssue creation from the Issues toolbar appears to save and show the new issue as a link in the table. The post-submit checks are weak, so the form-close and table results are not fully confirmed. Coverage
Execution Issues
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts: # CHANGELOG.md
Generalises the planner-to-Captain handover from #282 and #283. When an agent reports it can't go on, Captain gets the full situation and decides how to get past it, then the work continues.
Changes
BlockedError(src/utils/error-page.ts) is the base error for "an agent can't go on". It carries two texts:message: a short line for the logs.request: what Captain reads. It covers what the agent was asked to do, where it stopped and why, what it already tried, and what happens next.There are three kinds:
PlanningBlockedError: the planner can't plan the page.NavigationBlockedError: the Navigator can't reach a page. Its reason is the Navigator's singlelastFailureReason, and the request lists the last 5 commands it tried.TestStartBlockedError: the judge says the open page isn't where the test can start. The check runs only whenai.decisionModelis set, and only a confident "no" stops the test.Captain.resolveBlocker(error, resolved)gives the request to Captain, then runsresolvedto check the outcome and returns whether the blocker is gone. A blocker Captain failed on isn't handed over again. A blocker raised while Captain is already working is ignored, so Captain's ownnavigateandplan()calls never start a second Captain run.Who asks Captain:
ExplorBot.visit()asks when the Navigator is blocked. The check is whether the browser is now on the target page.ExplorBot.plan()asks when the Planner is blocked. The check is whether new tests appeared.TestStartBlockedErrorbefore the test starts.explorehands it to Captain and runs the test again if Captain resolves it, or skips the test if not. Thetestcommand skips it without Captain.setSupervisor), in place ofsetCaptain.exploreonly skips a page that stays blocked.The handover now applies wherever Explorbot opens a page, plans a page or starts a test, including
explore,freesail,testand TUI/navigate. In interactive runs the Navigator still asks the user before it gives up, so Captain is asked after the user.Testing
tests/unit/captain-blocked.test.tscovers:resolveBlocker: a resolved handover, not handing over again, and the guards.ExplorBot.visit()andplan(): each with the blocker resolved and not resolved.bunosh regression:gatedwith real AI on the first commit of this PR. It passed on attempt 2 of 3: 8 tests planned across 4 features, and 5 of 5 run tests passed. In both attempts Captain took over the blocked planning, signed in and re-planned. Attempt 1 failed only the scenario-coverage check: the planner covered 2 of the 3 required features. The latest commit moves that same handover intoExplorBot.plan(). It has not been re-run against real AI.🤖 Generated with Claude Code