Repository navigation
Why
This release comes from running the engine on real tickets: the engine agents now work inside hard boundaries and hand back reports the engine can read, the shell guards stop tripping on harmless commands while catching wrapped installs, and acceptance testing gets a stale-base preflight, a configurable setup step and a skip option. On Claude Code, the map panel learns about paused tickets, pending UAT, per-map counts and the whiteboard.
Added
- Dashboard view in the map panel (#264). A
Whiteboardrow above the maps list, with itsN open / Mcounts (name-only when they cannot be read), shows the repo index in place of a map: a link to the pinnedtrailhead:dashboardissue, every open map (a click opens it) and the whiteboard's open tickets as Frontier / In progress / Blocked with aworkbutton per frontier ticket.mapgoes back, the mode survives/clear, and the old headerdashboardbutton is gone. - Open and total counts per map in the panel (#260). The maps list shows
N open / Mnext to every map, read in one GraphQL call, and the whiteboard heading readsWhiteboard · N open · M assigned. A failed counts read falls back to names only, never an error. trailhead:uatlabel and a UAT group in the panel (#261). Pending UAT follow-ups carry the newtrailhead:uatmarker label (a marker, never a frontier filter) and show in the panel as their own UAT group with atests <parent> #<n>line and aworkbutton. A newtemplates/trailhead-uat-backfill.jstags existing follow-ups that have aUAT of:line, at first-use setup and once per clone at work-start.- Paused group and "this session" mark in the panel (#259).
/trailhead:pausenow adds atrailhead:pausedlabel,/trailhead:resumeor a new claim removes it, and the panel lists such tickets underPaused · nwith noworkbutton. The ticket your own session is working is marked▸+this session, even when another session in the same checkout overwrites the shared work state file. isolation.copycopies gitignored files into new workspaces (#242). A worktree or clone created for a ticket now receives the gitignored files named inisolation.copy(for example.env.local) before any install, throughtemplates/trailhead-isolation-copy.js. It never overwrites, rejects unsafe paths, and when the key is unset suggests candidates from tracked*.example/*.samplefiles and offers once to save the key.- Stale-base preflight with
preflight.checks(#243). Before UAT and before integration,templates/trailhead-base-preflight.jsmeasures how far the working base is behind the trunk, syncs it, re-runs the tests and runs the commands listed inpreflight.checks(for example a migration-timestamp check). It stops on a conflict or a failing check and fails closed on anything it cannot verify. - UAT setup from project config,
uat.setupanduat.accounts(#252). Acceptance testing now prepares the environment before the drive-mode ask, running the steps inuat.setupthroughtemplates/trailhead-uat-setup.js: a step whosecheckpasses is skipped, a failure stops with a redacted output tail, and--from/--onlyresume. Test accounts are named inuat.accountsby environment variable only, never by value; an unconfigured project is offered a probe-and-save path, andautoruns configured setup only. - Resolve bookkeeping helpers (#253). Two new templates do the mechanical part of Resolve:
trailhead-issue-body.jsedits one section of an issue body (append/replace/remove) with retry, concurrency and secret checks, andtrailhead-dashboard.jsregenerates the pinned dashboard.trailhead-work-state.js clearnow also removes thesession-ticketmarker. - Structured return report from every engine agent (#249). Implementing agents report
status: done | partial | blockedwithcommits:,tests:,deviations:andblockers:; investigating agents reportfound | inconclusive | needs_inputwithanswer:,evidence:andopen questions:; the plan agent reportsready | needs_input. The engine checks the fields (and thatcommits:matches theRefs:set) before it branches, and research findings are posted as aRESEARCHcomment instead of a branch.
Changed
- A paused ticket is off the frontier on every surface (#263). A ticket carrying
trailhead:pausedis excluded from every frontier query (map, scoped map, whiteboard and the dashboard count), so bare/trailhead:workand an autonomous run never pick it;/trailhead:resume, or an explicitwork <n>/quick <n>, takes it back. The map and whiteboard renders and the pinned dashboard gain a Paused group matching the panel: a paused ticket shows once, under Paused, whatever its assignee or blocked state (the dashboard now classifies unverified, then paused, blocked, in progress, frontier, like the panel). - The acceptance testing ask gains a skip option (#254). The drive-mode ask now offers skip next to AI-driven and human-driven, at all three UAT start paths. A skip is a waiver, not a deferral: the
VERIFYcomment recordsacceptance: waived by the user (unconfirmed), never a pass; no UAT follow-up is opened, the Pending-UAT guard does not fire and the resolution comment states the waiver (aUAT of:follow-up closes as waived). The delegate option andautonever pick skip. When no step is agent-performable the ask is no longer skipped outright: it drops only the AI-driven option and asks human-driven or skip, with the one-line reason. AI-driven UAT now also drives a connected phone, emulator, simulator, TV or desktop app. - The ticket-start scope confirm is a menu (#234).
workandquickask it as a picker: Proceed (recommended), Change something, plus the delegate option. A change that diverges from the ticket gets a second menu, work as-is or open a separate ticket. On Codex the same options render as a numbered list. - The scope confirm is skipped on a ticket you just shaped (#244). A ticket this session created from your own request, or one a grilling round just concluded on, gets a one-line note instead of the menu. Tickets from an earlier session, someone else's, resumed or bulk-created still ask, and
autois unchanged. - Isolation answer is remembered (#245). Under
isolation: autothe answer to the work-start concurrency ask is kept in the gitignored.trailhead/isolation-answer.jsonand reused with a one-line note while the other assigned tickets are the same and the last work-start was under 8 hours ago./trailhead:autoand explicit modes never use it. bug --ofinherits the origin's destination (#246). A regression bug lands on the origin ticket's open map, or on the whiteboard when the origin is there, without the which-map ask. A closed origin map or a failed lookup falls back to the usual rule.- Engine agents carry hard git and tracker boundaries (#248). Every
trailhead-*agent forbidsgit push,git stash,git reset --hard,git checkout -- <path>,git clean -f, branch switches and tracker writes (the orchestrator posts), and leaves other sessions' changes in a shared checkout untouched. Executor and fix agents compare against the baseline SHA in a temporary worktree instead of stashing, and commit by path. - Verify and code review open with a fixed status line (#250). Review agents return their report instead of posting it, and
templates/trailhead-report-status.jschecks the first line (met/gaps_found/inconclusive, orclean/issues_foundwith a counts line), rewrites an equivalent spelling and asks the agent once to redo an ambiguous one. A second failure stops at a checkpoint instead of guessing a verdict. The shared agent text now lives inscripts/agent-blocks.md, synced byscripts/sync-agent-blocks.js. - The Execute step is split into orchestrator and executor parts (#251). The implementing protocol lives in
references/executor-brief.md, the only protocol text given to the executor and fix agents, so they no longer carry orchestration steps such as branch, PR and fidelity posting.
Fixed
- Shared core loads by absolute path (#237). The skills load the shared core with the Read tool on absolute paths resolved from the skill's base directory, instead of
cd ... && catrelative reads that the search guard denied. The Codex adapter resolves skill references the same way. - Search guard no longer reads redirections as file reads (#238).
>,2>/dev/null,&>and heredoc operators with their targets are skipped, and acdinto the session's own working directory no longer arms the check. Acdto a real other directory still does. - Install guard no longer flags lockfile installs or text inside
echo(#239). Commands are split with the quote- and heredoc-aware scanner, redirections are ignored, and--filter/-Fvalues are no longer read as packages. A lockfile flag still does not exempt a line that names a package. - Install guard sees wrapped installs and file-like package names (#255, #258). An install behind
sudo,time,env,nohup,xargs,timeout,nice,stdbuf,setsid,ionice,doas,commandorexec(including nested chains andenv -Spayloads) is now gated. A name such asleft-pad.tomlis local only when it is a path or exists on disk. - Commit-msg hook no longer aborts every commit in
"type": "module"repos (#257). The hook is now a POSIXshwrapper running a.cjsfile beside it, so the repo'spackage.jsoncannot change its module format. The sync installs both files and migrates the old single-file hook. - Commit-msg hook warns when it cannot enforce (#262). If the
.cjsis missing, node is not on PATH or the logic crashes, it printstrailhead: commit-msg hook inactive (<reason>); commit rules not enforced.and lets the commit through. A rule violation still blocks. - Dashboard regeneration works on a full edit history (#253). GitHub stops counting body edits past 100, which made the post-write check report a false conflict; at the cap it now verifies by exact read-back and says so in its output line.
- Landing no longer scrolls sideways on phones (#233, #235). The capture and view cards stack in one column below 520px, and the hero, install command and map card shrink to fit a 320px viewport.