Release notes
One line per entry, generated from the repository's CHANGELOG.md at build time — this page is an index, not a second copy. Follow the link for the reasoning, the measurements and the code behind any line.
Releases through 0.3.1 are tagged alpha; 0.4.0 is the first beta. The commands are real and tested. See what alpha, beta and stable mean.
0.16.0 — 2026-09-11
Added
tldrx run auto --retry-failed <n>— a bounded retry on a failed stage (#233)
Fixed
- An
autogate that REFUSES now writes the verdict down, sorun statussays which of the seven conditions is holding it (#230)
0.15.0 — 2026-09-10
Added
- Four Build calibrations became optional
stage.ymlkeys:attempts(default 2),fixlist_rounds(1),reviewer_share(0.25),gate_signer_share(0.25) tldrx run auto --prompt-max-bytes <n>and--max-reads <n>(#208)install:is a slot the framework runs, in every fresh story worktree, before the developer (#209)- A watcher card can now say "there is nothing to query", and be believed (#212)
run.ymlgrows an additiveoutcome:, so a run can no longer readdoneover nothing delivered (#210)- A truncated input is now told to the OWNER, not only to the sub-agent (#207)
- A turn killed on
timeout_skeeps the usage the provider had already streamed (#207)
Changed
- A stage's
timeout_snow bounds a turn a real model can finish: 900 s → 7200 s (#207) - The context ceilings stop refusing prompts the model would have read:
prompt_max_bytes163840 → 409600,inputs_max_bytes98304 → 262144 - The context line no longer quotes a window it cannot source
- A phase ceiling now holds every attempt its stages may take, so a retry is not refused by arithmetic (#170)
warn_at_pctstill fires at the same real dollars- Everything that prints "attempt N of M" reads the stage that dispatched the story
- The maintain skill says which sha a review record's
against:must name (#207)
Fixed
- The DoD-gate hook re-runs a story's commands on the STAGE's clock, not on a private 900 s constant
- A Build gate now says what the stage DELIVERED, on every gate policy — the counting existed and ran for
autogates alone (#210) tldrx shiprefuses a run that delivered no story instead of opening a PR over nothing (#210)- A story's Definition of Done exiting
127is reported as an absent binary, not as a red test (#209) - A developer may run its declared commands WITH ARGUMENTS (#209)
- A story's DoD check says which tree it ran in (#209)
- A red Definition-of-Done command's records name the FAILURE, not the last warning on stderr (#211)
0.14.3 — 2026-09-10
Changed
- A Build no longer stops because somebody else's work is uncommitted in the checkout (#164)
- The restore reinstates the INDEX, not just the files (#164)
Fixed
- The dashboard's live tests wait on the machine's clock, not a literal — the flake that blocked four merges in two days (#193)
- A live dashboard can no longer go silently stale because the OS dropped a notification (#213)
- The refusal's printed remedy no longer makes the run disappear (#164)
- A filename with a space, a leading dash or a bracket is the file that moves (#164)
0.14.2 — 2026-09-09
Fixed
- A stage's
claim-sourcescheck reads the disk it is judging, not a snapshot taken stages ago (#206)
0.14.1 — 2026-09-09
Fixed
- A training test no longer runs on the fixed 5000 ms default: the spawner heuristic now names the training shape (#194)
- The five phase ids are written out in one file now, not three, and a shape test refuses the fourth (#187)
- The changelog no longer credits a release with work it did not ship, and a gate now says so (#200)
scripts/release-check.shrefuses a rewritten released section- An auto gate now says WHY it did not close, and the reason reaches the phone (#203)
- The questions are notified before the gate that is downstream of them (#203)
- An
autogate closes itself when the thing holding it clears (#203) - "a auto gate" is now "an auto gate"
Added
- A question can carry its own recommendation:
Recommended: <letter> — <why> [src: …](#203) tldrx facts add --repo <name>is now checked againstworkspace.yml, through the one implementationtldrx answer --repoalready refused on (#186)
0.14.0 — 2026-09-09
Added
tldrx run auto --wait-gates <duration>— the loop waits for a signature the way it already waits for an answer (#197)- The heartbeat stops telling a waiting owner that nothing is waiting on him at a GATE
run autonow closes anagentgate itself, over a note it wrote and had validated (#198)
Changed
- The pre-merge reviewer runs targeted tests, not the whole suite
AGENTS.md§2 now says a slash in a branch name is a directorycicancels a run a newer push has already superseded- The docs deploy now fires on
src/cli/helpText.ts publish.ymldepends onci's answer instead of recomputing it
0.13.1 — 2026-09-08
Fixed
- A stage prompt now opens by saying what to do (#196)
- The "N runs are open" nudge stops talking to sub-agents (#196)
0.13.0 — 2026-09-08
Added
tldrx expert rescore [<name>] [--area <a>]— score the knowledge you already paid forscripts/merge-wave.shnow refuses a branch that carries no review record (#192)
Fixed
- The mutation check is asked of the developer, which can run it, instead of the reviewer, which holds no pen
- A role expert could never earn evidence —
--mode fullmines the run record and the domain gate refused it - Two shipped role templates declared a
## Domainpath that matched nothing at all - A paid training pass that earned nothing said so nowhere durable
0.12.0 — 2026-09-08
Added
- The reviewer can run on a different model than the developer, and every verdict now says which model produced it
toucheswas declared and never measured, so the boundary audit was answering against a forecast- A run now records which tldrx wrote it (#183)
- A task row now carries a duration it actually measured, and says which span it is (#184)
- A
maintainskill turns a session into this repo's maintainer, and the circuit it encodes is the one that was measured, not the one that sounds right
Fixed
- No surface prints a bare
$0.00over work nobody metered
0.11.1 — 2026-09-08
Changed
- The mandate now tells the driver what to READ, because the host's own context was the bill
Added
- A run can now tell a person it needs them, without the framework naming a chat tool
- A failing notifier is written down, never a refusal
tldrx run auto --notify-every <duration>tldrx run auto --wait-answers <duration>- The docs site now explains how to OPERATE a run unattended, not just what the flags are
0.11.0 — 2026-09-08
Fixed
- An answered decision now says who decided it, and what it binds to
- Two signed facts that disagree produce a question, without an agent choosing to notice
- A defect in a file no story declared has a sanctioned remedy and a visible home
- The developer bundle carries
result_schematoo, so both halves of one handshake make the same promise
Added
tldrx story widen <id> <path>... --note "<why>"tldrx budget grant <amount> --fact <id>tldrx cost --stories- A run close,
run cancel,approveand the Build handoff header all say how many of a run's decisions name a decider workspace.ymlgains an optionaltest_fast:command — the developer iterates on it, and the suite runs once at the Definition of Donetldrx next --commit --checkrehearses the commit and writes nothing, so a bad envelope is caught while the turn is still open
Changed
- The shipped stage and workflow money literals are labelled
[assumption] - The Build stage ships
parallel: 2, so a wave runs two stories at a time out of the box - The "can this test fail?" check now names its instrument: one test file, not the whole declared suite
0.10.0 — 2026-09-07
Fixed
- A refused Definition-of-Done command is no longer recorded as
exit 126 - The reviewer no longer diffs an empty range
- A costless turn that declared only a provider token split is no longer counted silent
- A reviewer turn's token split reaches its
run.ymlrow - The dirty-tree refusal prints the commands, and the reason it gives is true
Added
command_probes:— whattldrx initactually ran, not what it guessed
Changed
tldrx ship's PR body is written for a PR, not forwarded from the last handoff verbatim
0.9.2 — 2026-09-07
Changed
- The Build executor is no longer one 4,351-line file
0.9.1 — 2026-09-06
Added
- The docs site carries the whole CLI, generated from the registry
test/docs-cli-coverage.test.ts— the docs are now a gatetldrx facts add— the command the drive mandate has been naming since 0.8.0 (#161)- The provider's token split on the
run.ymltask row (#159)
Fixed
- Two commands the docs told you to run that do not exist
- Two flags the guide never documented
- A turn with no provider USD figure is unmetered, not a metered
$0.00(#159) - A refusal no longer discards a cost (#159)
- An oversized reviewer verdict no longer takes the whole invocation's ledger with it (#160)
- A cached red base is no longer trusted forever (#162)
tldrx facts add --run <id>no longer invents an absence- A fix list records the canonical 40-hex sha (#163)
Changed
- A command's subcommands are declared once
0.9.0 — 2026-09-06
Added
AGENTS.mdis the canonical agent context, andCLAUDE.mdimports it- Stack packs —
tldrx expert packs <enable|disable|status> - Project skills are named to the developer, independent of the packs switch
- The context ledger separates
expert.mdbytes from overlay bytes - Two out-of-scope findings from building this: stack-expert naming has two independent derivations that agree today only because a mismatch fails silently (#152), and a…
0.8.0 — 2026-09-04
Added
tldrx drive --tldr— essentials only, for a run whose trail nobody will readMANDATE_TLDR_MAX_LINES(165) bounds the--tldrvariants; the standard mandate keeps the tighterMANDATE_MAX_LINES
Fixed
tldrx drive --unattendedtold the driver four times to stop and never once to continue, and the runs it drove did exactly that- A parked question is now a GUIDED question
- The old halt licence is gone
Changed
- The ask channel is the console, and the framework stays agnostic about anything else
MANDATE_MAX_LINESmoved once,120→140, with the reason recorded in the source
0.7.0 — 2026-09-03
Added
- Codex is now a second honest automated runner
Fixed
- A citation to a file that exists only on the run's unmerged epic branch passed unflagged, or broke, depending on whether a temp directory still existed (#140)
- A
filesrc now gets one more chance after every base on disk: the branches the run RECORDED - A watcher card could cite a path only the unmerged epic has, and say nothing (#143)
- A run could close with a question nobody ever answered, and nothing said so (#141)
0.6.1 — 2026-09-03
Fixed
- The Build handoff's
Cost:header was invocation-scoped, so a re-entered stage reported$0.00for a phase that had spent$0.44(#138) - That same header was a LOWER BOUND whenever a turn ran in-session, and nothing on the line said so (#139)
test/attempt-cost.test.tsproved "carries no format refusal" with the bare wordREFUSED, and unrelated prompt prose turned it red (#135)- 03-plan had NO map at all on a single-repo workspace (#136)
- A re-entered Build stage OVERWROTE its own handoff with a degraded reconstruction (#137)
- The
featurepreset declared map inputs without{repo}, so 02-how and 03-plan ran with no map at all (#131) - The reviewer prompt described the result envelope in prose beside the schema that defines it (#133)
- Pruning a blocked story's worktree destroyed the work inside it (#129)
- The fix list recorded
Resolved: yesover a fix that did not exist (#130) - The Build handoff cited a story branch that does not exist (#134)
Added
- The Plan prompt now says how to make a
toucheslist COMPLETE (#132) - The landing page now sells the unattended flow it never mentioned (#128)
0.6.0 — 2026-09-02
Added
- A gate record now says which entity evaluated it and under whose authority (#122)
tldrx run statusprints a stage's duration and says when a gate was signed with words (#120)- The docs site's demo dashboard now shows the story grid and the Waves view with something in them (#119)
- A stage now carries when it started, when it ended and what its gate said (#118)
tldrx dashboard --servepushes only when the page would actually change, and ages itself when it would not (#108)- An answer that overtakes an earlier phase's document now says so on that document (#104)
- The dashboard opens on a "Now" strip, and it says what it does not know (#107)
- Three drill-ins on the run detail, and each one names what it cannot show (#107)
- A Waves view (#107)
- Craft: keyboard reach, tabular money, still one file
- The docs site now SHOWS the dashboard instead of describing it (#106)
- The run headline shows BOTH economies, or says why it cannot (#103)
- A run says when it last moved (
lastEventAt,lastEventFrom,ageSeconds) Run.nextAction— who is waited on right now, where, and what closes itscripts/merge-wave.shnow gates the documentation site too (#114)- A surprised merge-wave assertion now prints the logs the script kept (#115, instrumentation only — the flake is NOT fixed)
- A drift guard over the public surfaces (#121)
Changed
- The staleness field is spelled
lastEventFrom, notlastEventSource
Fixed
validateEnvnow enforces the twoenv.ymlrules §2.10 designed, and §2.10 stops designing the third (#126)- The status line's gate counter is
machine:N, and counts every gate a machine closed (#127) docs/spec.md§2.10 documented anenv.ymlfield that does not exist, and two values that were stale (#125)- A revoked gate no longer records what its withdrawn signature rested on (#123)
tldrx statusnow reports an AGENT-signed gate as machine-signed (#124)- The merge-wave suite no longer plants its #95 fixture at a machine-global path (#113)
merge-wave.shno longer executes a file anything can rewrite underneath it (#117)- An interrupted merge wave no longer leaves an ungated commit on
mainfor the next sibling to push under its own gate result (#116) - A docs-scope story bundle is no longer handed to a developer with nothing to write, no requirements it can open, and its core acceptance criterion deleted (#111)
- A closed run no longer sets up the operator's next
git pullto be refused (#102) - A 1M-context model is no longer sized at 200k because of how its name was spelled (#112)
- A stage with nothing to ask can close its own auto gate again (#109)
absent:has ONE semantic, and both checkers share it (#110, absorbing #105)- The docs site advertised a version we had already shipped past (#121)
- Three surfaces disagreed about whether Bun is needed to run tldrx (#121)
- The landing page claimed an absolute the implementation cannot guarantee (#121)
- Provider wording tightened to what we can show (#121)
0.5.0 — 2026-09-02
Added
- The dashboard answers the five questions #85 left open (#93)
- The dashboard reads
budget.ymlandevents.jsonl(#85) - The
tldrx drivemandate carries its own preflight (#84) - The retro aggregate has consumers:
--json, the reviewer prompt, and a workspace taxonomy (#74) CONTRIBUTING.md, and a section an outside contributor can build a model provider from (#27 companion)tldrx questions cards [<run>]— a parked question, as something to decide (#59)tldrx watch arm --run <id>— the merge detector that fires the post-merge checklist (#69)tldrx plan schema— the story/epic/waves contract, printed for a human (#71)tldrx drive [--attended|--unattended]— the host/driver mandate, shipped (#63)tldrx retro --all— cross-run mining of what keeps catching you (#64)tldrx watch checkis the post-merge checklist (#65, owner decision 2026-09-01: manual command first,ghdetector later)- Evals v1 — five golden-transcript evals, one per stage (#26, owner decision 2026-09-01: small v1 now)
tldrx story reopen <id> --for-fix --note "<defect>"— a sanctioned fix round on adonestory (#58, owner decision 2026-09-01)
Changed
- tldrx is no longer sold as "lightweight" (owner decision, 2026-09-02)
- A watcher card may name a HUMAN owner — optional, per item, never invented (#70)
docs/guide/08-cli-reference.mddocumentsnoteandship(#72)tldrx watch's one-line summary says checklisttldrx shipopens one PR PER REPO when the branch is in more than one (#66, owner decision 2026-09-01)
Fixed
- A training pass with nothing to read is no longer paid for (#101)
expert createnow yields an expert that can actually be trained, and states the## Domaingrammar it will be read under (#94)release.shran the gate AFTER pushing the release commit tomain(#100)- The prose was validated against the binary, top to bottom, and a lot of it was false
expert trainsays what it is about to spend, on which model, BEFORE it spends it (#96)expert train --preparecarries that check into the bundle (#98)test/merge-wave.test.tsno longer fails a wave over another wave's log directory (#95, #97)- A story's first attempt is dispatched at what the plan priced it, not at that figure halved again (#91)
- The merge lock now has something to say about raw git in the shared checkout (#89)
- A cancelled run is no longer told to retry itself (#86)
- An out-of-order
--commitno longer leaves astage.startedbehind (#87) - An unreadable
result.jsonis refused like an absent one, loudly (#88) - Watch READS the branch it diffs off
run.yml; it used to derive one (#90) - A recorded
default_branchthat does not resolve is incoherent state too (#92) - The dashboard says the framework's CURRENT vocabulary, not 0.2.0's
- The #80 guard's kind sweep could not tell a regex literal in CODE from one quoted in a COMMENT (#83)
- A handshake called in the wrong ORDER no longer fails the stage and the run (#82)
facts.ymlids and citable ids were two spellings of one shape; now they are one constant (#81)- The docs site said 0.3.1, named a flag that does not exist, and told readers to hand-write a mandate the CLI now prints
- The site covered none of the last release's commands, and the Spanish mirror had fallen a release behind the English one
tldrx map --checkran a SECOND, divergent[src: …]grammar; there is one grammar now (#80)- A
[src: …]rejection now states the RULE it enforced, and the grammar is published where the writers read it (#77) - A grammar-rejected review envelope no longer consumes a story ATTEMPT (#78)
- Every envelope-FORMAT refusal gets that same free round, not just the citation (#79)
merge-wave.shno longer leaves a conflicted tree behind, wedging every queued sibling (#76)- The built-CLI dashboard test no longer gates a stale
dist/(#73) tldrx drivefills the mandate's<run>in (#75)tldrx statusno longer calls a RUNNING run "cannot start yet" (#60)- A cost/token declaration on a story commit now attaches to the build task (#68)
onStderrLineon the runtime seam, so progress prints before the verdict it produced (#67)tldrx planhas a section in the CLI reference (#55)tldrx update, and a one-line notice when a newer version exists (#62, owner decision 2026-09-01: on by default, with an opt-out)budget.ymlno longer adds host tokens to dollars (#61, owner decision 2026-09-01)
Removed
templates/story.mdandtemplates/epic.mdare deleted (#48, owner decision 2026-09-01, option (a))
0.4.0 — 2026-09-01
Changed
- Dependent epics share ONE integration branch (#57, owner decision 2026-09-01, option (a))
- An epic worktree now lives for the RUN's lifetime, not the Build stage's (#16, owner decision 2026-09-01, option (a))
- The budget gate's three open policy questions are answered (#22, owner decision 2026-09-01)
Added
- The documentation site speaks Spanish (
docs-site/es/, phase 2) - A public documentation site, written for people who have never seen tldrx (
docs-site/, phase 1) tldrx learnchapters 3-8 — the whole loop, played (#30, phase 2)tldrx learn— a playable sandbox tutorial that runs the REAL commands (#30, phase 1 of 3)tldrx note <run> [--stage <id>] "text"— an honest carrier for an operator annotation, at the moment it happened (#46)tldrx run gates set <stage>:<policy> --note "…"— the signed upgrade path for a frozengates_policy(#14)tldrx ship— open a PR from the run's epic branch, with the handoff as the body (#15)TLDRX_CLAUDE_BIN— point the sub-agent spawn at a different binary (#27, minimal slice)- A drift guard on
templates/story.mdandtemplates/epic.md(#48) - The merge-wave sandbox is built under a hostile
init.defaultBranch(#49) - The Plan prompt now STATES the schema the
plancheck enforces, generated from the check itself (#35, #38) tldrx plan sync-dod— the mechanical repair for dod blocks an editedworkspace.ymlorphaned (#42)tldrx answer <Qn> "…" --supersede— the verb for reversing a decision already on record
Fixed
- A trainer that
cds no longer writes its knowledge file into a different git repo - A rejected training run records WHICH problems, not just how many
## Sourcesis now taught as prose with the refused shape showntldrx expert trainalready exits nonzero when a training failstldrx learn— the cold-player QA round (#30)tldrx costno longer claims "two economies" over one (#56)- The README's "Not on npm yet" warning was false and told readers not to run the install line directly underneath it
- The site's own home page linked an anchor that does not exist
tickets sync,tickets statusandbudget showtook a run id as a positional that neither theirusagenor their--helpdeclared (#53)tldrx run gates setwas documented nowhere indocs/(#54)- The epic file duplicated every story's status, and nothing ever updated the copy (#50)
- Seven
usagestrings were narrower than the same command's--help(#51, after #25) - A literal ESC byte in
McpProbe.ts's ANSI regex (#52) - A stray NUL byte made two source files invisible to every grep-based sweep (#47)
- The five wave-5 docs-pass nits, each a sentence nothing was checking (#25)
tldrx next --dry-runspawns nothing. It used to cost $0.42 a go (#17)- A precondition gets its own clock, not the stage's 900–1800 s (#20)
- The budget gate can see host-token spend and attendedness (#22)
- The
max_readsflake was a real race, not a slow test (#24) - One over-cap list item no longer cascades into false "S<id> has no file" errors (#37)
- A refused list value now names the cap it broke, at the cap's current value (#38)
- The merge itself is now serialised, and a gate can no longer describe a tree it is not pushing (#44)
- The test suite no longer goes red because the machine was busy (#43)
npm packoutput no longer refuses the next agent's merge (#45)claim-sourcesreports every problem it found, over every declared.mdoutput — and afilesrc resolves against this run's epic worktree- The Build DoD is a DELTA gate again: the base tree is checked before any story is charged (#41)
- The review handshake no longer swallows an unrecognized verdict, nor drops structured findings
- A project stage override that supplies only
stage.ymlno longer swaps the stage body for an empty one approve --as-agent's refusal now names the route that works on the run in front of youbudget raise <phase> <usd>help said<usd>was "the new ceiling"; the source adds ittldrx run new --fromstores an imported answer's own words, not a letter pointing at a file it does not own- A second run's stories no longer merge into ANOTHER run's epic branch
- A
--notewith a blank line in it no longer destroysrun.yml
Changed
- The docs now say, at the top of both places a reader starts, that
run attend hostis a LOCK andrun autois an ENGINE tldrx run estimateis remaining-work aware (#21)
0.3.1 — 2026-08-31
Added
- A story branch that has fallen behind its epic is fast-forwarded before a developer is dispatched onto it
- Decision cards — the shape an interrupt takes when a run stops for a person
- The budget brake counts the work that is LEFT, not the price the stage was written at
preconditions:on a stage — the check that runs before the money does- The
fixlistverdict, its artifact and its router — the review that SIGNS and still has findings tldrx next --prepare --review/--commit --review— the reviewer is the second delegable role
Changed
tldrx next --prepareon a story awaiting review now writes the reviewer bundle instead of spawning a reviewertldrx next'sattended_by: hostrefusal names--commit --review--discard-pendingbins the reviewer bundle tootldrx initsays what it is doing while it does itcore/ui/color.ts- The dispatch-notes slot
attended_by: host— a run a host session drives, that the framework never spawns oneconomy: metered-usd | host-tokensonbudget.ymltldrx story reopen <id> --note "<why>"--parallel <n>ontldrx nextandtldrx run auto- The live view gives each running story its own column —
S1 reading … · S2 $ dotnet test …— in the scene, the compact one-liner and--ui plain gates_policy: agent— a gate an agent may close, over a check it wrote down- The gate evidence note
- Auto-gate condition 7,
boundary— the stage stayed inside the surface the run declared
Changed
- The init report is coloured and carries a roll-up
detectWorkspaceandbuildMaptake optional progress callbackstldrx initnow writes progress bytes to stderr like every other long-running command, so the twobuild.test.tscases that spawn it to exercise the node seam pass `…tldrx costis organised by ECONOMY, and prints no grand totaltldrx doctorprints where the framework's own files are: aframework <path>line naming the installed package that shipsstages/,workflows/andtemplates/,…
Fixed
- A rejected knowledge file gets ONE repair round before the money is thrown away
- The execution-claim rule is now TAUGHT, with an example and a counter-example
duplicate srcis documented as non-fatal, and the rejection report stops implying otherwise- A developer that FAILED is no longer recorded as a consumed attempt
- Runs recorded by the old code pick those stories back up
- The auto gate will not sign a Build stage whose stories are not all
done - A merge that moved nothing is no longer called "merged"
- A reviewer that FAILED is no longer recorded as a reviewer that asked for changes
tldrx nexton a story whose review errored re-runs only the REVIEW- The Build executor reads
03-plan/budget.yml - A reviewer is never given less than $1.00
tldrx costno longer prints0 in · 0 out · 0 cache write · 0 cache readfor a turn the host declared tokens for- A stage whose declared outputs are a SHAPE no longer fails while the files sit next to the error
- A pattern output that matches nothing now fails honestly — "
03-plan/stories/<id>.mdwas declared as an output but no file matches it on disk", rather than claimi… tldrx run estimateprices cache traffic, which is where the money actually goestldrx costshows the cache write / cache read columns on every attempt line- tldrx state survives the project's own
.gitignorerules, anddoctordetects a rule that shadows it tldrx doctornow says when a rule outside that block is still hiding state- The
## Inputspreamble no longer claims files the budget dropped - A touched path the story's worktree cannot read is flagged as such
- The story's own goal wins the developer prompt's inline budget
- The developer is told to run an acceptance criterion's embedded pattern BEFORE it edits
- The implicit story no longer
touchestldrx's own state - A document your answer settles now joins the implicit story's
touches - The developer gets the WHOLE answer
- The implicit story's goal is the work, not the What's stale scoping
tldrx next --prepare --discard-pendingre-derives an implicit plan- The dirty-tree check ignores tldrx's own state (
tldrx-work/,.tldrx/) - A scope that skips the Plan phase can Build
skips:in a workflow is read rather than decorative- A DoD command is looked up by its
workspace.ymlKEY, not by matching the command text - Build's declared
03-plan/…inputs are treated as satisfied when the scope skips Plan, and only those: every other missing input is still exit 1
Verified, not changed
- The walk already skips vendored and generated trees
0.3.0 — 2026-08-30
Added
tldrx status [--json]— one report of everything in the workspace waiting on a human, in the order the sources block each other: open init questions, every `split.ym…tldrx expert train <name> --area <a> [--mode light|full]— training runstldrx expert recompute [<name>] [--json]— recomputesareas[].levelfrom the evidence already on disktldrx install --claude— writes the facilitator into a real.claude/without the plugin and withoutinit: the skill file (marker<!-- tldrx-managed -->, `disab…tldrx hook <name>andtldrx statusline— run one hook script (dist/hooks/<name>.js, orsrc/hooks/<name>.tsin a source checkout), passing stdin, stdout, stderr…tldrx interview [--run <id>] [--init] [--yes-to-defaults]— the Interview step in a terminal, recording through the samesrc/core/answers/path astldrx answera…tldrx run auto [<run>]— the headless loop:nextuntil a human gate or open question (4), a failure (5), a budget refusal (2),--until <stage>reached or t…tldrx run unlock [<run>] [--force]andtldrx run cancel [<run>] --note <t> [--force]— the two ways out of a stuck run, with newrun.unlocked/run.cancellede…tldrx cost [<run>] [--all] [--json]— what was actually spent, read offagent.resultevents and nothing elsetldrx run estimate [<run>] [--json]— the only command that guesses, and it says sotldrx questions lint [--run <id>] [--fix] [--area <a>]— names everyquestions.mdblock the §2.7 parser cannot see and exits2tldrx reject --stage <phase>/<stage> --note <t>— revokes an approval already given, whoever signed ittldrx seed triage <path>— free, offline, no LLM:inventory.md+inventory.jsonwith per-document tokens, headings, cross-links,Status:, open markers, and a *…tldrx seed triage <path> --propose— ONE sub-agent (effortlow,--max-usd 1.00) that proposes a split and never creates a runtldrx seed answer <split.yml> <Qid> "<text>"— records a decision beside the questiontldrx seed apply <split.yml> [--dry-run]— the human gatetldrx tickets sync|status— the optional ticket mirror (off unlessprocess.ymlnames aticket_tool.kind)tldrx <command> --helpnow answers the question: a one-line description, the positional arguments, every flag with its meaning and — where the set is closed — its va…- Gate policy is data
- An
autogate closes only when it can show its work effort:instage.ymland--effort <low|medium|high|xhigh|max>on the command line — the cost lever--max-budget-usdis not, because the budget flag can only en…- A context ledger, and
prompt_max_bytesas a refusal max_reads— the brake--max-budget-usdis nottldrx next --commit --cost-usd <n> [--tokens <n>]— so a host session can declare what its own sub-agent cost- New
budget.raisedevent with before/after for both ceilings, the actor and an optional--note;--take-from <phase>moves money instead of adding it, refusing to… map.refreshedis finally emitted — providers, document count, repo count — recorded against the newest OPEN run, and the command says whichsrc/cli/signals.ts— SIGINT/SIGTERM kill the sub-agent's whole process tree, record a partialagent.resultcarryingcost_usd: nullandstopped_by: "signal", de….tldrx/.lock, a workspace lock held across read-modify-write- Two new waiting kinds,
runningandprepared, so a stage killed between--prepareand--commitis no longer reported asreadyand re-spawned - A stage prompt now carries what its experts LEARNED, not only who they are
- A third expert-loading rule
tldrx initseeds five ROLE experts.tldrx/experts/<name>/training.jsonl(spec §2.6.1) — the §2.9 envelope withrunreplaced byexpertandstagebyarea, because training outlives every runkind: testis a first-class evidence kind at weight 1.0, the same ascode— a test read or run is a direct observation of behaviourtldrx expert listgains total evidence and per-area levels columns, an ASCII star chart, and aloaded by: what (named), how (stack)line per expert derived…tldrx next --prepareprints one line per loaded expert with its bytes, plustruncatedandNOT LOADEDwhere they apply, andpending.jsongains anexperts:arr…- A citation must sustain its claim, not only resolve
- Three warnings that cost a citation its evidence row without rejecting the file
## Sourcesearns nothing- A bullet may carry its own confidence
tldrx expert listwarns on a shared citation- The Build executor writes
retro.mdas the run goes - Redesigned, and it now draws in the browser: the model rides inline in a
<script type="application/json">and every view is rendered client-side, so--staticis th… - Citations are first-class:
[src: …]renders as a reference chip and[assumption]/[inference]as a flag, marked in the DOM so the model'shandoffHtmlis style… runs[].waitingis the CLI's own{kind, message, questions}from one shared derivation (src/core/run/waiting.ts), anddependsOn/blockedBy/runnable/ `or…- ORDER is the default sort; the first runnable run wears the same
← nextmarker the CLI prints; chains draw as root-to-leaf PATHS, so every arrow is a real edge - Stage rows carry
gatePolicy, the execution path gains asigned bycolumn, and the section counts them the way the CLI does - The server checks
Host - Story branches are
story/<run-id>/<story-id>and their worktrees.tldrx/worktrees/<repo>/<run-id>-<story-id>, so two runs of one plan cannot collide - An
epic/<slug>branch this run did not cut is refused (exit2, nothing spent) unlesstldrx next --reuse-epic
Changed
- The level ladder weighs findings, not files
- The training prompt asks for value, not coverage
- Light mode's file selection is bounded by
## Domain - One shared knowledge budget, declared inputs first
- The prompt is ordered for the cache
- Attempt 2 gets the refused draft
claudeis spawned with--output-format stream-json --verbose- A progress view, on by default, on the four commands that make you wait
- Ambiguity is refused rather than guessed
- An unknown flag is refused instead of ignored
--jsonis supported or it is an error- An unknown COMMAND exits
1, not64 tldrx statusstops counting advice as worktldrx replay's usage stops requiring an id it does not requiretldrx tickets syncpreviews by default;--applywritesticket_tool.syncmeans somethingversion: 1is the key;schema_version:is deprecated for one release- The DoD gate no longer runs an un-allowlisted command
budget-gatecovers every spender and fails CLOSED--yolono longer reaches the reviewer- Unmetered is not zero
- Build cannot charge 2.5x its phase, and Watch's floor cannot exceed its ceiling
run.ymlandbudget.ymlare written temp +rename, andbudget.ymlceilings are re-read from disk before every write unless this store deliberately changed them…EventLog.readskips an unparseable line instead of throwing- A job stopped halfway now looks stopped halfway:
seed applywritesstatus: applyingbefore the loop and growscreated_runsafter each run; `seed triage --propose… tldrx initand.tldrx/init-questions.mdboth point attldrx interview --inittldrx interview --initapplies the two process answers to.tldrx/process.yml(methodology,ticket_tool.kind, and for GitHub theowner/repofrom the git remot…tldrx tickets statusvalidatesprocess.ymlbefore the no-run check, so a broken adapter config is reported as a config error rather than as "no run"- The SessionStart hook appends up to three lines of the
tldrx statusreport after the three it always printed, so a session opening on work that is NOT a run — a prop… --seedis repeatable: several are merged, deduped and re-sorted, with the 50-file cap applied to the merged set rather than per argumentrun.ymlgains an optionaltriage: {split, depends_on}block, written only byseed applyand absent everywhere else- The
/tldrxskill is "status → guide": step 1 is alwaystldrx status --json, then it walks the items one at a time, asking when the decision is the human's and acti… - Package
tldr-expertsnow installs two commands,tldrxandtldr-experts .claude/settings.json.bak-tldrx-*is gitignored —install --claudebacks the file up before merging into it, and that backup was the one thing the framework writes…- Documented, from measurement:
--max-budget-usdis a stop, not a cap - Documented, from measurement: nested
claude -pworks; the ceiling was the constraint
Fixed
claim-sourcesverified sixsrckinds it used to wave through- A
[src: …]wrapped in backticks is a citation, not a missing one - An auto gate can no longer be closed by silence
- An approval could not be revoked
--print-prompttold everyone they had no reposkind: testwas dropped without a word- Light-mode training was structurally incapable of exceeding level 3
- An evidence
srcis validated against itskind, both directions - The stage files named experts that
initnever seeds - A run nobody has started is
ready, not "waiting at a gate" - Only a gate, a question or a failure raises an alert on the page:
readyreads "ready —tldrx next <id>" in the WAITING ON column instead of the blank "nothing" tha… - Re-rendering the dashboard keeps the reader's place: handoff panel ids are derived from run + phase rather than render order, so a
reloadrestores the open panel and… - A dashboard path row is marked "waiting" only when the run is actually stopped at that stage (every downstream gate also reads
pending, which had painted four rows o… - An ADR's status is read from the document, not from the cached inventory
- A recycled pid made a
.lockpermanent - Ctrl-C did not reach the sub-agent
- Four runs of one plan all cut
story/S1 bun dist/tldrx.jsprinted·wherenode dist/tldrx.jsprinted·bun testno longer printsfatal: Needed a single revisiontwice:execFileSyncinherits the child's stderr, and the two assertions that prove Build cut no branch…- The
/tldrxskill's "PRE-ALPHA — some commands are still stubs and exit 64" warning was false - README and ROADMAP stop claiming a release that has not happened: both
npm i -glines say so and keep the commands, and ROADMAP's four "shipped in 0.3.0" become "on…
Removed
gate.requires:— from all five shipped stage files and fromStageGate- The placeholders
domainandstackfrom the shippedexperts:lists
0.2.0 — 2026-08-29
The Build phase executes
waves.ymlis the schedule- Done means proven
- A failure costs one story, not the wave
- A reviewer's
changesrequeues the story once - Nothing ships
- Safety
04-build/handoff.mdis generated, not asked forrun statusgrows a Build line- In-session
tldrx dashboard — a live, read-only local server
- Three GET routes on
127.0.0.1 - A watcher over `.tldrx/
node:httpandnode:fs, nothing else- Ctrl-C closes the listener and the watcher and exits
0
Model and renderer are now separate things
src/core/dashboard/model.tsproduces one plain JSONDashboardModelsrc/core/dashboard/render.tsis the only markup in the product--staticis unchanged in what it shows, and gained the plan block
Watch: one watcher card per shipped feature
05-watch/watchers/<feature>.mdstatusis computed, never claimed- The Watch executor
- No done stories is a result, not an error
--prepare/--commitis per featuretldrx watch list [--run <id>]
0.1.0 — 2026-08-29
Greenfield: a project with no code yet
tldrx initnames the caseinitalways seeds aproductexpertinit --stack ts,dotnet,python,go,rust,…
tldrx run new --seed <file|dir> — import any document
- Takes one
.md/.txtfile or a directory of them (recursive, sorted, ≤50 files, ≤2 MB each; anything larger is skipped and named) - Copies nothing
- Writes
01-what/seed-index.md(documents, sizes, skips, warnings) and01-what/handoff.mdwhose Findings are every heading, bullet and paragraph of the seed - The seed documents are added to the What stage's declared inputs in
run.yml, sotldrx nextinlines their content into the prompt - Story front matter:
idepictitlerepostatusdepends_ontouchesacceptancetest_planevidence, plus the fenced```dodblock - Epic front matter:
idtitlereposstoriesbranch: epic/<slug>status waves.yml:waves: [{id: W1, stories: [S1, S2]}, …], ids ascending because file order is execution order, and the rule the shape cannot enforce alone — **every stor…- New
plangate check reads all three together at the Plan gate (tldrx approve), which is the only place the cross-file rules can be checked - Templates:
templates/story.md,templates/epic.md,templates/waves.yml tldrx budget show [<run>] [--json]— a phase table of ceiling, spent, remaining, the next stage and its own estimate, and whethertldrx nextwould be blocked theretldrx budget raise <phase> <usd> [--take-from <phase>]— the one sanctioned edit tobudget.yml, validated before it writes: Σ phase ceilings ≤ run ceiling holds on…- Both
budget.blockedmessages (the hook andtldrx next) now name the exact command, with the shortfall computed and rounded up to the cent, instead of namin… run statusshows per-attempt cost for the cursor stage —attempts: 2 · $1.39 + $1.21— read fromagent.resultevents
0.0.2 — 2026-08-29
0.0.1 — 2026-08-29
What is implemented
tldrx inittldrx map --refresh | --checktldrx doctor- The run lifecycle
run new --from <dir>tldrx next, in two execution modes- Six hooks
tldrx expert list | create | train --print-prompttldrx replaytldrx retro [--apply]tldrx dashboard --static- Runtime: Node ≥ 20 or Bun
What is NOT implemented
- Build and Watch phase execution
- Expert training
- The live dashboard
- The ticket adapter
- Parallel execution
Notes
tldrx <command> --helpprints usage and exits0without needing a workspace- A
failedstage is not progress and not the end:run statusrenders it as a failure,tldrx nextretries it, andreject --notesends it back toreadywith the…