Skip to content

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 auto gate that REFUSES now writes the verdict down, so run status says which of the seven conditions is holding it (#230)

0.15.0 — 2026-09-10

Added

  • Four Build calibrations became optional stage.yml keys: 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.yml grows an additive outcome:, so a run can no longer read done over nothing delivered (#210)
  • A truncated input is now told to the OWNER, not only to the sub-agent (#207)
  • A turn killed on timeout_s keeps the usage the provider had already streamed (#207)

Changed

  • A stage's timeout_s now 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_bytes 163840 → 409600, inputs_max_bytes 98304 → 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_pct still 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 auto gates alone (#210)
  • tldrx ship refuses a run that delivered no story instead of opening a PR over nothing (#210)
  • A story's Definition of Done exiting 127 is 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-sources check 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.sh refuses 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 auto gate 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 against workspace.yml, through the one implementation tldrx answer --repo already 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 auto now closes an agent gate 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 directory
  • ci cancels a run a newer push has already superseded
  • The docs deploy now fires on src/cli/helpText.ts
  • publish.yml depends on ci'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 for
  • scripts/merge-wave.sh now 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 full mines the run record and the domain gate refused it
  • Two shipped role templates declared a ## Domain path 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
  • touches was 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 maintain skill 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.00 over 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_schema too, 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, approve and the Build handoff header all say how many of a run's decisions name a decider
  • workspace.yml gains an optional test_fast: command — the developer iterates on it, and the suite runs once at the Definition of Done
  • tldrx next --commit --check rehearses 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.yml row
  • The dirty-tree refusal prints the commands, and the reason it gives is true

Added

  • command_probes: — what tldrx init actually 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 gate
  • tldrx facts add — the command the drive mandate has been naming since 0.8.0 (#161)
  • The provider's token split on the run.yml task 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.md is the canonical agent context, and CLAUDE.md imports 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.md bytes 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 read
  • MANDATE_TLDR_MAX_LINES (165) bounds the --tldr variants; the standard mandate keeps the tighter MANDATE_MAX_LINES

Fixed

  • tldrx drive --unattended told 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_LINES moved once, 120140, 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 file src 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.00 for 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.ts proved "carries no format refusal" with the bare word REFUSED, 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 feature preset 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: yes over 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 touches list 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 status prints 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 --serve pushes 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 it
  • scripts/merge-wave.sh now 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, not lastEventSource

Fixed

  • validateEnv now enforces the two env.yml rules §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 an env.yml field 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 status now 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.sh no longer executes a file anything can rewrite underneath it (#117)
  • An interrupted merge wave no longer leaves an ungated commit on main for 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 pull to 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.yml and events.jsonl (#85)
  • The tldrx drive mandate 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 check is the post-merge checklist (#65, owner decision 2026-09-01: manual command first, gh detector 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 a done story (#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.md documents note and ship (#72)
  • tldrx watch's one-line summary says checklist
  • tldrx ship opens 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 create now yields an expert that can actually be trained, and states the ## Domain grammar it will be read under (#94)
  • release.sh ran the gate AFTER pushing the release commit to main (#100)
  • The prose was validated against the binary, top to bottom, and a lot of it was false
  • expert train says what it is about to spend, on which model, BEFORE it spends it (#96)
  • expert train --prepare carries that check into the bundle (#98)
  • test/merge-wave.test.ts no 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 --commit no longer leaves a stage.started behind (#87)
  • An unreadable result.json is 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_branch that 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.yml ids 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 --check ran 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.sh no longer leaves a conflicted tree behind, wedging every queued sibling (#76)
  • The built-CLI dashboard test no longer gates a stale dist/ (#73)
  • tldrx drive fills the mandate's <run> in (#75)
  • tldrx status no longer calls a RUNNING run "cannot start yet" (#60)
  • A cost/token declaration on a story commit now attaches to the build task (#68)
  • onStderrLine on the runtime seam, so progress prints before the verdict it produced (#67)
  • tldrx plan has 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.yml no longer adds host tokens to dollars (#61, owner decision 2026-09-01)

Removed

  • templates/story.md and templates/epic.md are 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 learn chapters 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 frozen gates_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.md and templates/epic.md (#48)
  • The merge-wave sandbox is built under a hostile init.defaultBranch (#49)
  • The Plan prompt now STATES the schema the plan check enforces, generated from the check itself (#35, #38)
  • tldrx plan sync-dod — the mechanical repair for dod blocks an edited workspace.yml orphaned (#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
  • ## Sources is now taught as prose with the refused shape shown
  • tldrx expert train already exits nonzero when a training fails
  • tldrx learn — the cold-player QA round (#30)
  • tldrx cost no 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 status and budget show took a run id as a positional that neither their usage nor their --help declared (#53)
  • tldrx run gates set was documented nowhere in docs/ (#54)
  • The epic file duplicated every story's status, and nothing ever updated the copy (#50)
  • Seven usage strings 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-run spawns 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_reads flake 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 pack output no longer refuses the next agent's merge (#45)
  • claim-sources reports every problem it found, over every declared .md output — and a file src 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.yml no 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 you
  • budget raise <phase> <usd> help said <usd> was "the new ceiling"; the source adds it
  • tldrx run new --from stores 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 --note with a blank line in it no longer destroys run.yml

Changed

  • The docs now say, at the top of both places a reader starts, that run attend host is a LOCK and run auto is an ENGINE
  • tldrx run estimate is 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 fixlist verdict, 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 --prepare on a story awaiting review now writes the reviewer bundle instead of spawning a reviewer
  • tldrx next's attended_by: host refusal names --commit --review
  • --discard-pending bins the reviewer bundle too
  • tldrx init says what it is doing while it does it
  • core/ui/color.ts
  • The dispatch-notes slot
  • attended_by: host — a run a host session drives, that the framework never spawns on
  • economy: metered-usd | host-tokens on budget.yml
  • tldrx story reopen <id> --note "<why>"
  • --parallel <n> on tldrx next and tldrx 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
  • detectWorkspace and buildMap take optional progress callbacks
  • tldrx init now writes progress bytes to stderr like every other long-running command, so the two build.test.ts cases that spawn it to exercise the node seam pass `…
  • tldrx cost is organised by ECONOMY, and prints no grand total
  • tldrx doctor prints where the framework's own files are: a framework <path> line naming the installed package that ships stages/, workflows/ and templates/,…

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 src is 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 next on 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 cost no longer prints 0 in · 0 out · 0 cache write · 0 cache read for 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>.md was declared as an output but no file matches it on disk", rather than claimi…
  • tldrx run estimate prices cache traffic, which is where the money actually goes
  • tldrx cost shows the cache write / cache read columns on every attempt line
  • tldrx state survives the project's own .gitignore rules, and doctor detects a rule that shadows it
  • tldrx doctor now says when a rule outside that block is still hiding state
  • The ## Inputs preamble 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 touches tldrx'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-pending re-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.yml KEY, 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 runs
  • tldrx expert recompute [<name>] [--json] — recomputes areas[].level from the evidence already on disk
  • tldrx install --claude — writes the facilitator into a real .claude/ without the plugin and without init: the skill file (marker <!-- tldrx-managed -->, `disab…
  • tldrx hook <name> and tldrx statusline — run one hook script (dist/hooks/<name>.js, or src/hooks/<name>.ts in a source checkout), passing stdin, stdout, stderr…
  • tldrx interview [--run <id>] [--init] [--yes-to-defaults] — the Interview step in a terminal, recording through the same src/core/answers/ path as tldrx answer a…
  • tldrx run auto [<run>] — the headless loop: next until a human gate or open question (4), a failure (5), a budget refusal (2), --until <stage> reached or t…
  • tldrx run unlock [<run>] [--force] and tldrx run cancel [<run>] --note <t> [--force] — the two ways out of a stuck run, with new run.unlocked / run.cancelled e…
  • tldrx cost [<run>] [--all] [--json] — what was actually spent, read off agent.result events and nothing else
  • tldrx run estimate [<run>] [--json] — the only command that guesses, and it says so
  • tldrx questions lint [--run <id>] [--fix] [--area <a>] — names every questions.md block the §2.7 parser cannot see and exits 2
  • tldrx reject --stage <phase>/<stage> --note <t> — revokes an approval already given, whoever signed it
  • tldrx seed triage <path> — free, offline, no LLM: inventory.md + inventory.json with per-document tokens, headings, cross-links, Status:, open markers, and a *…
  • tldrx seed triage <path> --propose — ONE sub-agent (effort low, --max-usd 1.00) that proposes a split and never creates a run
  • tldrx seed answer <split.yml> <Qid> "<text>" — records a decision beside the question
  • tldrx seed apply <split.yml> [--dry-run] — the human gate
  • tldrx tickets sync|status — the optional ticket mirror (off unless process.yml names a ticket_tool.kind)
  • tldrx <command> --help now 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 auto gate closes only when it can show its work
  • effort: in stage.yml and --effort <low|medium|high|xhigh|max> on the command line — the cost lever --max-budget-usd is not, because the budget flag can only en…
  • A context ledger, and prompt_max_bytes as a refusal
  • max_reads — the brake --max-budget-usd is not
  • tldrx next --commit --cost-usd <n> [--tokens <n>] — so a host session can declare what its own sub-agent cost
  • New budget.raised event with before/after for both ceilings, the actor and an optional --note; --take-from <phase> moves money instead of adding it, refusing to…
  • map.refreshed is finally emitted — providers, document count, repo count — recorded against the newest OPEN run, and the command says which
  • src/cli/signals.ts — SIGINT/SIGTERM kill the sub-agent's whole process tree, record a partial agent.result carrying cost_usd: null and stopped_by: "signal", de…
  • .tldrx/.lock, a workspace lock held across read-modify-write
  • Two new waiting kinds, running and prepared, so a stage killed between --prepare and --commit is no longer reported as ready and re-spawned
  • A stage prompt now carries what its experts LEARNED, not only who they are
  • A third expert-loading rule
  • tldrx init seeds five ROLE experts
  • .tldrx/experts/<name>/training.jsonl (spec §2.6.1) — the §2.9 envelope with run replaced by expert and stage by area, because training outlives every run
  • kind: test is a first-class evidence kind at weight 1.0, the same as code — a test read or run is a direct observation of behaviour
  • tldrx expert list gains total evidence and per-area levels columns, an ASCII star chart, and a loaded by: what (named), how (stack) line per expert derived…
  • tldrx next --prepare prints one line per loaded expert with its bytes, plus truncated and NOT LOADED where they apply, and pending.json gains an experts: arr…
  • A citation must sustain its claim, not only resolve
  • Three warnings that cost a citation its evidence row without rejecting the file
  • ## Sources earns nothing
  • A bullet may carry its own confidence
  • tldrx expert list warns on a shared citation
  • The Build executor writes retro.md as 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 --static is th…
  • Citations are first-class: [src: …] renders as a reference chip and [assumption] / [inference] as a flag, marked in the DOM so the model's handoffHtml is style…
  • runs[].waiting is the CLI's own {kind, message, questions} from one shared derivation (src/core/run/waiting.ts), and dependsOn / blockedBy / runnable / `or…
  • ORDER is the default sort; the first runnable run wears the same ← next marker 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 a signed by column, 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 (exit 2, nothing spent) unless tldrx 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
  • claude is 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
  • --json is supported or it is an error
  • An unknown COMMAND exits 1, not 64
  • tldrx status stops counting advice as work
  • tldrx replay's usage stops requiring an id it does not require
  • tldrx tickets sync previews by default; --apply writes
  • ticket_tool.sync means something
  • version: 1 is the key; schema_version: is deprecated for one release
  • The DoD gate no longer runs an un-allowlisted command
  • budget-gate covers every spender and fails CLOSED
  • --yolo no longer reaches the reviewer
  • Unmetered is not zero
  • Build cannot charge 2.5x its phase, and Watch's floor cannot exceed its ceiling
  • run.yml and budget.yml are written temp + rename, and budget.yml ceilings are re-read from disk before every write unless this store deliberately changed them…
  • EventLog.read skips an unparseable line instead of throwing
  • A job stopped halfway now looks stopped halfway: seed apply writes status: applying before the loop and grows created_runs after each run; `seed triage --propose…
  • tldrx init and .tldrx/init-questions.md both point at tldrx interview --init
  • tldrx interview --init applies the two process answers to .tldrx/process.yml (methodology, ticket_tool.kind, and for GitHub the owner/repo from the git remot…
  • tldrx tickets status validates process.yml before 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 status report after the three it always printed, so a session opening on work that is NOT a run — a prop…
  • --seed is repeatable: several are merged, deduped and re-sorted, with the 50-file cap applied to the merged set rather than per argument
  • run.yml gains an optional triage: {split, depends_on} block, written only by seed apply and absent everywhere else
  • The /tldrx skill is "status → guide": step 1 is always tldrx status --json, then it walks the items one at a time, asking when the decision is the human's and acti…
  • Package tldr-experts now installs two commands, tldrx and tldr-experts
  • .claude/settings.json.bak-tldrx-* is gitignored — install --claude backs the file up before merging into it, and that backup was the one thing the framework writes…
  • Documented, from measurement: --max-budget-usd is a stop, not a cap
  • Documented, from measurement: nested claude -p works; the ceiling was the constraint

Fixed

  • claim-sources verified six src kinds 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-prompt told everyone they had no repos
  • kind: test was dropped without a word
  • Light-mode training was structurally incapable of exceeding level 3
  • An evidence src is validated against its kind, both directions
  • The stage files named experts that init never 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: ready reads "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 reload restores 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 .lock permanent
  • Ctrl-C did not reach the sub-agent
  • Four runs of one plan all cut story/S1
  • bun dist/tldrx.js printed · where node dist/tldrx.js printed ·
  • bun test no longer prints fatal: Needed a single revision twice: execFileSync inherits the child's stderr, and the two assertions that prove Build cut no branch…
  • The /tldrx skill'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 -g lines 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 from StageGate
  • The placeholders domain and stack from the shipped experts: lists

0.2.0 — 2026-08-29

The Build phase executes

  • waves.yml is the schedule
  • Done means proven
  • A failure costs one story, not the wave
  • A reviewer's changes requeues the story once
  • Nothing ships
  • Safety
  • 04-build/handoff.md is generated, not asked for
  • run status grows 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:http and node: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.ts produces one plain JSON DashboardModel
  • src/core/dashboard/render.ts is the only markup in the product
  • --static is unchanged in what it shows, and gained the plan block

Watch: one watcher card per shipped feature

  • 05-watch/watchers/<feature>.md
  • status is computed, never claimed
  • The Watch executor
  • No done stories is a result, not an error
  • --prepare/--commit is per feature
  • tldrx watch list [--run <id>]

0.1.0 — 2026-08-29

Greenfield: a project with no code yet

  • tldrx init names the case
  • init always seeds a product expert
  • init --stack ts,dotnet,python,go,rust,…

tldrx run new --seed <file|dir> — import any document

  • Takes one .md/.txt file 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) and 01-what/handoff.md whose 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, so tldrx next inlines their content into the prompt
  • Story front matter: id epic title repo status depends_on touches acceptance test_plan evidence, plus the fenced ```dod block
  • Epic front matter: id title repos stories branch: 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 plan gate 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 whether tldrx next would be blocked there
  • tldrx budget raise <phase> <usd> [--take-from <phase>] — the one sanctioned edit to budget.yml, validated before it writes: Σ phase ceilings ≤ run ceiling holds on…
  • Both budget.blocked messages (the hook and tldrx next) now name the exact command, with the shortfall computed and rounded up to the cent, instead of namin…
  • run status shows per-attempt cost for the cursor stage — attempts: 2 · $1.39 + $1.21 — read from agent.result events

0.0.2 — 2026-08-29

0.0.1 — 2026-08-29

What is implemented

  • tldrx init
  • tldrx map --refresh | --check
  • tldrx doctor
  • The run lifecycle
  • run new --from <dir>
  • tldrx next, in two execution modes
  • Six hooks
  • tldrx expert list | create | train --print-prompt
  • tldrx replay
  • tldrx 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> --help prints usage and exits 0 without needing a workspace
  • A failed stage is not progress and not the end: run status renders it as a failure, tldrx next retries it, and reject --note sends it back to ready with the…

MIT licensed. Beta software — the file formats are frozen.