Repository navigation
1.2.4
[1.2.4] - 2026-10-06
Lean mode, a session briefing, more hosts and a safer uninstall, and the bugs found while reviewing the rest of the code. What is and isn't claimed for lean mode: docs/LEAN.md.
pipeline.lean(off,liteby default,full): the Implementer and Reviewer are told to make the smallest correct change. Atlite: reuse before writing, fix the root cause (grep every caller), leave one runnable check for non-trivial logic, mark a deliberate shortcut with alean:comment and list it in the report, never lean away validation, error handling, security or accessibility. Atfull: also climb the ladder (needed at all, repo, standard library, platform, installed dependency, one line, minimum) and the Reviewer blocks an avoidable new dependency.skills/implementer/references/native-first.mdis a lookup of what the platform, the standard library and the database already do. Read from the default branch, so a branch can't switch it off for its own review. The reviewer's lens tags findingsdelete/stdlib/native/reuse/yagni/shrinkand reportsnet_lines_removable; the implementer report gainsshortcuts, whichrun --prlists in the pull request. Whether it shrinks what a model writes in a given repo is not measured here.agent-flow debtreads everylean:comment (aponytail:one is read too) back from the code with its ceiling and upgrade trigger, flags those that name none, and has--jsonand--fail-on-no-trigger.statusshows the count; the Gardener gains/debtand/audit-lean(and prompts for both). A marker inside a string literal (a fixture) is text, not a comment.agent-flow uninstall [--harness] [--yes] [--keep-runtime] [--keep-hook]takes out whatinstallwrote and nothing else. Previews until--yes. Unedited skills, agents, rules files, the OpenCode plugin and the vendored runtime go; an edited one is kept and named; only agent-flow's own entries leave the hook files (your other hooks and settings stay, an unparseable file is untouched); a skills folder shared by several harnesses stays until the last one goes;AGENTS.md, the manifest, CODEOWNERS, the baseline and the pipeline's state are never touched. A pipeline role can't run it.- A session briefing.
agent-flow briefsays what is protected, review-only and always blocked, which checks must pass and how many issues wait on a person: facts only, never an issue's free text.installwires it asSessionStart(andSubagentStarton Claude Code) for Claude Code, andSessionStart/sessionStartfor Codex and Cursor;--no-briefleaves it out,updateadds it to an existing install. It answers in the shape each harness reads (and Copilot, Qoder and ZCode if one is wired by hand), never reads stdin, never fails. agent-flow statuslineis one line for Claude Code'sstatusLine(guard on or OFF, how many need you, are ready, are working);install --statuslinesets it only when none is set.agent-flow mcp, a zero-dependency read-only MCP server on stdio: status, pipeline state, classify, debt, doctor, audit summary, gates and the brief, as tools and a prompt, for any MCP client. Every tool is one of a short list of read-only CLI commands with validated arguments.pipeline.isolate_roleslaunches each role with--setting-sources project,local, so a plugin or hook installed globally on the machine can't add context to a role. Off by default.- More hosts:
install --harness cline|kiro|qoder(a rules file, plus skills in.agents/skills) andswival|factory|commandcode(skills folders), instruction-tier and listed as such in the harness matrix, with paths that were not run live here. - The guard no longer hangs on input that never arrives. A wrapper that swallows the piped JSON used to leave the hook waiting until the harness killed it, which lets the call through. It waits 10 s (
AGENT_FLOW_HOOK_STDIN_MS) and refuses wherever protection is configured; the stop gate and the badge are bounded too (FM-22). - Fixed: re-running
installstacked another guard hook for Codex, Cursor and Gemini when the runtime was vendored (the "is this ours" check only knew thenode_modulespath), so the guard ran once per install on every tool call. A re-install now replaces ours, andupdateleaves a customised guard hook alone with a note. - Fixed:
install --harness claudeoverwrote a user's own hook whose name merely containedagent-flowandguard(a./scripts/agent-flow-guard.shinPreToolUsewas replaced by agent-flow's command). "Ours" now means "runs agent-flow's own binary" (the project copy or the vendored runtime), for install, the briefing,uninstalland the status badge alike. - Fixed:
updatetreated every harness that shares.agents/skillsas installed (it would have written rules files for ones nobody installed); installed harnesses are now told apart by the install record and their own wiring. The install record no longer forgets what a sibling harness wrote. - Fixed: piped output could be cut short. The CLI called
process.exit()right after a large write (status --json,classify), which can truncate output on a pipe; it now lets stdout drain first. - Fewer tokens spent on agent-flow's own instructions (see docs/LEAN.md): skill descriptions 3,285 to 1,969 characters; the orchestrator skill 15.2 KB to 3.9 KB with its manual procedure moved to
references/manual.md; the implementer, reviewer and QA skills tightened, and told to be terse; QA keeps the first 50 and last 100 lines of a long log; the starterDOCS_INDEX.mdand the rules files shortened; agents are told to runagent-flow briefinstead of reading the manifest; the MCP server cuts answers at 20,000 characters.tests/token-budget.test.jspins the ceilings. doctorwarns when a context file is heavy: an.mdcontext file over 150 lines or about 9 KB is named with its size in tokens (a warning, never a failure;context_weightin--json). Bootstrap now asks for under 60 lines per module.- Fixed: the MCP server's input buffer was unbounded. A client line with no end grew memory without limit; it is now refused past 1 MB and dropped to its newline, a batch is capped at 50, and the next request still works.
- Fixed:
briefloaded the manifest twice (once per trust level) and now once; thestatusshortcut scan has a 1.5 s budget and says when it is partial; a pre-record install in the shared skills folder is read as the genericagentstarget; the review-violation message names the CRLF trap beside the missing-final-newline one. - Fixed (review comments on the pull request): added lines that couldn't be read (a diff past the buffer) were treated as none, so a risky CI line could pass unchecked; they are now a
review_violationsentry.check-versionslet a release tag that isn't shaped like a version (v1.2) through to publish; every tag that isn't the version now fails. A test left its polling timer running on early exit. - Release hygiene:
scripts/check-versions.mjs(every version file, the CHANGELOG section and the docs' action tag agree; on a release tag it equals the tag) runs in CI and before publishing;tests/release-hygiene.test.jspins the load-bearing rules in every skill, prompt and harness copy, and the frontmatter every skill needs. A frontmatter value with a bare": "must be quoted, or strict YAML readers (Pi) reject the skill as a nested mapping. - Fixed: the implementer skill failed to load in Pi — its frontmatter
descriptionheld a bare": "((agent/issue-N): smallest…), which strict YAML reads as a nested mapping. The value is now quoted inskills/and the.agents,.cursorand.geminicopies. - Skills renamed to
agent-flow-*(bootstrap→agent-flow-bootstrap,gardener→agent-flow-gardener,implementer→agent-flow-implementer,invoking-agents→agent-flow-invoking-agents,qa→agent-flow-qa,reviewer→agent-flow-reviewer): one generic word shares a flat skill namespace with every other package on every harness (Pi keeps the first discovered and warns; Claude Code project skills collide silently), so the unprefixed names are retired. Skill directories, frontmatter names, prompts, launch procedures, docs and the Claude reviewer'sskills:field use the new names.updateremoves a pre-rename dir that is still exactly what install wrote and keeps (named) one you edited;uninstalland a freshinstalldo the same. Role identifiers (AGENT_FLOW_ROLE=implementer, …) are unchanged.