hassan-mohiddin/freeflow
Feedback-based control system for coding agents.
Changelog
Unreleased
Breaking Changes
- Track Work's
initmakes a Schema 5 task folder and needs--cue(when the task matters, starting "read when"); a script that raninitwithout it gets an error saying so. - Pi's Task Memory is removed: the
task_memorytool and its dialogs,/freeflow task,/freeflow projectand/freeflow trash, the record write gate, held records, child records and fan-out, thetaskMemorysettings, and the task-memory capability skill. Pi keeps tasks in the Freeflow store as Claude Code does: the task menu at session start, the held task in the footer, and Freeflow's compaction after the agent's checkpoint. A config that still setstaskMemoryloads, and/freeflow statussays those settings are ignored. Setup Freeflow moves Task Memory's records into the store with Track Work'smigrate, as a task each (a child record too), leaving the originals in place;store initstill refuses the folder that holds them, so the store goes in another one. - Track Work no longer runs Schema 4 records: only
migratereads one, and every other command refuses it and namesmigrate.init --schema 4,view resume, Checkpoints and Decisions (checkpoint propose,activate,defer,resumeandclose,decision add,supersedeandretire),slice reopen, the registry'sproject link,task import,task envandtask fanout, and the Schema 4 reference are gone;projectandtaskcommands work only in a Freeflow store. Discuss Work'schoices.mjs --recordreads a Schema 5 record only. - Evaluate Behavior's
skill-eval run --dry-runis now--uncommitted: it always ran subjects and called models, and only allowed uncommitted inputs, so the old name promised a run that spends nothing.--dry-runis refused with a message naming the new flag; stored results keep theirdryRunfield and still read. - Review Work's review mode is replaced:
review.mode(auto,off,always) is gone, and a configuration that still sets it is refused with a message namingreview.unit. An independent review now runs at every review unit,review.unit(prby default, orpush,commit,agreement,manual, which proposes each review and waits for your yes), withreview.roundscapping its rounds;review.modeldefaults toauto.
Added
-
Freeflow's settings can be changed on every host, the same way. Setup Freeflow's
scripts/settings.mjslists, reads, sets and unsets any setting in the repository's.freeflow/config.json, your.freeflow/local.json, or for this session only, with the rules of Pi's settings screen, and tells the agent at once which Runtime State line changed; the agent runs it when you ask. On Claude Code,/freeflow settingslists the settings Claude Code acts on and/freeflow settings review.mode always [--session | --personal | --repository]changes one, Personal by default, the agent working under the new line from its next step; it runs with no model call and shows in a cloud session. A Session value outside Pi lives in the Freeflow home and is read again at resume and compaction; a new session starts without it. -
Track Work's
delegate open --scratch <folder>keeps a delegation with no task: the same brief from the template under the folder'sdelegations/, with nothing recorded, anddelegate check-return --scratchchecks its return. Freeflow's core prompt now names Execute Work's delegation reference whenever work goes to another agent (a subagent, parallel workers, a reviewer or any multi-agent orchestration), with or without a task. -
Setup Freeflow sets up the Freeflow store that keeps task memory, in a reference of its own: it asks local only or local + cloud, local only by default, makes it with Track Work's
store init(orstore init --remote <url>for your private repository), says what to set in a cloud environment (FREEFLOW_HOMEat the store's clone, a setup-script line that clones a Freeflow release, and the store attached to a session when its work needs task memory), and moves older records into the store: Schema 4 records and Pi's Task Memory withmigrate --project, which converts a copy, and Schema 5 tasks kept in a repository's.freeflow/tasks/with the same command, which copies them unchanged; the originals stay. A task always lives in the store: where you want no store, there is no task. -
At session start, Freeflow on Claude Code says what keeps the session from a working store and whether you or the agent fixes it (
session status's newmissinglist): a storeFREEFLOW_HOMEnames that is not there, an empty clone not laid out yet, a cloud session's store with no remote. Where no task names the session's folder, as in a cloud session that starts in the store, the menu lists every open task in the store; andtask here --scan <folders>finds where a task's repositories are on this machine, so recovery reads their files in a fresh container. -
Track Work's tasks may belong to no project:
task create --no-project, or with no project naming the repository, makestask-NNNin the store'stasks/, the session-start menu lists it under "No project", andtask move --id <ID> --project <name>(or--no-project) moves a task's folder into a project or out of it, with the next number there and Git keeping its history.estimategives the context's use against the window and the point where Freeflow's notice comes, from--usedor the session's transcript, and with--doneand--leftprojects whether the rest of the work fits in this cycle; where no window is set and the context is larger than the one it would assume, it asks for--window. -
Freeflow on Claude Code (2.1.287 or later) carries a Schema 5 task through compactions by itself, wherever a Freeflow store exists; elsewhere it does nothing. At session start,
/clearand resume it pulls the store and gives the agent the menu of the project's tasks. As the context nears Claude's own compaction it tells the agent to checkpoint, and once the checkpoint is done it compacts the session at the turn's end with the task's bundle in place of the conversation, with no summary request, then starts the next turn so the work goes on. A compaction that comes before the checkpoint is Claude's own, with the bundle as of the last checkpoint and your messages since added after its summary. Reading and editing files inside the store no longer waits on a permission prompt or auto mode's check, as in a working directory where edits are allowed; a deny rule still holds. It also syncs the store when a turn changed it, reminds workers whose prompt names a delegation to keep theirprogress.md, sends back once a return that is not ready, and releases the task at session end; resuming that session, as a cloud session resumes after its container was reclaimed, takes the task back, unless another session took it meanwhile, and Pi does the same. Track Work's script gainssession status(this session's state in the store, as JSON for such a layer) andview bundle --fallback. -
Track Work's script sets up the Freeflow store, one Git repository that holds every task's memory. It is local by default (
store initmakes it on this device, and nothing leaves the machine), and a cloud store with your private repository:store init --remote <url>clones it into the Freeflow home and, when it is empty, lays the store out (store.json, ignore and merge rules,rules/,projects/) and pushes a first commit authored as you, or joins a store another machine made, andstore remote --url <url>moves a local store's whole history into an empty repository;store statussays what is not committed or pushed;store synccommits, takes the remote's commits and pushes, or with--pullonly takes them. Sync keeps working without a network (it commits here and pushes next time), retries a push the remote refused because it moved, mergeshistory.mdandsessions.mdby keeping both sides' lines, stops on any other file both machines changed with both copies kept untilstore sync --resolved, and scans every push for common secrets, naming a found one by path and line and never pushing a commit that held it. A home that holds Pi's Task Memory is left alone, and records inside the store pass Track Work's Git check. -
Track Work's script keeps Schema 5 tasks.
initmakes a task folder:record.md(Current Context, Current Work with the open agreement, the Slice, delegations, Space and what to read, and Future Work),history.mdanddecisions.md.agreement open,updateandclosekeep what the user agreed, in their words; the slice commands andtask set-statework on it; closing a Slice or an agreement appends its one History entry (with the Slice's updates, or the agreement's lines, updates and decision list) and commits and pushes the store; a close that stopped halfway finishes when run again.checkpointchecks the folder's structure and the recovery budget, writes where the work repository stands and pushes the store.view recoversays the record is memory and your direction decides the work, then prints the rules, the record, the decisions within their budget, the History index, the project's other tasks and the checks;view entryandview indexread History. In a Freeflow store,project new,remove,listandshowandtask create,take,release,switch,here,searchandremovework on its folders: a task'ssessions.mdsays which session holds it, a second session'stask takeis refused until the holder releases it or you agree to a takeover,checkpointis refused for a task the session does not hold,task hereprints the session-start menu for the folder's repository, and a removed task stays in the store's Git history. -
Track Work's script carries what shaped the work across compactions, converts Schema 4 records, and measures recovery against a budget.
discussion listnumbers your messages since the last checkpoint, read from Claude Code's session log or a plainUser:/Assistant:export (--transcript), messages sent while a turn ran included and resends left out;discussion savekeeps the ones that shaped the work, word for word, as a block insources/discussion.md, each with the agent's line saying what it answered;discussion dropremoves a block, andcheckpointlists the blocks whose work is closed.migrateconverts a Schema 4 record to Schema 5, in place or into the store with--project, keeping the old record whole insources/. The recovery budget counts only the memory the agent shapes and scales with the square root of the context window (about 10,000 words at 200,000 tokens, fromFREEFLOW_CONTEXT_WINDOW), in normal or expanded mode (task set-budget); Current Context and Future Work keep fixed budgets, and the rules, the skills and the files the record's Recovery list marksalways, not counted(accepted Specs, Plans and the skills the work follows) are read and never counted.budgetprints it before the agent writes, andinitandcheckpointprint it too; it only warns. The record's Recovery section lists what recovery reads, each line markedalways,always, not countedorwhen <trigger>, a file optionally cut to(lines a–b).checkpoint --inputrewrites the record's In flight section (where the step stands, and what was observed, tried or is pending) and, after aRecovery:line, replaces the Recovery list, which is otherwise kept (Recovery: noneempties it); the checkpoint prints each Recovery line's size and share of the budget, and names a definition the new list dropped.view bundleprints everything recovery reads, each file whole or for its lines, with its sizes; without a task,checkpoint --sessionwrites a session summary thatview bundle --sessionprints, with the files its Recovery lines name. -
Track Work's script keeps delegations for Schema 5 tasks:
delegate openassignsD-NNN, writes the brief indelegations/D-NNN-<slug>/from the template, makes a writing worker's worktree on its own branch at the base, and writes the delegation's line in Current Work;--parentopens a sub-worker's delegation inside its worker's folder and refuses a fourth level.delegate amendappends a dated change to the brief;delegate statuslists open delegations and their sub-workers;delegate check-returnrefuses a return with a missing heading or a commit that is not on the brief's branch;delegate closerecords the outcome, model, effort, tokens, minutes and merge commit in one History entry.view recover --delegation <ID>is a worker's recovery: its rule, then its brief, progress and return. Execute Work's delegation reference names these commands where a step used to be kept by hand. -
Evaluate Behavior's pilot (
--pilot) checks each shell arm's harness before its first subject, with no model call: a command in the workspace, one naming a path outside it, the first command again, a write under/tmp, and which ofnode,python3andgitthe shell has. It stops the pilot when the shell stops working after a probe or the arms found different things, and otherwise prints the findings, which apply to every arm. -
Evaluate Behavior refuses a run before any subject when a container image an arm runs in, or the engine that runs it, is missing, saying what to install or pull; nothing is pulled.
-
Research Work's
study.mjs lockrefuses a study plan whose pilot shows the reference arm passing every unit, since such a study has no room to show a gain, unless--saturatedgives a written reason, which the lock records. The plan records the pilot in onePilot result:line. -
Execute Work has a delegation reference for handing work to other agents (subagents, parallel workers, reviewers, trial and eval agents): when handing work out pays, the smallest capable model by default and the strongest only with your yes, briefs that point to files, one folder per delegation holding its brief, progress and return, writers in their own worktrees, a return checked before it is accepted, and each delegation's model, effort, tokens and minutes recorded. A worker may hand mechanical checks, gathering or research to sub-workers on the smallest model, three levels at most, and only the agent you talk to asks you anything. Write Skill's trials, Review Work's reviewers and Research Work's workers point to it.
-
Research Work's figures list x labels that overlap and text past the canvas, and an
x.rotateoption turns long category labels. -
Track Work measures what work uses and plans from it.
slice start, eachcheckpointandslice closekeep, in one line the agent never types, the context a Slice added, the compaction cycles it touched, its working and wall-clock time and, per model and effort, its billed tokens and their cost at API list price, read from the harness's transcript (Freeflow's Claude Code mod names it) or given with--used;delegate closemeasures a worker from its own log. Each Slice starts with a prediction from past Slices (the task's, else its project's or the store's), corrected by how far past predictions were off; its cost comes from those run on the model and effort it starts on once three were, else from all of them, and the prediction names the model its cost was measured on.estimate --planlays the Slices left across compaction cycles, flags any too big for one, shows what could run in parallel and prices past delegations and a fan-out;estimate --projectand--storeadd up what was measured. Discuss Work's agreement shows the work's size in compaction cycles and its cost (choices.mjs agreement --plan), with the plan under Technical. Prices come from a dated list-price table thatFREEFLOW_PRICEScan replace; the planner shows costs and never picks a model. -
Research Work, a new skill (
/research-work) for answering a question from evidence gathered and checked first, starting with in-depth reports on code, papers or docs: a research brief agreed with you, a source ledger saying how each source was checked, a claims register with an evidence level per claim, and checks that everypath:linecitation exists at its pinned commit, every quote appears in its source and every number in the report traces to a registered claim. Its statistics script gives intervals, paired comparisons, clustered runs, rater agreement, multiple-comparison correction, pass@k and power, and Evaluate Behavior now uses it. -
Research Work runs studies and quick checks: a study plan answering twelve questions and locked before the runs that count, a receipt for every run (failed ones included), deviations logged with who cleared them, a validation record before a model judge's verdicts count, and checks that a confirmatory claim was planned, that held-out items ran only under the lock, that every registered number appears in its result file, and that each judge score quotes the output it judged. A Bayesian interval covers pass or fail results in few clusters. The general method of study design and measurement moves from Evaluate Behavior into Research Work, and Evaluate Behavior points to it.
-
Research Work writes papers: an outline checked against the claims register (a proposition a result could contradict, contributions with their claim IDs, one sentence per planned paragraph, figures with their data files, the objections and where each is answered), the writing techniques with the evidence behind each, one review and revision by patch, and a rebuttal ledger for the venue's reviewers that records your choice and reason for each comment, refuses submission while a commitment has no place it was fulfilled, and lists requests that are new in a later round. A literature review gets an evidence table. The research report's shape moves from Write Docs into Research Work, which states each finding's strength as its evidence level; Write Docs routes research documents there.
-
Research Work has tools for writing the paper: figures drawn from their data files with a receipt the outline checks, a bibliography from the source ledger that marks every source not verified, checks a draft must pass before review (abstract numbers in the body, citations, figure and section references, word limits), a venue copy without claim IDs, revision by patch where each change names its finding, a build to PDF, Word, LaTeX or HTML through Pandoc, a check of the built PDF's pages, words and required sections, and a default project layout.
-
Research Work checks three things its guidance asked for: a claim that something is new cites the search behind it, every analysis variant a study plan lists is reported, and a plan can declare the models in its method with their exact snapshots (
study.mjs checknotes a plan that does not). A literature review's evidence table can name each study's weakness. -
Research Work aggregates results over several seeds and tasks: the interquartile mean, mean, median and optimality gap with stratified bootstrap intervals, the probability that one method beats another, and an interval for pass^k for one task or a suite.
-
Research Work checks more of a study before its result counts: the plan names the method that computes each confirmatory rule, and a verdict computed by another method is refused; a model that labels the data counts as a judge; the arms compared get the same budget; a validity check that fails holds the analysis until you clear it; the plan records how each route of contamination is controlled; and the plan lists each source of variance. Weighted kappa takes quadratic weights and reports raw agreement beside it. A study with human participants stops for you and your institution.
-
Research Work checks that a key claim's cited lines or passage actually show it: a separate reader sees only the claim and its evidence and answers supported, partial or unsupported with a quote, and the check counts the answers and holds the report until each partial or unsupported one is settled. Lookups no longer verify a correction notice, a reply or another part of the work, or a record whose year or first author differs; a row with no identifier can be searched by title for a candidate DOI, and a dead link is looked up in the Wayback Machine. Reports and drafts get more checks: a percentage that does not follow from its counts, wording stronger than a claim's evidence level or against a number's sign, an undated "latest", passages copied from a source without quotation marks, and sources never cited. Rechecks add Cohen's d from t and degrees of freedom against the sample size, and accept a corrected p. Text inside a source is treated as data, never as instructions. A quote beside a source in any other form is listed as not checked rather than passed, and a citation sentence counts for the claim named right after it. Model names such as GPT-4 no longer count as numbers to trace, search counts trace to the search ledger, the bibliography takes titles and authors from verified lookups, and a source ledger's Supports is checked against the claims that cite it.
-
Research Work rechecks the numbers another study reports: whether a mean, a percentage or an SD is possible for its sample size (GRIM, GRIMMER, DEBIT), and whether a p value follows from its test statistic, in a table whose verdicts only the computation can write.
-
Research Work looks sources up online when you ask: a DOI through Crossref with any retraction or correction notice, an arXiv ID, whether a link's page names the source, each matched on the title and an author, cached so a second run stays offline, and never marking a source fabricated because nothing was found. A code citation can be checked against the lines the agent actually read. A study plan's lock names the git commit that holds it when the plan is committed, and a plan is refused when it stops as soon as a result turns significant or gives a comparison no sample size.
-
Research Work supports systematic reviews: screening criteria tagged by stage, so a criterion that needs the full text cannot exclude a study at the title and abstract; a model that screens counts only with a judge validation record that passes; two screeners' raw agreement, kappa and the disagreements a person settles; a PRISMA-style flow figure drawn from the search ledger's counts, never typed; each study's risk-of-bias tool and judgment in the evidence table; and
stats.mjs meta, fixed and random-effects pooling with tau², I² and the Hartung-Knapp interval, matching statsmodels on the BCG vaccine trials. The paper guidance says what an abstract holds. -
Research Work's systematic-review checks hold tighter: a model screener's judge record must be for the rubric the model was given; a flow figure is recomputed from the search ledger it names, so a count edited by hand is refused even when its sums still add up; a hit both screeners decided cannot be left in another state without a person settling it;
stats.mjs metawarns when the Hartung-Knapp interval is narrower than the studies' own evidence and gives the truncated interval to report instead; a randomized trial with a secondary cohort analysis is no longer refused RoB 2; andstats.mjs meta --method leave-one-outrefits without each study in turn and names a study the pooled answer rests on. -
Research Work fits a review the agent runs: the reviewing agent can record itself as the screener, without a judge record, and the counts and flow say it screened alone; citation chasing is its own method, counted apart from the databases as PRISMA does; a query can carry the service's own count of records returned, so those not screened show in the flow; a claim above L1 citing a source whose recheck is a mismatch is refused when the recheck table is given;
stats.mjs effectmakes risk differences, log odds ratios and log risk ratios with their variances, unpaired or paired, in the formmetareads; andinit project --kind reviewlays out a review's synthesis folder without the study and paper folders.validatenow notes and ignores--sourceson an artifact that does not read it. -
Research Work checks a report or paper with one command:
research.mjs gate <folder>takes the rigor from the brief, runs every offline check that rigor requires on the files present (the brief, ledgers and register, the study's records, citations and numbers, a paper's draft checks and PDF, and at publication rigor every source opened and the citation-support answers), and prints each check as passed, failed or not run with why, then what is left before the work goes out. Evaluate Behavior says how a Research Work study plan's method, budgets, validity check, contamination and judges map onto its runs; Review Work's Judge Contract covers the citation-support reader; and the open choices of a research brief and a study plan go into the task's decision list. -
Research Work's gate says what it did not check: at publication rigor it names every claim the report or paper cites that has no support answer, for you to add or keep out with
--unsupported-ok, which it lists as not checked; a paper's PDF counts as checked at publication only against the venue's limits or required sections it is given, and with none given it is not checked (below publication a PDF is shown without holding the gate); a passed check's notes print beneath it; a report that cites nothing is not checked; and a register with a confirmatory claim but no study plan fails. The packets for the support check can come from the report and the paper together. The gate finds a source's saved copy in the sources folder by its ID or pin, so quotes are checked without a--copyfor each. -
Freeflow keeps an event log of what happens in each session's loop, on Claude Code and on Pi: session start and end, turns, model requests with their tokens by model and effort, tool calls with whether they failed, the exit code where the host gives one, how long they took, the paths a file tool named and a shell command's text, compactions and who ran them, workers started and stopped, and Freeflow's own actions. A line never holds a prompt, an answer, a file's content or a tool's output; a command's keys and tokens are replaced with
[redacted]and it is cut to 200 characters. The log stays on this machine, inevents/<session>.jsonlin the Freeflow home, which the store's Git ignores, and each checkpoint and task release commits a short summary of it into the task's folder (events/<session>.json). Track Work'sevents summaryandevents showread it, andevents appendis how the drivers write it. Theevents.enabledsetting turns it off, in every scope. -
Freeflow says what it can do in each session. Each driver writes its claims for the requests Freeflow knows (pin, inject, forget, compact, checkpoint, rewind, route, spawn, send, wake, ask, block, sensors, timers): yes for what it carries out today, possible for what the host offers and Freeflow does not use yet, no for what the host cannot do, each with how or why not.
/freeflow capabilitieslists them on Claude Code and Pi, and Setup Freeflow'scapabilities.mjslists them for the agent (check <request>exits 0 only for yes) on every host, saying where no driver runs that only the session-start guidance arrives. -
Freeflow arriving in a session that is already running catches up at the next turn. When the plugin is enabled or updated mid-session,
enabledis switched on, or a harness skips the session-start hook, what session start would have given (the guidance, the task menu, the window, the claims, the store's pull) comes at the start of the next turn, once, with a line saying Freeflow started mid-session; on Pi, a reload that brings Freeflow in, orenabledswitched on, brings the menu at the next run. Each session keeps which steps of its start ran in the Freeflow home'ssessions/<session>/start.json, so a reload or a normal session gets nothing twice; a step that fails is logged and tried once more at the next turn. -
On Claude Code, Freeflow's guidance (the core prompt, the Interaction Contract and the Working Method) is a section of the system prompt, so it is in every request and stays after every compaction; the session-start hooks still run, and their copies are left out while the section carries the text, so it is not sent twice. A resumed session keeps the prompt it recorded, so one recorded before this change gets the hooks' copies until its next compaction.
pinis nowyesin/freeflow capabilitieson Claude Code. -
Freeflow on Codex does what Codex's hooks allow, as its mod does on Claude Code: after the session-start guidance, the task menu with your rules, taking back the task a resumed session held; a context row at 50, 60 and 70 percent of the window and the checkpoint notice near Codex's own compaction, added after the next tool call or prompt; after Codex compacts, the task's record as of its last checkpoint after Codex's summary; the event log; the store synced at each turn's end; and the hold released when the session ends, pushed at the next start. Its claims: pin, inject, checkpoint and sensors yes, block possible, the rest no. Approve Freeflow's hooks again in
/hooksafter updating. Checked with recorded hook inputs shaped by Codex's hook schemas, not in a live Codex session. -
Track Work's
task release --no-pushcommits the release on this machine only, and the nextstore syncpushes it, for a session end that leaves no time for the network. -
Freeflow checks four rules before each tool call on Claude Code and Pi, and for now only warns: no change before an agreement, no change outside the record without an open Slice while a task is held, a reminder that a commit, push, tag, merge, pull request, publish or release needs your own yes, and a worker writing only what its brief's
May write:line allows and never the task's record. The agent reads the rule, why and the way through, once per gate in a turn; the call runs as it would have. Each gate isoff,warn(the default) orblockin every scope (gates.agreement,gates.slice,gates.delivery,gates.delegation); underblockthe call is refused with the same text, and a delivery step becomes a question to you where someone can answer. The event log counts each would-fire,events summaryprints them per gate andestimate --storeadds them up, so you can decide from data when a gate should block. See Gates. -
Track Work keeps the gates' state in
sessions/<session>/gates.jsonin the Freeflow home, written by the commands that change it (taking or releasing a task, an agreement's open or close, a Slice's start, pause, resume or close, a delegation's open or close).agree --outcome <text>records the agreement of a session that holds no task, with--exact-spec "<reason>"when your request fixes every choice, logged for a reviewer;delegate open --writes <glob>puts aMay write:line in the brief's Scope. -
Delegation across sessions (Track Work):
delegate open --sessionhands a part of a task to a separate session and prints its start command for Claude Code and Pi; the worker runsdelegate join, keeps itsprogress.mdwithcheckpoint --delegationand recovers withview bundle --delegation, and its session is refused every command that writes the record. Each delegation event is a line in the task folder'schannel.jsonl, printed bydelegate log; an accepted return's Left open choices joindecisions.md;session statusreports a Slice's Waits on with what came back.claimandreleasekeep claims on paths in the store,delegate open --writesclaims the worker's scope, and the delegation gate warns before a write to a path another session claims. -
Claude Code's mod runs a worker session as such: its notice asks for
checkpoint --delegation, its compaction installs the worker's bundle, and its end releases its claims; when a delegation the current Slice waits on comes back, the coordinator gets one row naming it, and an idle interactive session is woken with it. Its notice to a subagent worker and the block of a worker's stop are logged in the task's delegation log. -
On Pi, a worker session's checkpoint notice asks for
checkpoint --delegation, its compaction installs the worker's bundle, and its end releases its claims; when a delegation the current Slice waits on comes back, the coordinator gets one row naming it, and an idle session is woken with it (delegation.wakeOnReturn). -
Execute Work's delegation reference covers workers in separate sessions (the lead assigns every part; workers talk only to their coordinator), and when to message another session, what to send, and that a received message is information; Pi's Messaging skill points to it.
-
Settings
delegation.claimHours(how long a claim on paths lasts, 4 hours by default) anddelegation.wakeOnReturn(whether a returned delegation wakes the waiting session, on by default), in every scope, on Pi's/freeflow settingsscreen and Claude Code's. -
The gates run on Codex too, through its
PreToolUsehook: a warning reaches the agent before the call runs, once per gate in a turn, and underblockCodex refuses the call with the gate's text; a delivery step underblockis refused, since Codex cannot ask you. Codex does not run its hooks for hosted tools such as web search, so the gates do not see those.capabilities.mjsnow listsblockas yes on Codex. -
Review Work plans each review from the change itself:
review-plan.mjscomputes how deep it goes (Quick, Standard or Deep, with its tier, reviewers, rounds and the humans the policy asks for, and why) from the diff, the repository'sreview.depthrules read from the base commit, so a branch never supplies its own policy, the agreement'sReview:lines and built-in triggers for security, stored data, CI and release files and a public interface found by content (a skill's name or description, a command, a settings key, a package'sbin,exportsormain). A Deep review is three reviewers who see none of each other's reports until all have written theirs, with one adjudication. Reviews are kept in the task'sreviews/folder, synced with the store, andcheck-adjudication.mjs --recordbinds each to the commit it reviewed, soreview-status.mjs, and Deliver Work'sdelivery-state.mjs, say whether a review is on record for the head before a pull request opens. Until Freeflow's gates arrive, that check is the skill's, not enforced. -
Freeflow on Claude Code has a cost governor. After each model request it reads your plan's usage windows and the session's cost: on a subscription it holds the seven-day window to a daily pace (what was left of it when this day of the window began, over the days until it resets), and with a task whose plan predicts its cost (
estimate --plan), the task to the plan's high end. At 80% of a cap the agent gets one row naming the cap, the use and the reset; at 100% one notice, or undergovernor.mode stopthe ask to stop at its next safe point, checkpoint and ask you.governor.capsets one cap of your own: a percent of the seven-day window, or dollars with an API key. Each response is agovernorline in the event log, andevents summarylists them. -
Discuss Work's
drift.mjs --base <ref>lists the hunks of a change that no decision item'sShows atcovers, those in code a feature file covers first, so the account at the end and a reviewer see the choices nobody agreed;choices.mjs return --base <ref>prints how many. -
On Claude Code, Freeflow keeps a status line under the prompt (the held task and its Slice or agreement, the context and its cycle, the weekly window, the open delegations) and a pane,
/freeflow pane, with four views: Tasks (every open task, what needs you first), Agents (the held task's workers, sub-workers nested), Cost (this session, the task by model and effort, the plan's windows, the Slices left) and Decisions (waiting first). Its keys open, create, move and release tasks, view or message a worker and check a return, each running Track Work's own command and telling the agent in one line.pane.enabledandpane.statusLineturn them off; Track Work addsproject list --json,delegate status --jsonandestimate --spentfor it. -
Two-tier routing (SPEC-010):
delegate openwithout--agenttakes a worker's model and effort from the routing table you own,rules/routing.mdin the Freeflow store (a project's ownprojects/<project>/rules/routing.mdread first), by the work's--kind,--settled yes|noand--check scripted|tests|judgement, prints the Route line, and writes Settled, Check and Route in the brief; a row that asks you first is refused until the agent gives--agentafter your yes, and no table, a table that does not parse, or no matching row is refused with the reason. A new store gets the default table: the cheap tier (Haiku on Claude) atxhighfor gathering, research, evals, reviews and settled builds, and the coordinator's own model athigh, asked first, for the rest.estimate --planandestimate --storeprint how many delegations of each kind, check and model were sent back, and why.
Changed
-
Track Work's
checkpoint --compactasks for Freeflow's compaction only where the session's driver claims it can compact (Claude Code's mod and Pi's extension do). Elsewhere it writes the checkpoint, leaves no request that nothing would answer, and says so: "No Freeflow driver here compacts (no capabilities for this session). The harness compacts on its own; after it, recover with view recover." -
Self-review is verification: checking your own change or document before you report it done is Verify Work's Check Your Own Result, with the self-review script at
skills/verify-work/scripts/self-review.mjs(it was Execute Work's) and Review Work's lenses for the kind. Review Work means independent review in another context, and adjudicating its report. -
The design reference, how to shape modules, interfaces, state and failure, is Discuss Work's, where approaches are chosen; diagnose stays in Execute Work.
-
Freeflow's words follow its design map: a context cycle (formerly compaction cycle) runs from a session's start or a compaction to the next compaction, and the Return (formerly hand-over) is where the agreed work comes back to you to accept. The cycle reads agree, build and verify, review and return. The skills, the scripts' output, the notices on Claude Code and Pi and the docs say so;
choices.mjs returnlists the choices you have not seen, andchoices.mjs handoverstill works. -
Freeflow on Claude Code obeys
enabled: with it off, its task menu, notices, context rows, compaction, task hold and store sync stop as well as the session-start context, and/freeflow settings enabled onbrings them back from the next event. Every setting is now one row of one table, which the validators, Pi's screen and the settings script share; the configuration files accept an optional"v": 1, which a later Freeflow writes. -
Freeflow's messaging on Pi lists the task each session holds in the Freeflow store, with its project, and the inbound policy
projectdelivers messages from sessions that hold a task in the same project. -
Freeflow compaction on Pi works as on Claude Code, through Track Work. One soft notice a compaction cycle comes before Pi's own limit (at 75% of the window, or a tenth of the window before Pi's trigger if earlier), after rows at 50, 60 and 70%; at a safe point the agent checkpoints its task with
checkpoint --compactand ends its turn, and Freeflow replaces the conversation with the task's bundle and continues the run. With no task, a session summary takes the record's place, with or without a store. Pi's own compaction stays the fallback: once the agent has checkpointed, the bundle replaces Pi's summary; otherwise the bundle as of the last checkpoint and your messages since follow it. Where the Freeflow store exists, a Pi session gets the task menu and your rules with its first turn, the footer shows the task it holds, the store syncs after a run that changed it, and the hold is released when the session ends. Track Work'sdiscussion listreads Pi's session file along its active branch. -
Track Work's planner sizes each Slice from the files it will add or change (
Size: <n> files) and the measured cost per file of past Slices, so a large Slice is no longer planned as the median one.slice startrecords the work repository's commit (Base),slice closecounts the files the Slice changed (Files), andslice sizeadds that count to Slices closed before. The correction starts from the first Slice with its actual, pulled toward none; a reading that found nothing no longer counts as a Slice that used nothing; andestimate --planand Discuss Work's agreement lead with the cost as a range and say what it rests on. -
Track Work's recovery view and bundle open their checks with the task folder's path, so an agent after a compaction finds the files the record names.
-
Write Docs' docs check says when a
Verified atcommit is missing because the clone is shallow, as a cloud session's may be, and how to fetch its history. -
Freeflow on Claude Code compacts only when the agent asks, with Track Work's
checkpoint --compact: the mod answers the request once, at the end of that turn, with the record in place of the conversation, then starts the next turn. The notice at 75% reminds the agent to do so; a checkpoint without--compact, before a pause or a switch, never compacts; and the agent may ask earlier, at a boundary where the conversation holds mostly finished work. -
Discuss Work's agreement reply puts its Size line last, after Technical, so the work's size stands out.
-
Track Work's guidance describes Schema 5 tasks: taking only the task your message points to from the session-start menu, the agreement in your words, Slices with one-line updates that point to their evidence, the recovery budget, the checkpoint at a safe point before a compaction or a transfer, and recovery from Freeflow's bundle. A task is kept when the work will outlast the current compaction cycle, which
estimatehelps judge, and the agent asks one question before making one, with where it goes: a project or none. Execute Work checks, when it sets the route, whether the work fits in what is left of the context. The store, projects and holds are part of its format reference. Schema 4's format and method, which Pi's Task Memory keeps, are in a reference of their own (skills/track-work/references/schema-4.md), and Pi's task-memory and compaction skills point to it. -
A stop on the route that you agreed, such as a commit, a review, a decision or a hand-over, is now called a return point, and the work agreement names it (in a Working Record, its
Back atline); "checkpoint" means only Track Work's save before a compaction. Freeflow's core prompt, Execute Work, Deliver Work, Discuss Work, Research Work, Write Docs, Review Work and Write Skill say so. Deliver Work's rule against publishing Working Records names the Freeflow store's task folders too, and lets only Track Work's script sync the store, to your own private remote. Discuss Work'schoices.mjs --recordreads a Schema 5 task'sdecisions.md, and its catch-up the current Slice's update lines. Review Work's briefs say that reading files is inspection, not a check that needsMay run. -
On Claude Code, Freeflow's checkpoint notice comes once a compaction cycle and no longer repeats every 5%: it asks the agent to keep working to a safe point (a finished step whose result it knows), then checkpoint and end its turn, and says where Claude Code would compact on its own. Before it, a one-line row shows the context's share at 50%, 60% and 70% of the window. The rows and the notice name the compaction cycle, counted for each session in the store and kept when it is resumed. A worker gets one notice in each of its compaction cycles.
-
Evaluate Behavior runs four subjects at once by default, or one per two CPUs when arms run in containers;
--jobs 1runs one at a time. Its skill gives every eval one route: count the runs,check-tasksfor a coding task, a pilot,--max-costfrom the pilot's cost per run and your yes, the batch in the background,--reuseafter a stop, and flagged runs held out until you clear them. -
Write Docs' docs check can move a stale document's
Verified atitself (docs-check.mjs <docs> --stamp), so the document goes into the same commit as the code it covers instead of a commit of its own. Feature files, which only driving updates, are left alone. -
Write Skill tries a new or changed skill on a real task before measuring it: Evaluate Behavior's new Trial mode runs one agent that keeps a friction log, which Review Work adjudicates like a review. Evaluate Behavior now asks for your yes, with the run count and estimated cost, before any run that calls a model, unless the task's agreement already covers it, and never asks a measured arm for notes.
-
Research Work's citation-support check judges the claim as the report states it: each packet carries the report's and paper's sentences that cite the claim, so a sentence that drops a condition is caught, and at publication every cited claim needs a packet, quoted or not. A paper's quote form
"the exact words" [@S3]is checked like(S3), a verdict may quote one whole short line, and a quote's passage keeps its line breaks. -
Research Work's gate checks what it used to skip: a review's numbers against the result files its register cites, even with no study plan; a review's evidence table against the source ledger; and a report or paper given on stdin (
--report -). A study or publication plan must have its method, budgets, contamination record and models before it is locked, and a lookup no longer verifies a "Part I" record for a "Part II" source. -
Research Work's guidance is in three references, one per stage (
evidence,study,reporting), instead of seven, so a stage's guidance and its formats are in one file and a route opens one or two files instead of three or four; each artifact's format now sits beside the method that writes it. -
Write Skill explains why one capability skill that routes to its references and scripts (a trunk) beats many narrow skills, keeps a trunk's body to its routing table, common route and Rules, and asks for a design record per skill in the developer docs; Write Docs adds the skill design record shape under
dev-docs/skills/. -
Write Docs keeps history in git: developer docs drop their Changes lists, and decisions cite the commit where they were made.
-
Model judges follow one rule across Review Work, Evaluate Behavior and Research Work: Research Work says what a judge needs before its answers count, a judge counts as calibrated only with a passing judge validation record (repeatability included; an advisory review needs none), and by default the judge is a different model from the one it grades, another family being optional. Literature reviews and other research that needs checked sources now route to Research Work, which still writes its report in Write Docs' Research shape.
-
Review Work's independent reviewers may run probes of the changed code on scratch copies by default, and a code Issue shows the command run and what it printed; the adjudicator reruns a Blocking code Issue's command before accepting it.
review-packet.mjsfinds the project's Review Rules when they are a## Review Rulessection of a Markdown file (check-brief.mjsrefusesReview rules: nonewhen one exists), points the reviewer at the base's copy of Review Work, reads aREVIEW.mdfrom the base so a change cannot supply its own rules, takes Review 2's diff from the previous review of the same change when reviews of several changes interleave, keeps another change's brief that has not reported, and prints the correction diff's size for Review 2. Corrections that change what a check accepts or refuses justify a focused Review 2, and a newcheck-adjudication.mjsrefuses a report until each item has an Accepted, Rejected or Open disposition with a reason (and refuses two items with one ID), and counts them for the Working Record's Review line. -
Freeflow's Codex hook delivers its guidance at a forked session's start too, as on Claude Code.
-
check-adjudication.mjsrefuses an adjudicated judgment the dispositions contradict: an Accepted Blocking item with Pass or Non-blocking. Freeflow's own sensitive paths move from its Review Rules into its.freeflow/config.jsonreview policy: a Standard review for every pull request, Deep where a built-in fires. -
Verify Work's
self-review.mjssays whether each requirement's check ran after the last edit from the session's event log where the harness keeps one: the last tool call running the check the requirements file gives (R<n> <text> :: <command>, orcheck: <command>), against later edits by the agent of the paths the requirement names. Where there is no log it readscheck --idrecords as before, and the report names the source of each. -
delegate close --outcome "sent back"requires--reason brief|capability|scope, and a delegation's History entry keeps its Settled, Check, Route and Reason. Execute Work's delegation reference chooses a worker's model through the routing table and the Route line, and Review Work's reviewer model is the table's review row (the security-tier row for the security tier) unlessreview.modelis set.
Fixed
-
With every runtime prompt off, the hook hosts still deliver the review and skills lines, as the settings page says; they used to drop them. Setup Freeflow no longer calls
skillsan unsupported key, and the settings page names OpenCode as reading no settings. -
Freeflow on Claude Code no longer sends its "continue" prompt late. After its own compaction it prompts the agent to go on only when nothing else started the next turn: a notification or message queued during the compaction starts a turn that goes on from the record itself, and the prompt used to wait behind that turn and arrive after it, sometimes long after.
-
Freeflow on Claude Code no longer loses a compaction the agent asked for with
checkpoint --compactwhen queued input, such as a notification or a message typed during the turn, starts the next turn first: the request stays until the record replaces the conversation, the next turn end tries again, and a line in the conversation says when a compaction did not run. -
Track Work measures a Claude Code session that was resumed in another folder from its newest log, instead of whichever copy it found first.
-
Track Work's recovery and Freeflow's compaction bundle find the files a task names in the repositories it changes, such as a skill or
AGENTS.md, when the session runs outside those repositories: a pointer that is in neither the task folder nor the work repository is looked up in each repository the record's Space names, where the store last saw it on this machine. An always Recovery line that names no file now gets a line in the checks, instead of being left out without a word. -
Freeflow on Claude Code gives a session your rules at its start, after the task menu: the store's
rules/and those of the folder's project and of the task the session holds. Before, a session saw them only once it took a task and recovered it. Track Work'stask here --rulesprints them for any harness layer. -
Freeflow on Claude Code takes up a store added to a session that has already started, as a repository attached to a running cloud session is, at the end of that turn: the transcript that measures Slices, a pull, the scan for a task's repositories, and the store's file permissions, which it used to leave off for the rest of the session.
-
Track Work's
validateno longer takes a session's ID, a hex word after "session" in a Slice's update line, for a commit that does not resolve. -
Track Work's
store init --remote <url>uses a folder that already holds an empty clone of that repository, as a cloud session has it, instead of refusing it. -
Discuss Work's
choices.mjs validateaccepts a decision list with no items yet, such as a new task'sdecisions.md, and its catch-up no longer lists a Slice'sPredicted:andMeasured:lines as work that ran. -
Track Work's
checkpoint --inputtakes a labelled In flight line that says onlynone(- Pending: none) as no line, instead of refusing it; a plain line under Future Work is refused with the shape a proposed Slice takes; and a Schema 5 Slice accepts theReview gateline Review Work records. -
Claude Code no longer reports a failing hook ("Cannot find module '/hooks/adapters/gemini-session-start.mjs'") at every session start: it reads Gemini's
hooks/hooks.jsonfrom the plugin's root beside its own hooks, and that hook now names its adapter so it resolves under both hosts and stays silent under Claude Code. -
Research Work's judge validation record accepts
not applicablefor Both orders when the judge rates one output at a time, so a rubric judge's record can pass; Review Work and Evaluate Behavior now say thatreview --calibrategives agreement and kappa (the interval comes fromstats.mjs), that a labelled judge is calibrated only with a passing record, and that an uncalibrated reviewer's verdict is weighed in adjudication, never obeyed alone. -
Evaluate Behavior's evaluator: a suite's decision cut short by the budget or a stop no longer claims "beats" or "worse" (its claim is
none, reasoncancelled, with the counts that ran andkthe trials that completed);--jobsand--cpu-jobshold even when a new start arrives as a slot is freed; the plan line also counts host-extension builds, which run on the host outside the seal; the transcript scan flags a host name with no dot, such ashttp://intranet, as an external network target (loopback andlocalhoststay internal), so more runs are held for you to read; judge calibration and agreement between two judges add linear-weighted kappa for0-2dimensions beside the unchanged kappa; and a decision or combined judge answer over a very long list of values no longer fails. -
skill-author compare --all-unitslists every reworded unit that is not rule-like, under "Other reworded: confirm the meaning survived" in its JSON (otherReworded) and--markdownoutput, so the meaning check Write Skill asks for after a substantial revision can reach each one; the exit status is unchanged. -
Review Work's
review-packet.mjs, run with--rootfrom another folder, names the Docs and Review rules files relative to the repository instead of the current folder, so the brief it writes passescheck-brief.mjsinstead of being refused for paths that do not exist. -
Track Work's
migrateconverts a task record written before the one Recovery list: Defined by, Read on recovery, Read when and Carry lines become Recovery lines (always, not counted,always,when <trigger>), in place, keeping the old record insources/record-before-recovery.md. Every other command refused such a record, so a task kept with an earlier Freeflow could not be recovered. -
Track Work's
delegate check-returnno longer takes a hex number inside an email address (the GitHub ID in a noreply author email), a UUID, or a folder name between two slashes of a path for a commit. Such a return was refused with "commit … does not exist", anddelegate close --outcome acceptedcould not close its delegation. A commit the return names from another repository, such as a host's source the worker pinned, is named by the coordinator with--elsewhere <hash>=<owner/name>oncheck-returnandclose: it is not looked for here, the output names it, and the History entry records it on anElsewhereline. Every other commit-shaped word is checked as before, a commit in a GitHubblob/,tree/orcommit/URL included: refused when it is not in the repository or not on the brief's branch.
Removed
- Pi's
compact_contexttool, its result index (r12), the carried copies of your latest messages, and the compaction capability skill with its summary format: on Pi the agent checkpoints with Track Work instead, and/freeflow compactasks it to checkpoint with--compact. - Pi's context reuse: tool results are no longer carried across a compaction; the bundle carries the files the agent names in its record's Recovery list. The Context reuse switch goes from
/freeflow settings, andcompaction.carryin a config still loads and does nothing. - Cognitive Routing, Pi's Coordinator, Helper and Executor profiles: their context projection, the
delegate_work,return_work,routing_unitandselect_evidencetools,/freeflow profile,/freeflow resume, theCtrl+Shift+RandCtrl+Shift+Ashortcuts, the settings rows and footer states, the routing prompt and its capability skill. A config that still setscognitiveRoutingis refused, saying the feature was removed and the key to delete, on Pi and the hook hosts. Pi now claimsforgetandrouteas possible. Routing entries already in a Pi session stay and nothing reads them. Handing work to other agents stays with Execute Work's delegation reference.
0.9.0 - 2026-10-24
Breaking Changes
- Freeflow has ten skills instead of twenty-five, and the Workflow skill is gone: its body reached the agent only when the agent opened it, which it rarely did. Its cycle (agree before building, build and verify, review and hand over), what authorizes work, and where to stop are now in the always-present core guidance as "How Freeflow Works", and each skill's description says when to use it, so no skill routes the others; the line telling the agent to open a skill by its subject rather than a keyword is gone. Workflow's other parts moved to the skill open when they matter: route preparation, re-entry when the basis changes, and Domain Skill Composition to Execute Work; work that grows, remedies that change what you own, and its Asking The User reference to Discuss Work; questions and "stop" mid-work to the Interaction Contract. Every skill that said "return to Workflow" names the skill that takes over. No removed or merged skill or command below has an alias: update links, scripts and commands that name them, including
skills/workflowandskills/workflow/references/asking-the-user.md. How Freeflow Works maps each removed name to where its job went. - Discuss, Agree Work and Decision Gate are one skill, Discuss Work (
skills/discuss-work,/discuss-work);skills/discuss,skills/agree-work,skills/decision-gateand the/discusscommand are removed. The agreement now runs before building, and the core guidance carries it: the agent reads Discuss Work at a task's first request, before its first tool call, and before the first change on a task that builds or changes behavior it sends one message with what it will do, where it stops, and your decisions, each with its default and why, then waits. It lists every choice the request, code and docs leave open, technical ones too such as names, messages and files. "Go" accepts every default, and a correction changes only the line it names. A question needs no agreement; an exactly specified change, or a run where no one can answer, counts as one, with its defaults recorded and reported; a request that merely looks clear no longer stands in for one. The choices are kept in one decision list through the task (sources/decisions.mdbeside a Working Record, where only the choices you answered become Decisions), self-review checks the work against it, and the final report shows only choices you have not seen. Discuss Work's first page covers the common path: exploring while what or how is open, the agreement, when the wait is skipped, choices during the work, asking one question, and accounting at the end. A learning action (an experiment or prototype that answers one question, shared with Execute Work) and keeping a discussion across context loss are references read only when needed. - The Action Selection skill is removed. Its description matched almost every search or command and its body was almost never opened; its one rule that reached the work, keeping tool output small and saying when it was cut, is now in the Working Method on every host, and the rest repeated the Working Method or other skills. The
/action-selectioncommand is gone. No alias replaces it. - Bypass is no longer a skill, and
/bypassis removed with no alias. Discuss Work now says what it did: when you explicitly ask to skip an optional step, such as waiting for the agreement, a plan, a review or a record, the agent skips only that, takes its defaults and reports them, still asks before a hard-to-reverse choice, and changes no authority, checkpoint you selected, or claim. When that skip must outlast the conversation and a Working Record exists, the agent records it in the Work agreement. - Commit Work, Finish Branch, Release Work and Launch Work are one skill, Deliver Work (
/deliver-work);/commit-work,/finish-branch,/release-workand/launch-workare removed. Its first page routes by situation and carries a plain commit in full: inspect, stage only what is yours, write the message, check the result. Closing a branch (a push, a merge or pull request, keeping or discarding it), a release and a production launch each have their own page, read only when that route applies. The rules the four shared, such as each route needing its own yes, never staging Working Records or secrets, and inspecting what changed before retrying a failed step, are stated once, with one stop list and one report. The commit step says to fix conflict markers or whitespace damage in the content they belong to, never to edit content just to silence the check. - Design for Depth, Simplify Code, Diagnose Failure and Migration Work are part of Execute Work (
/execute-work);/simplify-code,/migration-workand/diagnose-failureare removed, and so are Execute Work's Execute Work Edges and Domain Skill Composition references and Design for Depth's Implementation Decisions reference: what they held that nothing else did is now in Execute Work, its design reference and Track Work. Execute Work's first page is enough for ordinary implementation: a table of situations, the rules not already in the always-present guidance, what to settle before the first edit, one method at a time, where to go back when the evidence changes, and when to stop. Five references hold the rest, each read only when its situation arises: design (settling a choice later work depends on, interfaces, module dependencies, a change that keeps touching many places, and state that must survive failures), a behavior-preserving cleanup, a failure with no known cause, moving users or data to a replacement, and code practices, now read only before adding edge-case handling or a comment that explains why, which points durable rationale to the developer docs. Track Work's Checkpoint table names the skill that handles each Checkpoint when it is due. - The Handoff skill and its
/handoffcommand are removed; writing a handoff is part of Track Work (skills/track-work/references/handoff.md), opened when work pauses or passes to another session or person. Its page covers where the handoff goes (asking when that would change privacy, durability or audience), what the next context needs, and the templates. Resuming from a handoff goes through Track Work's own recovery, which now also says to check a completion, review or commit claim against its evidence before repeating it, and what to do with a handoff and no record. The Working Record format's second Checkpoint table is gone: the format points to Track Work's table and still reads the earlier type names. Update links, scripts and commands that nameskills/handoff. - Write Spec and Write Plan are part of Write Docs (
/write-docs), now for any document a reader acts on;/write-specand/write-planare removed. Its first page says how specs and plans (task artifacts kept beside the Working Record, drafted and then accepted) differ from documentation (repository files that change with the code), states the shared rules once (a document grants no permission, no invented requirements, proposals labelled as proposals, claims checked against their sources), the shared method (reader, sources, shape, self-review), and the header, status and source trail for specs, plans and decision records, with one status list for all of them:Draft,Reviewed,Accepted,Rejected,Superseded,Retired(it replacesApproved,Ready,ProposedandAbandoned). A decision record can beRetired, with the date and the reason, when nothing replaces it, and a durable decision that shapes how existing software works is also stated, with a pointer to its record, in the owning subsystem doc's Decisions section. Two references hold the rest: spec and plan shapes, with decision records as one of its sections, and documentation shapes, which holds the reader test for a new or rewritten subsystem doc or overview. Update links, scripts and commands that nameskills/write-specorskills/write-plan, or theirspec-shapes,plan-shapesandartifact-standardsreferences. - Review Artifact is merged into Review Work, and
/review-artifactis removed: use/review-work, which now reviews code and other finished work as well as documents that guide later work (specs, plans, designs, decision records, handoffs and skills). Its rules, review budget and judgments are unchanged; each kind keeps its own sources, job checks and lenses, and one reviewer contract and one adjudication reference cover both. - Evaluate Skill is renamed Evaluate Behavior (
/evaluate-skillbecomes/evaluate-behavior), and its subject is now any declared part of the agent's setup, such as its skills, instruction files, model, or host extensions and settings. Update links, commands and scripts that nameskills/evaluate-skill; the evaluator script is stillscripts/skill-eval.mjs, and definitions stay under.skill-eval/. - Evaluate Behavior definitions are schema 2, and schema 1 files no longer load: rewrite them in the new shape. A group is now a task (prompt, fixture, tools, expectations) plus a
configuration(host, model, the skill under test, and optionally Freeflow and a runtime);arms.baselineandarms.candidateeach overlay it, andcomponentnames the only paths where the two may differ, such assubject.sourceormodel.thinking. A group whose arms differ anywhere else, or that declares a difference that is not there, is refused before anything runs, andcomponent: []runs the same configuration twice to measure run-to-run variation.extendsshares one configuration file across groups. The authoring reference shows the full shape. skill-eval runrefuses, before anything starts, a run whose inputs are not committed: the definition files, the fixture, runtime bundles, and working-tree skills and context must match the repository's commit, which the result then records. Add--dry-runto run anyway; the result is marked as a dry run and supports no claim. A configuration'shost.version, when declared, must match the installedpi --version.
Added
-
On Pi, Freeflow pushes a few lines of guidance at the tool call that needs them: Deliver Work's commit essentials on a
git commitresult (with a reminder of Write Skill's loss check when the commit holds instruction text), the key lines of Execute Work's diagnose method when the same test command fails a second time, a reminder to run Execute Work's self-review when a test passes after a change, and, on the first tool result of a run while Execute Work is not in the agent's context, a request to read it (a read of a Freeflow skill does not trigger it, so reading Discuss Work first is not interrupted). The Guidance notices row under Tool Execution in/freeflow settingsturns them off for the session, for you or for the repository (toolExecution.guidanceNotices). -
Skills now come with scripts that put the facts a decision needs in front of the agent. Execute Work's
touch-map.mjsanswers what a change touches (entry points, readers, writers, scheduled code, covering tests and the developer docs covering each file, each block saying what it did not search), andself-review.mjswrites one report before the agent reports a change: status, diff stat, every changed existing test or fixture with its hunk, each new test and whether it fails on the base, and whether each requirement's check ran after the last edit. -
Discuss Work's
choices.mjschecks the decision list and renders the agreement, the hand-over's unseen choices, and a catch-up after an unattended run (defaults taken, choices waiting, what ran). -
Deliver Work's
delivery-state.mjsreports branch, upstream, uncommitted work, an operation in progress, worktrees (flagging the session's own), the latest tag, version and changelog in one read-only call;commit-state.mjstells your changes from pre-existing staged work;release-preflight.mjsandpush-route.mjscheck a release and a simple push locally without performing them. -
Review Work's
review-packet.mjsprefills a reviewer's brief, names the review gate's triggers and the round budget, and runscheck-brief.mjs. Write Docs'plan-lint.mjslists Plan steps that name no check, andartifact-check.mjschecks a Spec, Plan or decision record's status and source trail. -
Track Work's
working-record.mjs view recovergives, in one call after context loss, the resume view, each defining artifact and Recovery source with its trigger and whether it resolves, and where live Git state disagrees with the record;validatenow warns about Material updates pointers (files, commits) that do not resolve, and--strictfails on those an Evidence or Result line names. -
Evaluate Behavior can declare Freeflow's Tool Execution tools in a container subject on Pi:
bash_backgroundandmonitorrun their command in the subject's container (they need a container environment in every arm), the folder where Freeflow saves their output is readable there,stop_backgroundstops the command in the container as well as on the host, andapply_patchmay only name paths inside the workspace. Freeflow's own checks of a shell command see it as the model wrote it. -
Evaluate Behavior body groups on Pi can close and resume the subject's session between turns:
input.resume_beforenames the turns to resume before, withruntime.sessionon. -
skill-eval check-taskslists, for every group, what the task's copy lacks against the setting it came from: Git history (a workspace is never a repository), ignored files the fixture holds (a clone lacks them) or the task names (such as.env), and tools or network the task asks for but the subject lacks, with each arm's tools and network. It reports these without refusing, and still calls no model. -
Evaluate Behavior scans every run's transcript and flags reads outside the workspace and declared resources, attempts to reach an external network target, reads of instruction files (
CLAUDE.md,AGENTS.md,.claude/) outside the workspace, and hidden-test or reference-solution text in the subject's answer or files. A flagged run stays in the results but is held out of every count and decision, and stops a pilot, until you clear it withskill-eval clear <result> --variant <arm> --flag <id> --reason <text>, which records your reason beside the run and recounts every aggregate that lists it. -
Evaluate Behavior configurations can declare
network:"none"seals the subject, so its bash, declared commands and command graders all run confined with no network and none of your files, including the provider login on disk, and a group that would run declared commands or graders on the host is refused;"host"allows them on the host on purpose. Each run recordssealing(what its code could reach and where each part ran), the plan line names arms whose code would run on the host, and a declared command no longer receives the path of Pi's login directory or a login variable. -
Evaluate Behavior checks that each run shows a model at work before grading it: a run the host reported complete but with no assistant message, zero tokens, or no answer and nothing written (as after a failed login) is reported
invalidwith its reasons, never as a fail; it counts in no comparison, metric summary or decision, and it stops a pilot. Tokens are the signal rather than cost, which is zero for real work on a model with no configured price. -
Evaluate Behavior groups can run any number of named arms against a reference arm (
reference, defaultbaseline), or a single arm that measures one setup with nothing to compare (pass^k, metrics and judged scores, no comparison claim). Two-arm groups keep working unchanged. -
A suite can declare a
decisionrule before it runs (the measure, the two arms, the direction, alpha and the minimum cases): the aggregate then reports "beats", "worse" or "no difference shown" from an exact sign test over cases, and only then says "beats". A rule'strialsschedule adds trials only to cases still undecided, up to a maximum. -
Every run records metrics (duration, turns, tool calls and errors, tokens, cost, cache hit rate), and an aggregate summarizes them per arm with paired differences against the reference; a decision can use them as its measure.
-
Evaluate Behavior run metrics on Pi add
peakContext, the largest single request a run sent (input plus cache reads plus cache writes), andskillReadsandskillReadTokens, every read of a declared skill's files or of the loaded Freeflow package's skills and prompts, re-reads included, with tokens estimated from bytes. Aggregates report them per arm with paired differences, and a decision can use them as its measure. -
Judged evaluation: a group's
rubricis answered by declaredjudgesfor each run alone, blind to its arm (skill-eval review --rubric), combined by a declared rule, stored apart from run and grade files, with agreement between judges and calibration against hand labels (--calibrate).--swap-samplechecks order on a sample of groups. -
Coding tasks:
commandexpectations run hidden tests, a linter or a build on a copy of the agent's final work and pass on an exit code or named tests; areference_solutionproves a task solvable, andskill-eval check-taskschecks it with no model call, including that the unchanged task fails its new tests. -
Several participants in one run: a
conversationwith a simulated user who knows only its card, or apipelineof stages that each see only what they declare (such as two independent reviews and an adjudicator); arms may differ in their participants. -
Host extensions can be built from an exact commit or a committed folder, arms may differ in declared environment variables, and
run --source <arm>=<commit>measures an arm at another commit without editing the definition. -
A subject may use a shell only behind a declared isolation that the evaluator first proves confined with six probes, or in a container from a digest-pinned image through the standard
dockercommand; when something is missing, the run says exactly what and how to install it, and never installs or pulls anything itself. -
skill-eval rungains--jobsand--cpu-jobsfor parallel subjects and local work,--reuseto count identical earlier runs instead of rerunning them,--pilot <n>to try the first groups before the batch, and--results <dir>;skill-eval view --html <file>writes one self-contained page of a result. -
Evaluate Behavior guidance covers each eval mode, how to size and read results (claim classes, run-to-run noise, held-out cases, fair tasks, judge practice), and how to measure reviewers and other detectors on clean, seeded and real cases. Write Skill adds choosing what to change from evidence, a deletion trigger, and one authoring loop; Review Work's judge contract covers rubric judges, and its eval-definition review checks a definition before any run.
-
skill-eval review --limit <name>=<chars>sets how much the advisory reviewer is shown (each response, tool-call arguments, each file, and the task materials in total; the defaults are unchanged). The review records the effective limits, and anything cut is recorded as the contract gapmaterials truncated, because the judge contract asks for full files. -
Adds Task Memory on native Pi as a preview, off by default (the Task Memory switch in
/freeflow settings, ortaskMemory.enabled). A session attaches the Working Records it works on; Freeflow delivers the focused record's resume view when it becomes the focus and after a compaction, reload, resume, fork or/treenavigation, and refuses record writes to records the session has not attached. Projects group tasks, with records under~/.freeflow(orFREEFLOW_HOME), IDs such asmy-app/task-003and one owning session each; each task's resume view lists the project's other tasks, which the agent reads and searches when they bear on its work. Fan-out creates a child record with its own Git worktree and branch for a parallel session and gives a command to paste into a new terminal, where Pi offers to attach the child. Everything can be asked for in plain language ("list my projects", "open the retry task", "split the parser off"): the agent proposes, and anything that creates something or lets the session write opens a dialog for the user to confirm./freeflow taskand/freeflow projectcommands do the same directly. Task-memory steps and delivered resume views show as one line in the transcript and expand to the full text. Thetask_memorytool's description names Track Work and the Task Memory skill, so the tool leads to them. -
Track Work gains projects, child records, task IDs, worktree fan-out (with a start command for the host's agent) and record search as
working-record.mjscommands on every host, andview entry <ID>to read closed History entries by ID. -
On Codex, Claude Code, Gemini CLI, Cursor, and GitHub Copilot, a
promptssetting in.freeflow/config.jsonor.freeflow/local.jsonturns each of Freeflow's session-start prompts on or off:core,interactionContract, andworkingMethod, each on by default. Pi always delivers all of them. -
A
reviewsetting in.freeflow/config.jsonor.freeflow/local.json, on every host, sets when finished work gets an independent review:modeisauto(the default: Review Work's risk check decides),off(the agent only proposes a review, with its reason and cost, and runs it on your yes) oralways, andmodelnames the model a reviewer runs on. The personal file overrides the shared one field by field, andautothere returns a shared choice to the default. A setting other than the default appears in the agent's Runtime State, so the agent follows it without reading the files. On Pi,/freeflow settingssets both in the Personal and Repository scopes: the Review row cycles the mode, and Reviewer model picks from your authenticated models. -
Task Memory works under automatic Cognitive Routing: the Coordinator handles task memory with you, Helper and Executor workers only read it and put any action they need in their report, and every profile receives the focused record's resume view, also after a worker compacts.
-
Task Memory's
taskMemory.autoApproveswitches let the agent take some actions without the confirmation dialog:attach,create,env,fanoutandprojects, each off by default and set in/freeflow settings(Personal or Repository) or a config file. An action taken this way says so in the transcript. -
On Pi, the agent can put a choice that is yours to make into a dialog (
ask_user) and continue on your answer in the same turn, instead of asking in its reply and stopping: one to four questions, each with two to four options and their trade-offs, the agent's recommendation first, a row for your own answer and a note per question.Esccloses it without answering, and the agent then does not act on that choice. Without a UI the agent asks in its reply as before. Task Memory's confirmations use the same dialog. -
With Tool Execution on,
monitorwatches a command's output and tells the agent each line it prints as it happens, so it can react to a log or watcher while it runs, including after it went idle. Lines within 200 ms arrive together; a monitor ends when its command exits, after its time limit (5 minutes by default, at most 30) or withstop_background, and one that sends more than 20 messages a minute is stopped. -
On Pi, Messaging (a preview, off by default: the Messaging switch in
/freeflow settings, ormessaging.enabled) lets the agents in your Pi sessions on this machine send each other plain-text messages: ask one session to tell, ask or answer another, and the reply comes back on its own. A message reaches the other agent after its current tool calls, or starts a turn when it is idle; a session that has had no prompt yet shows it and reads it with your first prompt. A message is information from another agent, never your instruction. Ask before delivering (messaging.inbound) can hold messages for you to accept: never (the default), from outside the repository's Task Memory project, every message, or refuse all. Sessions are addressed by session ID and shown by name, and each step is one line in the transcript. Thesend_messagetool's description says to read the Messaging skill first. -
Task Memory links each repository in a project, and each child's worktree, to the project's store at
.freeflow/project, so you can open and edit its records in your editor while the agent works. The link is kept out of Git through the clone's.git/info/exclude, and made again at session start when missing. -
Task Memory can remove tasks and projects: ask the agent ("remove the trial project") or run
/freeflow task remove <ID>or/freeflow project remove <name>. A dialog always asks first, names what goes and which Git worktrees stay. Removed records move to~/.freeflow/trash/, and only you delete them for good, with/freeflow trash empty; the agent cannot. Track Work's CLI hastask removeandproject removefor other hosts, and task numbers are never reused. -
Review Work reviews two more kinds of thing: a report or record of work done (a final report, a results note, a Working Record), checked claim by claim against the outputs and files it describes; and an eval definition (a case, suite, fixture or grader), checked before its runs are paid for, for whether a correct answer can pass, a wrong one cannot, and its defects are real. It also adds a judge contract for any model whose verdict on another agent's output is used as evidence: what to record about the judge, what it must be shown, and how to combine verdicts. Before a model reviews anything, the deterministic checks that apply run first, and an adjudicated review is recorded in the task's Working Record.
-
Evaluate Behavior can run a subject with Freeflow loaded, built from an exact commit, with repository and personal settings declared in the configuration and checked by that build's own validator before anything runs; comparing two settings, such as Task Memory off and on, is one
component.runprints its plan (subjects, models, Freeflow builds) before starting, and asks on an interactive terminal unless--yesis given. Aggregates now count grade errors and run states, report pass^k per check (whether it passed in every trial) and the per-trial pairs per comparison, and name the strongest claim the counts support. Afile-textexpectation can check oneline, such as a review's first-line judgment. -
skill-eval reviewchecks its reviewer against Review Work's judge contract: it shows the reviewer the task's fixture and each run's written files in full, hides run paths and arm names, records the reviewer's model family against the subject's, and with--swapreviews again with the runs in the other order to show whether position decided the answers. -
Evaluate Behavior body groups may give the subject Pi's
ls,findandgrep, confined likeread: without a path they work in the run's workspace, and a path outside the evaluation environment is refused. A reviewer can then list the files it was given instead of guessing their paths.bashandpowershellstay unsupported. -
An eval configuration declares the host's Pi extensions and settings:
host.extensionsnames installed Pi packages by exact name and version (such as an Anthropic subscription's auth extension), andhost.settingsbecomes each subject's Pisettings.json. Both are recorded with every run and may be the compared component, so a definition can evaluate any Pi setup, not only Pi's defaults.skill-eval review --configuration <file>gives the advisory reviewer its model, extensions and settings the same way. -
Evaluate Behavior can run its agents in Claude Code as well as Pi: a configuration with
"host": { "name": "claude-code" }runs subjects, judges and simulated users in headless Claude Code, with only the declared tools, no settings, instruction files, MCP servers or slash commands from the machine, and the same confinement as on Pi. Bash runs only in a container environment, and the login comes from your environment (such asCLAUDE_CODE_OAUTH_TOKEN, whichclaude setup-tokenprints), never from a copied file. Each run records what Claude Code sent to the model, since Claude Code adds a line about itself and a note about the environment to every request. -
Evaluate Behavior accepts an optional group field
"revision": "description-only": before any subject runs, the evaluator checks that the two target skills differ only in their frontmatter description, and refuses the group otherwise. -
A Working Record can hold a Work agreement: an optional
### Work agreementheading directly after Goal, for what done looks like, what the agent does without asking, what needs your yes first, where it comes back and how long that holds (each line led byDone when,Without asking:,Ask first:,BackorHolds until), with your reply quoted.initwrites it only when its input has one, andvalidaterejects it when empty or anywhere else. Records without it stay valid, and nothing is migrated. In a record that has one, return conditions and actions that need your yes move there from Boundaries. -
Verify Work checks changes to existing tests:
test-changes.mjslists every test file, fixture, snapshot and shared test setup file that changed, moved or was deleted since a base commit, with the changed hunks, and the agent gives each one a reason (it keeps what the test checked, or follows a behavior change you agreed) or brings it to you before calling the work done;--newlists added test files. Its guidance also asks new tests to assert only agreed behavior, names signs of a test too weak to catch a bug, runs a bug fix's regression test on the unfixed code, bounds a speedup by the share of the run that changed, and treats a no-regression claim without a baseline as unproven. -
Write Docs covers a feature map: one file per user-facing feature in the developer docs, saying what the user sees and the exact steps and results that show it working in the running software, plus one shared guide for launching, checking, driving and cleaning up, and which steps cost a model call. When a project with code has no developer docs, the agent recommends creating them and waits for your yes, instead of putting that knowledge in
AGENTS.mdorCLAUDE.md. -
Verify Work uses a project's feature map when a claim needs the running software: it finds the feature files that cover the changed code, reads only those, the shared guide and its helper, drives the steps through the saved helper, and when a step fails decides whether the steps drifted, miss the claim, or the product is wrong. A product bug is reported, never written into the steps. Corrected steps are saved with the change when your agreement covers docs, and proposed otherwise.
-
Write Docs' docs check gains
--covering <path>: it lists the documents whoseCoversheader includes each path (the file, or a folder holding it), with the commit each was verified at and whether it is current or stale, so a change can find the docs it should reread. Without document arguments it searches the project's docs index, and it reports how many documents have noCoversline. -
Write Docs has a default developer-docs layout for a project that has none (
dev-docs/with an overview, thensubsystems/,features/,guides/andadr/as each is needed), proposed to you rather than created; a project with its own docs keeps them, found in the orderdev-docs/README.md,ARCHITECTURE.md, aREADME.mdindocs/. It also says which kind of knowledge belongs where: developer docs, instruction files, the task's record, or your host's memory. -
Verify Work can set up a feature map: when you want a tested way to check your software live, the agent studies the repository and writes a feature map in your developer docs (one file per user-facing feature, with the exact steps and the results to expect), a shared guide, and a helper script that launches the software in an isolated run, drives it the way a user does, keeps evidence, and cleans up. It drives every step it writes before calling it verified, marks the rest unverified, and later rechecks the map feature by feature when you ask, reporting a product bug instead of editing the steps to pass. Steps that call a model or another paid service run only with your yes, and the helper starts the software without credentials otherwise. Verify Work proposes it when a claim needs the running software and no recipe exists. This lives in Verify Work's feature map reference, not in a skill of its own.
-
Evaluate Behavior pipelines can hand a stage's whole workspace to the next:
sees: ["<stage>.workspace"]starts that stage in a copy of the earlier stage's final workspace, binary files included, so it can run what the earlier stage wrote.<stage>.filesstill delivers written files as text to read. -
Before any container starts, Evaluate Behavior checks that your container engine shares the folder the workspaces live under, and refuses with the folder and the fix when it does not. A VM-based engine such as Colima shares only your home folder by default, so a workspace elsewhere (
check-tasksuses the system temp folder) used to arrive empty and fail its graders for no visible reason. -
Execute Work covers one mechanical edit repeated across many sites: the agent edits the first site by hand, writes a script or codemod, checks that the script reproduces the hand edit on that site, then runs it on the rest and points to the script in its report so a reviewer can rerun it. A few sites, or sites that each need their own decision, are still edited by hand.
-
skill-author comparereports what a revision of skills, references, runtime prompts or AGENTS.md no longer says: with no arguments it compares the working tree, uncommitted edits included, with where the branch left the default branch, or two named refs, or a folder copy (--base) for text kept outside Git. It lists every bullet, step, table row and sentence that was dropped, moved or reworded, and exits nonzero while a dropped rule (under a Rules heading, a numbered step, or a never, always, must, only, do not or stop sentence) has no verdict in a--verdictsfile. Reasons (because, so that, otherwise, why) are protected like rules, and--all-unitsneeds a verdict for every unmatched unit in a substantial revision.skill-author validatenow lists link cycles among the references a skill reaches, and with--routing-map <file>checks that the map's row for the skill names the same sibling skills and resources itsSKILL.mdlinks. -
Write Docs' docs check takes
--driven: a covered change counts even when it was committed with the document, for feature files whose verified commit is the last live drive, so editing a feature file's text does not count as driving it. -
/freeflow settingshas Runtime prompts and Skills sections. Each row is a master switch (prompts.enabledfor all three prompts,skills.enabledfor every skill but Setup Freeflow), with Each prompt and Each skill under it opening a switch per item (prompts.<name>,skills.<name>). On Pi an off prompt is left out and an off skill is not loaded, and its command says it is off; Codex, Claude Code and the other hosts already readpromptsand now also tell the agent which skills are off, since they load plugin skills themselves. This brings back the switches 0.7.0 removed, withskills.enabledvalid again. -
Every setting has a row in all three scopes of
/freeflow settings: Session now also has Review, Reviewer model, Ask before delivering, Auto-approve, Runtime prompts and Skills, and a test fails when a setting is missing from any scope. -
Verify Work points at the project's feature map: a claim about what a user sees in a feature a feature file covers is checked by driving that file's steps, found with
docs-check.mjs --covering <path> --driven. Execute Work's self-review report lists the feature files covering the change and whether each was driven live since its code changed.
Changed
- Every skill's description is broader: it names the requests each of its references and scripts serves, in the words a request would use, and drops the "Not for" exclusions, since a skill read when it was not needed costs less than one missed when it was. The bodies of Execute Work, Discuss Work, Review Work and Write Docs list their scripts in their routing tables. Write Skill now says to keep a merged skill's triggers in its owner's description, to write as long as recall needs up to the host's 1,024-character limit, and to add an exclusion only when the read would do harm.
- The runtime prompts and the skills are one layer. Core's cycle names, at each step, the skill that holds its method in the words that skill's description uses, then the references and scripts its routing table gives for common moments, and says to read the skill's whole body before acting, even for a small change; the method itself lives only in the skills. Outside the cycle, core names Track Work (memory beyond the conversation, and its handoff reference) and Evaluate Behavior (before writing or running an eval), read when their situation comes up at any step. The Working Method keeps its five rules and Keep output small, and gives each step a one-line habit that names the skill, reference or script holding it; the evidence method it held moved into Verify Work, and reading the request and diagnosing into Execute Work.
- The agent reads Execute Work before its first tool call on a task, even a small or read-only one, instead of before its first edit: reading, searching and diagnosing are Execute Work's work too. Discuss Work is read at a task's first request.
- On Pi, Freeflow is developed and tested against Pi 1.4.0 (was 1.0.1); Pi 0.99.1 or later is still supported. When Pi compacts on its own, Freeflow now asks Pi's summarizer to keep the summary under 8,000 tokens, the limit an agent's own summary has: from Pi 1.4.0 that summary is no longer capped by Pi's reserve. Cognitive Routing's tools stay inactive until routing turns them on, like Freeflow's other tools.
- Evaluate Behavior's authoring references no longer restate the field rules its loader enforces with an error naming the field; they point to
skill-eval check-tasks, keep the rules needed while designing a group as one line each, and keep meanings, defaults and choices. - Evaluate Behavior checks expectations and a suite's decision when the definition loads, so
skill-eval check-tasks,runandnpm run check:eval-definitionsrefuse them before anything is spent, where before most became grade errors after the subjects were paid for. A kind in a group type that cannot grade it (such asresponse-textin a description group orskill-readin a body group), avariantthat is not an arm, aturnthe input does not declare, a value its grader rejects, or comparison members that are not one check is refused; so is a decision that could only exclude cases: a group without a decision arm, a measure recorded in one decision arm but not the other, an unknown metric, or a measure no group records in both arms. A group that records the measure in neither arm, such as a control case, still loads. An unknown expectation kind still loads and becomes a grade error. - Evaluate Behavior names the group's file when a suite's group fails to load (
group <id> (<file>): <reason>), in eachcheck-tasksline, and when a reference check refuses a run. - Write Skill has new rules for shaping skills: a skill's main file must be enough for the common case, with a routing table first and a reference only for a narrow, large situation; a script or tool output is preferred to prose that may never be read; skills that do one job split by type are merged; a removed or merged skill gets no alias. Before committing a substantial revision, the agent runs
skill-author compareand settles every rule it no longer states, which replaces snapshotting the old package by hand. Its five references are now two: Placement And Dependencies (where text lives, references, scripts and how skills depend on each other) and Activation And Wording (when a skill is read and how its text reads); update links to the old reference files. - Cognitive Routing's skill is split by role: the skill keeps what every profile shares, and the Coordinator's method (with one section per delegation mode) and the workers' method are the references
coordinator.mdandworker.md, replacinghelper-mode.md,executor-mode.mdandboth-mode.md. Under automatic routing each profile now reads the skill and its own reference before its first command or edit, and Freeflow refuses those calls until both are in view; a worker reads about 2,200 words instead of 3,700. Update links to the old mode references. - Setup Freeflow is one skill file: its activation-contract and host-setup references are folded in, with the unsupported config keys in one list. Update links to
skills/setup-freeflow/references/. - Rules repeated across skills keep one owner: what counts as a choice that is yours is defined once in Discuss Work, which now also owns the self-review decision check; the others point there. Verify Work's two report shapes are one.
- Review Work, Verify Work and Evaluate Behavior state each rule once and keep fewer, larger references, one per situation. Review Work's review gate is now in the skill itself, and its references are
work.md(now with the security risk lens and the work reviewer's brief and instructions),artifact.md(now with reports and Working Records, and the prompt for any independent review that is not of work),adjudication.md, andevals-and-judges.md(eval definition review and the judge contract);reviewer-contract.md,review-gate.md,report-and-record.md,security-risk-lens.md,eval-definition.mdandjudge-contract.mdare gone. Verify Work's integration, browser, performance and project-recipe references are oneruntime-evidence.md. Evaluate Behavior's core is shorter, opens with a routing table, and has five references:design-and-measurement.md,authoring.md(the definition schema),coding-tasks.md,conversations-pipelines-judges.mdandrunning-and-evidence.md. Update links to the old reference files. - An independent reviewer runs only what its brief's
May runline names, by default the project's declared checks (tests, build, typecheck) in its own copy, and Verify Work now counts that line, like your request, as covering the checks it runs. A report or Working Record is reviewed as an artifact. - An independent reviewer of work is now briefed with pointers to its inputs (the Working Record, the covering dev docs, the Review Rules, the diff range, the builder's evidence, what it may run, and where to write its report) instead of a long prompt with everything pasted in. It reads them and the reviewer instructions itself. A new script,
skills/review-work/scripts/check-brief.mjs, refuses a brief missing a line or naming a path or commit that does not exist, and the agent runs it before dispatching. In a 135-review trial this found the same defects as the pasted prompt at about 16% lower cost per review. Artifact reviews are unchanged. - The hand-over, Deliver Work's pull-request description or the final report, now carries what the agreement said done looks like against what was done, the choices the work made that nobody agreed to, each check run on the final state with its result, and the review outcome with every Rejected finding and why, built from the Working Record when there is one.
- On Pi with Tool Execution on, the Runtime State lists the Freeflow skills already read in the context (from the next prompt on, and not under routing projection), and a compaction summary names the skills read in the cycle it ends.
- Freeflow's always-present guidance now tells the agent to read a project's developer docs index and the docs covering the code before changing or judging it, so behavior the docs record as intended is not "fixed" as a bug, and to keep what it learns where it lasts: task state in the Working Record, how the project works in the developer docs, and only agent rules in AGENTS.md or CLAUDE.md. A resumed session, or a new message after a pause, no longer counts as context loss while the conversation is still in context, so the agent keeps using the skills it already read instead of reading them again.
- Agents propose and keep the Work Agreement. When the outcome, scope or endpoint is unclear, the agent says what it will do, what it won't and when it comes back, and asks once; an unanswered proposal is not agreed. The agreement grows step by step: at its edge the agent reports and proposes the next step. It is kept in the lightest place the next context reads: the conversation, the compaction summary (a new
Work agreementheading in the summary for work without a record), the Working Record's Work agreement section, and for long or unattended runs an exchange log in the task'ssources/. After a compaction or a new session the agent checks the recovered agreement against your latest direction before acting on it. A narrower instruction such as "just diagnose first" holds until you lift it, also after a compaction, and when you change direction the agent updates the Working Record's agreement before continuing. At the edge of what you agreed, it ends with the next step as a question. - Write Skill now also covers other text an agent reads and acts on: instruction files such as AGENTS.md or CLAUDE.md, system or runtime prompts, tool descriptions, subagent briefs and judge prompts. Its method applies to them as to skills, apart from what concerns a skill package (the description, resource files and
validate); Evaluate Behavior returns revisions of instruction files to it. - Every judge, adjudicator and simulated user sees run material inside fenced blocks with a fixed rule that it is evidence, never instructions; text in a run that tries to steer the verdict is reported, not obeyed. Judge prompts changed, so earlier calibrations do not carry over.
- Review Work's Rule against chasing a Pass now reads "Never repeat a review merely to obtain Pass"; the old "Never review until Pass" read literally as forbidding review before a Pass.
- Review Work judges from evidence the reviewer can recover itself: when it can run an authorized check or read the code, it judges from what it observed, so a check the author skipped and the reviewer has since run is no longer reported as Needs evidence. On Haiku this let correct changes proceed in 91% of reviews instead of 77%, with defect detection unchanged.
- Track Work recovers a Working Record after context loss from its
resumeview, which now ends with a one-line index of closed History, and opens only the History entries the next action needs, instead of reading the whole record. On a long task this loads a fraction of the record. - Codex, Claude Code, Gemini CLI, Cursor, and GitHub Copilot now receive Freeflow's Working Method (the rules every task keeps, a one-line habit for each step naming the skill, reference or script that holds its method, and keeping output small) at session start, as Pi already did. It adds about 600 words to the session-start context.
- On Pi, Freeflow's tools drop the
freeflow_prefix, which models confused with/freeflowcommands: Cognitive Routing'sfreeflow_delegate,freeflow_return,freeflow_unitandfreeflow_projectare nowdelegate_work,return_work,routing_unitandselect_evidence, andfreeflow_compactiscompact_context. Sessions saved earlier keep working: their history keeps the old names, and routing and compaction still read it. - On Pi, a background command's exit and
/freeflow compactnow reach the agent as Freeflow's own messages, shown as one-line rows, instead of as messages from you. Freeflow's part of the system prompt now stays the same on the turns they start; working around the Pi issue that dropped it was why these were sent as your messages. /freeflow settingson Pi reads at a glance: each capability's switch is its section's row (no more "Enabled" rows under every section), values readonin green andoffin red, marked(inherited)when the tab you are in does not set them (the help line says from where), and a setting whose section is off is greyed with a line saying it takes effect once that switch is on, while it can still be set up. Sections run Freeflow, Compaction, Tool Execution, Task Memory, Messaging, Cognitive Routing. Pi's footer readsfreeflow: on, orfreeflow: on (all capabilities off), instead offreeflow: active; with Cognitive Routing on it shows routing's profile, control and mode. Settings lists every setting, its key, values and default, what Freeflow turns on by default, and how to read the footer.- Tool Execution is on by default on Pi whenever Freeflow is enabled: its working guidance, file tracking, clearer edit errors,
apply_patch, background commands and monitors. Turn it off with"toolExecution": { "enabled": false }or in/freeflow settings. Task Memory and Messaging stay off by default. - On Pi, Freeflow's notices to the agent (compaction, background exits, monitors, changed files,
/freeflow compact) are marked with a<freeflow-notice>tag instead of the[Freeflow notice, not from the user]prefix; Pi gives the model every such message as the user's, so the tag is what tells it otherwise. Your own messages that compaction carries over stay yours: they are quoted inside the notice in<user-message>tags, which nothing else in it can open or close. Compaction's warnings and recovery message, and the changed-file notice, now show as one-line rows that expand, instead of the full text. - Evaluate Behavior runs every subject and reviewer in its own home, temporary directory and Pi agent directory, with only the declared model's provider login copied in and removed when it exits. Your own Pi settings, such as the default thinking level, retries and compaction, no longer affect eval runs; Pi's defaults and the definition apply instead, so results from before this change may differ for that reason. A login close to expiry is refreshed once, by Pi itself in your own agent directory, before the batch and again whenever one has under 30 minutes left, so no run refreshes and rotates its copy and you are not asked to log in again unless the refresh itself fails.
- Review Work's independence rule now says what the research supports: an independent review needs a separately selected reviewer in a separate context, repeating a review with the same model adds no independent vote, and a reviewer from a different model family changes what gets flagged without a measured gain in real defects found. Reviews record the reviewer's model and family.
- Evaluate Behavior rejects, before any subject runs, an expectation field its kind does not define (a misspelled field was silently ignored before) and a group with no expectations and no review questions. A run whose selected checks are all unavailable now exits nonzero, because it observed nothing.
- Verify Work's performance guidance asks for more before a comparison is trusted: write the expected claim sentence before measuring, count failed and non-success results, confirm the timed work actually ran, name no winner against a side left on default settings, and alternate the sides over at least five runs each, reporting median and range. A claim that nothing visible changed needs an image diff against the saved baseline.
- Review Work decides at the end of the agreed work whether an independent review runs, by a review mode you can set as
"review": { "mode": ..., "model": ... }in.freeflow/local.jsonor.freeflow/config.json. With no mode (auto), the agent dispatches a review when the change touches security, auth or secrets, data loss or migrations, CI or release files, a public interface, a path your Review Rules mark sensitive, or anything your agreement names;offproposes such a review with its reason and estimated cost and runs it only on your yes;alwaysreviews every time. The agent records that decision, and each review's outcome counts, in the Working Record. Its self-review now lists the choices the agreement did not settle, marking which ones are yours to decide, and justifies every change to an existing test, fixture or setup. Reviewers may run the project's read-only checks (tests, build, typecheck) in their own copy when your saved evidence is missing or unconvincing, tag defects the change did not introduce as Pre-existing (never blocking), report a defect's class and where else it occurs, and in rounds 2 and 3 review only what changed since the last round. A rejected security finding goes to you. Briefs and reports are kept in the task'sscratch/reviews/until you delete them. A claim that a change is safe now grades how its one deciding fact is known, from asserted to reproduced in the app. Freeflow's core guidance names the path from self-review through the review gate to the hand-over. - Execute Work's design reference looks for designs where the obvious edit from one file is wrong for the rest: state with two writers, two supported ways to do one task, internals importable from outside their module, and lists kept in step by hand. When two writers share one file, key or record, it first asks whether each can write its own and the results be combined when read, and serializes them only when one shared target is required.
- Execute Work's diagnose reference asks, before a fix adds a guard, whether the failing state is allowed at all, and corrects what produced it when it is not; once the cause is supported, it looks for the same fault elsewhere, and when the deciding fact was hard to find it proposes a cheap always-on signal that would have shown it. For performance it reduces a large profile, trace or heap snapshot to a queryable form before reading it, treats a frame without a source mapping as not yet a diagnosis, and tries the cheapest kind of fix first, from dropping unneeded work to making it faster.
- Deliver Work gives a pull-request description a shape when the repository has no template or convention: a short briefing that says why the change exists, what changed, its scope and what it leaves out, what else it could affect, and how it was verified. A repository's own template or convention still comes first.
- On Pi with Tool Execution on, each of Freeflow's tools now says when to use it at the start of its own description:
bash_backgroundfor servers, watchers and commands over two minutes (shorter ones stay inbash), with no polling of its output file;monitoronly to act on lines as they appear, andbash_backgroundfor a single ready or finished signal;stop_backgroundonce nobody needs the command.apply_patchis for several files, or for adding, deleting or moving files with other changes, andeditfor one existing file; its description used to say to use it for any edit, against the prompt. The Tool Execution prompt section drops the lines these descriptions now hold, so the always-sent text does not grow. - Each skill's description now says when to use it in plain words. Task Memory's drops its "on Pi" preamble, since Freeflow lists it only while it is on. With the cycle in the core guidance, fifteen fewer descriptions and broader ones for the ten that remain, the always-present text on Codex and Claude Code (the three runtime prompts and the skill descriptions) goes from 3,211 to about 3,350 words (
wc -w); on Pi with every capability on it is about 5,550. - The Working Method has a new "Keep output small" section for every host: cap searches and command output, say when output was cut (a capped result does not show that nothing else matched), and save long output to a scratch file and query it instead of rerunning the command. On Pi, Tool Execution's prompt no longer repeats this, so it is stated once. When the agent lists what a change touches, it now decides for each thing whether it changes too because the goal needs it, or whether its users must still get exactly what they get now; the request not mentioning something is no longer a reason to leave it out.
- Under Cognitive Routing, the Coordinator takes names, messages and other contracts that the request and repository leave open to you before delegating, instead of fixing them in a worker's assignment, and writes your own decisions and changes to the Work agreement into the Working Record itself, so they are no longer held as "noted, not recorded" until a worker returns.
Fixed
- On Pi 1.2.0 and later,
/freeflow resumeof a worker's assignment sent its first request on the Coordinator's model: Pi now prepares runs an extension message starts, and Freeflow prepared the resumed run a second time, which returned control to the Coordinator. - On Pi 1.2.0 and later, a run started by a background exit, a monitor event or another session's message dropped the system-prompt sections other extensions set only for prompts (such as Pi's MCP server list), which changed the cached prompt; it keeps them again. Freeflow's own sections on such a run now follow what Freeflow set for it, so a change made since the last prompt reaches that run.
- A Freeflow skill command (
/review-workand the others) entered while Pi was working, and on Pi 1.2.0 and later also while a run was starting, failed with "Agent is already processing"; it now waits and runs when the current work ends. - Evaluate Behavior refuses
hostinside a configuration'sruntime. It was accepted and overrodehost.namefor the subject while the run usedhost.name, so one group could run on two hosts; the host isconfiguration.host.namealone. - Evaluate Behavior: a Pi run in which an extension starts a turn between prompts (Freeflow's notice that a background command exited or a monitor printed) is recorded in the turn before it; before, it ended the run as a protocol error. A command Pi stops in a container (a timeout or abort) now stops in the container too, and a
writeto a path starting with~is checked at the home directory it resolves to, where before it could write outside the workspace. - Evaluate Behavior: in a container environment, the subject's bash and its file tools now agree on paths. Bash ran at the container's
workdir(such as/testbed) while Pi reported, and itsread,writeandedittools used, the workspace's host path, so an edit to a/testbedpath failed with ENOENT and bash could not find the stated working directory, pushing subjects to rewrite files through bash. The workspace is now mounted at its host path, where bash and declared commands start, andworkdiris a link to it, so the image's references to it, such asGIT_WORK_TREE, still work. An image must now have itsworkdirempty or absent. - Evaluate Behavior: in a container environment, the subject's bash can run its skills' scripts. Each declared skill, context file, runtime resource and Freeflow's package is mounted read-only in the subject's container at the path the subject was given, so a command such as
node <skill>/scripts/test-changes.mjsworks; before, only the workspace was mounted and the path did not exist. - Evaluate Behavior: a link the subject makes in its workspace, such as a CLI an installer links into a scratch prefix, is recorded as a link with its target and never followed, instead of failing the whole run as infrastructure and losing its transcript. A fixture's or skill's relative link is now copied as it is; it used to be rewritten into an absolute link and refused.
- Evaluate Behavior:
--reusecan count a run made without it. Every complete canonical run is now indexed; before, only runs made with--reusewere, so a pilot run on its own was run again as a new trial. - Evaluate Behavior: each result's
summary.jsonrecords its own cost (cost.spent, with how many subjects ran and how many have no measured cost, including a run that used tokens at a cost of 0, as on a model Pi has no price for), and an aggregate lists each trial's cost. A trial'sbudget.spentused to be the whole run's running total, which read like that trial's own cost; the summary now names itbudget.runTotal. - Track Work: creating the first inline task record works in a repository whose only matching ignore rule is directory-only, such as
.freeflow/*/in a fresh clone of Freeflow. Before, it failed with "Record path is not ignored by Git" because the tasks folder did not exist yet. - Evaluate Behavior: in a container environment, a subject's declared commands (
run_command) run in its container, asbashdoes, instead of on the host, and the container starts for a group that declares commands withoutbash; graders already ran in the image. - Evaluate Behavior: judges and the pairwise reviewer run with the evaluator's Pi defaults (automatic retry and compaction off) under their declared settings, as subjects do.
- A trial aggregate counts a trial whose grade file is unreadable, or a check that could not be graded, as unavailable for that check, so a check no longer reads "passed in every trial" over fewer trials than ran.
- Cognitive Routing no longer trusts an entry Pi holds in memory but never wrote to the session file just because the current branch matches the file; after such a match, moving to that entry's branch is blocked until the history can be verified, instead of proceeding as if it were saved.
- Cognitive Routing: when the Coordinator requests an evidence recovery while an assessment waits for new user input, the assessment keeps waiting for that input after the recovery returns, instead of resuming on its own and skipping where unseen evidence should be placed.
- After Pi compacts on its own, Freeflow's next compaction keeps the files read or changed in the part of the history Pi kept unsummarized in its session-wide file lists; before, those files dropped out of every later list.
- Compaction notices and carried files: a Coordinator under projection is told at compact now that Pi also compacts when a request overflows the model's window, as other agents are; a carried file that ends with a newline no longer gets an extra empty numbered line, and a carried file whose last line looks like Pi's partial-read note is numbered like the rest.
- The prompt-cache keep-alive no longer replays a request on Sign in with ChatGPT after you switch to it from an API key on the same model during a hold; the route rejects replays, so the hold now stops instead of sending one.
- Track Work works in a repository reached through a symlinked directory (such as macOS
/tmpor/var). Before, it refused every command there because its Git ignore check compared a symlinked path with Git's resolved one. - Claude Code now receives Freeflow's whole session-start context. Claude Code caps each hook's context at 10,000 characters and shows longer output only as a short preview, so Freeflow now delivers each prompt through its own hook, and also at the start of forked sessions.
- Codex now runs Freeflow's session-start hook. Since 0.7.1, Codex loaded Freeflow's skills but none of its hooks, because it ignores hooks in a plugin that carries the Agent Plugins manifest the other hosts need. Codex now installs Freeflow from its npm package, which leaves that manifest out, and the hook raises Codex's context limit so the whole context fits. After upgrading the
freeflowmarketplace, approve the Freeflow hook in Codex's/hooks; Codex skips it until you do. - Freeflow no longer goes silently inactive on Codex, Claude Code, Gemini CLI, Cursor, and GitHub Copilot in a repository whose
.freeflow/config.jsonor.freeflow/local.jsonhastoolExecutionorcompactionsettings, such as those written by/freeflow settingson Pi. The session-start hooks now check configuration with the same validator as Pi, and an existing invalid configuration file now produces a short configuration error naming the file instead of no Freeflow context. /freeflow settingsshowed Cognitive Routing's Context projection asoff (default); routing turns projection on by default, and the screen now says so./freeflow settingsoffered every thinking level for a Cognitive Routing preset (offtomax) on any reasoning model; it now offers only the levels Pi's model data gives that model, such aslowtoxhighfor grok-4.7./freeflow enableand/freeflow disablereported success even when.freeflow/local.jsonor a session override still decided otherwise, since they write only the repository file. They now say which setting still wins.- Under Cognitive Routing, a Coordinator in executor mode could run commands and edits itself because it never read the routing skill, and after a compaction neither profile read it again. Each profile's commands and edits (also from codemode) now wait until it has read the skill, and the refusal names the file to read.
- With Cognitive Routing on, starting Pi with
--modelor--thinkingholds routing until/freeflow profile auto, as designed, but the footer gave the reason asacknowledgment_unclassified; it now readsstartup_selection, and the Cognitive Routing page explains the hold. - Under Cognitive Routing, a worker whose run ended without handing its work back left the session waiting: the Coordinator saw the assignment as still in progress. The Coordinator is now told the run ended and how to continue, and the worker is told to carry out its assignment and return it, which helps after a compaction when the routing skill is out of view. While assessing, the Coordinator is told that the worker's turns in its view are the worker's. The Coordinator says a decision is noted, not recorded, until the record update returns; a message to another session marks a choice the user has not made as open; and
send_messagesays that a session nobody has prompted yet reads a message with its first prompt. - Under Cognitive Routing on Anthropic models, a notice that arrived while a worker ran (a monitor line, for example) could break the session: the Coordinator's next request put the worker's evidence between its last tool calls and their results, and Anthropic rejected it (
400 unexpected tool_use_id found in tool_result blocks). Evidence now comes after the call group. The routing skill also says a worker's background commands and monitors keep running after it returns, so a Coordinator no longer refuses to delegate a watcher. - Under Cognitive Routing, a worker whose return was blocked by a selection problem was told the report would be delivered, so it could end its turn with the Coordinator never getting it. Its receipt now says nothing reaches the Coordinator until the problem is fixed, and how.
- On Pi, two background commands started together when 15 were running could both start, past the limit of 16, and one started as the session ended could keep running into the next session.
skill-eval reviewshows the reviewer a reply shape with one entry per review question; with a one-entry example, a reviewer sometimes answered only the first question and the review failed.- Evaluate Behavior grades skill-file reads in one-shot description runs and keeps their tool activity for the advisory review; a run that loses its context observation keeps its transcript, response and usage; and one trial's unreadable grade no longer aborts the whole aggregate (it is counted as
unreadableGrades).
0.8.0 - 2026-10-03
Breaking Changes
- Replaces the Astra effort-history entry type with
freeflow-openai-effort-v1and removes the old Astra provider-support import paths. Existingfreeflow-astra-effort-v1entries are not replayed or migrated; the next supported request starts a fresh effort chain. - Requires native Pi 0.99.1 or later for the Pi extension; Pi 1.0 and 1.0.1 are supported, and earlier Pi versions are no longer supported.
- Turns Cognitive Routing projection on by default. A configuration that omits
projectionnow gives the Coordinator the worker evidence it selects instead of every worker turn; setprojection: falseto keep the previous behavior. - Removes the Freeflow Context tool (
freeflow_context,/freeflow context), Context Virtualization, and Conversation History; Context Control v2 remains unavailable as a replacement. Before updating, deletecontextVirtualizationandconversationHistoryfrom.freeflow/config.jsonand.freeflow/local.jsonwherever present. Either key makes configuration invalid and blocks Freeflow activation until removed; no automatic migration occurs. - Removes Freeflow-owned PiFlow host integration and Evaluate Skill's PiFlow runtime selection; use native Pi for Freeflow's Pi extension. Existing PiFlow installations and state are not changed or automatically uninstalled.
- Removes Cognitive Routing evidence refs to assistant messages (
ctx:<entry>on an assistant message andctx:<entry>#text); only tool results can be selected as evidence, and worker narration belongs in the report. Assistant selections saved in existing sessions are no longer delivered to the Coordinator.
Added
- Extends cache-aware effort-history adaptation from GPT-6 Astra to GPT-6 Luna and Sol on qualified OpenAI Responses and OpenAI-Codex Responses routes; provider cache hits, billing savings, and model-quality improvements remain unguaranteed.
- Adds experimental native-Pi Tool Execution, off by default: a layer over Pi's own tools with guidance on working in the environment, platform and shell facts, file tracking that refuses to overwrite a file the model has not read and names files changed behind it, edit errors that show the closest lines,
apply_patchin OpenAI Codex's format (grammar-constrained for GPT-5 and later on OpenAI endpoints), andbash_background/stop_background, which notify the model when a command exits.bashrefuses a trailing&and a foregroundsleepof 10 seconds or more. - Adds Freeflow compaction on native Pi, on by default: Freeflow warns before Pi's own limit, the agent compacts at a safe point with
freeflow_compactfrom its own summary, Working Record, and carried files and tool results (numbered by line), and the same run continues from a recovery message./freeflow compactasks for a compaction now, and/freeflow statusshows the cycle and the context against each threshold. Pi's own compaction stays on as the fallback, with Freeflow's instructions and state added. Under Cognitive Routing, workers compact mid-assignment and the Coordinator delegates compaction. Configure it withcompaction.enabledandcompaction.carry. - Adds a Working Method section to Freeflow's prompt on Pi: how to approach, check, and report work.
- Warns once when back-to-back requests to the same model and effort repeatedly miss the prompt cache with no compaction, navigation, reload, or model change in between, and shows the warning in
/freeflow status. - Warns when a Cognitive Routing worker preset costs as much per input token as Coordinator or more, or shares Coordinator's model at a different effort on a route that does not keep the prompt cache across effort changes.
- Keeps a Cognitive Routing Coordinator's prompt cache reachable after a worker run: when the worker's turns push the Coordinator's previous cache entry past the provider's lookback window, Freeflow places a cache breakpoint on that entry on Anthropic Messages and GPT-5.6+ OpenAI Responses routes. The ChatGPT Codex backend needs no breakpoint and is not changed.
- Keeps a suspended Coordinator's prompt cache warm while its delegated worker runs, on models that declare a cache lifetime and prices, by replaying its last request with a one-token output cap. A hold stops when the worker returns, the run ends, a refresh stops reading the cache, or after 6 hours or $2; refreshes are recorded as
freeflow-cache-keepalive-v1session entries. The ChatGPT Codex backend is excluded because it rejects output caps. - Advises
PI_CACHE_RETENTION=longonce and in/freeflow statuswhen the Cognitive Routing Coordinator's model has a longer prompt-cache tier than the host uses; Freeflow does not change retention. - Adds a prompt caching guide covering provider cache behavior, what Freeflow adds to requests, how it keeps them cache-safe, and the rules for changing request assembly.
- Adds Track Work
slice record, which records a Slice that finished before it could be recorded directly into History withOccurredandRecorded: retroactively on <date>, without closing a live Slice or supplying placeholder fields. Working Record commands also accept an absolute--recordpath from any directory. - Adds the Write Docs skill (
/write-docs) for documentation of how existing software works and why: which document serves which reader, adaptable shapes for overviews, subsystem docs, folder READMEs, and user guides, correcting documentation in the same change that makes it wrong, and adocs-check.mjsscript that reports missing named paths and documents whose covered code changed since they were verified. Execute Work, Track Work, and Workflow point to it where documentation matters. - Gives each Track Work task a
scratch/directory for temporary work, created byinit; with Tool Execution, the guidance puts scratch files there when a Working Record exists. - Ships a
NOTICEand the Apache-2.0 license text for theapply_patchcode ported from OpenAI Codex.
Changed
- Turns Cognitive Routing off for the session, visibly in
/freeflow settingsand the footer, when you pick a model or effort in Pi itself (/model, Shift+Tab, or a virtual model) instead of leaving it in a hidden inactive state./freeflow profile autoor a profile hold,Ctrl+Shift+A,Ctrl+Shift+R, or the Session switch turns it back on and returns control to the automatic Coordinator. - Separates user and developer documentation.
plugin-docs/keeps the user docs; the developer pages move todev-docs/: architecture (nowdev-docs/README.md), prompt architecture (dev-docs/subsystems/prompt-assembly.md), skill routing, performance, the release process, and decision records. Cognitive Routing, Pi integration, and prompt caching are split: their user pages stay, and their internals move todev-docs/subsystems/cognitive-routing.md,dev-docs/subsystems/pi-extension.md, anddev-docs/guides/prompt-cache.md. Links to the old developer pages break. - Keeps Freeflow's own work on each native Pi request, turn, and session start from growing with session length: routing history replays in one pass, the session branch is walked once per change instead of dozens of times per prompt, request history and routing attribution reuse Pi's session projection instead of re-hashing the conversation, each message in a routed view is rendered once and reused, history and GPT-6 effort records are written only when their state changes, compaction measures context from the turn's own usage, and session checks read only the entries appended since Pi loaded the file. On a 24 MB routed session Freeflow's added time per prompt fell from about 28 to 14 ms with routing and its startup from about 180 to 50 ms; with 8,000 messages in live context, routing's per-request work fell from about 73 to 25 ms. A disabled repository no longer adds routing provenance, and GPT-6 effort adaptation stays off when a configured repository disables Freeflow. Requests sent to the provider are unchanged.
- Replaces
/freeflow settingswith one screen: Session, Personal, and Repository scopes switched with Tab, switches that change in place (three-way switches cycle inherit, enabled, and disabled), and the source of each value. The Session scope can also override Cognitive Routing, projection, Tool Execution, Compaction, and Context reuse. - Leaves OpenAI's Sign in with ChatGPT route (Pi 0.99 and later) untouched: no cache breakpoints, Coordinator keep-alive, or effort-history rewriting, which that route rejects. Cognitive Routing presets that switch effort on that route warn that it keeps a separate prompt cache per effort.
- Allows Cognitive Routing tools only as direct calls, not from codemode scripts; other tools a script calls are admitted under routing like direct calls.
- Tightens shipped guidance: Track Work recovery confirms that a pointed-to Working Record belongs to the current work before reading its sources, the Interaction Contract reports that something happened only from a source that would show it, and the routing, Workflow, Verify Work, and Evaluate Skill guidance carry refinements from agent-behavior research.
- Lets native Pi sessions override the Cognitive Routing delegation mode and stage any profile preset, while showing the effective mode in the footer without changing repository or personal configuration.
- Resumes a Cognitive Routing worker run automatically when a crash or reload interrupted it and no new user input has arrived; reopening an idle session only notes that an unchanged assignment can be resumed.
- Shows prompt-cache diagnostics (Coordinator keep-alive, context replay, and the GPT-6 effort baseline) on the
prompt cacheline of/freeflow statusinstead of the footer, which now shows only current Freeflow settings. - Shows the Coordinator only the tool calls of worker turns it did not select, so another model's reasoning no longer arrives as text, and gives each completed worker run one provenance note.
- Shares a Cognitive Routing profile's private reasoning with another profile only where both would send the same request: a turn produced on the receiving profile's model and under the same view. Otherwise each profile sees only its own reasoning, the Coordinator never receives worker reasoning under projection, and OpenAI function-call items are unpaired where their reasoning is withheld.
- Applies Cognitive Routing profile changes made while Pi is idle (manual holds, releases, and session presets) to Pi's model when the next prompt is submitted; the footer shows the pending model until then, and a model picked in Pi's own picker cancels it.
- Writes no Freeflow session entries before a session's first prompt, and records routing control and session setting changes made between prompts as one net change at the next prompt instead of one entry per switch.
- Has Cognitive Routing workers select evidence and submit their return in the same response, correcting reported problems with a return retry, instead of spending a separate request waiting for the selection receipt.
- Refuses a new Cognitive Routing assignment while attached evidence recovery is open, and refuses cancelling recovery or closing a unit while a worker run for that work is unresolved.
Fixed
- Stops trusting the session file as verified after
/reload, which keeps Pi's session in memory without re-reading the file; an entry that a failed write left only in memory now blocks Cognitive Routing instead of being treated as persisted. - Keeps Cognitive Routing correct on Pi 0.99 for runs that an extension's message starts: the run is handed to the Coordinator before its first request instead of waking an idle worker.
- Explains a Cognitive Routing recovery refusal when a context ref is passed as a captured result id: the ref belongs in the request, where the worker selects it as evidence.
- Preserves Pi's historical system-prompt and tool timeline by contributing Freeflow guidance as a structured section and composing the full request transcript rather than forcing a replacement system head.
- Keeps Cognitive Routing manual-hold and automatic-release shortcuts in step with the host model: requests run in order, the next manual hold is chosen from the latest state, and a profile is recorded only after its model is applied.
- Applies the same ordering to Cognitive Routing resume, session presets, rebinding, re-enabling, and navigation, so a failed model switch records nothing; a manual hold whose model was changed outside routing is reported once and shown in the footer instead of being overridden.
- Corrects the Cognitive Routing skill: profiles on the same model reuse the prompt cache only at matching effort or on routes that keep it across effort changes (currently the supported GPT-6 routes and Claude models that take per-message effort).
- Delivers evidence reused from an earlier assignment where it was selected, so a returning Coordinator request extends its cached prefix instead of rewriting it.
- Delivers evidence that an attention view left out where the assessment resumed, so the resumed Coordinator request extends its cached prefix instead of rewriting it.
- Keeps Freeflow runtime state and GPT-6 effort history at their original positions after
/treebranch navigation with a summary, so the request after the branch point reuses the cached path instead of rewriting it; only compaction starts a new history. - Counts cache writes in prompt-cache health checks and compares a Cognitive Routing profile that resumes on its own model with its previous request, so write-heavy and handoff misses are reported.
- Fixes the Cognitive Routing profile-cycle and automatic-release shortcuts, which read a stale model and took several presses to switch.
- Sends the Freeflow system section even when Cognitive Routing fails at a session's first prompt.
- Stops the Coordinator keep-alive from replaying Claude requests that use budget-based thinking, which a one-token replay cannot refresh.
- Keeps the Coordinator's cache anchor when a Claude request ends with a mid-conversation system update.
- No longer warns that a same-model Cognitive Routing preset at a different effort loses the prompt cache on Claude models that take per-message effort.
0.7.3 - 2026-09-16
Added
- Adds an optional Cognitive Routing Helper profile and
executor,helper, andbothdelegation modes with mode-aware presets, manual holds, durable worker-specific continuation, and shared worker history. - Adds cache-aware Pi request assembly and qualified Astra effort-history adaptation; provider cache hits, billing savings, and model-quality improvements remain unguaranteed.
- Adds attached Cognitive Routing evidence recovery with exact-path reads, preserved original reports and assessments, separate supplements, explicit cancellation, and direct selection of eligible occurrence-linked evidence refs.
- Adds session-only Cognitive Routing profile presets for Coordinator and enabled workers with complete model/effort pairs, inheritance, reset, and local/shared configuration isolation.
- Adds a practical Freeflow user guide for prompting, skill selection, Workflow and Track Work management, settings, Cognitive Routing presets, and evidence and cost boundaries.
Changed
- Clarifies mode-aware Coordinator/Helper/Executor ownership, implementation boundaries, evidence projection, recovery, and Coordinator assessment responsibilities.
- Batches worker evidence selection during return preparation while preserving saved reports, unresolved evidence, and handoff limits.
- Repositions Freeflow around Memory, planned Context, and Compute, and expands Cognitive Routing and PiFlow documentation with qualified preset and cache-reuse boundaries.
Fixed
- Clears session-local Cognitive Routing manual-hold state before validating a newly bound session.
- Clarifies evidence-selection operation shapes, remove-only withdrawal reasons, and the distinction between eligible result bodies and routing controls.
- Prevents pre-prompt
/reloadand Cognitive Routing preset changes from blocking on Pi's not-yet-materialized session file. - Preserves Astra effort-history replay across temporary model round trips and reloads when the qualified request lineage remains compatible.
0.7.2 - 2026-09-11
Breaking Changes
- Consolidates experimental routing reads into
freeflow_project inspectwith scoped candidates andfreeflow_unit inspectwith current/history/detail views; earlierlist,status, andhistoryoperation names are no longer advertised or accepted. - Replaces the experimental Cognitive Routing switch/boundary protocol with Coordinator/Executor assignments, separate delegate/return/unit/projection tools, and
projection/thinkingconfiguration. Old experimental configuration and tools are not migrated; redesigned PiFlow routing and composition with legacy context transforms remain unavailable pending qualification.
Added
- Adds exact assistant-visible-text evidence refs, bounded saved-work detail/history recovery, snapshot-based inspection pagination, and explicit target limitations in expanded routing output.
- Adds saved-report retry, explicit same-unit assignment replacement, strict read-only session acknowledgment reconciliation, and assessment-preserving evidence projection with attention suspension and restoration.
Changed
- Retires the old experimental routing source and tests into the historical archive, adds replacement-contract regression suites, and cleans generated extension output before building.
- Shows live routing tool arguments in a six-line trailing preview with full expansion, and replaces internal collapsed receipt labels with readable operation outcomes and evidence counts.
- Clarifies Cognitive Routing's Coordinator/Executor assignment boundary, design-decision transfer, selective evidence projection, and Coordinator assessment responsibilities in the shipped guidance.
Fixed
- Limits normal evidence inspection to usable candidates and removes source-content previews, while preserving saved-selection diagnostics.
- Preserves delivered-user identity across native compaction and explicit resume, so stored-but-undelivered history does not interrupt an outstanding Executor assignment while genuinely new input still does.
- Keeps streamed routing contracts and reports visible in collapsed receipts; limitations and replacement reasons remain available in expanded views instead of obscuring current prose.
- Preserves source attribution throughout routing request views and complete report metadata during handoff/recovery; excludes routing controls from new evidence selections, clarifies inspection counts and historical discovery, and distinguishes invalid lookup refs from unavailable work.
- Preserves admitted routing communication and active evidence across closure, replacement and attention; removes duplicate runtime communication and selection no-op churn, preserves identical-call receipts, indexes native exchanges, and streams long-session reconciliation with explicit resource limits. Request planning no longer treats base64 as text or a model output maximum as an invariably reserved allocation.
- Reconciles native routing navigation and explicit assignment resume, guards stale session operations, preserves evidence withdrawal details and cross-model tool-result carriers, and reduces history replay and routine journal writes. Routing tools now show readable receipts and role-appropriate controls.
0.7.1 - 2026-09-04
Added
- Adds Agent Plugins 1.0, Gemini CLI, Cursor, GitHub Copilot/VS Code, OpenCode v2, and Hermes distribution metadata or compatibility over the same canonical 25-skill tree, with Kiro compatibility through the portable Agent Plugins skill surface.
Changed
- Separates shared runtime-context rendering from Codex, Claude, Gemini, Cursor, and Copilot/VS Code hook adapters while preserving existing Pi/PiFlow capability boundaries and lifecycle behavior.
Fixed
- Aligns OpenCode v2 skill configuration, Gemini lifecycle matching, and Copilot session-start context output with their documented host contracts.
0.7.0 - 2026-09-03
Breaking Changes
- Removes Freeflow's selectable modes, mode commands, session mode state, and
defaultModeconfiguration; all work now uses one adaptive Workflow. - Removes the
interactionContractandskillsconfiguration toggles. The separately editable Interaction Contract and 25 base skills are always present whenever Freeflow is enabled, while optional capabilities remain independently gated. - Replaces the current Schema 3 Track Work package with compact Schema 4 Markdown task memory and lifecycle commands. Existing Schema 2/3 records remain untouched and require a later explicit migration.
Added
- Adds Cognitive Routing support to normal Pi through its official model, thinking-level, model-registry, and session-entry APIs while preserving the existing PiFlow host path, transition recovery, native-override handling, and rollback evidence.
Changed
- Refines core runtime prompts and workflow guidance with explicit authority and evidence boundaries, current-owner routing, bounded environment interactions, peer execution methods, and expanded design and skill-authoring references.
- Changes Cognitive Routing automatic control to start and return in Reasoning, keeps all substantive user-facing interaction in Reasoning while Standard transfers execution state at return conditions, adds Yield/Delegate/Act Bounded routing with model-written execution boundaries, and refreshes Runtime State only after context reconstruction or displayed-state changes.
- Reconciles the shipped skill-routing map with current direct routes and resource dependencies.
- Documents the Pi 0.84.3+ support floor and Pi 0.84.4 integration test target.
- Rewrites Cognitive Routing guidance around shared context, Reasoning-governed boundary-first routing, a persistent Delegate loop, standalone Yield, Reasoning-owned self-review, and explicitly bounded Act Bounded execution while preserving execution-boundary lifecycle semantics.
Fixed
- Keeps extension-generated Runtime State before the latest genuine user message so automatic profile refreshes cannot masquerade as user interruptions and prematurely return delegated work.
- Prevents stock-Pi model and thinking events emitted by Freeflow-owned profile transitions from being treated as native user overrides.
- Expands direct Pi skill commands through Pi’s
sendUserMessageAPI before dispatching them to the model. - Renders Schema 4 Current Work, Future Work, and History entities as compact field-list rows while preserving expanded reads, and expands Track Work operation help with fragment fields and stdin guidance.
0.6.0 - 2026-08-25
Added
- Adds a deterministic v2 Track Work runtime with strict schema-driven updates, bounded views, decision and checkpoint lifecycles, historical reopening, stale-lock recovery, loss-resistant migration and compression, candidate round-trip validation, and atomic persistence.
- Rebuilds Track Work as one complete lifecycle method for task-memory creation and recovery, Current Slice continuity, proposals, decisions, checkpoints, evidence, Notes, closure, and reconciliation while keeping exact command mechanics schema-driven.
- Extends Evaluate Skill with explicit runtime profiles, PiFlow host variants, extension bundles, prompt/context evidence, tool-call predicates, and stronger isolation and evidence safeguards for behavioral evaluation.
- Adds the Pi-only Cognitive Routing capability with standard/reasoning profiles, manual unsplit control, Reasoning-led automatic execution boundaries with Standard delegation, state restoration, runtime Control/Profile delivery, transition history, and PiFlow host integration; keeps it experimental pending behavioral acceptance.
- Adds Action Selection as a cross-host skill for bounding uncertain or broad environment interactions before choosing tools or repeated actions.
- Adds opt-in Pi-only Context Virtualization for archiving classified tool results from future model context while preserving canonical session history, with archive/restore controls and working-set policy.
- Adds opt-in Pi-only Conversation History retrieval for bounded current-branch recovery, with passage ranking, cancellation handling, and explicit recovery-policy safeguards.
- Adds committed exact-revision Freeflow development snapshots for Pi/PiFlow with provenance, atomic refresh, package validation, and isolated targets while separating Freeflow policy from PiFlow host ownership.
- Adds human-controlled release automation, pull-request/main CI, deterministic version and changelog preparation, metadata validation, tag-verified npm/GitHub Release publishing, recovery support, release-note extraction, and PR changelog declaration validation.
- Adds a canonical public documentation hub, Pi/PiFlow Getting Started guidance, versioned release evidence, consolidated ADR ownership, tracked historical project-doc archiving, and deterministic documentation validation.
Changed
- Simplifies the Interaction Contract into compact evidence-based interaction semantics: separates user goals from factual claims, answers mixed question/action turns before acting, and proceeds on clear requests without silently expanding them; adds focused baseline-versus-candidate behavioral evaluation cases.
- Scopes workflow authority by requested outcome, permitted effects, evidence boundary, and stop condition; distinguishes passive observation, active evidence generation, and mutation or delivery; and consolidates detailed policy in Workflow so mode, skill selection, usefulness, or new evidence cannot silently authorize the next action.
- Aligns discussion, diagnosis, execution, mode, TDD, verification, and review guidance with the shared authority model; separates review adjudication from remediation; moves Working Record selection to Discuss and Workflow while Track Work operates established memory; defines entry-required, activity-required, and conditional reference reads; makes child skills own their reference activation; and keeps reference filenames aligned with their visible titles.
- Moves the Interaction Contract into layered runtime prompt fragments and hides retained historical material under
.deprecated/, updating live loaders, package checks, documentation, and links. - Adds layered prompt-fragment, Runtime State, and discoverable-skill delivery with capability gating so hosts receive stable guidance and opt-in Pi capabilities through separate runtime surfaces.
- Requires silent self-review after every bounded activity—tasks, slices, subtasks, artifact revisions, and small local changes—before its result is accepted, reused, or claimed complete; keeps corrections inside the existing authority envelope and reinforces the boundary in execution, bypass, task completion, plan defaults, and pre-activation setup.
- Hardens changelog governance and tag-driven release CI with canonical category validation, released-history immutability, pre-publication release-note checks, exact artifact verification, and recovery safeguards.
Removed
- Removes the deprecated Output Router from the Pi runtime, tools, settings command, capability guidance, and active evaluation surface; it is no longer available for use. Legacy router-shaped configuration remains inert for activation compatibility, while the implementation and evidence are archived under
.deprecated/output-router/. - Removes the legacy Pi-only
/discoverand/execute-plancompatibility aliases; use/discussand/execute-workinstead.
0.5.0 - 2026-08-13
- Adds deterministic session-only Freeflow mode switching for Codex and Claude Code without restarting the conversation.
- Restores session mode across startup, resume, clear, and compact lifecycle boundaries using isolated plugin-owned state, including a bounded host-process-scoped, one-shot Claude
/clearhandoff; session controls never edit repository or personal configuration. - Supports explicit natural-language mode controls plus Claude namespaced skill invocation and Codex
$mode-contractmentions while leaving ordinary prompts, questions, and hypotheticals inert. - Clarifies configured-default scope: explicit personal/local requests target
.freeflow/local.json, explicit shared/repository requests target.freeflow/config.json, and unqualified requests ask before editing. - Keeps host-native skill dispatch and the 25-skill Codex/Claude surface while preserving Output Router as Pi-only.
0.4.0 - 2026-07-21
- Reframes Freeflow as a feedback-based control system for coding agents, with a directed Interaction Lifecycle, internal Feedback Loop, and evidence-supported exits instead of a fixed phase pipeline.
- Uses the compact Interaction Contract plus one Workflow bootstrap as runtime guidance, while keeping mode and capability state independently gated.
- Adds required repository activation, optional per-checkout personal core overrides, Pi session-mode precedence, fail-closed invalid-local behavior, and explicit delivery evidence.
- Replaces the canonical
discoverandexecute-planmodel skills withdiscuss,track-work, andexecute-work; Pi retains/discoverand/execute-planonly as compatibility aliases. - Keeps factual verification with the active agent, distinguishes silent self-review from selected independent review, and makes Pass, Non-blocking, Inconclusive, and Blocking valid review exits.
- Gives Specs and Plans separate independent Review Artifact boundaries, keeps findings non-authorizing, and requires explicit correction and focused follow-up authority.
- Adds the composite Track Work method for context-first Working Records, coherent write-ahead slice extensions, state-transition history, inert Notes, and restoration after context loss or session navigation.
- Aligns Mode Contract, Setup Freeflow, Bypass, Commit Work, migration, release, launch, handoff, branch finish, diagnosis, TDD, simplification, and design-depth methods with the feedback-based model.
- Keeps skill readiness outside subject
SKILL.mdfiles and repairs Skill Author validation for readable project-contained sibling and runtime dependencies. - Refreshes package and marketplace identity, root and plugin documentation, release/current-state contracts, activation validation, and the typed 25-skill routing/dependency map.
- Replaces the retired Skill Author and Skill Eval machinery with fresh
init,validate,inspect,run, andviewsurfaces, exact canonical evidence, deterministic baseline/candidate grading, isolated one-shot and multi-turn Pi subjects, serial batch continuation, and compact generated views. - Reorganizes the Pi extension source, tests, and generated distribution by feature while preserving its stable package entrypoint, and adds Workflow and Feedback Loop diagrams to the root documentation.
- Preserves Output Router as an explicit optional capability and keeps its existing runtime behavior and evidence boundaries unchanged in this migration.
- Leaves the adaptive candidate Unverified pending current baseline-vs-with-skill behavioral evaluation; deterministic structure and delivery checks do not establish behavioral readiness.
0.3.0 - 2026-06-28
- Adds plugin-bundled runtime context loading for mode-contract, workflow, interview-gate, discovery-light, and output-router, including Pi every-turn context injection.
- Enforces the conversation-mode boundary so mutating or consequential work requires workflow or strict-workflow mode.
- Adds the direct
/output-routerroute and exposes the Freeflow search/run/batch/status evidence surface in Pi. - Expands Output Router with observed routing, vault-wide indexing, deterministic transform/reducer routing, storage-policy dedupe, and exact recovery guidance.
- Adds proof-gated sandboxed script producers/transforms for JavaScript, Python, and jq behind explicit
scriptTransformopt-in, with no unsandboxed fallback. - Adds processing reducers for access logs, tests, diagnostics, build output, tables, MCP tools, browser snapshots, git logs, and query-aware JSON facts.
- Records Context Mode comparison evidence, storage-policy evidence, script-sandbox proof evidence, observed-routing evidence, and updated output-router release evidence.
- Simplifies runtime skill context, tightens output-router safety-policy docs, and refreshes public README/plugin docs with the workflow map and current positioning.
- Fixes Pi runtime context loading on every turn and makes the discover skill description YAML-safe.
0.2.0 - 2026-06-19
- Adds Freeflow output-router tooling for routed repo/vault evidence, noisy command routing, and exact raw-output recovery.
- Adds deterministic retrieval, command-output, optional local-index, and Codex Structured Q&A router benchmarks.
- Keeps scanner retrieval as the default backend; the no-dependency local index remains experimental.
- Keeps native post-tool safety-net routing off unless explicitly configured.
- Adds opt-in
outputRoutersetup/config guidance while preserving minimal setup as onlydefaultMode. - Replaces
research-brief,grill-context, andcapture-decisionswith the deeperresearchdiscovery skill. - Moves deprecated discovery skills to root
deprecated/skills/outside the runtime skill surface. - Updates the direct command surface to use
/research. - Clarifies
write-skillline budgets as best practice, not a hard cap for deep skills. - Adds parent adjudication and a three-pass hard cap for artifact/work review loops.
- Deepens
execute-planfor multi-slice execution, TDD slice contracts, review-failure routing, and scope-change backward edges. - Tightens workflow/review skills so non-passing reviews route to adjudication before more implementation.
0.1.0 - 2026-05-26
- Initial Freeflow package.
- Ships the accepted v0.1 workflow skill set.
- Supports Codex and Claude plugin metadata.
- Adds public workflow, skills, architecture, release evidence, and ADR docs.
- Keeps native slash handlers, hooks, and CLI enforcement out of scope.