Shipped and released
Now
Page 9 of 14. Every release ever published is still here — across these pages, in theAtom feed, and at its own permanent link. Nothing is dropped as it ages.
Released highlights, page 9
workspace-statuscan now prune an explicitly approved selection of delivery artifacts. A successful exit guarantees that every selected artifact directory and every workspace membership resolving to it are absent, proven in one coherent observation taken while the shared workspace lock is held. If either half survives, the command fails and names which one, rather than reporting success.- An interrupted prune is now recoverable from the command's own output: a failure names the selection and how far it got, and a busy lock names the lock file and the process holding it.
- Creating a durable work artifact now coordinates with that same lock, so an intake and a prune can no longer interleave and leave the register disagreeing with what is on disk.
- `workspace-status` shows you which initiative is which again. Orientation used to list bare slugs, because the projection replaced each initiative's name and milestone with a stand-in meaning "this value was not safe to hand to an agent." That guard was added when display text from
workspace.tomlwas treated as untrusted input. It is not:workspace.tomllives inside the repository it describes, so anyone who can reach it already has the source, and the guard was costing readability for a risk that was not there. A session now opens withini-002 — Platform Core (milestone: P5 · Adopt (M1–M5 shipped)).
- `workspace-status` shows you which initiative is which again. Orientation used to list bare slugs, because the projection replaced each initiative's name and milestone with a stand-in meaning "this value was not safe to hand to an agent." That guard was added when display text from
- `workspace-status` no longer tells you an initiative is called "workspace.toml". An initiative's name and milestone are free text you type into
workspace.toml, and the status tool deliberately never passes them through — they always come back as the literalworkspace.toml, the same stand-in every other field uses to mean "this value was not safe to hand to an agent." The skill's own instructions had not caught up and still told the agent to print them, so a status run announcedini-002 — workspace.toml (milestone: workspace.toml). Active initiatives now show their slug alone.
- `workspace-status` no longer tells you an initiative is called "workspace.toml". An initiative's name and milestone are free text you type into
- A catalogue you derive now keeps a working check on its vendored `credbroker` code.
catalogue init --preset self-hostedcopied the vendored copy of that code but left its source behind, and the check that compares the two passed by finding nothing to compare. The copy was frozen: an edit to it went unreported, andcatalogue self-hostnever produced the staged floor it is meant to write. Selecting thecredential-brokerspack now brings the source across too, so the comparison is real again. - `--attribution white-label` no longer leaves the upstream catalogue's name in a file you commit. That mode promises no upstream trace, and the scan enforcing it allows the upstream name zero occurrences anywhere — but the scan runs before
.agentbundle/self-host-state.jsonis written, so the name landed there unchecked. The file now records your own catalogue's name.--attribution attributedis unchanged and still records the upstream name.
- A catalogue you derive now keeps a working check on its vendored `credbroker` code.
- A surface can now declare the minimum viewport width it supports, and the rendered-page inspection stops asking for captures below it. A desktop-only tool that supports 1280 and up is asked for four captures per route in one channel instead of eight across two.
- Declaring a minimum never hides a width the surface does claim. It only ever raises a band's lower bound, so a minimum that falls between the default bands leaves the wider one where it is rather than pulling a capture down into a gap that satisfies no channel.
- A breakpoint above the minimum keeps its own band, so a high minimum cannot flatten a surface that really is responsive above it. Each run records the minimum it used and any breakpoint the minimum discarded, so a mistyped minimum is distinguishable from a deliberate single-channel surface.
- When a review finding says a claim promises more than its test checks, you now have two answers instead of one. Previously the only available answer was to shrink the claim, so the easy move was to weaken what you promised until the existing test covered it — quietly dropping the property from what anyone checks. Now: if any test can be made to cover the full promise, improve the test; shrink the claim only when none can.
- After fixing a review finding, search twice. Guidance used to say this search was "a walk, not a text search", which read as permission to skip searching for exact strings. You now do both: search for the repeated words and names, and read for the places that say the same thing in different words. After a fix, also re-run the search for tests that pin file contents, across every file you touched — that is when an edit breaks a test in a file you never opened.
- You can now move an obligation out of an intent or brief and still have something catch its deletion. Moving it requires something that fails if it is removed, and three of the four places you were told to move it to had nothing watching them. Editing
Opportunityon an intent, orRabbit holesorDesign artifactson a delivery brief, now counts as a material change, which cancels that artifact's approved review and sends it back for a fresh one. - How to prove a test actually catches a bug is now written down. To prove it, put back the original broken code — not an empty placeholder — and confirm the test fails. Undo it by editing, not with
git checkout,reset, orstash. A test that still passes while the bug is back has proved nothing. This rule previously existed only if your own process happened to supply it.
- A frontend review now gets the pictures, not just the diff. When a surface has been inspected, the work-loop hands
frontend-reviewerthe capture set and what was observed in it, alongside the diff. A reviewer that only ever saw a diff could not see one element covering another, which is the class of defect it was most often asked about.
- A frontend review now gets the pictures, not just the diff. When a surface has been inspected, the work-loop hands
- The rendered-page inspection now looks at both sides of your breakpoints. It used to permute viewport height and scroll position and nothing else, so a complete capture set could sit entirely on one side of every breakpoint a surface has — exercising each layout rule only where it already applies. A channel is a band of viewport widths, and a set is complete only when it covers every one your surface has.
- Tell it your breakpoints and it captures either side of each. Declare them and the bands they bound become the required channels, captured at the widths that straddle each boundary — declare
1152and you get1151and1152. Declare none and two bands apply,narrowat ≤480 andwideat ≥1024, and the run records that it fell back. Those two leave 481–1023 uncaptured, which is where a great many real breakpoints sit; declaring yours is what closes it. - The floor rises from four captures per route to eight. Four heights-and- scroll-positions in each required channel, and four times *n + 1* where you declare *n* breakpoints. An existing capture set becomes incomplete at this version, which is the intended signal.
- A capture's width now means something to the reviewer.
frontend-revieweris told to use it: it decides which breakpoint-scoped rules a capture exercised at all, so a failure absent from one channel is no evidence it is absent from another.
- You can now ask
workspace-statuswhich explicitly selected specs still have workspace membership and which do not, without changingworkspace.tomlor treating absence as permission to delete anything.
- You can now ask
- A sustained shaping finding no longer reads as an instruction to edit. Intent, delivery-brief and spec authoring point at the work-loop's ordered response ladder — cut, route, fix, hold, walked until one applies — so an author can answer a finding by dropping a claim nothing is obliged by rather than writing more careful prose. The lifecycle gates are unchanged: whatever blocked before still blocks.
- Each upstream artifact states where a demoted claim belongs. An intent sends a settled ground to
Opportunityand a matter decided without the authority to decide it toUnresolved questions. A brief sends a design trap toRabbit holesand informing provenance toDesign artifacts, and never toReady gaps, which it drops on leavingDraft. - A shaping reviewer no longer reopens a decision the artifact records as settled. A pre-existing defect stays reviewable however late it is found, so an author can refuse a reopened decision without dismissing a real defect from the same round.
- A legacy-only repository can activate its knowledge base even when the migration has nothing to import. Activating was the first command such a repository runs, and it crashed on the state those repositories are actually in: an empty
patterns.jsonl. The migration now produces the canonical empty topic map instead of a traceback.
- A legacy-only repository can activate its knowledge base even when the migration has nothing to import. Activating was the first command such a repository runs, and it crashed on the state those repositories are actually in: an empty
- The pack now looks at the page, and writes down what it saw. Step 4 of the journey captures each route you name at two viewport heights, at rest and scrolled, and reports what a reader would actually meet — something covering something else, text running out of its container, a control too small to hit. The evidence manifest gains an
inspection observationsfield that a list of screenshot filenames does not satisfy. - A skipped inspection can no longer pass as a completed one. Seven distinct result states replace a single unverified line, and the same state reaches the manifest, the step's output, and the acceptance gate — so a missing browser arrives as a decision rather than a green tick.
- Measure the noise yourself. Four defect fixtures and four known-clean ones ship with a procedure for measuring the false-positive rate in your own environment. The pack publishes no rate of its own, because the rate moves with the judge and the viewport sizes and does not transfer.
- A visible defect now costs something. A run that took every capture and found a banner covering the heading reports that it *ran* and that it did not *pass* — two answers, because "the browser would not start" and "the page is broken" need different fixes. The surface does not complete over an unresolved blocking finding.
- The independent reviewer can finally see the page.
frontend-revieweris handed the captures, reads them, and can take its own when the ones it was given do not cover what the diff makes it suspicious of. Until now it read the diff, and no diff shows one element covering another.
- The pack now looks at the page, and writes down what it saw. Step 4 of the journey captures each route you name at two viewport heights, at rest and scrolled, and reports what a reader would actually meet — something covering something else, text running out of its container, a control too small to hit. The evidence manifest gains an
- The conventions you install now say which projected paths a gate actually watches. Two entries were wrong: the repo hooks target is adapter-driven but no drift gate reaches it, and several seed-projected paths were described as hand-owned when the pipeline still regenerates them. Membership is decided by the exclusion list, not by the list in the prose.
- Shaping an intent no longer draws spec-grade craft findings on a four-paragraph artifact. The intent review answers one question — is this well-formed enough to shape further — in a vocabulary that cannot express a rewrite of your bet.
- A second, optional read attacks the bet itself and may only hand back an open question with a named decider or a kill condition with its real-world trigger. It cannot ask you to reword anything, and an empty answer is a real answer.
- After framing an intent, you can have the bet attacked rather than the wording reviewed — and whatever comes back is advisory, so it never moves the intent's status on its own.
- `new-spec` now tells you where a fact belongs, and hands you the facts to decide with. Plans kept accumulating design reasoning inside task lists — why an assertion had to take a particular shape — where it went stale against everything else and generated review findings of its own. The rule is now explicit: a fact belongs in the design unless a task must implement or verify it, because tasks are jobs to be done rather than containers for facts. And when a spec reaches you for approval, the skill reports the finding trend and every remaining concern with its consequence, rather than a verdict you cannot check.
- Installing a pack now sets up where its output goes, instead of quietly doing nothing.
- Your
agentbundle-layout.tomlkeeps its comments, formatting and permissions when a pack is installed.
- You can now measure how long each work-loop phase took, straight from the run log. Every transition line in
.loop-run/events.jsonlcarries when its phase began and how many seconds it lasted, so time-in-phase needs no guesswork about what happened between two entries. The first line's start is the run's own start, so the opening phase is a real measurement rather than a lower bound. - The retry budget is on the line, and so is the override flag. Every line carries the implementation and review retry counters beside their caps, so you can watch a run approach a limit without opening the cohort state file. A transition that carried
--allow-retry-cap-overriderecords that it did — the flag as passed, which is not the same as a cap having been exercised. - A repair cycle no longer looks like a give-up. Each line now says what the gate decided and, separately, whether the retry budget behind it still had room, so a routine repair round reads differently from a run continuing past a spent budget. Read the reachability note below before relying on the second case: on the ordinary path it does not arise.
- You can now measure how long each work-loop phase took, straight from the run log. Every transition line in
- A machine that cannot run `git` now gets one line of explanation instead of a stack trace. Every
loop-engineandloop-cohortcommand needsgitto confirm the spec directory sits inside your repository. Whengitcould not be run at all — not installed, or aPATHentry shadowing it with something unexecutable — the command ended in a 33-line Python trace that also printed internal file paths, more output than a whole successful run of the loop. Both tools now answer that situation the same way, in one line.
- A machine that cannot run `git` now gets one line of explanation instead of a stack trace. Every
- Review feedback is guidance about the criterion, not an edit request for the sentence.
new-spec's authoring rubric now says how to repair from a finding: name the property the clause establishes, ask whether that property is right, and look for its siblings before rewriting. It also gives you a way to notice when you have been patching text instead — and explains why a check that reads a whole document can silently pass on a second copy of the sentence it was looking for.
- Review feedback is guidance about the criterion, not an edit request for the sentence.