Skip to content

0.15.0

Latest

Choose a tag to compare

@ToRvaLDz ToRvaLDz released this 15 Oct 17:16
· 155 commits to main since this release

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 Whiteboard row above the maps list, with its N open / M counts (name-only when they cannot be read), shows the repo index in place of a map: a link to the pinned trailhead:dashboard issue, every open map (a click opens it) and the whiteboard's open tickets as Frontier / In progress / Blocked with a work button per frontier ticket. map goes back, the mode survives /clear, and the old header dashboard button is gone.
  • Open and total counts per map in the panel (#260). The maps list shows N open / M next to every map, read in one GraphQL call, and the whiteboard heading reads Whiteboard · N open · M assigned. A failed counts read falls back to names only, never an error.
  • trailhead:uat label and a UAT group in the panel (#261). Pending UAT follow-ups carry the new trailhead:uat marker label (a marker, never a frontier filter) and show in the panel as their own UAT group with a tests <parent> #<n> line and a work button. A new templates/trailhead-uat-backfill.js tags existing follow-ups that have a UAT of: line, at first-use setup and once per clone at work-start.
  • Paused group and "this session" mark in the panel (#259). /trailhead:pause now adds a trailhead:paused label, /trailhead:resume or a new claim removes it, and the panel lists such tickets under Paused · n with no work button. 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.copy copies gitignored files into new workspaces (#242). A worktree or clone created for a ticket now receives the gitignored files named in isolation.copy (for example .env.local) before any install, through templates/trailhead-isolation-copy.js. It never overwrites, rejects unsafe paths, and when the key is unset suggests candidates from tracked *.example / *.sample files and offers once to save the key.
  • Stale-base preflight with preflight.checks (#243). Before UAT and before integration, templates/trailhead-base-preflight.js measures how far the working base is behind the trunk, syncs it, re-runs the tests and runs the commands listed in preflight.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.setup and uat.accounts (#252). Acceptance testing now prepares the environment before the drive-mode ask, running the steps in uat.setup through templates/trailhead-uat-setup.js: a step whose check passes is skipped, a failure stops with a redacted output tail, and --from / --only resume. Test accounts are named in uat.accounts by environment variable only, never by value; an unconfigured project is offered a probe-and-save path, and auto runs configured setup only.
  • Resolve bookkeeping helpers (#253). Two new templates do the mechanical part of Resolve: trailhead-issue-body.js edits one section of an issue body (append / replace / remove) with retry, concurrency and secret checks, and trailhead-dashboard.js regenerates the pinned dashboard. trailhead-work-state.js clear now also removes the session-ticket marker.
  • Structured return report from every engine agent (#249). Implementing agents report status: done | partial | blocked with commits:, tests:, deviations: and blockers:; investigating agents report found | inconclusive | needs_input with answer:, evidence: and open questions:; the plan agent reports ready | needs_input. The engine checks the fields (and that commits: matches the Refs: set) before it branches, and research findings are posted as a RESEARCH comment instead of a branch.

Changed

  • A paused ticket is off the frontier on every surface (#263). A ticket carrying trailhead:paused is excluded from every frontier query (map, scoped map, whiteboard and the dashboard count), so bare /trailhead:work and an autonomous run never pick it; /trailhead:resume, or an explicit work <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 VERIFY comment records acceptance: 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 (a UAT of: follow-up closes as waived). The delegate option and auto never 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). work and quick ask 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 auto is unchanged.
  • Isolation answer is remembered (#245). Under isolation: auto the answer to the work-start concurrency ask is kept in the gitignored .trailhead/isolation-answer.json and 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:auto and explicit modes never use it.
  • bug --of inherits 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 forbids git 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.js checks the first line (met / gaps_found / inconclusive, or clean / issues_found with 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 in scripts/agent-blocks.md, synced by scripts/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 ... && cat relative 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 a cd into the session's own working directory no longer arms the check. A cd to 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 / -F values 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, command or exec (including nested chains and env -S payloads) is now gated. A name such as left-pad.toml is 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 POSIX sh wrapper running a .cjs file beside it, so the repo's package.json cannot 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 .cjs is missing, node is not on PATH or the logic crashes, it prints trailhead: 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.