- Docs
- Changelog
Changelog
All notable user-visible changes to this project are documented here.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
New product changelog updates are authored as fragments and rendered into the public
/changelog/view withpython3 tools/changelog.py render --output build/product-changelog.md. Runpython3 tools/changelog.py new --package package-name --version 0.0.0 --date 2026-09-30 --highlight "Describe the released outcome.", replacing the generic package, version, date and highlight values with the release’s actual values. Edit the created file underdocs/product/changelog.d/, and stop. Usedocs/product/changelog-fragment-template.mdas the tracked example; it lives outsidedocs/product/changelog.d/so the validator never treats the template as a real fragment.
Maintenance: an entry is owed in the same change that bumps a released artifact’s version — you know the version at write time, because you are setting it. Tooling that ships in no release owes none. This header covers how the file is written; stating the when here too keeps both in the place
docs/product/AGENTS.mdsays owns them, and needs no link out of a published page to one that is not published.A released section is free-standing, directly beneath
[Unreleased]. Write## [<artifact>][<version>] — YYYY-MM-DDat the top level, newest first.[Unreleased]holds only work that has no version yet: its own### Added/### Changed/### Fixedsections, never a versioned entry nested inside it. The level is load-bearing rather than cosmetic — a versioned entry nested under[Unreleased]is invisible to the/now/projection permanently, not until some later release step, because nothing ever moves it out.Leave exactly one blank line above and below every heading. This one is about the source text you and a reviewer read, not about output: CommonMark renders a welded or double-spaced heading identically to a correct one, and
/now/is blank-line blind too, so nothing downstream will tell you.tools/test_build_site_routing.pychecks it on any pull request intomainand names the line.Entries can be drafted from conventional commits:
git log --onelinefiltered tofeat:andfix:since the last tag is a starting point, not a finished product. Rewrite for users, not contributors. See the Common Changelog guidance — the audience is humans who use the software, not humans who wrote it.Highlights (feeds the public
/now/page). A release entry carries oneHighlightssubsection, one heading level below that entry, when the release changes what a consumer can do. Its bullets are the outcome-led, user-facing sentences that publish at/now/; everything else in the entry stays technical. Judge by the nature of the change, not the semver level: a patch that changes an adopter’s obligations earns one, a minor that only moves code does not. A release that changes nothing a consumer acts on carries none — but none is a verdict to record with its reason, not a step to skip. For a pack release the decision is part of the release pipeline inpacks/AGENTS.local.md; nothing downstream makes it, because the projection is a pure parser and no model runs in the build. Three rules govern them:
- Released only. An entry nested beneath
[Unreleased]never publishes, even when it has a date and aHighlightsblock — see the free-standing rule above, which is why that case should not arise.- Reviewed like code. Write them in the same PR as the implementation, grounded in that diff and its verification evidence. Ordinary PR review is the only approval gate; there is no separate editorial process. Drafting them with AI assistance is fine — the reviewer, not the drafter, is the authority, and no model runs in CI, release automation, or site generation.
- Outcome, not activity. Describe what someone can now do. Never plans, queue state, commits, pull requests, or what the team is working on.
A released entry with no
Highlightsstays in this changelog and is simply absent from/now/.
[Unreleased]
Section titled “[Unreleased]”[core][3.1.0] — 2026-10-11
Section titled “[core][3.1.0] — 2026-10-11”Highlights
Section titled “Highlights”- See every outstanding intent, brief, and spec placed under its parent intent, without opening files one by one and without
workspace.toml. The newnavigate-intentsskill derives the intent graph from preamble headers each time it is asked and writes nothing back. - Walk the intent tree by level, parent, children, and recorded status. One broken parent link no longer hides the rest of the tree — it shows as a flagged line naming what is wrong. An incomplete outstanding-work list is refused rather than returned silently.
close-worknow checks every intent ancestor that an artifact’s parent pointers record, including capability, outcome, and opportunity parents.close-workandnavigate-intentsnow agree on every parent link.- When an intent and a brief (or spec) share a slug, both now count, so a parent can no longer look ready to close while one of them is still open.
- A broken parent pointer or a fault while building the intent tree now refuses closure with a named reason:
parent-edge-refused,artifact-not-in-graph, orintent-graph-unavailable. - Relate two intents with one
Related intents:line.navigate-intentsshows the relation from both ends, and the intent lint refuses a value that is malformed, names the intent itself, or matches no live intent of that kind. - Export the whole intent graph as one HTML file that opens offline, to share with a reviewer or browse without a terminal. It lists every intent with its parents, outstanding work, refused pointers, and parentless intents. It links each source file. It works from the keyboard. Record text is shown as plain text. The file is always written outside the repository.
- A
navigate-intentsskill with a bundled query script. Its operations aresummary,record,tree,ancestors,search, andoutstanding, each returning a versioned JSON envelope with a closed set of error codes.treeandoutstandingalso print a text tree with control characters escaped. - Results stay bounded: a
treeresult over its limit is refused with--depthas the narrowing route; anoutstandingresult is refused with--from.searchandancestorsrefuse with the exceeded limit and name no bounded route. No result is truncated. - A
Related intents:field inwork-intake, with a lint rule. The value isnoneor comma-separated typed pointers (intent:,capability:,outcome:,opportunity:). The corpus lint refuses a repeated item, an item that names the intent itself, one that matches no live intent, and one whose prefix differs from the target’s kind. recordandtreelist the related intents an intent writes and the ones that name it. Text output prints~ related <id>,! refused related <state>, and~ related from <id>. A related value that names its own intent shows as the refused stateself_reference. A related edge is never a parent or a dependency, and no closure or status check reads it.- The skill reads every file through a co-located confinement helper, shows the delivery resolver’s typed relations and diagnostics with each intent, and decides what is outstanding by the same leading-word terminality rule as
close-work. A parity check keeps that rule in step with its sources. - A
navigate-intents exportcommand that writes a single self-contained HTML view (--destination,--name, and--fromfor one subtree) with the same factsqueryreturns, GitHub source links only for a plain GitHuborigin, and a content security policy that pins its one script and one style. It refuses a destination inside the repository or any of its work trees, never overwrites a file, writes mode0600atomically, and refuses a page over the size budget with--fromas the narrowing route. Its refusal codes areinvalid_destination,destination_exists,publish_failed, andexport_too_large, beside the query corpus codes.
Changed
Section titled “Changed”close-workloads a byte-identical copy of the intent-edge derivation and drops its own parent-pointer parser. The parity tool now pins the parent kinds the derivation reads.
- Descendants are keyed by type and slug, so an intent and a brief with the same slug are both counted.
[product-engineering][1.0.1] — 2026-10-11
Section titled “[product-engineering][1.0.1] — 2026-10-11”Highlights
Section titled “Highlights”- Frame an intent that sits beside another one with an optional
Related intents:line. The template offers it as comment-only guidance, so it stays absent until you fill it.
Changed
Section titled “Changed”- The
intentskill’s intent template offers an optionalRelated intents:line afterOutcome co-owner:, and the guide copies of the template match it. An eval case checks that the line stays optional and comment-only.
[core][3.0.5] — 2026-10-11
Section titled “[core][3.0.5] — 2026-10-11”Highlights
Section titled “Highlights”- Add a conforming reviewer to any repository without changing work-loop code. The structured review boundary ships a generic reviewer port: select an obligation, submit a versioned structured report, and the boundary assesses findings and derives review readiness from it. No reviewer-role condition or reviewer-specific hook exists in the runtime modules.
- Integrate the compatibility adapter that reconciles legacy review events with structured boundary facts. The legacy review authority and reviewer-specific procedure remain active; moving authority belongs to the review-authority cutover follow-on.
- Seven self-contained review boundary modules ship under
packs/core/.apm/skills/work-loop/scripts/:_review_contracts.py,_review_selection.py,_review_persistence.py,_review_assessment.py,_review_bridge.py,_review_disposition.py, and_review_compat.py. They import only the Python standard library or sibling work-loop modules. - Six review schemas (
review-subject.v1,review-obligation.v1,review-report.v1,finding.v1,finding-assessment.v1,finding-disposition.v1) ship as test-time contracts undercontracts/delivery/. No schema copy ships in the Core runtime. - Work-loop eval harness gains a case asserting a synthetic reviewer report is assessed through the structured boundary without a reviewer-specific work-loop change.
- Architecture documents (
work-loop-review-disposition.md,acceptance-centered-work-loop.md) describe the implemented boundary, the shipped module locations, the compatibility state, and the FEAT-0036 review-authority cutover follow-on.
Changed
Section titled “Changed”- The legacy review authority remains active. The compatibility adapter runs beside it; the review-authority cutover follow-on owns the engine review-gate switch, its owner cutover receipt, and removal of reviewer-specific procedure from the skill.
[core][3.0.4] — 2026-10-11
Section titled “[core][3.0.4] — 2026-10-11”Highlights
Section titled “Highlights”workspace-statusnow suggestsintentfor ashapeentry. Installproduct-engineering1.0.0 or later so that suggestion resolves to a skill you have.
Changed
Section titled “Changed”workspace-statusmaps theshapeentry type, and its fallback, tointent.work-intake,work-loop, andinit-projectnameintentwhere they named a retired shaping skill.- Compatibility: the shaping suggestion and the
shapedispatch now nameintent, which needsproduct-engineering1.0.0 or later.
[product-engineering][1.0.0] — 2026-10-11
Section titled “[product-engineering][1.0.0] — 2026-10-11”Highlights
Section titled “Highlights”- Shape product work with one skill. Use
intent frameto turn an idea into an outcome and the opportunity behind it. Useintent de-riskto test the assumption that would sink it. Useintent decomposeto break what survives into child intents or a delivery contract. - Not sure how much shaping a piece of work needs? Ask
intentwhich way to go. Route mode names the short, longer, or supervised route and where it starts, then offers the first step without taking it. - Every
intentmode shows where you are on the intent lifecycle, offers the next step, and recommends the shaping review at the point it applies.
Removed
Section titled “Removed”frame-intent: useintent frame.de-risk-intent: useintent de-risk.decompose-intent: useintent decompose.- There are no aliases. A request that used to reach one of these skills now reaches
intentand its mode. - Stale installed directories.
agentbundle upgradeaddsintent/but leaves the three old skill directories in place, so the old names stay discoverable. After updating, either deleteframe-intent/,de-risk-intent/, anddecompose-intent/from your installed skills directory, or runagentbundle uninstall --pack product-engineeringand thenagentbundle install --pack product-engineeringat the same scope.
Changed
Section titled “Changed”discovery-loop’s description and its G3 row hand a converged decision brief to Core’swork-intake.discovery-loopand thediscovery-leadagent name theintentmode at each gate.- Sibling skill descriptions name
intent frame,intent de-risk, orintent decomposewhere they named a retired skill. - The
intentevals merge the three source eval sets. intentpre-approves no tools.frame-intentpre-approved writes, edits, and agent dispatch; now everyintentmode,frameincluded, writes and edits under your permission settings. An interactive session asks before the first write. A headless run (claude -p) must grantWriteandEdit, for example with--allowed-toolsor--permission-mode acceptEdits.
Evidence
Section titled “Evidence”- Hosts measured: activation was measured on Claude Code only. Cursor, Copilot, and Gemini CLI were not measured.
- Activation: on 42 held-out queries run 3 times each, the positive trigger rate was 0.711 against 0.70 before the fold, and the false-trigger rate was 0.000 against 0.00. The held-out misses from an earlier run informed the
de-riskwording, so the held-out set is not a fully unseen test of that revision. - Mode accuracy: this was evidenced by a classification probe that read skill descriptions, not by an activation run. In the probe, 33 of 33 post-fold runs chose the expected skill and mode at high confidence.
- Pre-fold misses: before the fold, two probe cases fell short. The “which way should we shape this” request chose
intake-intentat low confidence instead offrame-intent. The raw market-signal request choseframe-situation, as expected, but at medium confidence.
[agentbundle][0.52.1] — 2026-10-11
Section titled “[agentbundle][0.52.1] — 2026-10-11”Highlights
Section titled “Highlights”- The workspace-status MCP tool now dispatches a
shapeentry tointent. Installproduct-engineering1.0.0 or later so the dispatch resolves.
Changed
Section titled “Changed”- The packaged
workspace_status_engine.pyand the workspace-status MCP tool’sshapedispatch now nameintent, in step with Core 3.0.4. - Compatibility: the shaping suggestion and the
shapedispatch now nameintent, which needsproduct-engineering1.0.0 or later.
[experience-design][4.1.5] — 2026-10-11
Section titled “[experience-design][4.1.5] — 2026-10-11”Changed
Section titled “Changed”- Seven skill descriptions (
creative-direction,process-mapping,service-blueprint,interaction-design,design-review,user-flow, anddesign-system) nameintentorintent framewhere they namedframe-intent. Theprocess-mappingtemplate and eval nameintenttoo.
[governance-extras][1.0.2] — 2026-10-11
Section titled “[governance-extras][1.0.2] — 2026-10-11”Changed
Section titled “Changed”new-rfcand its product-engineering design-proposal integration nameintent(frame or de-risk output) as the shaping provider, in place offrame-intentandde-risk-intent.
[product-strategy][0.2.8] — 2026-10-11
Section titled “[product-strategy][0.2.8] — 2026-10-11”Changed
Section titled “Changed”run-okr-cascade,run-swot, andwrite-prfaqnameintent framewhere they namedframe-intent.
[core][3.0.3] — 2026-10-10
Section titled “[core][3.0.3] — 2026-10-10”Highlights
Section titled “Highlights”- After a design you saved before building ships,
close-workcan now offer to reconcile it into your current architecture documentation, so a future-state design is not mistaken for a description of the running system.
Changed
Section titled “Changed”close-workgains one offer: when the change implemented a saved future-state design, it offers to reconcile that design into thecurrent-architecturedestination. The offer is optional and adds no gate.close-workgains one behavior eval for the reconciliation offer.
[code-intelligence][0.1.9] — 2026-10-11
Section titled “[code-intelligence][0.1.9] — 2026-10-11”Highlights
Section titled “Highlights”- Runs on Wicked Estate 0.29.2. A large blast radius or lineage answer now arrives in pages instead of being cut off at the first one. The agent passes each page’s token (
next_cursor) back with--cursoruntil it isnull, so every row the search found is retrievable. - If the answer changes between pages, the agent starts again from the first page instead of mixing two answers.
- One
wicked-estate lineagecall now follows dependencies 24 levels deep by default, up from 8.
Changed
Section titled “Changed”- Floor and pin move to 0.29 / 0.29.2 for
wicked-estateandwicked-estate-mcp. Install withcargo install wicked-estate --version 0.29.2 --locked; the firstindexafterwards rebuilds the graph. truncated_dependentsnow counts rows on later pages rather than rows lost. A depth or node cut and a non-zerounresolvedstill mark the answer as incomplete after the last page.- The capability map documents the paged
blast-radius --jsonandlineage --jsonkey sets, includingnext_cursorandpage, and the MCPcursorargument. - A
wicked-estate-mcp --readonlyserver with a missing store path serves that store as an empty in-memory store; the pack names the graph, memory, knowledge and cross-store paths to check. - Local object properties leave the value-lineage hop list, matching upstream 0.27.0.
[code-intelligence][0.1.8] — 2026-10-10
Section titled “[code-intelligence][0.1.8] — 2026-10-10”Highlights
Section titled “Highlights”- Runs on Wicked Estate 0.26.0. See what a function depends on with
wicked-estate lineage <name>; a plain name or a symbol id both work. - Impact analysis reads each dependent’s own
depthfromblast-radius --json, so one call separates direct callers from indirect ones. - Trace where a value flows through TypeScript, TSX and JavaScript code with
wicked-estate lineage <name> --relation flows_to. wicked-estate stats --jsontells you which commit the graph was built from and how many commits behind it is.- An exit 1 with nothing on stdout is treated as a command error, not as “nothing found”.
Changed
Section titled “Changed”- Floor and pin move to 0.26 / 0.26.0 for
wicked-estateandwicked-estate-mcp. Install withcargo install wicked-estate --version 0.26.0 --locked; the firstindexafterwards rebuilds the graph. - Annotation answers report
source_type,extraction_methodandlast_verified, andstale-annotationsaccepts Unix seconds, a date, or--older-than. query --jsonreturns structured output and--versionprints one line;evidencejoins the commands that write to the graph.- The evidence guide covers
compilerresolution and SCIP’s reference-only role (it never adds call edges), theSTALENESS:line forms, andrules-recall --steering-type.
[architect][0.15.16] — 2026-10-10
Section titled “[architect][0.15.16] — 2026-10-10”Highlights
Section titled “Highlights”- When a repository has no reference architecture,
architect-designnow says so, lowers its confidence in stack assumptions, and offers to hand off toadapt-to-project(existing code) orinit-project(a new project) to establish one. It never drafts one itself. architect-designnow treats a saved design as future-state and points to reconciling it into current architecture once the change ships.
Changed
Section titled “Changed”architect-designchecks for a reference architecture, states the result in the concept including “none found”, and routes a missing one to Core’s producers when they are in the roster; with neither present it states the absence and continues.architect-designdescribes a saved design as future-state to be reconciled intocurrent-architectureafter the change ships; the README andDESIGN.mdmatch, andpack.tomlrecords the optional Core hand-offs.- One behavior eval covers the no-reference-architecture case.
[product-engineering][0.13.25] — 2026-10-10
Section titled “[product-engineering][0.13.25] — 2026-10-10”Highlights
Section titled “Highlights”- With the
architectpack installed, shaping now reaches architecture at the right moment.frame-intentoffersarchitect-designwhen framing hits a system-shape question.frame-domainandde-risk-intentofferarchitect-assessfor a current-state model.decompose-intentandmap-capabilitiesoffer a design before cutting work. Withoutarchitect, no architect offer, mention, note, or error appears. - When a saved design covers a feature,
decompose-intentnow carries it into the delivery contract’s design context, so the spec stage reads it. explore-options,diverge-solutions,de-risk-intent, anddecompose-intentnow use a current-architecture document, when one exists, to judge feasibility and check slices against subsystem boundaries.
Changed
Section titled “Changed”- Every architect offer is conditional on the available-skills roster and ends with one fixed sentence that keeps the absent case silent: no mention, no note, and no error.
frame-domain’s brownfield half reuses a current-architecture document first, and an absentarchitect-assessis never recorded as a grounding gap.frame-intentparks a system-shape question as an open design question inAssumptions, outside Outcome and Opportunity.pack.tomldeclares two optionalarchitectintegrations (architect-design-offer,architect-current-state) with a silent fallback. No dependency is added.- New behavior evals cover the installed and not-installed paths for
frame-domain,frame-intent,de-risk-intent, anddecompose-intent. A pack test pins the silent sentence at every offer.
[core][3.0.2] — 2026-10-10
Section titled “[core][3.0.2] — 2026-10-10”Highlights
Section titled “Highlights”- When
work-loopplans a rename, removal, or refactor, checks that a fix reaches live code, or whenbug-fixtraces a bad value through its callers, it can now hand that question torepository-exploration. That skill uses a code-navigation tool your agent already has when one fits, and otherwise searches the repository. repository-explorationnow activates when a workflow or a user needs evidence to settle a pending decision, and leaves planning, building, and fixing to the workflow that asked.
Changed
Section titled “Changed”work-loopPLAN step 5 and its DECIDE execution-path check, andbug-fixstep 6, namerepository-explorationas an optional route for caller and dependents evidence. “grep for callers” and “Grep for the same caller” are replaced with tool-neutral wording. No gate, reviewer, or workflow state is added.repository-exploration’s description is keyed to a pending decision, drops the trigger wording a code-graph skill uses, and says the calling workflow owns the change.repository-explorationgains activation evals and joins the pack’s activation-eval allowlist;repository-exploration,work-loop, andbug-fixeach gain one decision-bound behavior eval.- The consumer-boundary test admits the name
repository-explorationinwork-loopandbug-fixonly inside those three sentences; every provider setup, call, refresh, and fallback phrase ban is unchanged.
[code-intelligence][0.1.7] — 2026-10-10
Section titled “[code-intelligence][0.1.7] — 2026-10-10”Highlights
Section titled “Highlights”- Install the code-intelligence pack on its own, at repo or user scope. It no longer requires the core pack.
- The skill and both agents now carry their own evidence rules. Provider output is treated as data, and a file location the code graph returns is never opened; call sites are confirmed with the agent’s own search.
- Answers end with an evidence note: the question, the commands and sources used or passed over, and why.
Changed
Section titled “Changed”- The readiness check runs from the skill folder:
python '<skill-dir>/scripts/estate_preflight.py' --check, where<skill-dir>is the installedcode-intelligencefolder. - The README and first-session tutorial list the core pack as optional. When it is installed, its exploration skill can use this pack as a provider.
[product-documentation][0.1.2] — 2026-10-10
Section titled “[product-documentation][0.1.2] — 2026-10-10”Highlights
Section titled “Highlights”author-product-docsdocuments any repository — libraries, CLIs, APIs, apps, services, frameworks, plugins, and agent packs — by first discovering the product surface and checking the docs against its own sources.- Documentation audits start with a journey gap report that covers nine reader stages, from discovery to contributing.
- It now writes release notes, changelogs, migration guides, contributing guides, troubleshooting pages, quickstarts, installation pages, and docs landing pages.
Changed
Section titled “Changed”- Added the
surface-discoveryanddocs-journeyreferences. - A README page contract replaces the pack-only README contract.
- Evals add CLI and library cases.
surface-discoverycovers frameworks and library extension points, and audits produce one journey gap report per surface or audience, bounded for large doc sets. The skill checks untrusted repositories against source instead of running their code.- Guides are consolidated:
use-author-product-docsis merged intoauthor-product-docs.
[experience-design][4.1.4] — 2026-10-10
Section titled “[experience-design][4.1.4] — 2026-10-10”Changed
Section titled “Changed”- The
information-architecturedocumentation-design reference and eval point documentation writing atauthor-product-docs(if installed) instead of the retirednew-guide.
[product-engineering][0.13.24] — 2026-10-10
Section titled “[product-engineering][0.13.24] — 2026-10-10”Changed
Section titled “Changed”- The
ux-writingdescription and references route documentation prose toauthor-product-docs(if installed) instead ofnew-guide. - Added an eval case that separates troubleshooting pages from UI microcopy.
[core][3.0.1] — 2026-10-09
Section titled “[core][3.0.1] — 2026-10-09”Highlights
Section titled “Highlights”- A work-loop transition that your arguments cannot satisfy now stops without touching
state.json. Correct the command and run it again; previously the refusal left a marker behind that no later command could clear, and the run could only be rescued by hand-editing state.
loop-cohortvalidates a registered cohort effect against current state before it writes thepending_transitionmarker, in the same lock acquisition. A refusedcontract-amendment— for example one missing--completed-evidence-reffor a completed task — leaves the cohort byte-identical, so the corrected command no longer hitspending transition conflicts with this sequence. The guarantee covers every registered effect, not just amendments: a marker on disk is now one whose effect was appliable when it was written.
[core][3.0.0] — 2026-10-08
Section titled “[core][3.0.0] — 2026-10-08”Highlights
Section titled “Highlights”- Send all intake requests to
work-intake. Thecapture-workskill is removed and has no replacement alias. - A former
spec/<slug>or other legacy workspace entry surfaces as anunsupported_legacyfinding and cannot dispatch. Rewrite it in canonical form by hand and delete the old alias in the same edit — a canonical entry is refused dispatch while its old alias survives anywhere in the workspace. - Use
workspace-status repair-plan --migration-selection,repair-apply, andrepair-rollbackonly to recover or roll back an operation already recorded in the migration ledger.
Removed
Section titled “Removed”capture-workskill, its activation evals, its pack registration, and the alias-only router branch inwork-intake. There is no replacement alias; send all intake requests towork-intake.- Ordinary accepted-legacy reader from canonical reconciliation. Former legacy shapes produce
unsupported_legacyfindings and are not considered lifecycle memberships. Explicit migration, prune, and Type 2 repair retain their legacy decoding as non-dispatching repair operations.
[agentbundle][0.52.0] — 2026-10-08
Section titled “[agentbundle][0.52.0] — 2026-10-08”Highlights
Section titled “Highlights”- The workspace-status MCP tool now surfaces a former legacy entry (a bare
spec/<slug>string or other accepted legacy shape) as anunsupported_legacyfinding. The entry is absent fromreadyandblocked; ordinary reconciliation no longer accepts legacy shapes as lifecycle members. - A canonical entry with a surviving historical alias appears in
blockedwith aduplicate_membershipfinding and does not appear inready. Delete the alias and the canonical entry dispatches normally.
Changed
Section titled “Changed”- Packaged runtime
workspace_status_engine.pyandworkspace_status_prune.pysynchronized to Core 3.0.0: ordinary canonical reconciliation rejects former accepted-legacy shapes asunsupported_legacyfindings, and prune retains its legacy decoding as a repair-only operation.
[product-engineering][0.13.23] — 2026-10-08
Section titled “[product-engineering][0.13.23] — 2026-10-08”Highlights
Section titled “Highlights”- Skills and examples in the product-engineering pack that previously directed users to
capture-worknow direct them towork-intake, matching the Core 3.0.0 surface. frame-situationanddiverge-solutionsnote that old shaping entries still appear in the information-only shaping lists until rewritten in canonical form.
Changed
Section titled “Changed”map-capabilities,place-bet, anddiverge-solutionsskill guidance and examples referencework-intakeinstead ofcapture-work.frame-situationanddiverge-solutionsadd a note that former legacy shaping entries remain visible in the information-only shaping lists until replaced with canonical entries.
[release-engineering][0.1.11] — 2026-10-08
Section titled “[release-engineering][0.1.11] — 2026-10-08”Changed
Section titled “Changed”- Core dependency range updated from
^2.0to^3.0. Pack behavior is unchanged; this update tracks the Core 3.0.0 major release that removes thecapture-workalias.
[monorepo-extras][0.1.10] — 2026-10-08
Section titled “[monorepo-extras][0.1.10] — 2026-10-08”Changed
Section titled “Changed”- Core dependency range updated from
^2.0to^3.0. Pack behavior is unchanged; this update tracks the Core 3.0.0 major release that removes thecapture-workalias.
[iac-terraform][0.1.12] — 2026-10-08
Section titled “[iac-terraform][0.1.12] — 2026-10-08”Changed
Section titled “Changed”- Core dependency range updated from
^2.0to^3.0. Pack behavior is unchanged; this update tracks the Core 3.0.0 major release that removes thecapture-workalias.
[governance-extras][1.0.1] — 2026-10-08
Section titled “[governance-extras][1.0.1] — 2026-10-08”Changed
Section titled “Changed”- Core dependency range updated from
^2.0to^3.0. Pack behavior is unchanged; this update tracks the Core 3.0.0 major release that removes thecapture-workalias.
[code-intelligence][0.1.6] — 2026-10-08
Section titled “[code-intelligence][0.1.6] — 2026-10-08”Changed
Section titled “Changed”- Core dependency range updated from
^2.0to^3.0. Pack behavior is unchanged; this update tracks the Core 3.0.0 major release that removes thecapture-workalias.
[core][2.30.1] — 2026-10-08
Section titled “[core][2.30.1] — 2026-10-08”Highlights
Section titled “Highlights”- Close work whose descendants have terminal statuses with dates or notes, such as
Shipped (2026-09-11)orArchived — note. The closure check now reads the leading status word and preserves the full value in its evidence.
- Intent, brief, and spec terminality now follows the leading-token rule used by the spec-status lint. Annotations and transition notes no longer change the classification;
Approved → Shipped (x)remains non-terminal.
[core][2.30.0] — 2026-10-07
Section titled “[core][2.30.0] — 2026-10-07”Highlights
Section titled “Highlights”- Installed Core now answers “which specs and briefs deliver this feature intent?” one way. A typed resolver ships inside the
close-workandwork-loopskills, so every Core install carries it and it runs withoutagentbundleimportable. Bothclose-workand the traceability lint use its answer. A missing, contradictory, or unsafe mapping is reported by a stable code instead of being guessed. close-workruns the resolver whenever it closes a spec or checks a feature’s spec or brief delivery. The traceability lint runs it only when the repository has a delivery anchor (briefs, a rollup, or populated discovery layers), and fails withdelivery-resolver-unavailablewhen the spec or intent folder has moved.
- A typed delivery resolver ships as
intent_delivery_relations.pyinside theclose-workandwork-loopskillscripts/folders, pinned byte-identical to one source. It returns a deterministic JSON snapshot of feature delivery: typed links, per-feature classification, contextual provenance, diagnostics, and anartifactsmap from each identifier to its file path. It reads only confined artifact headers and refuses an unsafe or oversized corpus as an incomplete result.
Changed
Section titled “Changed”close-worktakes a feature intent’s delivery descendants from that snapshot and refuses closure when the mapping is missing, ambiguous, or contradictory. When a spec or brief carries a broken delivery reference, it refuses every feature that artifact could belong to and names the stable code.- The
work-looptraceability lint wires feature-delivery edges from the snapshot when a delivery anchor is present. A missing delivery target from a spec or brief fails the lint in every mode; contradictory or unsafe references fail under--strict; other delivery diagnostics are informational. A repository whose traceability layout moves the spec or intent folder away from the resolver’s fixed defaults now fails the lint withdelivery-resolver-unavailable, because the resolver reads only those default folders. - Both consumers validate every snapshot record and fail closed with
delivery-resolver-unavailablewhen the resolver is absent, fails, or returns an incomplete snapshot. Neither falls back to its own scan. - The Core pack eval harness now covers shared delivery descendants, the broken-spec refusal, and the fail-closed outcome for both consumers.
[code-intelligence][0.1.5] — 2026-10-08
Section titled “[code-intelligence][0.1.5] — 2026-10-08”Highlights
Section titled “Highlights”- Ask what a function depends on, all the way down, and get an answer from the
wicked-estatecommand line. You no longer need the optional MCP server for forward dependencies, graph walks, or rules lookups. - Ask which of a change’s dependents matter most, and get an importance ordering from the command line, with any dependent it could not rank named rather than dropped.
Changed
Section titled “Changed”- Wicked Estate 0.21.0 is the floor and the pinned install for both
wicked-estateandwicked-estate-mcp. The preflight exits 4 on an older binary. wicked-estate lineage,traverse,rules-inventory, andrules-recallare taught as CLI commands.lineagetakes an exact symbol id, so the skill resolves the name first. The MCP server is needed only for the memory, knowledge, and proposal tools and for the richer MCP response shapes.- Ordering a dependent set uses
rank --seedsfollowed by a filter to the set, because--seedsbiases a ranking of the whole graph rather than limiting it. blast-radius --jsonis taught with itsconfidencesummary. Bridged commands are taught as reportingSTALENESS:andCLAMPED:on stderr.sourceselectors are taught as working without--json, and a flag a command does not read is taught as an error.- The live CLI contract tests, the vocabulary allowlist, the retired-claim scanner, and the evals follow the 0.21.0 surface.
[code-intelligence][0.1.4] — 2026-10-07
Section titled “[code-intelligence][0.1.4] — 2026-10-07”Highlights
Section titled “Highlights”- The pack now includes a worked example showing how to answer a change-impact question with a code index and how to answer the same question without one, with the limits of each approach named rather than rounded away.
- The example marks which steps come from the core pack’s shared rules for answering code questions and which are specific to Wicked Estate, so another code-intelligence tool does not need to copy Wicked Estate’s commands.
references/composition-example.md: a worked composition example covering a direct-dependents question through two paths.- Provider-fit path: preflight ready, fresh index; symbol resolved via
wicked-estate resolve parse_config --json; direct dependents fromwicked-estate blast-radius parse_config --depth 1 --json; completeness limits includingunresolved,truncated_dependents,searched_depth, andnode_cap_reachedkept; stopped at depth 1. When Core’srepository-explorationskill runs the inquiry, load-bearing call sites are verified through Core’s locator reader. When Core’srepository-explorationskill is not running the inquiry, each call site is confirmed with repository-native search, withwicked-estate source --symbols <id> --jsonoutput labelled as indexed-revision snapshot evidence. - Fallback path: binary absent, no index, version below floor, or index stale for the changed file. Text search and source reading with named gaps; commit range bounded by the
STALENESS:count fromwicked-estate stats; no install or re-index.
- Provider-fit path: preflight ready, fresh index; symbol resolved via
- Five pack-local behavior evaluations graded from each run’s evidence record: provider-fit, provider-absent, poor-fit (staleness detected from
wicked-estate statsand bounded commit history), Core-only (no provider in session), and untrusted output (parent-segment locator refused, embedded instruction recorded as data).
Changed
Section titled “Changed”SKILL.md§ Evidence discipline now asks for every command quoted exactly as run, flags included, and for an output a caller supplied to be reported under the command it stands for, so a run record is reproducible without inspecting a tool trace.SKILL.md,README.md, and the how-to guide route to the composition example and state that other providers may expose fewer, different, or new capabilities and need not emulate Wicked Estate.
[core][2.29.1] — 2026-10-07
Section titled “[core][2.29.1] — 2026-10-07”No Highlights: this release adds maintainer-only shadow acceptance services behind an opt-in flag and changes no skill outcome or user task; adopters receive no new invocation. The omission is a recorded decision rather than an oversight.
- Callable shadow acceptance services now ship in
packs/core. The services — acceptance projection, approval import, evidence transactions, subject projection, security primitives, content-safety guard, and the compatibility facade — are standard-library-only scripts in thework-loopskill. WithWORK_LOOP_SHADOW_SERVICES=1, the engine records an evidence receipt after each transition. When the plan locks, it also imports the approval against the approved spec and plan digests, projects the delivery subject when the tree allows (it skips a dirty tree or an oversized manifest), and derives a verdict, all under the feature’s.shadow-acceptance/folder. The current engine keeps all authority, and every result stays non-authoritative shadow evidence until a separately accepted governance record enables a cutover. Maintainers can verify parity, run import and reversal checks, and confirm cross-adapter conformance without reading the delivery spec.
[core][2.29.0] — 2026-10-06
Section titled “[core][2.29.0] — 2026-10-06”Highlights
Section titled “Highlights”- Core now has a
repository-explorationskill for open questions about how your code behaves, what it depends on, and what a change would affect. It uses a code-intelligence tool your agent already has only when that tool fits the question, keeps the tool’s limits, checks key claims against the source, and stops once the question is answered. With no tool installed it still answers from the repository. - Tool output stays data. A tool’s description, its results, or a file it points to cannot add a folder the agent may read, start a refresh or install, or run a change on its own. A refused file stays unread.
repository-explorationships its method, a locator reader that reuses therepository-groundingreader with its own 2 MB limit, and 24 behavior evaluations covering editor and indexed tool shapes, fallback, conflict, disclosure, unsafe locators, and tool output that tries to act as instructions.
Changed
Section titled “Changed”- The
repository-groundinglocator reader accepts an optional byte limit from a calling skill; its own limit and behavior are unchanged.
[core][2.28.0] — 2026-10-05
Section titled “[core][2.28.0] — 2026-10-05”Highlights
Section titled “Highlights”- Core now has a
repository-groundingskill that answers “what already governs these paths?” from the repository alone, and can add evidence from a code-intelligence tool your agent already has. Provider evidence is labelled, its limits are kept, a claim that conflicts with source never decides the answer, and with no tool installed the answer is the same. - A path or
file:URI a provider returns is read only if the file sits inside the repository or a folder that you or the calling workflow approved. Symlinks, hard links, non-regular and oversized files are refused with a stated reason, and the locator text never reaches a command line raw, so shell metacharacters in it cannot run.
repository-groundingships the path-seeded explorer, theread-locator.pylocator reader with a co-located copy of the confinement helper, and 22 behavior evaluations covering provider fit, absence, failure, conflict, unsafe locators, disclosure, and provider output that tries to act as instructions.
Changed
Section titled “Changed”new-specstep 3 now delegates its grounding inquiry torepository-groundingby skill name. The explorer moved fromnew-spec/scripts/explore-grounding.pytorepository-grounding/scripts/explore-grounding.py; automation that called the old path should call the new one.
[converters][0.9.7] — 2026-10-05
Section titled “[converters][0.9.7] — 2026-10-05”No Highlights: this release changes maintainer verification and dependency
reproducibility, not a skill outcome or a user task. The omission is a recorded
decision rather than an oversight.
Changed
Section titled “Changed”- Converters now carries committed lockfiles for its canonical JavaScript projects, so maintainer verification can reproduce dependencies without running dependency scripts.
[core][2.27.14] — 2026-10-03
Section titled “[core][2.27.14] — 2026-10-03”Highlights
Section titled “Highlights”- Installed Core can now rename an intent as a recoverable retire-and-issue operation. The old path becomes a tombstone, the successor receives a fresh target-token ordinal, citations and
workspace.tomlmove with it, and an interrupted run can be driven forward or back.
work-intakenow shipsintent_rename.pywith installedrename,recover, andresolvecommands for operators.- Product Engineering now includes a how-to for renaming an intent and recovering an interrupted rename.
Changed
Section titled “Changed”work-intakeandintake-intentnow point existing-intent filename changes to the rename operation instead of saying an intent can never be renamed.- The Core pack eval harness now covers installed rename, recovery, and tombstone resolution behavior.
[governance-extras][1.0.0] — 2026-10-04
Section titled “[governance-extras][1.0.0] — 2026-10-04”Highlights
Section titled “Highlights”navigate-decisionsreplaces the retiredrfc-statusskill. It queries both ADRs and RFCs for exact lifecycle, checked supersession lineage, contextual references, guidance context, and record detail. It also exports a self-contained offline HTML explorer with list, lifecycle-graph, guidance-context, and record-detail views.
Changed
Section titled “Changed”- Breaking:
rfc-statusis removed. Usenavigate-decisionswith asummaryprompt (or ask “show me the RFC landscape”) to get the counts and lifecycle viewrfc-statusprovided. Allrfc-statusactivation prompts now route tonavigate-decisions.
Migration
Section titled “Migration”Run navigate-decisions summary (or ask “how many RFCs are in each lifecycle state?”) in place of rfc-status. For exact record detail, use navigate-decisions record ADR-NNNN or navigate-decisions record RFC-NNNN. For offline review, export with navigate-decisions export.
[iac-terraform][0.1.11] — 2026-10-04
Section titled “[iac-terraform][0.1.11] — 2026-10-04”Changed
Section titled “Changed”- The
governance-extrasdependency range is widened to^1.0(from^0.11). Theiac-terraformpack behavior is unchanged; this update tracks the governance-extras major release that replacedrfc-statuswithnavigate-decisions.
[frontend-engineering][0.4.5] — 2026-10-04
Section titled “[frontend-engineering][0.4.5] — 2026-10-04”Changed
Section titled “Changed”- The evidence manifest’s
visual authorityfield now lists every upstream gap the build held, with its axes, its operation kind and its route class — never the recorded owner or operation itself, which goes to the operator live — so a held axis is visible rather than read as an absence. - The
visual-authority-silent-domaineval asks for the bound custom-property block and the gap record, so its fixed checks grade what the run produced.
[frontend-engineering][0.4.4] — 2026-10-04
Section titled “[frontend-engineering][0.4.4] — 2026-10-04”Highlights
Section titled “Highlights”- A token taxonomy that says nothing about a visual domain the surface needs — no value, and no
unresolvedrecord — is now an upstream gap. The build holds that axis and routes it to whoever produced the taxonomy, instead of inventing a type scale or stroke widths that read as resolved.
- A
visual-authority-silent-domaineval case grades the hold, and the two golden-path cases now state typography, shape and layout values so they leave nothing silent.
[frontend-engineering][0.4.3] — 2026-10-04
Section titled “[frontend-engineering][0.4.3] — 2026-10-04”Changed
Section titled “Changed”- The token-namespace rule now resolves in order: the naming a taxonomy’s Binding section records, else the incumbent’s own names, else
--ds-*for a system this pack seeds. The manifest’svisual authorityfield, not the prefix, records where values came from, andfrontend-reviewerflags a parallel token system against that order rather than any--ds-*set. - The visual-authority eval cases are calibrated against live runs: the two gap cases and the standalone case start from what the handoff read extracted or name the product, every case asks for the
visual authorityline in the reply, hex values are lower-case, and fallback detection keys on the fallback’s own values rather than the shared--ds-*names.
[frontend-engineering][0.4.2] — 2026-10-03
Section titled “[frontend-engineering][0.4.2] — 2026-10-03”- Three golden-path eval cases for the visual handoff: a confirmed target with the taxonomy’s concrete values, an unconfirmed target, and a design-handoff refusal that must stay a refusal. Each grades both sides deterministically — the values it must carry and the fallback declarations it must not.
Changed
Section titled “Changed”- The upstream-gap, unresolved-domain and standalone visual-authority eval cases now carry deterministic
expectcriteria: the two gap cases exclude fallback token declarations, and the standalone case expectslocal-premise.
[agentbundle][0.51.0] — 2026-10-03
Section titled “[agentbundle][0.51.0] — 2026-10-03”Highlights
Section titled “Highlights”- Protected catalogue installation without manual token injection. AgentBundle
now picks credentials automatically from a priority-ordered set: bearer token,
JFrog CLI 2.105.0+ profile, exact-machine
.netrcrecord, and anonymous. Public catalogues need no setup. A broken configured provider stops resolution; no fallback across types. SetAGENTBUNDLE_CA_BUNDLEfor the direct path; useSSL_CERT_FILEorSSL_CERT_DIRto reachjf apion Linux.
- HTTPS catalogue acquisition resolves credentials automatically from four
providers in priority order: bearer token (
AGENTBUNDLE_HTTP_BEARER_TOKEN), JFrog CLI profile (2.105.0+), exact-machine.netrc, and anonymous. Each provider binds credentials to one normalized origin and does not forward them to any other host. - JFrog CLI delegated fetches: 10 s discovery, 5 s version probe, 30 s per fetch, 75 s aggregate subprocess budget, endpoint confinement, list-form arguments.
- Exact-machine
.netrc: host or host:port keys;defaultis never matched; permissions checked before reading.
Changed
Section titled “Changed”- A broken configured provider terminates resolution immediately. It never falls back to a lower provider.
- Requires
credbroker>=0.7,<0.8.
[credbroker][0.7.0] — 2026-10-03
Section titled “[credbroker][0.7.0] — 2026-10-03”resolve_http_access(target_url, *, env)— resolves target-bound HTTP access from a priority-ordered provider set (bearer, JFrog CLI, exact-machine.netrc, anonymous). Returns one ofBearerHttpAccess,JfrogCliHttpAccess,NetrcHttpAccess, orAnonymousHttpAccess. RaisesHttpAccessErrorwith a stable non-secretproviderandcodefor broken configured providers.HttpAccessError,BearerHttpAccess,JfrogCliHttpAccess,NetrcHttpAccess,AnonymousHttpAccess— five new public names added to__all__.
[credential-brokers][0.3.4] — 2026-10-03
Section titled “[credential-brokers][0.3.4] — 2026-10-03”Changed
Section titled “Changed”- The vendored
credbrokeruser-library floor in.apm/user-libs/credbroker/is updated to match thecredbroker0.7.0 source. A co-located pip-installed 0.7 takes precedence via normalsys.pathordering; the floor remains the zero-pip fallback for user-scope skill resolution.
[core][2.27.13] — 2026-10-02
Section titled “[core][2.27.13] — 2026-10-02”lint-traceabilityno longer reports a duplicate intent id when a retired intent leaves a tombstone. A tombstone keeps its oldSlug:so existing links still resolve, and the reissued record carries the same slug; the lint now skips any intent file whose preamble carries aTombstone:field, so only the reissued record becomes theintent:node.
[core][2.27.12] — 2026-10-01
Section titled “[core][2.27.12] — 2026-10-01”- Added paired
new-specbehavior evaluations for a shared repository substrate and an isolated private refactor, plus awork-loopcase that rejects feature-only evidence for accepted preservation properties. The cases measure future authoring and completion behavior without making optional repository-grounding tools mandatory.
[frontend-engineering][0.4.1] — 2026-10-02
Section titled “[frontend-engineering][0.4.1] — 2026-10-02”Highlights
Section titled “Highlights”- The
approved-visual-targetrung now resolves only when the direction artifact carriesvisual_target: confirmed. An approved target whose confirmation was never recorded no longer satisfies the rung; the distinction is in the artifact, not in a reviewer’s memory.
[experience-design][4.1.3] — 2026-10-02
Section titled “[experience-design][4.1.3] — 2026-10-02”Highlights
Section titled “Highlights”- A visual target now binds composition only once a person confirms it and
convergerecordsvisual_target: confirmedin the direction artifact. An unconfirmed target is still captured —convergerecords it asvisual_target: unconfirmed— it just does not bind, and the rung that reads the field is downstream infrontend-engineering.
[core][2.27.11] — 2026-10-01
Section titled “[core][2.27.11] — 2026-10-01”Highlights
Section titled “Highlights”- A work-loop run whose
state.jsonrecords no retry cap now shows the default cap of 5 on its event line, instead of no cap at all. The run was always held to 5, so a dashboard or alert watching how close it is to being refused was reading nothing where it should have read 5. A malformed cap, which the guard refuses, still reportsnull, and so does a retry count nothing has recorded; the key is always present, which is how a consumer tells “not recorded” from zero.
loop-engine’sbudgetssnapshot resolvesmax_implementation_retriesandmax_review_retriesthrough the same default-resolution helper the guard layer enforces them with, so an absent cap reports the default the guard enforces. A malformed cap still reportsnull, and the two retry counters keep their existing absent-when-unrecorded behaviour.
[core][2.27.10] — 2026-10-01
Section titled “[core][2.27.10] — 2026-10-01”- Added a position-free
familieskey to review-classification payloads for future recurrence work. The key is emitted but has no consumer, state, comparison, or verdict effect.
[core][2.27.9] — 2026-10-01
Section titled “[core][2.27.9] — 2026-10-01”Highlights
Section titled “Highlights”- Work planning now records only declined architectural additions that materially affect scope or design, and sizes review units by whether they can be independently understood, verified, or reviewed.
Changed
Section titled “Changed”- Review shape remains explicit, while roughly 2,000 reviewable behavior and test lines is now a heuristic for extra scrutiny rather than a threshold.
- A review unit that cannot be independently understood, verified, or reviewed is split into dependency-ordered units, or carries a transformation/reproducibility proof when it is mechanically uniform WIDE work.
[core][2.27.8] — 2026-10-01
Section titled “[core][2.27.8] — 2026-10-01”- The pack’s filesystem-confinement and state-lock scripts carry corrected
context-manager return annotations —
GeneratorwhereIteratorwas written. No behaviour changes and no interface moves. The same correction reachesagentbundle, which bundlesfile_safety.pybyte-identically.
[core][2.27.7] — 2026-10-01
Section titled “[core][2.27.7] — 2026-10-01”Highlights
Section titled “Highlights”- Renaming a live intent whose title mentions tombstones now works. The rename validator reads a document title as a title rather than as a damaged retirement marker, so an intent called something like “Tombstone migration plan” is no longer refused. Nothing that should be refused now passes.
- The intent rename validator’s damaged-marker scan skips a single leading H1 title. A token-bearing line that parses as no field still refuses, a later heading still refuses, and a successor-pointer field without a retirement marker still refuses.
[core][2.27.6] — 2026-09-30
Section titled “[core][2.27.6] — 2026-09-30”Highlights
Section titled “Highlights”- Work-loop can now explain a scheduled wave before dispatch without authorizing concurrent writes.
loop-cohort wave-decision --jsonreports unfinished tasks asparallel-capableorsequential, includes pairwiseTouches:relations, and returns fixed public-safe JSON refusal envelopes while leaving ADR-0005’s post-write gate and ADR-0061 D5 unchanged.
- Added the read-only
loop-cohort wave-decisionscreen for scheduled cohorts. It reports task-level admission candidates, pair-leveldisjoint/overlapping/unknownrelations, andadmission_pending: trueon verdicts. - Added a versioned JSON contract for
wave-decisionverdict and refusal envelopes, including stdout JSON refusals under--jsonwith bounded public-safedetailmessages.
Changed
Section titled “Changed”- Supervisor guidance now separates the pre-dispatch
wave-decisionscreen from the existing post-writedispatch-decisiongate and names_DANGER_PATH_REas shared by both consumers.
[governance-extras][0.11.3] — 2026-09-30
Section titled “[governance-extras][0.11.3] — 2026-09-30”Highlights
Section titled “Highlights”- The governance-index template and its how-to guide no longer promise that
generate-iacwill fill in missing domain rows for you. It never did: it offers to create an index when you have none, and it reads the one you already have. Both places now say so, and the guide tells you to add the row yourself.
- Removed the claim that
generate-iac“adds any missing domain rows” from the seed manifest, and the claim that it adds all eight IaC domains “automatically” from the governance-index how-to.
[core][2.27.5] — 2026-09-29
Section titled “[core][2.27.5] — 2026-09-29”Highlights
Section titled “Highlights”- Work-loop can now prove a current branch is fresh before it tries to write Git metadata. If the branch is stale, it still stops: environments that can prepare the update ask before updating, and locked-down environments tell you to refresh the branch separately.
- The base-freshness check now advertises the configured remote target first and returns current branches as ready without requiring a metadata-writing fetch.
- Stale branches remain blocking even when Git metadata writes are denied, with separate messages for update-capable and user-refresh-only environments.
[architect][0.15.15] — 2026-09-30
Section titled “[architect][0.15.15] — 2026-09-30”Highlights
Section titled “Highlights”- Well-architected reviews now route data/ML, GenAI/agentic, and serverless workloads only through their supported reference material.
Changed
Section titled “Changed”- Removed the unsupported SaaS workload-class lens claim from the architect review rubric.
[core][2.27.4] — 2026-09-29
Section titled “[core][2.27.4] — 2026-09-29”Highlights
Section titled “Highlights”- Renaming an intent no longer risks silently handing its old number to a different intent later. A retired filename now leaves a tombstone behind, and the number allocator counts tombstones alongside live intents, so a retired number stays out of circulation for as long as its tombstone stands.
- A rename-request validator in
work-intake. It answers one question — is this a well-formed request to rename a live intent — and returns either the resolved request or one fixed refusal token naming what was wrong. It refuses a source that is missing, outside the intents directory, not a regular file, unreadable, already a tombstone, unregistered, or carrying an uncommitted change; an unparseable or ambiguous registry; an unrecognized target token; and an unresolvable repository root. - A tombstone reader and writer in
work-intake. A tombstone carries the retired artifact’s slug unchanged, the retirement date as one ISO 8601 calendar date, and exactly one of a successor path or a retirement note. Bad values are refused rather than written: a malformed date, a successor path outside the intents directory, an empty note, both pointer fields, or neither. - The retirement date is supplied by the caller rather than read from a clock, so an operation running across midnight writes the date it started with rather than two different dates.
Changed
Section titled “Changed”- The number allocator’s guarantee is now stated over tombstones as well as live intents: the next number for a type exceeds every number that type carries in the intents directory, counted across both.
[code-intelligence][0.1.3] — 2026-10-03
Section titled “[code-intelligence][0.1.3] — 2026-10-03”Highlights
Section titled “Highlights”- The agent can now ask for the route from one symbol to another using
wicked-estate path. A result offound: falsewithdepth_bounded: truemeans the route was not proven absent — the search hit its depth limit — and you can raise--max-depth(up to 16) to look deeper. - A blast radius now tells you when the depth limit cut it short.
depth_horizon_reached: truein the JSON output means the result is a floor, not the full set;--depth N(maximum 24) lets you search deeper, and--depth 1isolates the direct dependents from the transitive ones.
Changed
Section titled “Changed”- Requires Wicked Estate 0.18 — floor and pin are both 0.18.0; a binary older than 0.18 causes the preflight to exit 4 with a remediation command.
wicked-estate pathis now documented: it follows dependency edges of every kind, returns the shortest route, and reports whether afound: falseanswer is bounded (depth_boundedornode_boundedtrue), names an unknown symbol (unresolvedset), or is proven absent (neither). The 0-basedlinefield in path hop endpoints is noted.blast-radius --depth Nand its three cut fields (searched_depth,depth_horizon_reached,node_cap_reached) replace the earlier silent-depth-12 guidance.- MCP-only additions are documented as schema-derived: the
Pathtool,Lineagewithrelation: "flows_to",SearchEntitywithinclude_values,rules.recallwithprojects, and the cut fields onTraverseGraph,BlastRadius, andLineage. Tool counts are 30 without an embedding backend, 31 with one.
[code-intelligence][0.1.2] — 2026-09-30
Section titled “[code-intelligence][0.1.2] — 2026-09-30”- A guide home at
guides/code-intelligence/: what the pack is for, a first-session tutorial that ends with reading the completeness numbers rather than just the answer, a how-to covering the five investigation patterns, and a reference for the command surface and its gaps. - A pack journey describing the outcome — find out what is actually true about a codebase before changing it — with the two decisions it asks of you: which symbol was meant when a name is ambiguous, and whether to build the index, which writes into your working tree.
[code-intelligence][0.1.1] — 2026-09-30
Section titled “[code-intelligence][0.1.1] — 2026-09-30”Changed
Section titled “Changed”- The capability reference now states maturity per provider surface: the command-line surface is validated against a real index, and the MCP surface is read from upstream’s published schemas and has never been run here. Claims from the two are no longer presented alike.
- The gap analysis names which of its findings were observed by running the tool, which were read from upstream’s schemas, and which were read from its source because the tool does not report them.
[experience-design][4.1.2] — 2026-09-30
Section titled “[experience-design][4.1.2] — 2026-09-30”Highlights
Section titled “Highlights”- You can now record whether a direction’s visual target was ever confirmed, and tell that apart from never having asked. A
visual_targetkey on the direction artifact holds one ofnone,unconfirmed, orconfirmed, andconvergewrites it every time it runs, so the answer is there without you remembering to add it. Nothing reads the field and nothing is gated on it: it is a record you can act on when you want to, and ignore when you do not.
[experience-design][4.1.1] — 2026-09-29
Section titled “[experience-design][4.1.1] — 2026-09-29”Highlights
Section titled “Highlights”- Adding a component or section to a surface that already has an aesthetic direction no longer restarts the vibe conversation. The
inheritroute now scopes the new element against the direction’s existing goals and axis commitments, which is what its route table always promised.
- The
frameoperation’s interrogation instruction is scoped to theextendandoriginateroutes. It previously read unconditionally, contradicting the route table’s promise thatinheritruns no fresh interrogation.
[code-intelligence][0.1.0] — 2026-09-29
Section titled “[code-intelligence][0.1.0] — 2026-09-29”Highlights
Section titled “Highlights”- Ask what is actually true about a codebase before changing it. Index the repository once, then ask what calls a symbol, what a change would break, or how the system is organised — answered from a resolved call graph rather than a text search.
- Answers carry the index’s own limits. The unresolved-reference count, the truncated-row count, and the traversal horizon are reported rather than rounded away, so a blast radius reads as a floor instead of a total.
- The
code-intelligenceskill: five reusable investigation patterns, a capability map from tool-neutral intent to the exact command, evidence and provenance handling, and a fourteen-point assessment of what the provider does and does not expose. - Two forked-context subagents:
code-investigatorfor evidence-driven investigation, andimpact-analystfor structured change-impact analysis. Both are workflow-neutral and read-only. - Graceful degradation. Without an index the skill falls back to ordinary repository search and labels it as such; it never presents a text search as a blast radius, lineage, or provenance.
[frontend-engineering][0.4.0] — 2026-09-29
Section titled “[frontend-engineering][0.4.0] — 2026-09-29”Highlights
Section titled “Highlights”- Frontend builds now stop on upstream design gaps instead of filling them from a fallback, local premise, or category habit. When a resolved direction is missing the needed taxonomy, or a taxonomy records a domain as unresolved, the run holds only that axis and routes it back to the recorded owner or operation.
- Standalone visual work now has a clear admission rule: it is allowed only when there is no applicable design artifact, no incumbent system, and no upstream authority left to complete. That keeps greenfield work moving without turning unfinished design decisions into implementation choices.
Changed
Section titled “Changed”- The visual-authority eval corpus now grades upstream-gap routing, unresolved-domain handling, and the three standalone admission conditions.
- The pack and Claude plugin metadata now publish Frontend Engineering
0.4.0.
[experience-design][4.1.0] — 2026-09-29
Section titled “[experience-design][4.1.0] — 2026-09-29”Highlights
Section titled “Highlights”- Design artifacts now tell downstream builders who owns every unresolved domain and which operation supplies it, so “unresolved” routes work back upstream instead of inviting a consumer to invent a value.
- The design thread now makes
design-systemconditional, not merely optional. Run it when a direction exists and neither a completed design system nor a coherent incumbent system supplies every concrete value the surface needs; skip it when an incumbent system already covers the work.
Changed
Section titled “Changed”- The design-system eval corpus now grades unresolved-domain records that place the supplying operation beside the owner and require consumers to resolve no value for those domains.
- The pack and Claude plugin metadata now publish Experience Design
4.1.0.
[product-engineering][0.13.22] — 2026-09-29
Section titled “[product-engineering][0.13.22] — 2026-09-29”Highlights
Section titled “Highlights”frame-intentnow refuses a configured destination before writing when resolving it follows a symlink out of its anchoring root. An ordinary absolute destination outside the repository still asks first, and a personal-scope destination remains legitimate.
Changed
Section titled “Changed”- Split output-directory escapes into three explicit verdicts in both the
frame-intentworkflow and its layout reference: refuse symlink escapes, refuse paths containing.., and ask before using absolute-only paths that resolve outside the repository.
[core][2.27.3] — 2026-09-28
Section titled “[core][2.27.3] — 2026-09-28”Highlights
Section titled “Highlights”loop-cohort statusnow shows what each wave’s dispatch records actually say. A wave whose every task was declined used to read exactly like one whose every task was implemented; both reported the same single flag. The new per-wave counts separate receipts, declines, superseded records and unaccounted tasks, so someone reading a finished run can tell which waves were implemented and which were not.
wave_dispatch_accountinginloop-cohort status, in both the default and--jsonoutput: one entry per scheduled wave, ornullfor a wave whose accounting is undefined. Counts are taken once per task position, so a wave listing one identifier twice counts it twice and a receipts key naming a task outside the wave counts for nothing. The value reflects the partition live at the time of the call, not what any past wave exit saw.
[core][2.27.2] — 2026-09-27
Section titled “[core][2.27.2] — 2026-09-27”Highlights
Section titled “Highlights”- Ask the agent to explain a diff, branch, commit, or pull request and you get back one self-contained offline HTML lesson — background, intuition, a code walkthrough, and a five-question quiz — written for that specific change rather than poured into a shared template. The agent reports the exact file path it wrote.
explain-diffskill. It traces the changed code and nearby tests, designs the lesson, and publishes it through a bundled standard-library publisher that needs no network access and no third-party dependency.- The publisher writes a dated, collision-resistant file under the operating system’s temporary directory by default, and writes elsewhere only to an output root the user approves. It redacts secrets, tokens, email addresses, private hostnames, personal names, and user-home paths from the page while preserving the code path being taught.
work-intakeroutes explanation requests toexplain-diff, keeping them separate from correctness review, bug fixing, and document conversion.
[core][2.27.1] — 2026-09-27
Section titled “[core][2.27.1] — 2026-09-27”Highlights
Section titled “Highlights”- Interrupted work-loop transitions now replay without separate cohort repair commands. The five registered cohort-effect transitions apply their effects through
loop-cohort.py, record one durable transition identity, and safely resume without double-advancing a wave, double-counting a retry, or duplicating a review round.
Changed
Section titled “Changed”- Cohort state moves to schema 2 with
pending_transitionand a unified, oldest-first-truncatedtransition_history; engine state remains schema 1. Runs crossing this boundary must use the authorizedloop-cohort resetthenloop-engine resetrecovery pair.
[frontend-engineering][0.3.5] — 2026-09-28
Section titled “[frontend-engineering][0.3.5] — 2026-09-28”Highlights
Section titled “Highlights”- The guides now describe the pre-flight the pack actually ships. The design-handoff how-to states the four-rung precedence in order and says what happens when a slot is empty; the tutorial walks the rung an adopter without a design tree actually uses, working from a stated premise rather than copying a named product.
- Where your token taxonomy already resolved a value, the build now uses that value as given instead of re-deriving its own. Re-deriving a number the design step already decided is how a surface drifts from the direction it was supposed to inherit; what the taxonomy left as a relationship, or recorded as unresolved, is still the build’s work to settle.
- You can now see what the frontend reviewer actually checks. Its reference page documents all seven lenses, including the visual-authority lens, and says what evidence confirms each one — the diff for five, a rendered capture for one, the evidence manifest for the last.
Changed
Section titled “Changed”- The tutorial’s worked example is re-based onto the standalone fallback rung. Its brief states a visual premise in the pack’s own words, and the step that used to pick an aesthetic reference now resolves visual authority and records the rung it landed on. The seed-token step is now token-value resolution. It starts from the fallback block the reference ships, replaces the placeholder accent as that reference instructs, and accounts for every value it changes or adds relative to that block — so a reader can tell an inherited number from a decided one.
- The journey’s implementation sequence describes visual-authority resolution and the render-observe-correct loop instead of an aesthetic reference and a seed token block. The acceptance gate asks for
visual authorityin the manifest, and the review gate names the visual-authority lens. - Both guide manifest examples carry the
visual authorityfield, so an example no longer shows a manifest shorter than the field list it documents. - Where the token taxonomy resolved a value, the build now uses it as given rather than re-deriving it. Re-deriving a value the design step already decided is how a surface drifts from its direction; what the taxonomy left as a relationship, or recorded unresolved, is still the run’s work.
- Adopter guidance that described a fallback the previous release deleted. The
experience-designjourney, its depth how-to and its README each said the frontend pre-flight falls back to its own canonical reference for an unfilled slot. It does not: the slot resolves from a lower rung, and the run records which. The frontend design-handoff how-to carried the same claim. - The
frontend-engineeringreference page described the reviewer as reading five lenses and the rendered page for a sixth, which stopped being true when the seventh lens shipped.
[experience-design][4.0.3] — 2026-09-28
Section titled “[experience-design][4.0.3] — 2026-09-28”Highlights
Section titled “Highlights”design-systemnow decides your product’s visual system instead of handing you an empty table of token names. It resolves typography, color, spacing, shape, depth and motion. Each decision records the authority behind it, so you can tell an inherited value from a derived one at a glance.- A system you already have is inherited, not replaced. The skill finds the source of visual truth your interface actually reads from and judges whether it is coherent. It fills only the gaps your current work needs, keeps your naming conventions, and will not build a second system beside your first.
- Nothing in the pack carries a palette, typeface, scale, radius, shadow or easing value. Your product’s values come from your direction and your existing system, so two unrelated products no longer end up looking the same.
- Four routes with a selection rubric that picks one before any reference loads, so the choice is readable on a small model.
- A six-rung design-authority precedence — a stated constraint, an approved visual target, the approved direction, the incumbent system, the named platform’s convention, then the skill’s own derivation. A rung overrides a lower one only on the axis it decides. The approved visual target binds composition and relationships and supplies no value, matching what the direction writer and the frontend build already say.
- A map from each of the fifteen direction axes to the one system domain it constrains, so every resolved value is traceable to the commitment that authorised it.
- A rule for the two things
[platform-default]means upstream. Where your named target surface genuinely owns a decision, the value resolves from that platform’s convention. Where nobody decided, the domain is recorded unresolved with the missing authority named — never filled with a guess. - A proving set: the smallest group of real product needs that exercises every resolved domain, checked before the artifact is written and recorded in it. Token tables that look tidy and fail on contact with real content are the thing this catches.
- Two references — value derivation and incumbent systems — loaded only by the route that needs them.
- Seven evaluation cases: a mature incumbent system, a greenfield distinctive direction, a visual target, a rejected category default, a brownfield conflict, insufficient authority, and an accessibility conflict.
Changed
Section titled “Changed”- The artifact records authority, the relationships implementation must preserve, explicitly prohibited treatments, the proving set, accessibility adaptations, how the values bind to whatever architecture you already use, what changed against an incumbent system, and only genuinely unresolved decisions. Its address and
type: token-taxonomyidentity are unchanged, so anything already reading it keeps working. - Accessibility is now stated as a floor that constrains every resolved value and supplies none. It is not ranked against a goal, because it is not in the arbitration. A value that cannot clear it is adapted, and the adaptation is recorded rather than made silently.
- The pack’s “no values, ever” invariant is now “no universal values, ever” — it binds what the pack carries, not what a run writes for you.
- The Experience Design guide and pack documentation describe the resolved artifact.
- The pack and Claude plugin metadata now publish Experience Design
4.0.3.
[frontend-engineering][0.3.4] — 2026-09-27
Section titled “[frontend-engineering][0.3.4] — 2026-09-27”Highlights
Section titled “Highlights”- When your team has already agreed a visual direction, the frontend build now inherits it instead of quietly picking a different look. The skill resolves visual authority from the design artifacts your repository already points at, falls back to the visual system you already have, and only invents a premise when a surface is genuinely greenfield. It no longer names a product as an aesthetic anchor.
- Significant visual work is now looked at while it is being built. The agent renders a representative state, compares it against the direction it inherited, corrects once where the difference is material, and renders again to check — then goes on to the usual gates. The loop is bounded: a further pass happens only if you ask.
- A four-rung visual-authority precedence — an approved visual target, then the direction and token taxonomy, then the incumbent system, then a stated local premise — with each rung naming what it binds and which rung it falls to. A lower rung never overrides a higher one.
- A statement of what visual authority never controls: product behaviour, accessibility, content correctness, data and state, security, established component contracts, and platform constraints. Where a visual decision fights the accessibility floor, the floor wins.
- A
visual authorityfield in the evidence manifest, recording which rung supplied the visual decisions and the artifact or convention it named. A run that used the fallback records that explicitly. - A seventh lens in
frontend-reviewer, testing the manifest’s visual-authority claims against the diff. It scores no aesthetics and re-runs no design work. - Six evaluation cases covering the approved-target, direction-only, brownfield, standalone, non-visual and no-browser paths.
Changed
Section titled “Changed”- The named-aesthetic-reference step is now visual-authority resolution. The canonical product-reference table is gone, along with every pointer to it. A product name was always a poor instrument for this: it carries whatever the model associates with that product today, which is why so much generated work converges on the same look. If you relied on it, two routes give you back the determinism. Write a direction artifact under your design output directory and the build inherits it; or state the qualities you want in-session — the density, the voice, the restraint — and the run records that as
local-premise. Naming a product as shorthand for qualities still works in conversation; what changed is that the skill no longer reaches for one on your behalf. - The seed token block moved out of the always-loaded skill into a fallback reference, read only when no taxonomy and no incumbent system supply values.
- Print and slide guidance — the page box, colour-adjust and page-break rules — moved to its own reference, loaded whenever the output targets a PPT slide or PDF export, whatever supplied the token values.
- A run could previously record a completed visual check without any capture behind it, because nothing connected the claim to the evidence. A claim with no capture is now rejected, and where no browser is reachable the run names the missing capability and claims nothing.
Known gap
Section titled “Known gap”- The pack’s journey page and its guide tree still describe the previous pre-flight — a named aesthetic reference and a seed token block. The skill is the current behaviour; those pages land in the next patch.
[experience-design][4.0.2] — 2026-09-27
Section titled “[experience-design][4.0.2] — 2026-09-27”Highlights
Section titled “Highlights”creative-directionnow turns product context into a buildable visual contract, not just a mood statement: it records the engagement mode, product-specific visual thesis, first-viewport thesis, honest evidence and asset status, and optional visual-target boundaries without requiring Product Engineering, Frontend Engineering, a comp, browser control, or image analysis.
Changed
Section titled “Changed”- The Experience Design guide now describes the direct-answer and optional-artifact inputs
creative-directionaccepts, plus the product-specific output fields adopters should expect. - The pack and Claude plugin metadata now publish Experience Design
4.0.2.
[experience-design][4.0.1] — 2026-09-27
Section titled “[experience-design][4.0.1] — 2026-09-27”Highlights
Section titled “Highlights”- The first approval now happens where you can actually make it. The journey approval covers the journey and the screens derived from it, so it comes after the screen flow exists rather than before. The check that earns it — does every screen trace to a moment in the journey — needs both halves in front of you.
- The adopter guide opens with the work, not the roster. The
experience-designguide front door now answers “I have an experience to design — how do I get from the user’s outcome to reviewed design intent?” It leads with one ordinary-language request, the stage sequence, the three decisions that are yours, what you end up holding, and which downstream pack consumes each artifact. The skill reference is still there, one level down.
JOURNEY.mdno longer claimsjourney-mappingproduces a screen list. It produces the journey;user-flowderives the screens, and the skill refuses a journey with one stage per screen. The gate contract in that file was already correct about when the approval falls; only its walkthrough disagreed.JOURNEY.mddescribesexperience-revieweras a dispatched reviewer role rather than presenting it as a skill to run, matching how the guide already described it.
[product-engineering][0.13.21] — 2026-09-27
Section titled “[product-engineering][0.13.21] — 2026-09-27”Highlights
Section titled “Highlights”- Feature and capability intents can now carry product facts for downstream experience work only when a surface is materially affected. The optional handoff names the affected journey or surface, first-success behavior, product proof, claim evidence, constraints, prohibited claims, and unknowns while backend-only work and product-level framing stay unchanged.
Changed
Section titled “Changed”frame-intentadds an optional Product-to-experience handoff block for qualifying capability and feature intents, keeps it as Product Engineering-owned Markdown, and does not require or invoke any downstream pack.- The feature-intent how-to names when the optional handoff appears and where Product Engineering stops.
[core][2.27.0] — 2026-09-27
Section titled “[core][2.27.0] — 2026-09-27”Highlights
Section titled “Highlights”- Ask the agent to explain a diff, branch, commit, or pull request and you get back one self-contained offline HTML lesson — background, intuition, a code walkthrough, and a five-question quiz — written for that specific change rather than poured into a shared template. The agent reports the exact file path it wrote.
explain-diffskill. It traces the changed code and nearby tests, designs the lesson, and publishes it through a bundled standard-library publisher that needs no network access and no third-party dependency.- The publisher writes a dated, collision-resistant file under the operating system’s temporary directory by default, and writes elsewhere only to an output root the user approves. It redacts secrets, tokens, email addresses, private hostnames, personal names, and user-home paths from the page while preserving the code path being taught.
work-intakeroutes explanation requests toexplain-diff, keeping them separate from correctness review, bug fixing, and document conversion.
[core][2.26.46] — 2026-09-26
Section titled “[core][2.26.46] — 2026-09-26”Highlights
Section titled “Highlights”- Base freshness can now be unverified without stopping every work-loop. When network access, authentication, timeouts, or enterprise Git-metadata policy prevent the check from completing, the loop tells you freshness was not verified and continues so you can update the branch separately. A proven stale base or unsafe repository state still stops the run.
Changed
Section titled “Changed”work-looptreats classified base-freshness capability gaps as a skipped check, while keeping confirmed stale bases, missing targets, unsafe local state, and unclassified Git failures blocking.
[experience-design][4.0.0] — 2026-09-27
Section titled “[experience-design][4.0.0] — 2026-09-27”Highlights
Section titled “Highlights”- The copy layer is now one skill with three modes.
content-designcovers message and narrative structure, per-surface acquisition copy goals, and the brand-level register. You pick a task, not a registration — the skill selects the mode from your request. Thecopy-directionandtone-of-voiceskills are removed. - Nothing you have already written moves. All three artifacts keep their paths and their
type:values:content/<slug>.md,copy/<surface-slug>.md, and the reservedcopy/brand-register.md, which still carriesscope: brand-levelbeside itstype:. An existing document needs no migration. - Shared copy references were reconciled rather than merged. Six references that shared a name across the folded skills disagreed; each was resolved deliberately, and the two whose variants differed only by scope are now one body with a named scope parameter that binds per mode.
Changed
Section titled “Changed”- Folded
copy-directionandtone-of-voiceintocontent-design, which now runs in three named modes with a selection rubric that needs no reference loaded. editorial-quality-gates.mdis one canonical body held byte-identical across the two skills that need it, replacing a recorded decision to let per-skill copies drift.ux-writingin theproduct-engineeringpack keeps its scope; its pointers to the removed skills now name the surviving modes.
Removed
Section titled “Removed”- The
copy-directionandtone-of-voiceskills. After upgrading an existing installation, remove thecopy-directionandtone-of-voiceskill directories from that installation’s skills directory. Whole-packagentbundle upgradedoes not prune paths the new pack no longer declares, so leaving them in place would keep their staleSKILL.mdregistrations active and a copy task could still route to a skill this pack no longer ships.
[product-engineering][0.13.20] — 2026-09-27
Section titled “[product-engineering][0.13.20] — 2026-09-27”Changed
Section titled “Changed”ux-writing’s scope boundary, onboarding tri-point, and brand-register migration prompt now namecontent-design’s modes instead of the two removedexperience-designskills. The skill’s own behaviour, its artifact markers, and the copy it writes are unchanged.close-worknow checks whether each intent ancestor above a closing artifact can itself close. When any artifact reaches a terminal state, the skill evaluates each intent ancestor and returns one of three verdicts — refuse, not-eligible, or eligible — with named grounds, and presents an evidence packet before any status is written. On a confirmed eligible transition, a closure record is written to the intent carrying the date, decider, and evidence reviewed.
- Closure eligibility check in the § Closeout procedure: fires on each intent ancestor when any artifact reaches a terminal state; returns refuse (missing precondition), not-eligible (live descendants named), or eligible (all-terminal closure, evidence packet presented); writes a closure record on confirmed eligible transitions; never sets a status itself.
closure_index.pyandclosure_terminality.pyscript seams implementing terminus-driven descendant discovery, confined reads, verdict types, an evidence packet, and a per-decision index discarded by scope.
[core][2.26.45] — 2026-09-26
Section titled “[core][2.26.45] — 2026-09-26”Highlights
Section titled “Highlights”- Intent preambles can now say an outcome is shared with another intent by adding
Outcome co-owner:as a typed peer pointer. The corpus and traceability checks reject malformed, missing-target, and self-referential peers without turning the peer into a parent or delivery edge. Decomposed:can now record a finished childless decomposition withYYYY-MM-DD closed-empty. It stays distinct from the literalno, so an author can tell “we deliberately closed this with no child work” from “we decided not to decompose.”
Changed
Section titled “Changed”work-intakeignores preamble-shaped lines inside HTML comments before it recognizes fields or the first visible body heading. A hiddenOutcome co-owner:line is absent, not malformed or unresolved.Outcome co-owner:is constrained when present tooutcome:<target>,opportunity:<target>,capability:<target>, orintent:<target>, and traceability resolves the value against another live intent identity without adding graph edges.Decomposed:acceptsclosed-emptyas a dated terminus. Thedirect-lightcheckbox-item rule remains exclusive todirect-light.
[product-engineering][0.13.19] — 2026-09-26
Section titled “[product-engineering][0.13.19] — 2026-09-26”Highlights
Section titled “Highlights”- The intent template and product-engineering how-tos now show both closure declarations authors can copy: optional
Outcome co-owner:for a shared outcome, andclosed-emptyfor a decomposition that is complete with no child work.
Changed
Section titled “Changed”frame-intent’s template seedsOutcome co-owner:as an optional comment-only field, so it is absent until an author writes a typed peer pointer.- The frame and handoff how-tos list
closed-emptybeside the existingDecomposed:termini, and the refused-intent guide shows how to repair malformed, unresolved, self-referential, and comment-hidden co-owner declarations.
[core][2.26.44] — 2026-09-26
Section titled “[core][2.26.44] — 2026-09-26”Highlights
Section titled “Highlights”- A
Shippedbrief now requires aCut-closed:declaration. When you close a brief asShipped, add aCut-closed:preamble field recording that no further slices are coming: an ISO 8601 date then evidence, as in2026-08-25 All nine slices are Shipped.It must sit above the brief’s first##heading; written below one it reads as absent. The coverage lint also refuses aDraftbrief that carries the field, and every other state may carry it or omit it. - A brief that passed the coverage lint yesterday can fail today, so this is a gate change to plan for rather than a new option to adopt. Any repository holding a
Status: Shippedbrief without the new field fails until it is backfilled — run it from your repository root aspython3 <skill>/scripts/lint-brief-coverage.py --root .before your pipeline does — it resolvesdocs/product/briefsbeneath the root you pass, so pointing it at the briefs directory itself finds nothing and exits 0. - A brief’s states and legal moves are now documented once, so the reference guide and the lint cannot disagree about which transitions are legal or what each status requires of its children.
Changed
Section titled “Changed”lint-brief-coverage.pynow readsStatus:,Slug:, andCut-closed:through a bounded preamble reader that stops at the first uncommented##heading and ignores fields inside HTML comments. A field placed below a section heading or inside a comment is no longer read.- A
Shippedbrief without aCut-closed:record is refused with exit 1. The field must be an ISO 8601 date (YYYY-MM-DD) followed by non-empty evidence text. - A
Draftbrief with aCut-closed:record is refused with exit 1 (a material edit reopens the cut). - The brief status vocabulary, child-execution-evidence predicate, and transition table are now the sole property of
brief_shape.py.lint-brief-coverage.pydefines none of them.
[core][2.26.43] — 2026-09-25
Section titled “[core][2.26.43] — 2026-09-25”Highlights
Section titled “Highlights”workspace-statuscan now tell you which delivery contracts are retirement candidates. It reads the repository, reports every blocker holding each candidate back, and names the migration obligations a candidate must discharge before its container can go. Being listed authorizes nothing: a human selects, and the separately confirmed prune executes.- Evidence the run could not read withholds eligibility rather than passing silently. Each blocker declares the input corpus its absence rests on, and a refusal naming any member of that corpus suppresses every candidate that blocker is evaluated over — including candidates carrying no blocker of their own, which are reported rather than dropped. A shorter list never means a cleaner one.
- Ages come from recorded change history and are labelled as such. They are not the thirty-day cooling clock, which runs from a delivery-completion event this capability does not read, so the report is a triage signal rather than a disposition.
retirement-candidates, a read-only subcommand that writes nothing and succeeds against a read-only checkout.contracts/jsonschema/spec-retirement-candidates.schema.json, which owns the emitted document’s field set, its twelve blocker codes and its twelve refusal codes.
[experience-design][3.0.0] — 2026-09-26
Section titled “[experience-design][3.0.0] — 2026-09-26”Highlights
Section titled “Highlights”information-architecturenow owns the surface-genre routing that previously required six separate registrations:analytical-design,conversion-design,documentation-design,informational-design,marketplace-design, andworkspace-design.- The removed registrations’ methods now live as genre references under
information-architecture, so adopters should update direct skill references and invocations to callinformation-architecturewith the relevantsurface-genre:value.
Changed
Section titled “Changed”- Folded the six genre-specific design registrations into
information-architecturewhile preserving their methods as routed references. - Kept
interaction-designas the destination for transactional journeys. - After upgrading an existing installation, remove the retired
analytical-design,conversion-design,documentation-design,informational-design,marketplace-design, andworkspace-designskill directories from that installation’s skills directory. Whole-packagentbundle upgradedoes not prune paths that the new pack no longer declares, so leaving them in place would keep their staleSKILL.mdregistrations active.
[frontend-engineering][0.3.3] — 2026-09-26
Section titled “[frontend-engineering][0.3.3] — 2026-09-26”Highlights
Section titled “Highlights”- Frontend pre-flight now routes every
surface-genre:value through the consolidatedinformation-architecturehandoff whenexperience-designis co-installed, withinteraction-designstill owning transactional journeys. - The design-system handoff now names the shipped
design-systemskill slug, andexperience-design>=3.0.0is the recommended floor for the genre-aware route.
- Repaired the frontend genre-routing table for the experience-design fold.
- Corrected the design-system slug in the handoff path.
- Raised the recommended
experience-designco-install floor to>=3.0.0.
[atlassian][0.10.1] — 2026-09-26
Section titled “[atlassian][0.10.1] — 2026-09-26”Highlights
Section titled “Highlights”- You can now see what each Jira Epic delivered beside what that work was meant to change, in one read-only view. Ask for a project’s Epics and their outcomes: the view groups the project’s work by Epic, counts delivery from the
flow-metricsskill’s own per-issue rows, and renders each Epic’s recorded outcome next to it. It writes nothing to Jira and leaves no file behind. - An Epic with no recorded outcome says so, and asks you for one. Instead of a blank row, the view states plainly that nothing is recorded and names the one place to write it — the block under an
Outcomeheading in the Epic’s description. Hand your answer back with--outcome EPIC-KEY=<text>and your exact words come back as text you paste into Jira yourself, so the outcome stays something your team said. - A
flow-metricsrun can now touch the on-disk cache not at all. The new--inert-cachemode performs no cache read, write, directory creation or stale-temporary-file cleanup, which--no-cachestill did. It is off by default, so every existingflow-metricsrun behaves exactly as before.
jira-epic-outcome-view: a read-only Jira skill that groups a project’s work by Epic and renders each Epic’s delivery reading beside its recorded outcome. Throughput and work in flight are counts overflow-metrics’ own per-issue rows, never a recomputation, so no duration or percentile is reported. Work whose parent chain never reaches an in-scope Epic is rendered in a named unattributed group with the reason, rather than dropped.- A repeatable
--outcome EPIC-KEY=<text>argument on that skill turns a team’s stated outcome into paste-ready text naming the fixed location to paste it into. A key outside the queried scope, or the same key passed twice, is refused with exit 2 naming the key;EPIC-KEY=with no text is a decline and renders the prompt. --inert-cacheonflow-metrics, a default-off mode under which no cache operation of any kind occurs.[pack.metadata].bridge-skillsin the pack manifest declares which of this pack’s skills may reach a host repository’s delivery machinery. Every skill outside that list returns value to a team that has installed nothing but this pack.
Changed
Section titled “Changed”- The Epic outcome view reads its outcome from one fixed, documented location — the block under a top-level
Outcomeheading in the Epic’s description — in both description shapes Jira returns: the structured document from Cloud and plain or wiki text from Server and Data Center. The location is not configurable per invocation. - Every reading the view renders states the moment it was taken, and the delivery reading and the Jira read state their two moments separately rather than implying one snapshot. Every run also discloses that it covers only the work the calling credential can browse.
[core][2.26.42] — 2026-09-24
Section titled “[core][2.26.42] — 2026-09-24”Highlights
Section titled “Highlights”- Three re-entry edges now require a wave reopen before you re-enter implementation. When gates fail, a code review finds remaining issues, or a blocker is applied, the loop now refuses the edge and names the tasks that still hold a live dispatch record. Run
loop-cohort wave reopen <spec-dir> --expect-run-id <id>to mark the current wave’s records superseded and unblock the edge.
loop-cohort wave reopen <spec-dir> --expect-run-id <id>marks every dispatch record for the current wave superseded. The records stay on disk; recording a fresh assertion for any task makes that task account again. The three edges that require a reopen before re-entering implementation aregates-failedfrom code verification,findings-remainfrom code review, andblocker-appliedfrom the code human gate.
[experience-design][2.0.10] — 2026-09-25
Section titled “[experience-design][2.0.10] — 2026-09-25”Highlights
Section titled “Highlights”- The
creative-directionskill now exposes five named operations —frame,explore,visualize,converge, andrefine— each with a dedicated reference, so craft detail loads only when the operation needs it. - A route rule (
inherit,extend,originate) selects how much invention the work warrants;inheritruns no divergence and no visual step when a direction already exists for the surface. - Divergence generation in
exploredraws referents from the audience’s own world — publications, instruments, maps, architecture, packaging, signage — rather than from other software products, so candidate directions stop converging on the category default. - The visual step in
visualizeis capability-gated: it defaults to a text schematic in any harness that cannot produce images, with a named skip rather than a blocker, and produces a rendered comp only on theoriginateroute when the harness supports it. - Asking to refine an existing direction now reaches the skill and amends the document in place, instead of starting a second direction for the same surface.
[core][2.26.41] — 2026-09-24
Section titled “[core][2.26.41] — 2026-09-24”Highlights
Section titled “Highlights”- An intent that says the work is finished now has to say who decided that and
on what evidence.
Status: Fulfilledrequires both anAccepted:and aFulfilled:record, andStatus: CancelledrequiresAccepted:. Intents that passed the corpus lint yesterday can fail today, so this is a gate change to plan for rather than a new option to adopt.
Changed
Section titled “Changed”- The corpus lint decides
Accepted:andFulfilled:byStatus. It refuses aFulfilledintent missing either record, and aCancelledintent missingAccepted:. It also refuses a record that contradicts the status: either record besideDraft, or aFulfilled:record besideAccepted,CancelledorWithdrawn.Withdrawnnever needsAccepted:— abandoning a bet nobody ratified needs no ratification — andSupersededis not decided either way. - A record is an ISO 8601 date, a space, then text saying who decided and on
what evidence:
- **Accepted:** 2026-09-20 ratified by the lifecycle owner. It must sit in the preamble; written below the first##heading it reads as absent, so a “requires a record” refusal can point at a file that visibly contains the line. - Every refusal names the file and the field at fault. To check before your pipeline does, run the corpus lint over your intent directory. The field reference and the fix a refused intent how-to in the product-engineering guides carry the per-status table and the fix for each message.
[core][2.26.40] — 2026-09-24
Section titled “[core][2.26.40] — 2026-09-24”Highlights
Section titled “Highlights”- A review finding is now blockable when something outside it establishes the defect — a test, a lint, a schema, a resolvable reference or a stated constraint that disagrees with the target — even when several repairs would fix it. The old wording asked instead whether the fix was fully determined, so a finding like “this count says three where the tree holds five” could be capped at Concern purely because you could change the count, add a baseline, or drop the claim. How much that mattered depended on which model read the rule. Two models were asked which of the same 50 recorded blocking findings should have been capped: under the old wording they answered 2 and 8, and under the new one both answered 1.
Changed
Section titled “Changed”adversarial-reviewertags severity by whether the defect is established, not by whether the remedy is determined. Mechanical now reads: something external disagrees with what the target says, and something would red. The bullet states outright that the repair may take several defensible forms.finding-adjudicator’s fifth predicate asks the same question in the same order, and says in its own words that a defect several defensible repairs could fix is still established.
The severity vocabulary, the Concern ceiling on a judgement finding, and who applies the test are all unchanged. Only which question the test asks changed.
[governance-extras][0.11.2] — 2026-09-24
Section titled “[governance-extras][0.11.2] — 2026-09-24”Highlights
Section titled “Highlights”new-adr’s infra mode no longer claims its seven topics cover the whole governance index. Each of the seven maps to a domain, andobservabilityis named as the domain with no authoring topic of its own — so you can see the gap instead of assuming the list is complete.
new-adrreferences/infra-decisions.md: the header said the seven IaC topics “correspond to” thegenerate-iacgovernance-index domains. The manifest carries eight. The sentence now states that each topic maps to a domain and namesobservabilityas the one without a dedicated topic.
[governance-extras][0.11.1] — 2026-09-24
Section titled “[governance-extras][0.11.1] — 2026-09-24”Highlights
Section titled “Highlights”- Superseding part of a decision record is now explained where you write
it. The four supersession fields shipped with the ability to carve one
numbered constraint out of an older ADR, and the shape check has always
enforced it — but the template’s one-line examples never said whose D-IDs
each half names, so the only way to get it right was to find an existing
pair and copy it. The template now states the rule beside the fields: both
halves name D-IDs defined by the older record, and a partially superseded
record keeps
Status: Accepted.
Changed
Section titled “Changed”- The
new-adrtemplate gains a comment block beside the four supersession fields covering the mirrored pair, which record’s D-IDs each half cites, the status a partially superseded record keeps, and how multiple entries are spelled. Field names, values, and the shape check are unchanged.
[product-engineering][0.13.18] — 2026-09-24
Section titled “[product-engineering][0.13.18] — 2026-09-24”Highlights
Section titled “Highlights”- The
align-value-streamlayout page now names every skill that reads its output setting. It lists all eight[product]readers, calls outlean-canvas’s scan-only read, and makes clear thatux-writingreads[design]instead.
Changed
Section titled “Changed”align-value-stream’s layout page now names all eight skills that read[product], includinglean-canvas’s scan-only read, and distinguishesux-writing’s[design]read.
[core][2.26.39] — 2026-09-23
Section titled “[core][2.26.39] — 2026-09-23”Highlights
Section titled “Highlights”- Saying that an intent was replaced now takes two plain fields instead of one
packed line: the status reads
Superseded, and aSuperseded by:field names the bet that took over. Each is refused without the other, so a pointer can no longer be left behind when a status moves on. - The
Accepted:andFulfilled:lines now have to carry more than a date. Each takes a date, a space, and text — a date on its own is refused, because these lines exist to hold the reasoning. What that text should say, who decided and on what evidence, is for you; the check asks only that it is there.
Changed
Section titled “Changed”- The intent
Statusvocabulary is six bare tokens —Draft,Accepted,Fulfilled,Withdrawn,Cancelled,Superseded. No value carries a payload. The retiredSuperseded by <slug>form is refused. Superseded by:is a preamble field, paired withStatus: Supersededin both directions. Supersession resolution reads that field, still resolves one hop against live intents only, and now names the pointer field rather thanStatuswhen it refuses.Accepted:andFulfilled:move from unconstrained to constrained when present: an ISO 8601 calendar date, a space, then non-empty text. The bare date and the literalnoare both refused. The calendar-date rule is the one the contract already had, so a comma written straight after a date falls inside the date token and is refused.
The Status vocabulary and the dated-evidence rule are decided from one
artifact, by validate_live_intent. The supersession pairing and resolution
rules are decided over the corpus, by validate_supersession, because one asks
what another field’s value requires and the other reads every intent. The
shaping reviewer’s own text is byte-unchanged.
[product-engineering][0.13.17] — 2026-09-23
Section titled “[product-engineering][0.13.17] — 2026-09-23”Changed
Section titled “Changed”- The
frame-intentintent template carriesSupersededin itsStatuschoices and aSuperseded by:line, matching the split the core contract now decides.
[core][2.26.38] — 2026-09-23
Section titled “[core][2.26.38] — 2026-09-23”Changed
Section titled “Changed”loop-cohortnow remembers a resolved repository root for the current working directory. Repeated checks in one process no longer re-rungit rev-parse, while a process that changes directories still resolves the new repository and a failed lookup is retried rather than remembered.
[frontend-engineering][0.3.2] — 2026-09-23
Section titled “[frontend-engineering][0.3.2] — 2026-09-23”Highlights
Section titled “Highlights”- A surface now declares how much contract it owes, and
exploreis the default. The journey opens by asking you to pick the risk tier, then tells you the contract fields, the states, the gates and the captures that tier carries. A tooltip and a checkout flow walk the same stages at different depths, so the cheap path is a stated choice rather than a corner cut. - The cheap tier never drops an accessible surface. Every state whose
absence fails WCAG 2.2 AA is either already in the
exploreset or binds conditionally wherever its trigger fires. Depth buys evidence and completeness; it does not buy a surface someone cannot use.
- A
#### Pick the depth firstsub-stage in stage 1 of the journey, stating the tier ladder, theexplorestate subset, which gates run atexplore, that captures do not thin with the tier, and whatexploredrops. - A shared state-coverage map in the experience contract, mapping each of the eighteen quality-floor states to a tier band or a named trigger, and recording per state whether its absence fails WCAG 2.2 AA and the success criterion behind that judgement.
how-to/choose-the-depth.md— choosing a tier and reading what it owes.
Changed
Section titled “Changed”- Stage 2 names the three artifacts a design pack hands over —
direction/<slug>.md,screens/<slug>/<screen>.mdandtokens/<slug>.md— instead of asking for “the surface brief” as if from nowhere. - The journey states the four proportionality allowances the skill already carried, so it no longer reads stricter than the skill it describes.
- The contract’s frontend section is owned by
frontend-engineeringrather thancore, which has shipped no frontend skill since the pack promotion.
[experience-design][2.0.9] — 2026-09-23
Section titled “[experience-design][2.0.9] — 2026-09-23”Highlights
Section titled “Highlights”- The say-this table now tells you which steps you can skip. Every row carries one optionality verdict, resolved against the how-to guide that owns that skill, so the two surfaces can no longer disagree about whether a step is optional.
- A named minimal viable thread replaces guessing at what to drop. Four steps make the output coherent; the journey says so, and says what a skipped step actually costs rather than warning against shortcuts in the abstract.
#### The minimal viable threadand#### Pick the depthsub-stages in the journey, and a section naming the three artifacts that cross to frontend engineering by their output-directory-relative paths.- A
Needed?column on the say-this table. how-to/choose-the-depth.md— picking a depth and seeing what it still owes.frontend-engineeringinrelatedJourneys, making the link reciprocal.
Changed
Section titled “Changed”- The three illustrative state lists — twice in the journey, once in the pack
README — showed
default, which is not a quality-floor state, and omittedpartialanddisabled. All three now match theexploresubset. DESIGN.mdargued against skipping steps two lines above the section that names a shortened thread. It now states what a skipped step costs, which is what the thread is chosen against.design-reviewloads the experience contract at its quality-floor step, so a state miss is rated against what the surface’s tier actually owed.
[product-engineering][0.13.17] — 2026-09-23
Section titled “[product-engineering][0.13.17] — 2026-09-23”Highlights
Section titled “Highlights”- The contract this pack carries now defines what each depth owes. Its copy
of the experience contract gained the shared state-coverage map and the
frontend-engineeringowner label, so a team reading the contract alongside an intent finds one definition of a risk tier rather than a bare word. The pack’s skills are unchanged and still do not read the contract themselves.
Changed
Section titled “Changed”- The pack’s copy of the experience contract carries the shared state-coverage
map, and its frontend section names
frontend-engineeringas owner. frame-intentgains an eval case covering an intent that stays at its own altitude for a public surface.
[product-strategy][0.2.7] — 2026-09-23
Section titled “[product-strategy][0.2.7] — 2026-09-23”Highlights
Section titled “Highlights”- The contract this pack carries now defines what each depth owes. Its copy
of the experience contract gained the shared state-coverage map and the
frontend-engineeringowner label, so the tier annotations a strategist reads there mean one thing across all four packs. The pack’s skills are unchanged and still do not read the contract themselves.
Changed
Section titled “Changed”- The pack’s copy of the experience contract carries the shared state-coverage
map, and its frontend section names
frontend-engineeringas owner. synthesize-stakeholder-researchgains an eval case covering a synthesis organized by theme that names its coverage gaps.
[core][2.26.37] — 2026-09-23
Section titled “[core][2.26.37] — 2026-09-23”- A work-loop transition now commits only against the cohort state its own
reads saw. The engine fingerprints
state.jsonbefore its first cohort read and re-checks it under the cohort lock before committing, so a concurrentloop-cohortverb can no longer change the ground a guard just ruled on. Previously awave-completeapproved for one wave could commit after the wave pointer had moved, leaving a verdict about one wave discharging a commit about another. Note what this does not change:gates-cleanstill does not read dispatch receipts at all, which needs no concurrency to reach and is not addressed here.
Changed
Section titled “Changed”- Refusals that were not reachable before are now possible on paths that took
no cohort lock. A transition refuses when cohort state changed under it, and
refuses on cohort-lock contention; both clear on retry once the competing
verb finishes, and neither can occur in a sequential single-controller run —
they need two processes working on one spec directory at the same time. A
lock reclaimed at release is reported separately and says whether the
transition committed, because the remedy differs: a reclaim after the write
must not be re-run, while one after a refusal should be. Two lock conditions
never clear on retry — a
state.json.lockthat is not a regular file, and a lock record written by something other than this tool — and both need the file removed by hand.
[agentbundle][0.50.0] — 2026-09-24
Section titled “[agentbundle][0.50.0] — 2026-09-24”Highlights
Section titled “Highlights”catalogue sync --package writes both package destinations instead of
refusing them. If your catalogue vendors its tooling, --tooling vendored
now keeps the engine and its paired catalogue-curation copy current; if it
selects credential-brokers, packages/credbroker/ moves with everything
else. Packages go last, so a failure there rolls back a run whose other
writes had already landed.
Sync will not overwrite the agentbundle it is running from. That refusal
reads two things — the editable-install record, and where the running package
actually lives — because the first alone cannot see a derived catalogue that
is not a git repository, and that is exactly the adopter whose run would
replace executing code.
An apply run now ends with tree-modified: yes|no, so a caller deciding
whether to retry does not have to infer it from the exit code.
[agentbundle][0.49.0] — 2026-09-23
Section titled “[agentbundle][0.49.0] — 2026-09-23”Highlights
Section titled “Highlights”agentbundle catalogue synccan now bring a derived catalogue up to date, not just check it. Run it with neither--dry-runnor--checkand it asks once for confirmation, then applies the plan: unedited files update, your edits keep their bytes with the source’s version saved beside them, and paths the source dropped are removed — guarded so a run never touches anything outside what the catalogue already recorded. Four new flags —--pack,--profile,--guides,--package— let you sync just part of the catalogue, and--yesskips the prompt for a script or CI job.
catalogue sync’s write path never leaves the tree half-changed: nothing is written before consent, and a run that fails partway restores the tree to what it was before it started, naming any path it could not restore.- A source resolved from a
git+https://URL or a digest-bearing descriptor now has that ref or digest recorded after a sync, so a later--checkrun compares against the value this run actually synced to.
Changed
Section titled “Changed”- Breaking:
catalogue syncno longer resolves abbreviated flag names.--guidesis now a real flag — the new scoping flag above — so a command that relied on--guides selectedresolving to--guides-modenow errors instead of silently changing meaning; spell--guides-mode selectedin full.
[core][2.26.36] — 2026-09-22
Section titled “[core][2.26.36] — 2026-09-22”Highlights
Section titled “Highlights”- A reference from one artifact to another now names exactly one target, and an ambiguous name is refused rather than guessed. A pointer written as a bare name used to be resolved by picking the alphabetically first match when several fitted. Nothing told the author a choice had been made. Such a name is now reported with every candidate it matched, so the author decides rather than the sort order.
intent:is a recognized node kind, covering the 117 intent files no ladder rung already types. Their ids come from each file’sSlug:field, never the filename, so an ordinal never becomes part of an address.resolve_endpointgained a refusal state for a name matching more than one artifact, routed at all three of its call sites.
Changed
Section titled “Changed”brief:<slug>is the canonicalBrief:value, replacing the repository-relative path. The path form still works everywhere it worked before, and a unique bare slug is still accepted by the traceability resolver and the coverage join — dispatch continues to refuse a bare slug, as it always has. Nothing written under the old convention breaks.<kind>:<slug>is the canonical form forParent intent:too, and the existing values in both fields have been migrated.Contract:andDiscovery:are deliberately unchanged: see RFC-0103 for why their target kinds have to be settled first.- The templates and guides that stamp these fields now emit the canonical form, so a new artifact starts correct rather than needing a later sweep.
- The copy of the workspace-status engine packaged with the
agentbundleCLI is synchronized with this change. The CLI’s own contract is unchanged, so it takes no release of its own.
[core][2.26.35] — 2026-09-22
Section titled “[core][2.26.35] — 2026-09-22”Changed
Section titled “Changed”- The
workspace-statusentrypoint carries the same rules in a dispatcher shape. The body now states the four modes —status,reconcile,explainandmutate— and maps each of the eight backend subcommands to one of them, then holds the invocation contract, the status rendering contract and the hard prohibitions. Depth that only one mode reads moved into references the mode table loads on demand: the full-audit guidance and the coordination-receipt contract intoreferences/reconcile.md, the single-item investigation intoreferences/explain.md, and the prune workflow, interrupted-prune recovery, the repair workflow, legacy-migration planning and effects, andselected-membershipintoreferences/mutate.md. Theworkspace.tomlinitialisation template is nowassets/workspace.toml.template, written out unchanged rather than inlined. The body falls from 685 lines to 478. No rule changed: every relocated sentence moved byte-for-byte, and the canonical-findings table, the rendering contract and the cooling-exclusion statement stay on the entrypoint. - The consent requirement for the mutating subcommands stays on the entrypoint
even though its procedure moved.
prune,repair-applyandrepair-rollbackeach need a confirmation the authorized person writes out of band, and a guard that arrives only once the mutate reference has loaded would be guarding a decision already taken.
[core][2.26.34] — 2026-09-22
Section titled “[core][2.26.34] — 2026-09-22”Changed
Section titled “Changed”- The work-loop engine resolves the repository root once per invocation instead
of once per use. A
wave-completetransition now starts a singlegitprocess where it previously started three.
- The
docs/AGENTS.mdseed carries the Mermaid authoring constraints, so an adopter receives them and they survive a projection rebuild. They previously existed only in this repository’s generated copy, where every self-host run removed them.
[agentbundle][0.48.0] — 2026-09-22
Section titled “[agentbundle][0.48.0] — 2026-09-22”Highlights
Section titled “Highlights”- You can now check a derived catalogue against its source without
touching a file.
agentbundle catalogue sync --dry-runprints what would update, what would keep your edits behind a companion file, and what the source no longer has.agentbundle catalogue sync --checkanswers whether your catalogue still matches its source. Neither writes anything.
catalogue syncaccepts every--sourceforminitdoes — a local path, agit+https://URL, or acatalogue+https://descriptor — and names the source catalogue only under--attribution attributed. It also warns, without ever refusing, when a selected pack’s version has moved in the source.
[core][2.26.33] — 2026-09-22
Section titled “[core][2.26.33] — 2026-09-22”Changed
Section titled “Changed”- The
work-loopentrypoint’s § Capture keeps when capture runs and points at the reference; the discriminator a captured item must carry and the table routing a DECIDE scratch note to its destination now live inreferences/capture.md§ Capturing and routing a note, beside the guidance on what a kept note should say. The five routing rows, their first-match order, and the ready-now economics all read exactly as before. The two pointers intowork-item-capture.mdlost theirreferences/prefix, because that prefix was written fromSKILL.md’s directory and the file is now a sibling — the links resolve again, and the destinations are unchanged. No rule changed; what changed is where the rule is read from —SKILL.md908 lines to 866, against the 1,000-line cap that is the reason it moved.
- Two further links in the
work-loopreferences resolved to nothing and now resolve:scale-with-a-tool.md’s pointer to the unattended-loop guidance, which had outlived itsSKILL.mdsection and now namesunattended-loops.md, andself-coverage/resolve-vs-surface.md’s pointer to the self-coverage gate, which now namesSKILL.md§ Work-loop contract, the section that states it.
[core][2.26.32] — 2026-09-22
Section titled “[core][2.26.32] — 2026-09-22”Changed
Section titled “Changed”- The
work-loopentrypoint carries less reviewer-dispatch text for the same rules. Each role’s firing condition stays where reviewers are chosen, while the depth needed only once a role has fired moves into thereferences/reviewer-roster.mdthe routing table already loads on demand:security-reviewer’s framework lens, its inline-the-depth rule and its infra-flavored force-load set, andquality-engineer’soperational-safetymodule inlining, reliability-vs-security carve and independent contract re-derivation. Thesecurity-checklistsModule index routing sentence and the loud blocker for a missingsecurity-revieweron infra work both stay on the entrypoint. No rule changed, and no behaviour changed. - The skill-engineering provider handshake moved to a
references/skill-engineering-provider.mdthe routing table loads when the task concerns a skill, a skill script or evaluation, agent-loop orchestration, a hook, or a plugin. Because the handshake handles untrusted provider text, the entrypoint keeps a fail-closed guard as well as the pointer: no provider is resolved, invoked or read until that reference is loaded, so a task that misreads the predicate reaches no provider at all rather than reaching one without the containment rules. The consumer declaration — the contract version, both task kinds and the absent-case diagnostic — stays on the entrypoint. No rule changed, and no behaviour changed.
[core][2.26.31] — 2026-09-22
Section titled “[core][2.26.31] — 2026-09-22”Changed
Section titled “Changed”- The
work-loopentrypoint no longer carries its own copy of the fidelity ladder. The section holding the tier table, the sub-5-minute budget sentence and the build-pack handoff line is gone; the conditional-reference routing table gains a row that sends a task needing local-infra-equivalents to theoperational-safetyskill’sfidelity-ladderreference module. That module already held the seven-level ladder and the same budget heuristic, and it now also states the build-pack precedence rule the deleted line carried, so no guidance was dropped. No rule changed; what moved is where the ladder is read, from the entrypoint on every run to the reference module when a task needs it.
[core][2.26.30] — 2026-09-22
Section titled “[core][2.26.30] — 2026-09-22”Changed
Section titled “Changed”- The
work-loopentrypoint carries less text for the same rules. The reviewer roster’s explanation of the lens it gives up moved to areferences/reviewer-roster.mdthe routing table loads on demand, so the explanation is read when reviewers are being chosen instead of on every run. - The DECIDE step no longer argues for why a disposal duty does not make a finding required. The sentences that state the rule stay; only the argument for it is gone, and the work-frontier contract already settles the same point. No rule changed, and no behaviour changed.
- The four worked examples of where a capture note goes moved from the skill into its capture reference, next to the guidance on what a kept note should say. The routing rule and its table stay in the skill; only the examples moved, and the reference now says it owns them.
[core][2.26.29] — 2026-09-22
Section titled “[core][2.26.29] — 2026-09-22”Highlights
Section titled “Highlights”- An intent now states who owns it, what altitude it sits at, and where it stands — and a check refuses one that does not. Reading an intent’s opening lines used to leave the important questions open: two of the fields a reader needs most were optional, and one was buried in the body. Anyone can now learn who is accountable, how high the bet sits, whether it is still live, and whether it has been tested and broken down, without reading further.
- A stopped bet can say so. An intent that was withdrawn or cancelled now records that as its own standing, rather than being indistinguishable from one still waiting. A rollup that counted a cancelled bet as delivered is the outcome this prevents.
work-intakeshipsintent_shape.py, one home for the intent field rules, andintent_corpus_lint.py, which walks a directory of intents and exits non-zero for a non-conforming file. Both enforcement points read the vocabularies from that one table rather than each carrying a copy.- The lint exits
2, distinctly from1, for a corpus it could not fully read. “No violations found” and “clean” are different claims about a directory whose files would not open. - The cold shaping review gains a seventh intent-mode condition and the token
MALFORMED(shape). Its text states no condition count, so a later condition needs no prose rewrite.
Changed
Section titled “Changed”Ownermoves from a## Ownerbody section into anOwner:preamble field, andintake-intentrendersSlug:andLevel:. An admission with no altitude is refused rather than defaulted: a guessed altitude is a declared fact the artifact did not carry.- The retired preamble names
Type,Raised,Stage,Parent,SourceandAuthorityare refused.Authoritystays valid below the first heading, where it is an attribution or a provenance token rather than the governance pointer.
[experience-design][2.0.8] — 2026-09-22
Section titled “[experience-design][2.0.8] — 2026-09-22”content-design requires every content brief to declare a communication_mode
— product-copy, technical-editorial or reference-documentation — and to be
written under the adopter’s configured [design] output_dir. Neither the
template an author fills in nor the eval harness that judges the result carried
those requirements, so a brief could ship without the field and still pass.
Highlights
Section titled “Highlights”- A brief produced from the shipped template now carries the mode the next
skill reads.
copy-directiontakescommunication_modefrom the brief to decide whether its anti-AI-smell scan applies to the copy goals it names. The template had no slot for the field, so an author following it produced a brief that skill could not route, and the eval harness did not catch it.
- The content-brief template’s frontmatter gains
communication_mode, offering exactly the three modes the skill and its communication-modes reference own. The existingtype,surface-type,personaanddatefields are unchanged. - The
content-designlayout reference restated the brief’s whole frontmatter under a “Frontmatter contract” heading, which is how it came to list four fields while the template shipped five. Only one of those fields addresses the artifact —type: content-brief, the marker a consumer scanning<output_dir>reads — so that sentence moves to the marker section and the restatement is gone. The template owns the rest. That sentence also dropped the label “Tier 3 resolution”, which this pack defines nowhere; it already said in plain words what the marker does. content-design’s hand-off step saidconversion-designreadscommunication_mode: product-copybefore running its editorial quality gate. That skill runs the gate unconditionally and branches on no mode, so the sentence described a decision no skill makes. It now states why the gate always runs there:conversion-designadmits acquisition surfaces only.- The content-design eval harness expects
communication_mode: product-copyon the acquisition case andcommunication_mode: reference-documentationon the API quickstart case, and expects both artifacts at<output_dir>/content/<slug>.md. The acquisition case previously pinned one repository’sdocs/designlayout, which no adopter is obliged to use. Every surface-type, hierarchy, metric and downstream-routing expectation is retained.
[product-engineering][0.13.16] — 2026-09-22
Section titled “[product-engineering][0.13.16] — 2026-09-22”Highlights
Section titled “Highlights”- The intent template now seeds every field an intent is required to carry, and three that record how far its shaping got. An author filling the template in produces something the checks accept, instead of discovering the gaps afterwards.
frame-intent’s template seedsOwner:andStatus:, and the three shaping-progress fieldsDe-risked:,Shaping-reviewed:andDecomposed:. Each progress field is seeded as a comment with no value, which reads as absent — so a stage you have not reached costs nothing and asserts nothing.- A how-to, Fix a refused intent, takes each refusal to its remedy, with the real message for each.
Changed
Section titled “Changed”- The field reference restates every intent field in four tiers — required, constrained when present, unconstrained, and retired — replacing the claim that only Outcome and Opportunity were load-bearing and the rest were offered but never required. Four fields are now required.
[desk-research][1.1.9] — 2026-09-22
Section titled “[desk-research][1.1.9] — 2026-09-22”Highlights
Section titled “Highlights”- arXiv searches now find the paper you asked for. Free text used to be pasted straight into arXiv’s query language, where a phrase quietly became a loose word match: asking about instruction adherence in agent config files returned 124,103 papers with an unrelated one first. The retriever now composes the query properly and widens it only as far as it must, returning 97 matches with the right paper at the top — and it tells you which attempt produced them, so you can see when a match was loose.
- You can ask arXiv precise questions. Search by title, author, abstract or category, combine them, sort by newest or by relevance, and restrict to a submission-date window. If you already know arXiv’s own query syntax, pass it through untouched.
- Fetch one paper exactly, instead of searching for it. Give the retriever an arXiv identifier or a link and it returns that record — including papers from before 2015 and the older slashed identifiers — with its abstract, authors, categories, DOI and journal reference where arXiv publishes them. Ask for the full text and you get named sections within a stated budget rather than a whole paper.
- A paper’s submission date and its revision date are now separate. The previous version showed only one, so a 2017 paper revised in 2023 could be read as a 2023 paper.
- Rate limits no longer end a research session. Requests are spaced and retried, so the retriever keeps working where it previously became unavailable mid-investigation.
search,getandenrichmodes.enrichreturns a paper’s external links and emits only those it confirmed for that paper.
Changed
Section titled “Changed”perplexity-retriever.pyis now the minimal template for writing a new retriever;arxiv-retriever.pyis the production one.- Each citation carries the arXiv identifier, version, both dates, categories and primary category, with the abstract URL version-free and stable.
- A quote in a search phrase could change the query’s meaning; text is now always treated as text.
- Requests are bounded end to end — a deadline per attempt, caps on what is read and returned, redirects confined to known hosts — and every limit refuses cleanly rather than returning a partial answer.
[core][2.26.28] — 2026-09-21
Section titled “[core][2.26.28] — 2026-09-21”Highlights
Section titled “Highlights”- A knowledge topic can now be recorded as a durable lesson that owns no file. Some lessons are about how a tool behaves, not about a defect living in particular bytes, and pinning them to a file made them go stale on every unrelated edit to it. Such a topic can now be written with no owning source at all, which is a state the store could already hold and read but its writer could not produce.
project-knowledge: the topic writer accepts an explicitowning_source: null.validate_topicalready admitted it, and 63 stored topics are in that state, butcomplete_mutation_proposaland_validate_mutation_proposalrequired a source carrying a digest, so the store could represent a topic its only sanctioned writer could not write. The two writer guards now matchvalidate_topic’s. A non-null owning source still requires its digest, and an omitted key is still refused — only an explicitnullis admitted.
[agentbundle][0.47.3] — 2026-09-21
Section titled “[agentbundle][0.47.3] — 2026-09-21”Highlights
Section titled “Highlights”- A commit made for you by a workspace session now stages only that item’s
own files. If the directory you configure for a pack’s output contains
*,?,[,{or}, it cannot describe a commit scope — a*in particular made the commit reach every uncommitted file under the directory above it. Such a value is now refused with an error naming the section to correct, and the rest of the session’s git tools keep working. Rename the directory to one without those characters to commit again.
git_committook the wildcard structure of its staging scope from the configuredoutput_diras well as from the built-in lifecycle manifest, so a base ofdocs/*collapsed the scope’s static root todocs/and staged every uncommitted file under it. A configured base carrying a reserved character is refused before it reaches the pattern; the wildcard structure now comes only from the manifest. The scope’s containment test and the shared layout reader are unchanged.
[frontend-engineering][0.3.1] — 2026-09-21
Section titled “[frontend-engineering][0.3.1] — 2026-09-21”Highlights
Section titled “Highlights”- Verify mode’s gate list now names the rendered-page inspection. The inspection gate has shipped for some time, and both the visual QA checklist and the evidence manifest already required it. The verify procedure now enumerates all five gates and counts five.
frontend-engineering: the verify-mode procedure enumerates the rendered-page inspection gate, and the prose beneath it counts five gates rather than four. Gate 5’s capture, judgement, privacy, completeness, and no-baseline rules are unchanged; the step points at them rather than restating them.frontend-engineering: the state-matrix rationale no longer cites a study of AI-generated dashboards that cannot be sourced. The instruction it supported — enumerate every state, naming empty and error explicitly — remains.- The pack README’s verify job described a gate sequence the pack does not run: a typecheck, a Playwright baseline, and a Core Web Vitals measurement. It now names the five gates that exist, and no longer claims the run writes nothing while it writes the evidence manifest.
- The README’s worked example routed a notification panel to
documentation-design; the skill’s routing table sends a component interaction tointeraction-design. The example also reported LCP, CLS, and INP values that no gate produced; it no longer reports them. - Three more places described a gate run the pack does not perform. The README’s
create-mode job listed “performance gates”, though no gate in the GATES phase
measures performance. The journey’s verify
step said the run records Core Web Vitals at p75, which belongs to audit mode’s
own measurement step, not to the gate run. And
fe-statusreported “the four GATES steps”, naming four of the five — as did the scaffold-a-component tutorial, which now runs five and gives the rendered-page inspection its own gate.
[core][2.26.27] — 2026-09-21
Section titled “[core][2.26.27] — 2026-09-21”Highlights
Section titled “Highlights”- A small defect noticed mid-loop now gets routed while both of its routes are still open. Deciding where it goes happens at the DECIDE pass, which the loop reaches at a definite point, so a fix that could have shipped in this change no longer reaches the close with nowhere left to go.
- You can now read one row of the close-time table and know where your defect goes. A ready-now fix that can ride along and one that needs its own review unit sit on separate rows, so telling them apart no longer means reading past the table into the paragraph below it.
Changed
Section titled “Changed”work-loop§ Capture states the close-time routing table in five rows instead of four. The row that readSpecific, real, ready nowbecomes two, separating a ride-along-eligible defect from one that needs its own review unit; the four destinations and the routing sentence below the table are otherwise unchanged.work-loop§ Step 5. DECIDE gains the bound that a ready-now defect’s route is settled in that pass. It replaces a “before the session ends” instruction in § Capture that named no point in the loop an agent reaches.
[core][2.26.26] — 2026-09-21
Section titled “[core][2.26.26] — 2026-09-21”Highlights
Section titled “Highlights”- A work-loop close can now record a specific, real piece of leftover
work that is genuinely blocked, instead of losing it. When a defect,
an open question, or a decision is blocked on someone else’s call, an
instrument you don’t have, elapsed time, or a dependency, the close
captures it as a
work-item— with what “done” looks like and why it couldn’t be finished now — rather than dropping it or writing a vague note that a later reader can’t act on. - A work item is checked before it’s written, not after. Each one runs through a cold review with no memory of the session that noticed it; an item that isn’t real, isn’t necessary, or is missing what its shape requires is refused with a specific reason instead of being written silently.
- A blocked defect may carry its own reproduction command, bounded to a
small, read-only set of tools (
cat,wc,grep,ls) with no options and no path traversal, so a captured item can point at exactly how to confirm it without granting the record any power to write or execute.
project-knowledge: a fourth capture kind,work-item, at contract versionknowledge-captured-observation.v2(contracts/jsonschema/knowledge-captured-observation.schema.json). Awork_itemobject carries one of three shapes (defect,question,decision), each with its own admission threshold, and ablockernaming why it isn’t done now.v1stays readable; the writer emitsv2only.project-knowledge:verification_route.commandbecomes a bounded, read-only argv array — a four-tool allowlist, no options, a positive character class, and a repository-path rule over § D6’s stored-path set — for any capture kind that carries averification_route.work-loop: the close-time capture rule now routes a declined scratch note four ways instead of two — generalisable practice, specific-and- blocked (captured as awork-item), specific-and-ready-now (dispatched in-session), and razor-failing (refused, non-silently) — gated on a per-item cold reasoning check, capped at 12 declined items per close.docs/guides/reference/work-item-capture.md: a new reference for writing a validwork-itemrecord.docs/architecture/knowledge-capture.mdanddocs/architecture/security.md: document thework-itemrecord class, that this delivery ships the reasoning validation tier only (the deterministic mechanical tier isdocs/specs/work-item-mechanical-tier/spec.md’s and has not landed), and the complete list of accepted, unmitigated residuals this delivery carries.
[agentbundle][0.47.2] — 2026-09-21
Section titled “[agentbundle][0.47.2] — 2026-09-21”Highlights
Section titled “Highlights”- What the status surface reports about your output paths now follows the
same rules as everything else it reports. If the directory you configure
for a pack’s output uses anything beyond letters, digits and
. _ - /, or points at the repository root itself, the status surface reports no output pattern and tells you which section to correct, rather than passing the value through. Renaming the directory to a plain, repository-relative path restores the reported path.
workspace_statusscreens a configuredoutput_dirwith the same character policy as every other path it publishes, withholding the output pattern and warning when the value falls outside letters, digits and. _ - /. The screen covers the configured base only; the built-in pattern supplies the{slug}and glob tokens and is unaffected.
[core][2.26.25] — 2026-09-21
Section titled “[core][2.26.25] — 2026-09-21”Highlights
Section titled “Highlights”- Closeout asks five questions instead of seventeen.
work-loop’s finish checklist now reads as five assertions — acceptance criteria satisfied, verification passed, review passed with residuals surfaced, artifacts consistent, repository state valid — with the existing obligations grouped underneath each one. Nothing that blocked a release before stops blocking it; the list is easier to hold in mind and easier to answer honestly. - Knowledge capture leaves the critical path. Routing a session’s scratch
notes is no longer a condition of declaring done.
## Capturekeeps its routing rules and now runs after the loop closes — at session end, an explicit handoff, or before compaction. A capture obligation enforced at the completion boundary turns “is this lesson worth keeping?” into a blocking judgment, and the cheapest way past a blocking judgment is a low-value note. Recorded against RFC-0077 § Errata.
Changed
Section titled “Changed”- The finish-checklist item requiring every DECIDE scratch note to be routed
is removed, along with the
Looping without capturing learningsanti-pattern. Closeout remains a legitimate triage boundary and every other semantic gate in RFC-0077 — RFC completion, ADR acceptance, spec approval, plan approval, verified-slice completion, review completion — keeps its obligations unchanged.
[agentbundle][0.47.1] — 2026-09-21
Section titled “[agentbundle][0.47.1] — 2026-09-21”Highlights
Section titled “Highlights”- The status surface and the commit scope agree on where work goes.
workspace_statusreported an item type’s built-in default output path even whenagentbundle-layout.tomlconfigured a differentoutput_dir, while the git tools already scoped commits to the configured one. Anyone reading the status surface saw one location and got another. Nothing was written to the wrong place — the label was wrong, not the write.
workspace_statusresolves an item’soutput_patternthrough the same layout-config precedence the git tools use, so one process cannot report two answers for one item type.- A configured directory resolving outside the repository is reported as no pattern, with a warning naming the section, instead of as the default path. Commits are confined to the repository, so no glob in that payload can name such a location.
[core][2.26.24] — 2026-09-21
Section titled “[core][2.26.24] — 2026-09-21”Highlights
Section titled “Highlights”-
A path that hands your work to another skill is fixed, not configurable, and the reference now says which paths those are.
workspace-status’ layout page documented ashapingkey nothing reads and left outoutput_dir, the one every consumer does read. It now describes the real key, explains that the shaping folder is composed under it rather than configured beside it, and states plainly that your briefs and intents folders are hand-offs — redirect them and the artifact stops being found. -
A new intent now gets a readable name, not just a slug. An intent admitted through
work-intakeat a recognized altitude lands asCAP-0004-external-tracker-projection.mdrather thanexternal-tracker-projection.md, so you can say which one you mean out loud. The number is per altitude, so a capability and a feature can both be0001. -
Admission never stops because a number was unavailable. If the altitude has no prefix, or the allocator cannot be sure of its answer, the intent is still written and registered under its plain name and records why — so nothing you were doing is lost, and the number can be added later. The slug is the identity; the number is a label for humans.
-
Nothing is renamed. An intent already on disk keeps its filename whatever its altitude, so existing links and registry entries keep resolving.
-
The layout reference answers your question instead of citing ours. Where it used to say that two of our internal proposals disagree about whether a skill offers the default path before asking you, it now tells you what to do: do not rely on either order, and set
output_direxplicitly if the distinction matters.
packs/core/.apm/skills/work-intake/scripts/intent_ordinal.py— allocates a typed ordinal asmax + 1per altitude over the intent directory unioned with the records visible onorigin, and returns nothing rather than a plausible number for a malformed name in its namespace, an incomplete scan, an unreadable remote view, or a bound it would exceed. A duplicate check reports records sharing an altitude and a number in one directory, and refuses instead of reporting clean for a directory it could not fully read.
Changed
Section titled “Changed”-
workspace-statusreferences/agentbundle-layout.md:[product]’s single key isoutput_dir, a base under which each skill composes its own subpath.shapingis documented as not a key of the section, with the reason: nothing reads[product] shaping, the product-engineering skills compose<output_dir>/shaping/<slug>/..., and the product-strategy pack has its own[strategy]section. -
Same page: the fallback paragraph no longer invents a default of its own. Each consuming skill falls back to its own pack’s declared default, which is where ADR-0030 keeps it, and the page records that whether a consumer reaches that default before asking is unsettled between two accepted records.
-
Same page: the user-profile example uses
output_dir, and a closing note separates a personal authoring destination from a repository hand-off. -
work-intakeresolves the altitude against its closed table before invoking anything, passes only the resulting token on a command line, and treats a refusal as a change of destination rather than a reason to stop. -
intake-intentaccepts a destination that already carries a prefix, records one of six fixed tokens when no number was allocated, and does not treat a prefix supplied with a request as evidence that one was. -
The published routing table, the workspace schema reference, the start-the-work walkthrough and the product directory README state both destinations and what selects between them.
workspace-statusreferences/agentbundle-layout.md: the unsettled-order paragraph named two internal records by number. Shipped pack guidance states its rule directly and cites no catalogue-internal record, whichverify-host-checksenforces; the earlier wording would have failed that gate on any adopter’s clone as much as on ours.
[core][2.26.23] — 2026-09-20
Section titled “[core][2.26.23] — 2026-09-20”Highlights
Section titled “Highlights”- A review pass runs when something names a reason for it.
work-loopselects reviewers from one table instead of several scattered triggers:adversarial-revieweralways, and security, user-facing, architecture and quality lenses only as the change reaches them.quality-engineerjoins that rule rather than running on every full-mode loop — it is warranted when the change warrants at least oneoperational-safetymodule, is structural, or is explicitly requested. The three conditions reuse routers the catalogue already ships; none is a new predicate.adversarial-reviewerkeeps correctness and scope; testability, reliability, observability, maintenance cost and test-strength judgment belong toquality-engineeralone, so work tripping none of the three conditions ships without that lens — a deliberate trade of the lens for speed. Recorded against RFC-0025 § Errata.
Changed
Section titled “Changed”finding-adjudicatorrefutes on the Authority predicate any finding that names no violated acceptance criterion, repository rule, security property, or concrete defect. Reviewer taste stated confidently no longer reaches FIX. Refuted findings keep their audit record, so a later round can see a claim was tested rather than re-litigate it. Dispatch conditions are unchanged: making them risk-conditional would strand a non-Nit finding outsidefindings[], whichreferences/review-verdict-record.mdadmits only through adjudication.
[core][2.26.22] — 2026-09-20
Section titled “[core][2.26.22] — 2026-09-20”Highlights
Section titled “Highlights”- Ordinary work stays on the short path, and the loop stops when the work
is done. A
work-looprisk trigger that names something you can modify — a security or governance boundary, a structure or public interface, a persistent representation — now fires when a change modifies that thing. Reading it, calling it, testing it, documenting it, or regenerating a projection of it no longer routes the work to full mode. The triggers that name an act still fire on the act, even when everything they touch is unchanged. - The loop stops searching once the work is done. Resolve the findings the current intent requires, and do not expand the frontier unless a finding blocks correctness, security, or a stated acceptance criterion. Meeting the stop condition ends the iteration: do not continue searching for additional improvements.
- Not knowing a file no longer sends ordinary work down the heavy path. The Unfamiliar trigger asks whether you can predict the design, not whether you know the territory. Write down the design you intend and what grounds it; the trigger fires when you cannot, or would be guessing.
Changed
Section titled “Changed”- The risk-trigger block is two groups, and the group heading carries the rule instead of a preamble repeating every trigger. A modification that preserves behaviour still fires; where you cannot tell whether a change reached the thing, it did. Prose that is the rule is the thing itself.
- Backfill, replay, import, export and destructive transformation are their own trigger rather than a clause inside the persistent-representation trigger, which straddled both groups. Both halves fire exactly as before.
work-loop/SKILL.mddrops from 980 to 822 body lines. Theloop-engineandloop-cohortcommand sequences moved toreferences/full-mode-engine.md, which full mode loads at the step that fires one; light mode never ran that machine and now never reads it.- The self-coverage gate carries two rules that compose in order. The frontier rule decides whether a finding is in scope; the existing rule then decides whether to resolve it against a referent or ask a human. A finding outside the frontier is resolved, with the accepted intent as its referent.
- DECIDE routes by whether the accepted intent requires a discovery rather than by whether it matches the agent’s reading of intent. Required covers the trusted request, accepted-contract obligations, repository and skill rules, and mandatory finish duties; a direct-light run, which has no acceptance criteria, still requires its requested outcome. Requiredness is a property of the work, never of the loop that processes it.
- The completion boundary is unchanged: the accepted intent remains the boundary, and work it does not require no longer opens another review unit.
- The pre-EXECUTE design-intent pass now says it is advisory in both modes; a light-mode surface change receives the recommendation only.
- Two
work-loopreference links could never resolve from inside the installed pack and now name their file in prose.core’s design notes point at the canonical risk-trigger block instead of repeating a copy that had drifted two triggers behind it.
[contracts][0.3.7] — 2026-09-20
Section titled “[contracts][0.3.7] — 2026-09-20”Changed
Section titled “Changed”- The pack README described
contract-acquisitionas firing whenwork-loop“hits an unfamiliar API surface”. It fires when the agent codes against a contract it does not hold — unfamiliarity alone is not the condition.
[core][2.26.21] — 2026-09-20
Section titled “[core][2.26.21] — 2026-09-20”Highlights
Section titled “Highlights”- A work-loop no longer drops a small fix just because it sits outside the task at hand. When it notices a mechanically verifiable fix along the way — one it can prove correct with a command, a search, or a check against a named authority — it now lands that fix instead of discarding it or writing it down for later.
- Whether a fix rides along turns on its risk, its behavior, and how it was checked — not on how close it sits to the change already in flight.
- A design call that is already settled — because a rule says so, or because the owner answered in one line — no longer disqualifies a ride-along. Anything that would still change a convention, a contract, or a published interface keeps requiring its own separately reviewed change.
- Nothing noticed during a loop is dropped silently. At the end of a loop, every item gets routed somewhere; anything genuinely stuck is written down together with the one fact needed to unstick it later.
Changed
Section titled “Changed”work-loop: the ride-along carve-out is now admitted by verifiability and risk rather than by how local a fix is to the current change, and a design call already resolved by a citation or a one-line owner answer no longer blocks it. An unresolved call — one that would change a convention, a contract, or a published interface — still routes the item to capture instead. At Capture, every scratch note from the session is now routed to a destination rather than left to fall out of scope.
[product-engineering][0.13.15] — 2026-09-21
Section titled “[product-engineering][0.13.15] — 2026-09-21”Highlights
Section titled “Highlights”frame-intent’s layout page now tells you which intents it places and which it does not. An intent you author for yourself, including in a personal vault, goes where you configured. A repository intent goes to the folder core’s admission reads, and that path is fixed — the same treatment briefs already had, now written down for intents too. Authoring privately and admitting to the repository are two steps of one flow, not two rival destinations.- The page also names its real readers. It claimed two skills read
[product]; eight do, and one reads a different pack’s section entirely.
Changed
Section titled “Changed”frame-intentreferences/agentbundle-layout.md: the pinned-output section covers both hand-offs to core —decompose-intent’s briefs and a repository intent’sdocs/product/intents/<slug>.md— and states thatintake-intentreads no configuration for that path, taking a personal-vault source through a confirmed destination, minimized provenance and explicit authority transfer.- Same page: a new reader list replaces “Only
frame-intent(intents) andalign-value-stream(rollups) read[product]” with the eight skill bodies that do, notinglean-canvasreads to scan but writes a pinned path, and thatux-writingreads[design]rather than[product].
[product-engineering][0.13.14] — 2026-09-20
Section titled “[product-engineering][0.13.14] — 2026-09-20”The intent triad is now executed by the surfaces that run the discovery loop,
rather than left for a reader to reconstruct. Plus three residues of the
voice-and-microcopy → ux-writing rename and one doctrine correction, all in
the shaping surface.
discovery-lead’s gate-ladder walk named none of the three skills it is
supposed to drive. It now names frame-intent at G0, de-risk-intent and
decompose-intent at G1, and decompose-intent again at the G3 handoff — the
two ladder positions the skill’s own gate table already gave it. A reader of
the agent definition alone can run the ladder.
frame-intent gains a ## Pick a route section naming the three shaping
sequences and the situation each one fits: shape one bet end to end, scaffold a
whole product from a raw idea, or position a business before naming a bet. It
is the only place that choice is stated, and discovery-loop points at it.
discovery-loop’s own description no longer routes frame-intent away as
standalone-authoring work, because the loop calls it at G0.
The G3 Core-absent branch now names where it submits. Three surfaces said the
portable fallback was rendered without saying what receives it, while the
negotiated branch named work-intake — so the capability read as bounding the
target rather than the handoff object. All three now route both branches
through work-intake; only the envelope differs. The explanation guide, which
stated the old conditional route, was corrected with them; the how-to guide,
which named no route at all, now names this one.
The discovery-workspace sidecar schema documents two blackboard slot types that
had no stated shape: assumption-test carries the riskiest assumption, the
kill condition, the prototype-approach and the validation hook; and
delivery-contract carries the G3 leaf projection. Both start at internal,
and the schema now says outright that a starting level named for a slot type is
a floor a write-time assessment may raise — it is not a per-type constant, which
would let a higher-classified instance be read off a table instead of assessed.
ux-writing was missing the three output-rendering directives its entry in the
rendering-directive table specifies. The table was still keyed on the old name,
so the skill matched no entry and shipped without them — a missing key does not
fail, it just does not match, which is why nothing caught it.
frame-situation told readers that diverge-solutions and place-bet were
“not yet shipped” when explaining its step-2 readiness degrade. Both ship. The
line went stale when their specs landed and the degrade branch citing it was
never revisited, so it read as evidence and was not. The degrade behaviour is
unchanged; only the false justification is gone.
diverge-solutions demanded a fixed floor of options across its activation
description, opening line, output contract, generate step, artifact shape,
anti-pattern list, worked example and journey entry — some as ≥3, some as
“below 3” and “fewer than 3”, which is why a symbol search alone did not find
them all. A number invites padding to reach
it, which is the opposite of divergence: the skill was inducing the invented
alternatives it exists to avoid. It now asks for enough materially different
options to expose the real decision, and says outright not to invent
alternatives to satisfy a number.
Highlights
Section titled “Highlights”- Arriving with an unshaped idea, you can pick your shaping route from
frame-intentalone, instead of inferring it from three skills’ descriptions. discovery-leadnames the skill it runs at every gate, so a discovery can be driven from the agent definition without reading the loop’s gate table.- A discovery hands off through
work-intakewhether or not Core advertises the handoff object, so the route into delivery no longer depends on the envelope. - Writing an
assumption-testordelivery-contractslot, you can read its field set and its starting data classification off the sidecar schema. diverge-solutionsno longer asks for a minimum option count, so options are generated to expose the decision rather than to reach a threshold.ux-writingoutput follows the same rendering directives as its sibling product-engineering skills, instead of falling back to unguided formatting.frame-situationno longer tells you two shipped skills are unshipped.
[experience-design][2.0.7] — 2026-09-20
Section titled “[experience-design][2.0.7] — 2026-09-20”DESIGN.md named voice-and-microcopy in three places when describing which
pack owns per-state UI copy and which artifact user-flow hands off to. That
skill was renamed to ux-writing and no directory of the old name exists in any
pack, so all three references resolved to nothing. They now name ux-writing.
Highlights
Section titled “Highlights”- The experience-design pack’s own description of the copy handoff points at a
skill that exists, so a reader following it reaches
ux-writing.
[core][2.26.20] — 2026-09-18
Section titled “[core][2.26.20] — 2026-09-18”Highlights
Section titled “Highlights”- A pull-request template ships with the pack.
work-loopnow carriesassets/pull-request-template.md, with a copy step for GitHub and for GitLab in the adapt-to-project guide. It is not installed for you: a repository that already has a pull-request convention keeps it. The template states three things that do not belong in a body — what you tried, the method behind a result, and the diff restated — in comments that do not render, so an author reads them while writing and a reviewer never sees them. - The template ships with no checklist. Its verification section asks for commands and their observed results, which a checkbox cannot supply.
- A
Review focussection is available and optional. It names the one decision the author wants checked, as a question about the code. - Worked pull-request bodies and writing rules. A new
references/pr-authoring.mdcarries seven rules and two worked bodies of different size, so the shape is shown scaling down rather than only described. - The end of a run asks before it offers.
work-loopdecides whether it can open a pull request from the exit status ofgh api userand the value ofviewerPermission, and when either refuses it completes the checklist and says nothing. A blocked credential store makesgh auth statusreport an invalid token andgh repo viewreport a connection failure, so neither message states the cause — an exit status makes no such claim.
[architect][0.15.14] — 2026-09-20
Section titled “[architect][0.15.14] — 2026-09-20”Highlights
Section titled “Highlights”architect-designnow reaches for a system-shape concern when your design turns on one. When an open decision in your design depends on how a system shape coordinates — an event-driven system, a layered application, a distributed service — the skill now loads that shape’s concept in full, so the concern reaches the document without you having to name the shape yourself. A design with a live decision in each of several shapes loads every one of them. Where no decision turns on a shape, none is loaded and the working receipt says so, so you can tell the axis considered your design and found nothing to add.
architect-design: a system-shape routing axis inSKILL.md’s Stage-0 concept step, beside the existing workload axis, delimited by its own markers. It descends the corpus’sconcepts/system-shapes/index.mdand selects a shape only when an open decision turns on that shape’s coordination mechanism; a selected concept always loads whole, with no tier selection.architect-design: an eval case exercising the new axis.
[architect][0.15.13] — 2026-09-20
Section titled “[architect][0.15.13] — 2026-09-20”Highlights
Section titled “Highlights”- The paragraph-length check now sees a bold lead-in. Counting sentences needed a space straight after the full stop, so any closing mark standing between the two hid the break: an emphasised or code-spanned sentence, a parenthesised aside, or a closing quotation mark each read as no sentence end at all, and a paragraph that emphasised every sentence read as one. A long paragraph written with bold lead-ins could therefore pass the check it should have failed. Measured over the thirty-seven design documents in this repository’s own architecture folder, the check reported eighty-one over-long paragraphs where the true number is one hundred and twenty-seven — it missed forty-six that crossed the budget unseen, and the mark that hid them was a bold span in one hundred and twenty-one of the one hundred and twenty-six mis-counted paragraphs. Those paragraphs are counted now, and the check reports the same file and line it always did.
- A closing mark in any script closes a sentence. The marks recognised are
every Unicode close-punctuation and final-quote character, so a document
written with corner brackets, guillemets or angle brackets is counted the
same way as one written with parentheses — and so is a strikethrough span.
The set is those Unicode categories rather than every character that looks
like a closer: an ASCII
>stays out, because in Markdown it closes an autolink around a URL, and admitting it would misread more documents than it would fix. One shape stays undecidable and is unchanged: a single-letter sentence end inside a code span reads as an enumeration label, because an enumeration label written the same way has to keep reading as one. - The decomposition rubric names the third place a candidate can land. It offered a document of the part’s own or a row in the element catalogue. A part can satisfy the qualifying rule and still belong above the document holding it, so the rubric now says to route it upward and how to record that. The case this catches is a document that carries the changes it is asking of a ratified parent: ratifying it would accept those changes by implication, because its own reviewer has no standing to accept them. The qualifying rule now says plainly that it does not settle which document holds the result, and that none of the six criteria will tell you: they ask whether a candidate differs from its parent, not at what altitude the people who must accept its decisions hold that authority. So standing is a question to ask separately every time the rule is met.
- A design review no longer reports a correctly routed part as a missing document. The reviewer’s decomposition checklist asked whether a qualifying child had a document of its own. A child whose decision only someone above this document can accept — a ratified parent’s reviewer, say — has a link instead, by design, and would have been reported as a defect. The checklist now looks for either, and says which correction the part needed turns on standing. It also gains an item of its own for the case that started this: a document carrying the changes it is asking of a document above it that someone else accepts.
- The
DA3sentence counter skipped a boundary whose terminator was followed by a closing delimiter rather than whitespace. The defect and its size were established independently indocs/specs/architect-design-document-gates/notes/gate-calibration-probe.md, which ran the shipped script over that corpus and derived the corrected counts before this repair existed. The repaired counter reproduces them exactly: 127DA3trips against the record’s 127, across 29 of 37 documents against its 29, withDA10unchanged at 3 — and the shipped counter still gives the recorded 81 and 26. The boundary pattern and the lone-letter enumeration mask both skip a run of closing delimiters now: tolerating them in the boundary alone turns the under-count into an over-count on an inlinea.label, so the two patterns have to move together. One residual is irreducible and documented in the source — a one-letter sentence end behind a delimiter and an enumeration label behind one are the same shape, and only what follows separates them. Three over-counts are newly accepted, each recorded in the source with its reason and pinned by a test: a code span whose content ends in a terminator followed by another mark, as in “the patternfoo.*here”; a bracketed formula, as in “Compute ⟨n!⟩ first”; and a link whose URL ends in a terminator, as in a query marker. All three count one sentence more than they did before, so all three are regressions on those inputs. They differ in whether the underlying class was already live: an unbracketed “Compute n! first” over-counted before this change, so the formula case was a hidden instance of something already true, while a URL ending in a terminator was counted correctly before and now is not. Recognising a URL needs real Markdown scanning — a pattern for it mistakes a literal bracket-paren in running prose, stops early on a URL containing balanced parentheses, and is quadratic when no closing parenthesis follows — so a wrong one costs more than the over-count it removes. Masking what a code span contains would have stopped counting a span that is itself a sentence, which trades a visible over-count for the silent under-count the check exists to catch. - A cost this change would otherwise have made worse is removed instead. The sentence-boundary search retried a run of terminators from every position inside it, which was already quadratic before this change on input the check accepts at up to a megabyte; tolerating closing marks adds a rescan of the closing run to each of those retries. Anchoring the match to the start of the run changes no count and removes the retries, so the work grows in step with the input rather than with its square. A test pins a sampled growth ratio that separates the two implementations, rather than a duration that would differ on every machine.
[architect][0.15.12] — 2026-09-19
Section titled “[architect][0.15.12] — 2026-09-19”Highlights
Section titled “Highlights”- A design document now gets a runnable check for two of its ten quality gates. A gate script flags any prose paragraph over three sentences and any document over a 3,300-word size bound, both reported with the exact file and line, so those two checks no longer depend on a reviewer catching them by eye.
- Reviewing a design document now asks for a verdict on all ten named quality checks, every time. The checks cover present tense, named cross-references, model-before-prose ordering, single-sourced concerns, removed decision history, diagram clarity, buildability from the models, linked evidence, and document size — so a check nobody looked at and a check that passed no longer read the same in the result.
- Seven of those checks now give an author narrowing hints before a design document is ever sent out for review, including future-tense wording, an unnamed cross-reference, and a model-after-prose section — a reviewer still decides, but an author sees them first.
[core][2.26.19] — 2026-09-18
Section titled “[core][2.26.19] — 2026-09-18”Highlights
Section titled “Highlights”- A shipped spec is the record of what was agreed, not a rule the code must keep obeying. An agent that meets an older spec disagreeing with today’s change now reads that as the system moving on, and says so instead of raising it as a defect. The spec directory your repository is seeded with says the same thing in plain words, so a person opening it meets the limit of a spec’s authority beside its conventions.
Changed
Section titled “Changed”docs/specs/README.mdseed: a new closing section says a spec records what was agreed when it was agreed, freezes when the feature ships, and is corrected by superseding it rather than by editing the body — its status line points at the decision record, and the instruction anyone still follows lives in a living file at the point of use. The sentence that carried the freeze rule alone is folded into it, and the section names thenew-speccontract that owns the full rule. An adopter reading the directory now meets the limit of a spec’s authority beside its conventions.adversarial-reviewer: read-order step 2 scopes “the standard” to the targeted spec and names a shipped or archived spec delivery history rather than current-state authority, and drift check 5 opens with the same scoping. A change that contradicts an unrelated shipped spec is a finding only when it also breaks the targeted spec, a live unshipped spec, a cited ADR, or working code — previously neither surface said which spec it meant, and reviewers read shipped specs as live constraints.work-loop:references/delivery-contract-lifecycle.mdopens by naming what a delivery contract binds and for how long — living while the plan is drafting, pinned from plan approval, frozen once the spec isShipped, whose status line still takes the two licensed pointers and whose deferral anchors still have to resolve — and points at thenew-specskill’sreferences/spec-and-plan-contract.mdfor the full rule. The amendment machinery below it already assumed those stages without stating them.
[core][2.26.18] — 2026-09-18
Section titled “[core][2.26.18] — 2026-09-18”Highlights
Section titled “Highlights”- A design decision in a plan now names the task that builds it. Every
## Design (LLD)sub-section carries anOwned by:field alongside its existingTraces to:, and the pre-review walk checks that every interface, type, symbol or ownership decision has an owning task. The traversal runs one way only — design down to tasks — because over a third of tasks have no design origin and a reverse rule would fire on every one of them. - A plan that uses the field gets its ownership checked. Once any
sub-section carries
Owned by:, the contract-alignment lint reports a body-bearing sub-section that names no task, and a named task that no heading defines. A plan written before the field is reported as predating it, never failed, so existing plans need no migration. - The plan template no longer promises an edit the engine refuses. It
said an implementer corrects the design in place “without an amendment”;
approval hashes the whole plan, so that edit was always rejected. The
permission is now bounded to before approval, and the two post-approval
cases are named: grounding for a seam the plan marked
no stub (implementation-discovered)goes to the verification ledger, and a settled decision that execution falsified is a plan error taking controlled amendment. - A review finding is now classified by cause depth before it is answered. A finding whose cause is a design decision repairs the design and every task that decision owns, rather than patching the one place it was spotted.
- Five conditional design prompts in the plan template: concurrency and
transaction boundaries, stable error classes and retryability, a concrete
observability surface, backfill checkpointing and cutover validation, and
named test seams for crossed boundaries. Each scaffolds only when the
spec’s
Shape:selects its sub-section.
Changed
Section titled “Changed”- The contract-alignment lint’s task pattern accepts a lettered task-ID
suffix, so a
T2aheading now enters the set of defined tasks it resolves against.
[core][2.26.17] — 2026-09-18
Section titled “[core][2.26.17] — 2026-09-18”Highlights
Section titled “Highlights”- A plan now names the production code each of its checks drives. A task’s
Tests:bullet already owed the suite it lives in, the fixture carrying a join key, and the shipped assertion the change moves; it now owes the production code the check exercises as well. A reader of a plan written from here on can see what each check is meant to hold against without opening the test.
Changed
Section titled “Changed”new-spec:SKILL.mdstep 5 adds the production seam a check drives to the list of mechanisms aTests:bullet must name, alongside the suite and its location, the fixture carrying a join key, and the shipped assertion the change moves. A bullet that names no production code leaves an implementer unable to tell what the assertion is meant to hold against. Naming an honest proxy for a property the oracle cannot reach stays a separate obligation in the same step.new-spec:SKILL.mdstep 5’s Restating an acceptance criterion bullet no longer repeats that list of mechanisms; it points at the rule beginning “Carry mechanism, never a restatement of a criterion”, which states them once, so the two cannot drift apart again.adversarial-reviewer,quality-engineer,security-reviewerandfinding-adjudicatornow state that a finding’s bold title takes backticks rather than italics. The report parser rejects any*between the opening and closing**, so a title quoting an italicised phrase parsed as zero findings and the report was refused asinvalid (sustained-line-shape)— a reason code that reads as an unsound verdict rather than as markup, which cost a review loop a stop to diagnose.
[core][2.26.16] — 2026-09-18
Section titled “[core][2.26.16] — 2026-09-18”Highlights
Section titled “Highlights”- A spec now opens with what changes, not with an essay. The Objective section is renamed Outcome and capped at two sentences — who this is for, and what success looks like for them — and a new What Changes section sits right under it carrying the delta as bullets. A reader landing on a spec cold gets the shape of the change in the first screen instead of hunting for it.
- Boundaries is now called Agent Rules. Same three tiers, same meaning, a name that says what the section does. Specs written before this keep the old heading and stay valid: every reviewer that reads the section now recognises both names.
- The Assumptions section holds open questions only. It used to be an audit trail — every fact the author checked, with a citation for how. Those facts now go where they do work: a fact that bounds the delivery goes into the spec body, a fact that shapes how it is built goes into the plan’s design. What is left in Assumptions is what nobody has answered yet, so a reader sees the gaps instead of scrolling settled ground.
- A plan’s Changelog records approvals and nothing else. The dated diary of how the approach evolved is gone; the two approval entries, which are the only record of when the contract froze and on whose authority, stay exactly as they were.
- A plan task writes an Approach only when it has a decision to record. Where a task’s Tests and Done when already say what to build and how it is observed, the Approach was restating them. It is now written for an ordering or a seam decision a reader cannot otherwise infer.
- New advisory guidance on prose that reads as generated. A prose-discipline reference gives the author a signal-word scan, a list of canned rhetorical shapes, and the rule that the repair is restructuring rather than swapping synonyms. It is advice, never a gate, and it defers the form rules to the output-rendering block each skill already carries.
Changed
Section titled “Changed”new-spec:assets/spec.mdrenames## Objectiveto## Outcome, adds## What Changes, renames## Boundariesto## Agent Rules, and rewrites## Assumptionsto unresolved items only, in two admitted shapes — an open question and a named gap.new-spec:assets/plan.mddrops drafting history from## Changelogand makes a task’s**Approach:**conditional on an ordering or seam decision.new-spec:SKILL.mdstep 3 routes each settled fact to the spec body or the plan’s design instead of copying the confirmed list into## Assumptionswith citations; steps 4 and 5 point at the newreferences/prose-discipline.md.new-spec:references/spec-authoring-rubric.mdgains one pointer to that reference and keeps its six convergence classes.adversarial-reviewer,security-reviewer,quality-engineerandwork-loop’sreferences/pre-execute-review.mdnameAgent Rulesand the legacyBoundariesheading together, so a review of a spec written before this release still has a standard to measure against.
[architect][0.15.11] — 2026-09-18
Section titled “[architect][0.15.11] — 2026-09-18”Highlights
Section titled “Highlights”- Design docs now match the size of what they describe. Writing about a whole application or system, a single subsystem, or a change to an existing architecture each gets its own template, so a reviewer no longer has to fill in eight generic sections that half apply and skip the rest.
- Every modelled section leads with its model, not a page of prose about it. Each template opens with the question the section answers, and where the section carries a diagram or table it puts that first and only then explains why it looks that way — so a reader can see the shape of a decision before reading the argument for it.
- A new rubric says how many documents a design needs, not just what goes in one. Six criteria decide whether a part of a subsystem deserves a document of its own, so a design doesn’t grow past its own boundary just because a subsystem’s story kept expanding, and a parent document says plainly what it still owns once children split off.
- Existing links to the earlier design-doc template keep working. It stays at the same path and now says plainly what it is: a kept pointer to the three templates, never chosen for a design itself.
- Design and review now speak the same three scopes. The review checks ask the same scope-shaped questions the templates were written to answer, so a design that follows its template’s model doesn’t get marked down against a checklist that expected different sections.
architect-design: scope determination runs before Stage 0, resolving an altitude — application/system, subsystem, or architecture change — and a document count, both ahead of template choice.architect-design: three new templates underassets/—application-system-design.md,subsystem-design.md, andarchitecture-change-design.md. The subsystem spine covers Scope and Context, Structural Model, Runtime Model, Contracts and Invariants, Data and State, Deployment and Operations, Quality Scenarios and Verification, Implementation Mapping, “Decisions, Alternatives, and Risks”, “Rollout, Migration, and Reversal”, and Open Questions. The application/system template shares that spine at person/system/container zoom and omits internal component and file/module detail. The architecture-change template is delta-shaped and requires the authoritative current-state artifact as its baseline.architect-design:references/decomposition-rubric.mdis new, with six criteria (D1-D6) governing when a subsystem’s part earns its own document. A child qualifies onD1plus at least one other criterion,D1also doubles as the recursion’s stopping rule, and size alone is never sufficient. It also states what a parent document retains once children split out.
Changed
Section titled “Changed”architect-design:assets/design-doc.mdis retained at its existing path and now states that it is an unrouted compatibility pointer to the three routed templates; the procedure never selects it.architect-design: structural sections use standard Mermaid (flowchart,sequenceDiagram) with explicit boundaries and a declared zoom, never the experimentalC4Context,C4Container, orarchitecture-betadirectives.architect-design: the general Appendix section is retired from the templates; supporting evidence is cited or linked inline instead.architect-design:evals/evals.jsongains one eval per routed template asserting each section’s model precedes its rationale, and updates its existing eval to require model-first, scope-routed output rather than the retired eight-section shape.architect-review:SKILL.md,references/rubric-design-doc.md, and thedesign-revieweragent route and check by the same three scopes asarchitect-design, replacing the retired eight-section checklist.
[architect][0.15.10] — 2026-09-18
Section titled “[architect][0.15.10] — 2026-09-18”No Highlights: this release changes nothing a consumer of the pack can do.
architect-design produces the same output from the same instructions; the
change is enabling work for the scope-routed authoring model recorded in
ADR-0118.
Changed
Section titled “Changed”architect-design:SKILL.mdgains aknowledge-provider-handoffHTML comment marker either side of the bounded provider-consumer instructions. The markers are anchors for the pack’s own tests and render to nothing; no instruction text changed.architect-designtests: the provider-consumer boundary suite locates that block by those markers instead of by a neighbouring heading and step number, so restructuring the procedure fails the suite loudly rather than moving every assertion onto the wrong text.architect-designtests: the authority contract asserts the frontmatter’s key set, skill name, exactmetadata.boundarieslist, and both ends of the description — the invocation scope and trigger list that open it, and the refusal clause that closes it — replacing equality against the whole frontmatter string. It still fails onallowed-tools:, a widened boundary, an added top-level or metadata key, a renamed skill, and routing text prepended to or appended onto the description. It no longer fails when the description’s middle is reworded: the sentence saying what the skill produces, and the cloud well-architected claim, are both free.
[architect][0.15.9] — 2026-09-18
Section titled “[architect][0.15.9] — 2026-09-18”Highlights
Section titled “Highlights”- Choose the right Mermaid layout for your renderer. The diagram guidance now explains that releases before Mermaid 12 default to dagre and need a separate ELK package, while Mermaid 12 and later default to bundled ELK.
architect-diagram: names which Mermaid versions each layout and packaging statement applies to.
[core][2.26.15] — 2026-09-18
Section titled “[core][2.26.15] — 2026-09-18”Highlights
Section titled “Highlights”- A wave can no longer be signed off without saying who did the work. The step that closes a wave used to pass no matter what: it returned success for any state it could read, so a wave whose tasks were never dispatched looked exactly like one where every task was done. It now asks for one short record per task in the wave — either “this was dispatched” or a declared reason it was not — and refuses the exit by name when a record is missing, listing the tasks it could not account for rather than a count. The sibling command that steps the wave pointer forward asks for the same thing, so the check cannot be walked around by moving the pointer first.
- Nothing already in flight breaks. A run whose state predates this feature
carries no records at all, and the exit passes it with a notice saying
enforcement is off rather than blocking it, so an upgrade mid-run still
finishes.
loop-cohort statusreports whether records are being enforced. - A run that genuinely has no implementer can still proceed. A wave task can be declined for one of two declared reasons — no implementer is installed, or a human directed the work another way — and a declined task counts as accounted for.
loop-cohort dispatch-receipt <spec-dir> --task <id> --wave-index <n> (--receipt | --decline <reason>) --expect-run-id <id>records one per-task receipt or decline. Declines takeno-implementer-installedorhuman-directed; the set is closed and the verb names both when it refuses.loop-cohort check <spec-dir> --phase wave-exit, a read-only guard over an eight-row verdict table whose rows partition every cohort state, so exactly one row decides any given state.dispatch_receiptsin the cohort state template, keyed by partition digest, then wave index, then task identifier.schedulecreates it and keeps only the live partition’s records; a contract amendment empties it.dispatch_receipts_enforcedinloop-cohort status, in both the default and--jsonforms.
Changed
Section titled “Changed”-
The
wave-completetransition out ofCODE-IMPLEMENTATIONnow consultscheck --phase wave-exit.check --phase implementis unchanged and keeps its exact verdict for every state it passes today, which matters because the pre-push hook runs that phase for every spec directory and reads its exit code. -
loop-cohort wave advancerefuses on the branch that moves the pointer when a task in the wave being left has no record. The branch that recognises an already-applied advance still exits zero, because a crash-recovery replay re-issues the command and refusing there would strand the run. -
current_wave_indexis read through one validation shared by the branch selector and the accounting check, instead of two readings that disagreed on"1",1.9,TrueandNone. -
The work-loop scheduler now resolves which plan task owns a
Depends on:line in exactly one place. Four functions used to walk the plan’s task-section boundaries separately, including the unknown-dependency refusal and the dependency graph the refusal has to agree with; if those two walks had ever drifted apart,schedulewould have refused a plan it would otherwise have scheduled, or accepted one whose edges it then read differently. They now share one owner, so that agreement is structural. ADepends on:field is still read only up to its first(, so an ID inside parenthetical prose stays commentary — neither scheduled as an edge nor reported as unknown. Behaviour is unchanged: compared across every plan in this repository, the consolidated walk produces identical output.
- The supervisor-mode parallel-dispatch reference named a disjointness check
that does not exist. It now names
dispatch_decision, states that the function is handed a merge-tree verdict rather than computing one, and says that the verdict’s producer is unbuilt — no shipped script runsgit merge-tree. Reading the old sentence and resolving the missing name to the nearest real symbol inverted the gate’s safety property, because that symbol is the advisory glob screen the same page says must never greenlight a parallel wave. The merge step remains the sole authority for disjointness.
[frontend-engineering][0.3.0] — 2026-09-18
Section titled “[frontend-engineering][0.3.0] — 2026-09-18”Highlights
Section titled “Highlights”- The frontend pre-flight now reads the design handoff your team already wrote,
instead of picking an aesthetic direction of its own. Point
[design] output_dirat your design directory and it takes the aesthetic direction, the per-screen brief and the token taxonomy from there. Its own canonical reference list is now only the fallback, and only for a slot no artifact filled. - It keys on no section name inside your files. Design templates are scaffolds people edit, so a reader that looked for named sections would find nothing in most real documents — it takes the first heading, the frontmatter as it finds it, and the body whole.
- A file under a read path that is not the artifact — a different
type:, a draft, another kind of design record — is skipped and the scan continues. A design directory holding many kinds of document is expected, not an error. - When the directory is a personal vault or anywhere outside the repository, it asks you about each artifact before using it, and shows you what it found. Nothing in these files says which product they belong to, so that confirmation is the check — it is never reported as though a test had passed.
- Every refusal stops the whole read and halts, by name. It does not tidy up a bad value, pick a different file, quietly downgrade to a skip, or fall back to the canonical list. Read the design handoff says what each skip and each refusal means, and where the limits are.
- Shared pre-flight step 0,
Design handoff read, run by all four modes. It resolves[design] output_diracross the repo-root and user-profile branches, validates the slug before composing any path, approves the root with a reserved-tree refusal, compares on resolved path components at every component as enumeration reaches it, enforces read bounds in a stated order, filters by frontmattertype:, and takes per-artifact confirmation under a heightened root. references/design-handoff.md, the reading contract: the three read paths with their requiredtype:literals, what is taken from each file, and whattype:does and does not establish.guides/frontend-engineering/how-to/read-the-design-handoff.md, with its index row.- A repository test holding that contract to the real design tree, so a contract that mishandles a file in it fails a gate rather than a review.
Changed
Section titled “Changed”- The pre-flight is five steps. The new step is numbered 0, so steps 1, 1b, 2 and 3 keep their numbers and every reference to them stays true.
[experience-design][2.0.6] — 2026-09-18
Section titled “[experience-design][2.0.6] — 2026-09-18”Highlights
Section titled “Highlights”- Compare creative directions on shared terms. Each direction now records its commitments across fifteen named axes, including seven structural axes, so teams can identify a meaningful difference instead of arguing from taste.
- Test whether a direction is distinctive before carrying it forward. A counterfactual pass reworks a similar brief, then records changes wherever the result falls back to a generic default.
- Start with a named visual direction. Swiss / International Typographic, editorial broadsheet, and Bauhaus directions provide ready-made starting points for exploration.
- Check that candidate directions truly diverge. A divergence audit identifies the closest pair, showing whether the options differ in substance rather than only on average.
- Review a surface through two published instruments. Design reviews can now rate perceived quality and perceived genericness separately.
[core][2.26.14] — 2026-09-17
Section titled “[core][2.26.14] — 2026-09-17”Highlights
Section titled “Highlights”- A plan now records who approved it, and when. Approving a spec and plan froze the contract and left no trace in the artifacts of when that happened or on whose authority. Reading a shipped delivery months later, you could not tell which claims were in the contract at approval and which arrived during the work — the plan’s own history started at drafting and resumed at execution, with the gate itself unmarked. Each approval is now a dated entry in the plan’s changelog, written by the approver in the same edit that sets the status.
Changed
Section titled “Changed”- The plan template fixes the entry’s form;
work-loop’s G-plan sequence owns when each is written. The plan entry lands in the same edit asStatus: Approved, because the next step pins the plan’s content and splices out only the status token — an entry added afterwards invalidates the baseline.
[iac-terraform][0.1.10] — 2026-09-17
Section titled “[iac-terraform][0.1.10] — 2026-09-17”Changed
Section titled “Changed”- The required
governance-extrasrange widens to^0.11. This pack asksnew-adrto author its infrastructure ADRs rather than carrying a copy of the template or reading records itself, so the richer metadata block that release adds arrives as extra fields on the recordsnew-adrwrites. The infrastructure mode and its reference material are the same as before.
[governance-extras][0.11.0] — 2026-09-17
Section titled “[governance-extras][0.11.0] — 2026-09-17”Highlights
Section titled “Highlights”- New ADRs now record how easy a decision is to reverse and which areas it
touches. The
new-adrtemplate addsReversibilityandAreasfields, plus four supersession fields that staynoneuntil a decision is actually reversed. Coining anAreasvalue nothing else in yourdocs/adrdirectory already uses now asks for your explicit confirmation first, so a typo does not quietly start a new label on its own. - Reversing a decision no longer means editing the old record. Point a new
ADR’s
Supersedes:field at the one it replaces; the old record’s ownStatusandSuperseded by:fields pick up the link. Its text stays as written — history, not something the new decision rewrites — and the generated index shows the pointer from both records. - A shape check for your own decision records.
new-adrandnew-rfcbundle a script that reads every record’s metadata block and reports anything missing, unmatched, or shaped wrong, over the whole directory in one pass rather than stopping at the first problem. - Correcting an accepted decision has one place to write it. Add a dated
entry under
## Erratainstead of editing the decision itself; entries are only ever added, never rewritten or removed.
new-adrbundleslint-adr-shape.py, checking every ADR’s metadata block against fifteen shape rules — required fields present, a bareStatustoken rather than a compound value, a supersession entry matched by its mirrored counterpart on the other record, a duplicate decision ID among others — and reporting every finding it finds, not only the first.- The ADR template adds
Areas,Reversibility, and four supersession fields (Supersedes,Superseded by,Supersedes in part,Superseded in part), each defaulting tonone. The template states which parse tier each field belongs to and the authoring transformation: substitute every placeholder, delete the guidance comments. new-adrgains a## Errataconvention: a dated, append-only section for correcting what an accepted ADR meant, without rewriting its decision.
Changed
Section titled “Changed”new-adr’s write gate checks a draftedAreasvalue against the tokens already in use in the target directory and asks for explicit confirmation before coining one none of them use.- The generated ADR and RFC index now reads a bare
Statustoken plus aSuperseded by:field to render a supersession pointer, rather than a compoundSuperseded by ADR-NNNNvalue insideStatusitself. new-adrandnew-rfcstate the four zones a record moves through after acceptance — Live (Status, the supersession fields,Areas), Attested (Date,Decision-makers,Reversibility, frozen), Frozen (prose, frozen except## Errata), and Append-only (## Errata) — replacing the earlier rule that only a status change was ever permitted, which did not describe the metadata block’s own fields.
[core][2.26.13] — 2026-09-17
Section titled “[core][2.26.13] — 2026-09-17”Highlights
Section titled “Highlights”- Your agent decides where an unsettled assumption belongs. While drafting a
spec, it surfaces the assumptions it is making and checks each one before
filing it. Some cannot be settled at that point — what an existing helper
really does, what a generated file actually contains, what a check truly
proves. Each of those is now placed by a rule rather than written down as-is.
The rule lives in the
new-specskill’s assumptions step, under the anchorload-bearing-claim-routing; it has one home, and this entry does not restate it.
Changed
Section titled “Changed”new-spec’s assumptions step carries the routing rule under a stable anchor, and both surfaces that need it —work-loop’s plan-stage self-coverage step and the how-to guide for planning non-trivial work — point at that anchor rather than restating its destinations, so the three cannot drift apart.
[core][2.26.12] — 2026-09-17
Section titled “[core][2.26.12] — 2026-09-17”Highlights
Section titled “Highlights”- The spec checker now notices when a criterion was reworded and its
assertions were not. It could already do this, but only if you knew to
hand it a revision to compare against. Without one it said nothing and
reported a clean run, so the check was there and almost never ran. It now
works out what to compare against on its own — the point your branch left
the default branch. Nothing new can fail your build: this check describes
what it found and never sets the exit code. Pass
--no-sinceif you want it left alone.
Changed
Section titled “Changed”lint-contract-item-alignment.pyresolves its own base revision for the stale-assertion rule, tryingorigin/HEAD,origin/main,origin/master,mainandmasterin that order and taking the merge-base withHEAD.--sincestill names one explicitly;--no-sincedeclines one, and the two are mutually exclusive. An empty--sinceis now refused rather than read as absent.- Default base resolution is bounded to
--root.gitsearches upward for a repository, so a spec tree nested inside an unrelated checkout would otherwise be compared against that checkout’s history. A--rootthat is not itself a repository root now declines instead.GIT_DIRand its companions are dropped from git’s environment for the same reason: they take precedence over the directory, so an inherited one — normal inside a git hook,git rebase --execorgit bisect run— would otherwise answer for a repository you did not name while appearing to respect--root. - Every no-input entry the stale-assertion rule emits names which input was
missing, rather than printing a bare rule name that read as a check
declining to run. The causes it can report include an opt-out, an absent
plan.md, an unreadable diff, no repository, a repository with no work tree, a root inside another repository, no commit onHEAD, no default branch, and no merge-base with one that resolved.
[core][2.26.11] — 2026-09-17
Section titled “[core][2.26.11] — 2026-09-17”Highlights
Section titled “Highlights”-
Your agent now reads one conventions file instead of two. The seeded
AGENTS.mdwas a short file that pointed at a much longerdocs/CONVENTIONS.mdfor the rules that actually govern work. Two subagents loaded that longer file in full on every dispatch — roughly 21,900 tokens of context spent before either had read your code.AGENTS.mdnow states the rules an agent needs to start work: the commit format, the four pull-request questions, the privacy rule, how changes get scoped, when to confirm before a destructive step, and what to do when documented guidance and code disagree. Nothing was dropped to make it fit — the rest moved to whichever artifact already owned it, so the answer is in the guide, skill or architecture document you would have reached for anyway. -
A new
docs/README.mdtells you what belongs where. Installing the pack gave you four documentation directories and nothing explaining which one a new document goes in. The map names each area, what belongs there, and its lifecycle class — living, frozen, or governance — and it carries a row for you to extend when you add an area of your own. The seededAGENTS.mdroutes to it, so an agent entering your repository has a way into your documentation rather than a dead link. -
The seed stopped offering you sections it already has. Its trailing comment listed
Documentation,Security considerationsandScoped instructionsas guidance to add once you had a reason. All three are now real sections, so the comment no longer suggests adding what you have.Repository structureis still offered, because the seed still does not carry it.
Changed
Section titled “Changed”docs/CONVENTIONS.mdis retired and is no longer seeded. An existing adopter’s copy is left in place untouched — a withdrawn seed is never delivered again, and nothing deletes what you already have. Its content lives inAGENTS.md,docs/README.md, the directory READMEs, and thenew-specandwork-loopskills.docs/README.mdis seeded once and then yours, the same waydocs/CHARTER.mdalready was. Rebuilding never overwrites your edits to it.
[experience-design][2.0.5] — 2026-09-17
Section titled “[experience-design][2.0.5] — 2026-09-17”Highlights
Section titled “Highlights”- Four design skills now write where you point them.
creative-direction,design-principles,information-architectureanddesign-systemeach declare one canonical target under the[design] output_diryou set inagentbundle-layout.toml. Before this releasedesign-principleswrote to a fixeddocs/design/principles/...path that ignored your configuration,information-architectureused a location no skill declared,creative-directionnamed none at all, anddesign-systemproduced no file — it now writes a token taxonomy your frontend work can read instead of re-deriving tokens every session. - Treat the pack’s confinement as a strong default, not a boundary. Each of
the four is instructed, before writing, to state the approved output
directory, the file it read that value from, and the target path it composed.
One full run was captured against the shipped wording —
creative-direction, which stated all three — so this is a measured instruction for that skill and an unobserved one for the other three. The check that keeps a write inside that directory is an instruction the agent has to carry out, not something the pack enforces. Against a target reached through a symlink it was skipped in 2 of 8 observed runs, and every skip wrote outside the approved directory. The step was rewritten to require an executed real-path resolution and has refused on every run observed since, but a skipped check still leaves no trace: the file exists and looks ordinary. If you need a guarantee rather than a strong default, enforce confinement outside the agent — in the filesystem, or in a tool that refuses the write. - The how-to guides now say what each skill actually does. Nineteen steps
published a “where it lands” path. Eight named a file the skill never writes,
and several sent you to an
aesthetic/folder nothing produces. Every step now gives either the path its skill writes or a plain statement that it writes no artifact, so you stop waiting for a file that was never coming.
design-systemwrites<output_dir>/tokens/<slug>.mdwithtype: token-taxonomyfrontmatter, from a shipped template. It is the skill’s first artifact, and it is what a downstream frontend surface reads when it asks which token taxonomy applies.- A shared containment module,
references/containment.md, carried as a byte-identical copy by each of the four writers and bydesign-review. It holds output-directory approval, slug validation, final-target real-path confinement, intermediate-directory confinement, the existing-artifact type and product-belonging checks, and the rule that a loaded artifact is data rather than instructions. - Each of the four writes has an eval case covering its declared target, its frontmatter type, and the requirement to surface the resolved path.
Changed
Section titled “Changed”- The three existing writes resolve through your configured output directory:
creative-directionto<output_dir>/direction/<slug>.md,design-principlesto<output_dir>/principles/<slug>.md, andinformation-architectureto<output_dir>/screens/<slug>-ia.md. Nothing moves on upgrade; these targets had no address to move from. design-reviewresolves the design-principles artifact the same way. Its load is a step the skill marks mandatory, so under a non-defaultoutput_dirit previously missed the file and produced findings traced to nothing.- The pack’s three folder listings —
DESIGN.md, thepack.tomlsubdirectory note, and theexperience-statusscan table — name the same nine declared folders.aesthetic/andscreen-flows/, which no skill writes, are gone. - A known limit, stated because you cannot see it from the output.
Resolving
output_diris itself an instruction, and an agent sometimes writes to the example path in the layout reference instead of reading youragentbundle-layout.toml: 2 of 12 observed runs before that section was reworded, 1 of 4 after — no measured improvement. The wording is kept because it is more accurate, not because it fixed anything. The mitigation is visibility rather than prevention: the resolved path and the file it came from are stated before the write, so a wrong directory is something you can catch at the time.
- The final-target confinement check is now discharged by running a real-path
resolution and reading its result, with the command given inline, rather than
by reasoning about the path. Measured on the two skills that had leaked: 2
escapes in 6 symlink runs before, 0 in 6 after, with no new refusals on benign
input. Across all four writes, measured against the shipped module, the
current state refuses an inadmissible
output_dir, a symlinked target, and a non-conforming slug — twelve cells, twelve refusals, no file written in any of them. - A non-conforming slug was being silently rewritten rather than refused.
Given a slug carrying path-traversal segments,
creative-directionderived a tidy slug from the product name and wrote the artifact — in 2 of 3 runs. The containment module said to reject such a slug and never said not to repair it, so the skill complied in the most helpful way available. This is the one failure in this release you could not have spotted from the result: the file that lands is well-formed, correctly placed, and named something you did not ask for. All four writes now refuse a non-conforming slug instead of substituting one, and say which rule it broke. - The module now states its own limit at the point of use: the control is an instruction rather than an enforced boundary, a skipped check leaves no trace, and an adopter who needs a guarantee must enforce confinement outside the agent. A write is not to be described as confined unless the resolution was actually run.
[core][2.26.10] — 2026-09-17
Section titled “[core][2.26.10] — 2026-09-17”Highlights
Section titled “Highlights”- Your loop no longer halts when the same findings come back. It tells you and keeps going, bounded by the iteration cap. The stop it replaced never fired: the signal it read is equality over a fingerprint that carries a finding’s position, so any repair that moved a finding made the round look new.
Changed
Section titled “Changed”- Full mode no longer instructs a halt when review findings repeat. The control was evaluated 302 times across two months of recorded runs and never fired, because its key embeds a line number and an ordinal that every repair moves — so it read as protection while providing none. The signal is still computed, emitted, and surfaced to the human; only the halt is retired, and the iteration cap remains full mode’s mechanical bound. Recorded in ADR-0104.
- Published guidance and the public pack page match that behaviour. The two tool-comparison tables now claim a mechanical iteration cap rather than stasis detection: the cap is real and still absent from both compared tools, while the detection half had become a false capability claim.
[core][2.26.9] — 2026-09-17
Section titled “[core][2.26.9] — 2026-09-17”Highlights
Section titled “Highlights”- Your implementer looks for what you already have before it writes something new. Hand it a task whose best answer is a helper sitting elsewhere in your repository and it now finds that helper and uses it, instead of writing a second copy of the same logic a module away. When it finds something that only partly fits, its report names that helper too, so a near-miss is visible to you rather than silently passed over.
- A plan that asks for more structure than the job needs no longer gets built as written. Where a lighter route satisfies the task’s own “done” check, the implementer takes it and records the swap for you to see, rather than faithfully building a configuration class and a new module to do the work of one function. Structure you genuinely need survives: when several callers really do need different settings, it still builds the shared piece.
- The loop is now asked to weigh each addition it declines against a stated rule. Its “tempted to add, chose against” note asks for the “Cut before adding” step behind each line, so the reasoning sits against a written rule rather than a one-off justification, and where no step covers the call — an accepted requirement or a safety control forbids it — it is asked to say that instead of fitting a rule to it after the fact. This one is guidance the note requests rather than a check that enforces it, so read the notes rather than relying on them.
Changed
Section titled “Changed”- An implementer now looks for an existing solution before it writes a new one. The “Cut before adding” ladder already told it to search once and reuse what it finds, but nothing at the point of writing code asked it to, and it showed: given a task whose best answer was a helper sitting one module away, it produced byte-identical code whether that helper existed or not. It now takes the search once across the root it was given, reuses a hit that satisfies the outcome, and says what the search turned up every single time — the hit it reused, each candidate it found and why that one did not fit, or that it found nothing. A search nobody hears about cannot be told apart from a search that never happened, which is exactly how this went unnoticed.
- A heavier plan than the job needs no longer gets built anyway. Where the
ladder’s first sufficient rung is lighter than the route the task body names,
the implementer builds the lighter one and records the swap under its
deviations. Asked for a configuration class in a new module to satisfy
something one function covers, it now writes the function. The task body’s
Approach:is working material an implementer corrects as the work teaches, not a contract — and thefailedstatus says so too: it now means no route you can see satisfiesDone when:, rather than that the named approach did not work. Genuinely necessary structure is untouched: where several callers really do need different settings, the class still gets built. - A declined addition is now weighed against the ladder instead of a one-off reason. When the loop records what it was tempted to add and chose against, each line names the “Cut before adding” rung that killed it. Where no rung covers the decline — an accepted requirement or a trust-boundary control forbids it — that reason goes in the rung’s place rather than a rung being fitted to it after the fact.
- Frozen cases for all three rules are recorded in
work-loop’s eval set. They are a behaviour register rather than detection:work-loopsits outside the pack’s eval coverage list on purpose, so nothing executes them and a regression would not redden them. Their identifiers carry aregister-prefix to say so.
[core][2.26.8] — 2026-09-16
Section titled “[core][2.26.8] — 2026-09-16”Highlights
Section titled “Highlights”- A plan that names a task you never wrote no longer runs in the wrong order.
loop-cohort scheduleused to drop aDepends on:entry pointing at a task the plan did not contain — no warning, no error. The dependency edge vanished, the tasks collapsed into one wave, and because gates run per wave, the gate run collapsed with them.schedulenow stops, names every offendingtask->dependencypair, and writes no state, so you fix the plan instead of discovering the wrong order later.
work-loop: aDepends on:entry that names no task in the plan is refused. Only the declarations of tasks still to be scheduled are examined, and every task in the plan counts as a valid target, so a dependency on completed work still resolves and an amended plan is not refused for a line it can no longer edit. A range that spans an absent ID is refused too, naming the absent member.work-loop: cross-spec dependencies are unaffected, a dependency cycle still stops the run, and a forward reference still warns, reorders so the dependency runs first, and continues.new-spec: the plan template’sDepends on:placeholder no longer namesT0, a task ID that can never exist.
[core][2.26.7] — 2026-09-16
Section titled “[core][2.26.7] — 2026-09-16”work-loop’s mutation-proof reference names the four shapes that make a test unable to fail: a fixture that puts the asserted path out of reach, an absence the test harness itself guarantees, two independently sufficient mechanisms where no single removal changes an outcome, and an assertion naming a message the code under test never emits. It already said a test that passes under its mutation is not proof; it now says how to recognise one before mutating.
[core][2.26.6] — 2026-09-15
Section titled “[core][2.26.6] — 2026-09-15”loop-cohort schedulenow reminds full-mode controllers to delegate scheduled tasks one at a time when an implementer is installed, or run them directly and note the single-agent degradation.work-loop:loop-cohort schedulestops on cycles, reports and reorders forward references so dependencies run first, and drops missing task IDs without a diagnostic. Its supervisor reference does not promise thatschedulevalidates declared dependency existence.
[core][2.26.5] — 2026-09-15
Section titled “[core][2.26.5] — 2026-09-15”Highlights
Section titled “Highlights”- Your work-loop runs can now be watched in an observability backend. Install
jsonl-otlp-exporter, point it at your own OpenTelemetry Collector, and each phase change arrives as a log record — how long the phase took, which gate decided what, and how close the run is to its retry budgets. It is off until you configure an endpoint, and the thing that sends is a separate distribution you install on purpose, so a catalogue install alone can never transmit. - What would be sent is written down before you turn it on. The how-to guide names the file that is read, the records that leave, the fields that may go, and the things a pack cannot see at all — your prompts, the model’s replies, and token counts.
work-loop: a mapping profile at.apm/skills/work-loop/profiles/work-loop.tomlthat turns an event line into OTLP. Its allowlist is exactly the emitted keys less the four that are routed, so a field added to the envelope stops the build rather than flowing silently.work-loop: every freshly built event line carriesschemawith integer value- A record replayed from a crash is appended unchanged and is never retro-stamped.
guides/core/how-to/export-loop-telemetry.md: how to resolve the invocation for a repository, and aWhat leaves your machinedisclosure section.contracts/jsonschema/loop-run-event.schema.json: the event line’s shape, pinned against a corpus recorded from real transitions rather than authored.coredeclaresjsonl-otlp-exporteras an optional runtime dependency;agentbundle catalogue lintreports it as unsatisfied and exits 0 without invoking any package manager.
Changed
Section titled “Changed”docs/architecture/telemetry.mddescribes the sender that now exists. Its § 5.1 field count is pinned to a line the engine emits.
[agentbundle][0.47.0] — 2026-09-16
Section titled “[agentbundle][0.47.0] — 2026-09-16”Highlights
Section titled “Highlights”- Sending your work-loop telemetry no longer needs
agentbundleinstalled to build the command.jsonl-otlp-exportreads[telemetry]from your repository and your useragentbundle-layout.tomlitself, through its own--configand--user-config, so anything that can run a command can start an export — a hook included. Where you put your settings, and the rule that a repository value wins setting by setting, have not changed.
Removed
Section titled “Removed”agentbundle.telemetry_layout. Its job moved into the sender, which now resolves both layout scopes. The resolver existed only to read the two files and re-render their values as flags, and that reading is what made every caller of the sender import this package.
[agentbundle][0.46.1] — 2026-09-15
Section titled “[agentbundle][0.46.1] — 2026-09-15”- A symlink in your target directory can no longer redirect what
catalogue initwrites. The staging file now carries a random name, is created exclusively, and keeps the permissions your umask would give it. This closes a way another local user could have had a file of their choosing overwritten, at your privilege, when you initialise a catalogue in a directory you do not exclusively control.
[agentbundle][0.46.0] — 2026-09-15
Section titled “[agentbundle][0.46.0] — 2026-09-15”Highlights
Section titled “Highlights”- A self-hosted catalogue can now be recreated from its recorded recipe. A
repeat
catalogue init --preset self-hostedkeeps the recorded catalogue identity and pack and profile selections unless you explicitly replace them.
Changed
Section titled “Changed”catalogue init --preset self-hostedwrites schema-3 state with a recipe and source pin. The generatedcatalogue.tomlescapes every interpolated value. Local-path sources have no source revision or archive digest to record.
[agentbundle][0.45.0] — 2026-09-14
Section titled “[agentbundle][0.45.0] — 2026-09-14”Highlights
Section titled “Highlights”agentbundlecan now work out where to send your loop telemetry. A new resolver reads your repository and personal layout files and returns the exact arguments for the separately installed sender. Repository settings win per setting, because sending data off the machine is a team decision rather than a personal one — the opposite of how personal research settings resolve.catalogue lintnow tells you when an optional tool a pack wants is not installed. It names the package and exits 0. It never installs anything.
agentbundle.telemetry_layout.resolve()— per-setting, repository-first resolution over bothagentbundle-layout.tomlfiles, returning the merged[telemetry]settings and the sender’s arguments. Both files are read through the catalogue’s confinement helper, bounded at 64 KiB, with malformed, oversized, wrongly typed and symlinked inputs refused.CAT-L032— an informational diagnostic naming an optional runtime dependency that is declared by a pack and not installed. Detection is in-process; no package manager is invoked and the exit code stays 0.
[core][2.26.4] — 2026-09-15
Section titled “[core][2.26.4] — 2026-09-15”workspace-status: an initiative whoseworkspace.tomlsection omitsnameormilestoneno longer renders a blank segment at orientation. Neither key is required by the schema and no finding fires for a missing one, so both project as empty strings; the rendering template now omits the segment rather than showing—followed by nothing. The state was unreachable while those fields were redacted and became reachable when they began projecting as authored in 2.26.2.
[agentbundle][0.44.3] — 2026-09-15
Section titled “[agentbundle][0.44.3] — 2026-09-15”make build-checkfails when a declared packaged runtime is missing, not only when it has drifted.agentbundle/_data/carries a copy of each core pack script the packaged CLI runs where no installed skill tree is present, and the gate compared bytes only when both halves of a pair existed, so an absent copy was silently skipped. That is the worse failure of the two: the packaged engine loads its siblings from its own directory, so an unsynced copy breaks it at import while the gate reports clean. The skip now mirrors the write condition of the sync path itself — whereverbuild-selfwould have written a copy, the gate requires it present and byte-identical. A tree with no_data/directory is a partial checkout and is still tolerated.- The same gate derives the declared set’s sibling closure rather than trusting
it. Pairs are hand-declared, so a runtime could be bundled while the helper it
loads was not — the state reached during the workspace-status prune split,
where
build-selfsynced the engine and not its new sibling and nothing complained._data/is flat, so every helper is reached as a sibling of the loading module’s own file. The gate reads those reaches and requires each to be a declared pair or an exemption carrying its reason. An ancestor hop is not a sibling, so a reach into another skill tree is excluded by construction rather than by allow-list; a sibling whose name is computed rather than literal fails closed rather than passing unread.
[core][2.26.3] — 2026-09-14
Section titled “[core][2.26.3] — 2026-09-14”Highlights
Section titled “Highlights”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 pruneremoves a selected artifact together with every workspace entry resolving to it, including duplicate, legacy-alias and non-spec-kind forms. It requires an explicit confirmation bound to the selection and to the artifacts’ recorded state;prune --previewemits the unsigned challenge a caller needs to build one. A repository-level protected list refuses targets that must never be removed, comments and formatting inworkspace.tomlare preserved, and nothing outside the selection changes.
[core][2.26.2] — 2026-09-14
Section titled “[core][2.26.2] — 2026-09-14”Highlights
Section titled “Highlights”workspace-statusshows 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 fromworkspace.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)).
Changed
Section titled “Changed”workspace-status:initiatives[].nameandinitiatives[].milestonecarry the valuesworkspace.tomlassigns, as authored. Non-string values are coerced to their text form, so the fields are always JSON strings.SKILL.mddescribes and renders both fields and no longer instructs the consumer to render the slug alone.
[core][2.26.1] — 2026-09-14
Section titled “[core][2.26.1] — 2026-09-14”Highlights
Section titled “Highlights”workspace-statusno longer tells you an initiative is called “workspace.toml”. An initiative’s name and milestone are free text you type intoworkspace.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: the key list and the “Active initiatives” rendering template describedinitiatives[].nameandinitiatives[].milestoneas values to display. Both are documented as the redaction sentinel, the rendering template shows the slug alone, and the skill is told not to readworkspace.tomlto recover either value — doing so would put back the untrusted prose the sentinel keeps out of agent context.
[agentbundle][0.44.2] — 2026-09-14
Section titled “[agentbundle][0.44.2] — 2026-09-14”Highlights
Section titled “Highlights”- A catalogue you derive now keeps a working check on its vendored
credbrokercode.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-labelno 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.
catalogue init --preset self-hostedcopiespackages/credbroker/into the target whenever thecredential-brokerspack is selected, independent of--tooling.agentbundle/build/user_libs.pyresolves the package by relative path at<catalogue root>/packages/credbroker/credbroker/; absent it,compute_projectionsreturns an empty list and both of its consumers become silent no-ops —apply_projectionwrites no.agentbundle/lib/credbroker/floor andcheck_driftreports clean over nothing. The copy carries no test content, matching the boundary the vendored-pack copy already draws.--attribution white-labelrecords the derived catalogue’s name assource_pack_identityin.agentbundle/self-host-state.json. The leak check runs over the planned file map at step 9 and that file is written at step 13, so it was never scanned. Its scope is deliberately unchanged: bringing the state file inside the check would make a usable upstream pin impossible in the mode that most needs control over what ships, so the recorded value changed instead.
[frontend-engineering][0.2.5] — 2026-09-14
Section titled “[frontend-engineering][0.2.5] — 2026-09-14”Highlights
Section titled “Highlights”- 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.
Changed
Section titled “Changed”- The channel axis takes an optional declared minimum width. Bands lying wholly below it stop being required and the lowest surviving band starts at it.
- The evidence manifest’s
viewportsfield records the minimum in force, ornone-declared, and any discarded breakpoints. - The journey’s
youProvidenames the supported minimum width among the inputs an adopter brings.
[core][2.26.0] — 2026-09-13
Section titled “[core][2.26.0] — 2026-09-13”Changed
Section titled “Changed”- The cognitive-load rules are inline in
AGENTS.mdinstead of routed. RootAGENTS.mdused to tell an agent to readAGENT_RULES.mdand then everyalwaysrule there; those are model-directed reads with no error, no log and no failed gate when they do not happen, and they were skipped for a whole session while the rule they route to was breached throughout. The clauses now sit in the file every host already loads, beside the cut-before-adding ladder that was already there. AGENT_RULES.mdships with an empty routing table and is read every time, with one bounded operation; you then follow only the rows whosewhenmatches the work. The condition is inside the file, not in the instruction to open it, because a rule that activates only when you already know it applies never activates — which is the failure this whole release is about. It survives as the extension point for conditional rules, and the catalogue lint now accepts a pack-shipped.agents/rules/*.mdseed so a pack can supply one.
Removed
Section titled “Removed”.agents/rules/cognitive-load.mdis retired. Its chat clauses moved inline; its instruction-authority clauses moved with them, because that posture reached a session only through the routing chain this change removes.
Upgrading
Section titled “Upgrading”Four things an update does not do for you, because seed delivery adds and updates but never removes:
- Delete
.agents/rules/cognitive-load.mdfrom your tree by hand. A retired seed is never removed, so yours stays on disk, orphaned, with its routing row gone. - Merge
AGENT_RULES.upstream.md. YourAGENT_RULES.mddiffers from the new seed, so the empty table arrives as a companion rather than replacing the live file — and until you merge it, your oldalwaysrow stays live. - Merge
AGENTS.upstream.md. RootAGENTS.mdis a delivered seed too, so a customised one takes the same companion treatment. The inlined clauses are in that companion, not in the file your host loads. - Add a routing row if you want one. The shipped table is empty, so there
is no example to copy. A row reads
| <when> |.agents/rules/.md | <purpose> |, and the file it names must exist and carry no routing table of its own. Rows you already have keep working: the newAGENTS.mdreads the router unconditionally, so your rows are still reached.
[core][2.25.27] — 2026-09-13
Section titled “[core][2.25.27] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
work-loop:references/mutation-proof.mdstates what a mutation proof records, why reverting to a do-nothing stub proves nothing about a sub-property, and that restoration is by editing. One conditional-routing row loads it when a repair or claimed fix needs proof.
Changed
Section titled “Changed”work-loop:narrow-the-claimcarries both directions of a claim/check mismatch; the Fix axis requires a repair’s check to assert the repaired property rather than a consequence of it; a review round names a literal sweep and a semantic walk as separate instruments and obliges both after a repair; anddemote-the-claimdistinguishes an upstream revision-bound lifecycle pin from a downstream content test.intake-intent: editingOpportunityis a material change to an accepted intent.author-delivery-brief: editingRabbit holesorDesign artifactsis a material change to a ready brief.
[core][2.25.26] — 2026-09-13
Section titled “[core][2.25.26] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
Changed
Section titled “Changed”work-loop: thefrontend-reviewerdispatch line passes the rendered-page capture set, its recorded observations, and the adopter-named routes, and names the reviewer’s reader-visible-layout lens.
[frontend-engineering][0.2.4] — 2026-09-13
Section titled “[frontend-engineering][0.2.4] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
[core][2.25.25] — 2026-09-13
Section titled “[core][2.25.25] — 2026-09-13”workspace-statuscan now check an explicit list of spec directories and report each one’s workspace membership as present or absent, including canonical, duplicate, and supported legacy entries. The check is read-only and does not require the selected spec artifact to exist.
Highlights
Section titled “Highlights”- 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.
[core][2.25.24] — 2026-09-13
Section titled “[core][2.25.24] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
Changed
Section titled “Changed”intake-intent,author-delivery-brief, andnew-specnow point to the work-loop DECIDE step as the single home of finding-response vocabulary. Their local guidance states only howdemote-the-claimanddrop-the-claimapply to each artifact’s deciding and recording sections.- The shaping reviewer no longer reopens a decision that the supplied brief or spec records as settled with its ground and owner. Consequences, conflicts, and pre-existing defects remain reviewable.
[core][2.25.23] — 2026-09-13
Section titled “[core][2.25.23] — 2026-09-13”- The spec README seed names the
new-specskill instead of a Claude Code path.contracts/adapter.tomlprojects that skill into seven different roots, so the hardcoded.claude/skills/...copy command was wrong for every adopter on another adapter. It now points at aSKILLvariable, matching the ADR and RFC seeds, and the seed comes off the portable-citation cleanup list.
[core][2.25.22] — 2026-09-13
Section titled “[core][2.25.22] — 2026-09-13”Changed
Section titled “Changed”docs/specs/README.mddescribes the spec directory convention and carries no index table. Specs are discovered by listing the directory.new-specno longer maintains a list.- The CONVENTIONS seed’s ADR and RFC sections point at their index and say it is generated from the records, so a reader knows to regenerate rather than edit.
[agentbundle][0.44.1] — 2026-09-13
Section titled “[agentbundle][0.44.1] — 2026-09-13”Changed
Section titled “Changed”- Seed lint no longer requires a placeholder table in the spec README seed, which now carries the directory convention and no index.
[governance-extras][0.10.7] — 2026-09-13
Section titled “[governance-extras][0.10.7] — 2026-09-13”new-adrandnew-rfccarryindex-records.py, which derives a decision-record index from the records in a directory you name. The index cannot drift from the records, because it is read from them. Run it with--checkto find out whether it would change without writing.
Changed
Section titled “Changed”- Creating an ADR or RFC regenerates the index instead of hand-editing a row.
- The bundled ADR and RFC index seeds are what the generator writes, so your first generation changes nothing. Each seed’s “Adding a new …” section moved into the skill and its how-to, where the instruction is reachable without opening an index.
- The ADR index carries a
Datecolumn. A record that omits its date falls back to the file’s first-commit date.
[core][2.25.21] — 2026-09-13
Section titled “[core][2.25.21] — 2026-09-13”- A
review-verdict.v1finding can recordresponseandreason: which answer a sustained finding was given, and the ground for choosing it. Both are optional and recorded as a pair. An unrecognised value, aresponsewithout a non-emptyreason, and areasonwithout aresponseare each ignored with a note, leaving the entry and the record valid. Neither field appears in the finding-disposition table, state precedence, or residual eligibility, so nothing that decides a verdict can read them.
Changed
Section titled “Changed”- The work-loop’s DECIDE step states the answers to a sustained finding as an ordered ladder in four axes — cut, route, fix, hold — walked until one applies, then stopped. Cut leads because a review that can only add or hold cannot let a contract shrink, which is how rounds run long without converging.
- Two answers are new.
drop-the-claimremoves an assertion nothing is obliged by, operating on an assertion rather than a sentence or item.demote-the-claimmoves an obligation out of the contract into working material with a content pin, which needs owner authority and is never free. - Every answer walks its surfaces before it is taken, and the direction differs: cut walks backwards to what referenced the removed thing, route outwards then back to leave one home, fix sideways across other instances and their pins, and hold forwards so the next round can see the decision. It is a walk rather than a text search, because a companion usually paraphrases and shares no string, and it continues until the frontier is empty.
[core][2.25.20] — 2026-09-13
Section titled “[core][2.25.20] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
project-knowledge --migrate-legacyraised an unhandledFileNotFoundErrorinstead of staging a result whenever a migration yielded zero importable topics. The stage directory was created only as a side effect of writing the first topic, so an empty import set never created it and the map write failed. It surfaced as a raw traceback rather than a typedknowledge-diagnostic.v1refusal, so callers handling every documented refusal still broke. Two inputs reach it: an empty legacy corpus, and a corpus whose rows are all refused.
- The migration lifecycle is documented on the skill body and the
docs/knowledge/README.mdseed. Promoting the staged map intodocs/knowledge/and committing it is a required step between--migrate-legacyand--activate-staged, and it was previously discoverable only by reading the source.
[frontend-engineering][0.2.3] — 2026-09-13
Section titled “[frontend-engineering][0.2.3] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
references/rendered-page-inspection.md: the rule layer as tables — the finding-class to severity mapping, the required captures, the capture record and judgement-request shapes, the capture/judgement step split, and the result states.references/rendered-page-measurement.mdandreferences/inspection-fixtures/: the measurement kit, its fixture sets, its denominator, and the rate vocabulary.SKILL.mdsection 5 and journey step 4: the capture and judgement steps and the named skip.- Inspect the rendered page: the how-to that walks the step against a local file.
Changed
Section titled “Changed”- The evidence manifest’s required-field count moved 11 to 12, and its production-surface total 13 to 14.
- A finding’s severity is derived from its class. A severity a judge supplies is discarded, including when it disagrees.
- The query string and fragment are cut from a route before it is recorded and before it is stated to the judge.
- The request sent to a judge declares the capture untrusted evidence carrying no instruction authority. The skill already said so, but a judge you route captures to may never read the skill.
- A failure fitting more than one finding class takes the most severe, so which class a judge happens to name cannot lower the result.
- A viewport height captured beyond the two required bands carries the same at-rest and scrolled requirement. This was enforced before it was written down; it is now stated in the reference the checks read.
frontend-reviewergains a sixth lens for reader-visible layout failure, taking severity from the pack’s finding-class table, and states that it does not write to the repository under review.
- A page shorter than its viewport has no scrolled view, and is recorded as
page-scrollable: norather than reported as permanently incomplete. Found by running the procedure for real: 17 of 32 captures could not reach a non-zero scroll position, which would have made every sign-in form, 404 and settings panel impossible to inspect completely.
[core][2.25.19] — 2026-09-13
Section titled “[core][2.25.19] — 2026-09-13”Highlights
Section titled “Highlights”- 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.
CONVENTIONS.md§ Pack source-of-truth split: corrected the gate coverage claimed fortools/hooks/<name>.<ext>, and the set of seed-projected paths described as reclassified Manual.
[core][2.25.18] — 2026-09-12
Section titled “[core][2.25.18] — 2026-09-12”Changed
Section titled “Changed”- The shaping reviewer’s
intentmode now checks whether an intent is well-formed instead of reviewing its craft. It asks six questions — is the statement an outcome rather than a solution, are non-goals present, is the riskiest assumption named, is the altitude consistent with the parent it names, does the decomposition partition the artifact’s own outcome, is the owner the artifact’s own — and answers with oneMALFORMED(<field>)token per failed question, or nothing at all. The failure-mode table stays withdelivery-briefandspecmode, which review contracts. MALFORMED(owner)is emitted alone and suppresses the other five tokens: a wrong owner outranks everything else, and the rest of the artifact is not the reviewer’s to assess until it is settled.- A condition the supplied packet cannot settle emits its token rather than passing quietly, so an intent that names a parent the packet never supplied cannot pass the altitude question by default.
- Two of the six questions are asked only when the artifact can answer them, so
a thing that cannot have a relation is not malformed for lacking it. The
altitude question is asked only of an intent that names a parent — naming none
is not a fault at any level. Where an intent lists no decomposition, the
children question is asked only above the leaf of the recognized ladder
(
product-vision › product-strategy › capability › feature) once the intent isAccepted: you frame an intent before you decompose it, and this review runs at framing, so an empty decomposition at that point is a stage and not a defect. A level the reviewer cannot place on that ladder skips only that absence check rather than guessing; a decomposition you have listed is still measured for overlap and gaps. - The adversarial reviewer gains an optional
intentmode that attacks a bet instead of auditing an artifact. It returns an open question with a named decider, or a validation hook — a kill condition plus the real-world activity that would trigger it — and nothing else. Having nothing to say returns empty, which is a complete answer here. intake-intentnow reads “noMALFORMEDtoken” plus your explicit confirmation as the gate forAccepted, and records the revision it dispatched itself. A dispatch that starts and dies gets its own receipt instead of borrowing the one that means no independent reviewer was available.
Highlights
Section titled “Highlights”- 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.
[product-engineering][0.13.12] — 2026-09-12
Section titled “[product-engineering][0.13.12] — 2026-09-12”Changed
Section titled “Changed”frame-intentreads the intent review’sMALFORMEDtokens, owns the revision binding an empty pass cannot carry, and may dispatch the adversarial reviewer’sintentmode as a second, advisory read that settles no status.de-risk-intentstates that it never dispatches the adversarial reviewer. Naming the riskiest assumption and predeclaring its kill condition is the work this skill is accountable for; a reviewer handing it a hook would leave it marking that reviewer’s homework rather than taking a verdict.
Highlights
Section titled “Highlights”- 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.
[core][2.25.17] — 2026-09-12
Section titled “[core][2.25.17] — 2026-09-12”loop-cohort schedule --plannow states that it accepts only the canonical<spec-dir>/plan.mdpath, matching the command’s existing refusal behavior.loop-cohort identity --helpstates the schema version the command actually verifies, instead of a hard-coded number that a later schema bump would have left stale.
[core][2.25.16] — 2026-09-11
Section titled “[core][2.25.16] — 2026-09-11”Highlights
Section titled “Highlights”new-specnow 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.
new-spec: step 9 names every check the skill ships and the step that runs it, with the runnable<skill-dir>form. A control nobody calls reports nothing and is indistinguishable from one that found nothing, and the three checkers shipped before any step referenced them. The pack suite reads thescripts/directory rather than a restated list, so a check added later with no caller fails instead of shipping unreferenced.new-spec: three checkers in the skill’s ownscripts/. An item-alignment check over a spec directory’s identifiers, references and coverage; a grounding explorer that answers what already governs a set of paths, selected by stage and calibrated from the adopter repository’s own distribution; and a finding-coverage check that reports a rule whose message no test observes. Each states its flags and its exit codes in its own--help. The explorer never fails — it reports and exits zero whatever it finds. The two linters exit non-zero on a finding, so they can stand in a gate, except for the reworded-criterion rule, which prints as “reported, not failing” and leaves the status alone because it over-reports on a prose edit.new-spec: plan-authoring rules in the plan step. A fact belongs in## Design (LLD)unless a task must implement or verify it;Done whenpoints at the task’s ownTestsand never restates them; an obligation a completion gate must read belongs inTestsrather thanApproach, which no gate observes; a claim about what a check proves names the comparison its oracle performs, or names the proxy where it cannot; aTests-outruns-Approachratio is read before it is cut, because the same ratio means either misplaced design (relocate) or surplus detail (reduce); and a whole-plan walk before review checks construction evidence both ways, eachDone whenagainst its ownTests, one home per condition, and one definition per shared bound.new-spec: a step before human approval that reports the finding trend by round, every residual concern with its consequence, and what the residue implies — and refuses to seek acceptance for a residue in a protected risk class. A round count is not a fact an owner can act on.
Changed
Section titled “Changed”- A review finding whose fix is not determined can no longer block. Both
code-facing reviewing surfaces now grade on one decidable test — is the fix
fully determined? A mechanical finding, fixed by the code, a test, a lint, a
schema, a resolvable reference or a stated constraint, takes whatever severity
its consequence earns. A judgement finding — a tradeoff, a risk acceptance, or
a wording, framing or emphasis preference — is a Concern at most in
adversarial-reviewerand sustains at advisory severity at most infinding-adjudicator, which applies the test as the first half of its consequence predicate. Both still flag it; neither may block on it, because nothing external decides it and repairing one produces the next. Where the target marks a section or field as working material rather than contract, such a finding drops again to a Nit; where a target marks no tiers, every surface is reviewed as contract and the determinacy test still applies. Measured cause: in one round on a spec pair, eight of thirteen findings were judgement calls against prose no completion gate reads, six sustained as blockers, and the round was spent reconciling text nothing reads. new-spec: the spec template marks its own tiers, the way the plan template already does.Boundaries,Testing StrategyandAcceptance Criteriaare what a completion gate reads;Objective,Durable Outputs,Follow-onsandAssumptionsare working material an author corrects in place. Marking the tiers is the template’s job; honouring them is the reviewing surface’s.new-spec: a later review round reviews what changed, not the whole diff. The first round is dispatched over the artifacts entire; each round after it is bounded to the delta since the previous persisted report, whose revision that report records, and the delta includes the repair commits. A prior round’s result stays valid for text that has not changed, so re-presenting that text only re-finds a different slice of it — which is how a review loop runs at a flat finding rate instead of converging. Where no delta can be computed, the surface is reduced by naming the artifacts under review instead.new-spec: the plan template states which of its fields are contract.Touches,TestsandDone whenare what a completion gate reads and are pinned;Design,Approach,GroundingandRisksare working material an implementer corrects in place.Groundingstays recorded — a per-task resolution nobody wrote is not grounding — but stops being a claim a reviewer holds the plan to.new-spec: an obligation whose only check is that a sentence exists is not a criterion. The test is what would red if the obligation were violated: a machine makes it a criterion, “a reader would object” makes it design material protected by a content pin. A contract made mostly of the second kind does not converge, because each review round produces fresh plausible objections at about the rate the last round’s are resolved.new-spec: whateverBrief:orDiscovery:points at is frozen once shaping closes, and the spec cites it rather than restating it. An intent still moving is the one input no amount of criterion work compensates for.
new-spec:lint-contract-item-alignment.pyno longer drops a whole spec directory whenplan.mdis refused. The refusal is its own finding, the plan-reading rules are named as having no input, and the rules that decide their subject fromspec.mdalone are applied and reported — the same route an absentplan.mdalready took. Previously a refused plan reported four rules as neither run nor input-less, which is the partial-read-as-clean failure the checker exists to detect elsewhere.new-spec:lint-finding-coverage.pynames a discovery candidate it refuses. A link, an unresolvable path or a containment failure all left the candidate in no list at all — neither checked, skipped nor unreadable — so a subject the walk could not read was indistinguishable from one that opted out.
[governance-extras][0.10.6] — 2026-09-12
Section titled “[governance-extras][0.10.6] — 2026-09-12”new-adrandnew-rfcgainnext-ordinal.py --check <dir>, which reports every ordinal already held by more than one record and exits non-zero. It also exits non-zero when it cannot inspect the directory at all — a missing path, an unreadable directory, an entry it cannot classify, or a record-shaped symlink — so a mistyped path never reports clean. ANNNN-notes/folder or aNNNN-<slug>-research.mdsibling shares its record’s ordinal by design and is not reported. Wire it into whatever check your project runs before a change merges: that, rather than the allocator, is what keeps ordinals unique.
Changed
Section titled “Changed”next-ordinal.py <dir>now counts ordinals already on the remote default branch as well as those in your working tree, so a long-lived branch stops proposing a number that merged upstream while it waited. Where Git is unavailable, the directory is outside a repository, the remote has not been fetched, or Git does not answer within five seconds, it falls back to the working tree and says so rather than failing.- Both procedures now tell you to re-derive the ordinal immediately before opening your pull request rather than when the branch starts. The number is a snapshot, not a reservation, and a collision with a record someone else merged exists only against the default branch — nothing inside your branch, review included, can see it.
[core][2.25.15] — 2026-09-11
Section titled “[core][2.25.15] — 2026-09-11”workspace-status’s reference page no longer says an install discards your comments and unknown keys. It does not.
[agentbundle][0.44.0] — 2026-09-11
Section titled “[agentbundle][0.44.0] — 2026-09-11”- Installing a pack now adds its default output location to an
agentbundle-layout.tomlyou already keep. The step has existed sinceagentbundle 0.7.0and has never written anything: it looked for a manifest key no pack declares, and named the table after the pack while every skill reads a differently-named section. - The append no longer rebuilds your file. It adds one table and leaves every other byte alone — comments, key order, quoting style, line endings, and any key or section it has no model for. Previously it re-emitted the file from a single key and discarded the rest, which would have deleted adopter content the first time the step became reachable. A pack from an external catalogue could already trigger that, so this is a live fix rather than a latent one.
- Your file’s permissions survive the write. The atomic replace handed the target the temporary file’s owner-only mode, so a group-readable layout file became private on first append.
- A layout file that is a symbolic link is left alone and reported, instead of being replaced by a regular file and stranding what it pointed at.
- A layout problem no longer fails the install. A read-only file, an unwritable directory or a refused path is reported, and the install finishes with its files in place. Marker failures stay fatal.
Changed
Section titled “Changed”- A pack declares the layout section it writes, as
[pack.layout.<scope>].section. The value carries the same character class as a pack name, because it becomes a TOML table header. - A declared
output_diris confined to the directory the installer already writes under, and a relative value is anchored there rather than to your shell’s working directory. - A configured
output_dirin a repo-scopeagentbundle-layout.tomlresolves against the repository root. It resolved against the process working directory, so the same configuration meant different things depending on where a tool was launched. A relative value in the user-scope file is reported and ignored, as the reference docs already said it would be. - A layout file using lone-CR line endings is now reported as unparseable. It previously parsed only because the file was read in text mode, which is the same behaviour that silently rewrote CRLF files.
Highlights
Section titled “Highlights”- 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.
[architect][0.15.8] — 2026-09-11
Section titled “[architect][0.15.8] — 2026-09-11”Changed
Section titled “Changed”- Architecture output defaults to
docs/architecturerather thandocs/design, matching where this repository documents architecture. The two reference pages say so. - Declares
architectureas its layout section, so installing the pack sets that default up for you.
[desk-research][1.1.8] — 2026-09-11
Section titled “[desk-research][1.1.8] — 2026-09-11”Changed
Section titled “Changed”- Declares
researchas its layout section, so installing the pack sets that default up for you. - The reference page shows the shipped repo-scope default,
docs/product/research. It previously documented only a personal-vault path, so the value the installer writes appeared nowhere.
[experience-design][2.0.4] — 2026-09-11
Section titled “[experience-design][2.0.4] — 2026-09-11”Changed
Section titled “Changed”- Declares
designas its layout section, so installing the pack sets that default up for you.
[product-engineering][0.13.10] — 2026-09-11
Section titled “[product-engineering][0.13.10] — 2026-09-11”Changed
Section titled “Changed”- Declares
productas its layout section, so installing the pack sets that default up for you.
[product-strategy][0.2.6] — 2026-09-11
Section titled “[product-strategy][0.2.6] — 2026-09-11”Changed
Section titled “Changed”- Declares
strategyas its layout section, so installing the pack sets that default up for you.
[core][2.25.14] — 2026-09-10
Section titled “[core][2.25.14] — 2026-09-10”Highlights
Section titled “Highlights”- 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.
-
loop-engine transitionwrites six additive fields on each.loop-run/events.jsonlline:phase_started_at,phase_s,result,awaiting_input,waived, andbudgets. The first seven fields are unchanged in name, order, and value, so an existing reader is unaffected. -
phase_sis whole seconds and never negative, which keeps a backwards clock step from presenting as a measurement. A field that cannot be determined is written asnullrather than omitted, because a key that disappears reads as zero to anything summing durations or comparing a counter with its cap. -
budgetscopies the cohort retry counters and caps as they stood when the line was written. It does not move them: counter authority stays withloop-cohort, which remains their only writer. -
resultreports the gate decision assuccessorfailure, using the OpenTelemetry CI/CD convention’s result vocabulary rather than an invented one, and isnullfor a handoff or wave boundary that decides nothing.awaiting_inputmarks arrival at a state waiting on a human. -
No attempt count sits on the line. Counting the events answers how many rounds a run has taken, and a per-line count would be a second home for a fact the log already carries.
-
The work-loop
state-schema.mdreference gains the full field table for the event line, the whole-second resolution limit, the reachability note above, and a documented blind spot: a retry cap reached without an override is refused by a guard, and a refused transition writes no line — so that case is indistinguishable from a stall in this log alone.
[core][2.25.13] — 2026-09-10
Section titled “[core][2.25.13] — 2026-09-10”Highlights
Section titled “Highlights”- A machine that cannot run
gitnow gets one line of explanation instead of a stack trace. Everyloop-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.
work-loop:loop-engine.pyandloop-cohort.pyrefuse withcould not determine repo root: …whenever thegitlookup fails, instead of raising an unhandledOSError. Every verb reaches the repository-root lookup through the spec-directory confinement check, whose caller only ever handledValueError, so a missinggitbinary (FileNotFoundError) or one that resolves but cannot execute (PermissionError) escaped as a traceback from both tools. Both now bound the wholeOSErrorclass, matching howlint-knowledge.pyandlint-traceability.pyalready bound the same call. The refusal is unchanged in every other respect — same exit code, no write performed, and the confinement decision itself is untouched.
[core][2.25.12] — 2026-09-10
Section titled “[core][2.25.12] — 2026-09-10”Highlights
Section titled “Highlights”- 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.
Changed
Section titled “Changed”new-spec: the authoring rubric adds a repair method. A finding names a symptom at a location; repairing that location without re-deciding the property behind it is why a repair so often introduces the next defect. Three steps precede any rewrite: name the property the clause establishes, ask whether that property is right, and look for its siblings. The finding-origin marks then give you a symptom to watch — once a round’s sustained findings are mostly repair-origin, the round is reviewing the repairs rather than the draft, which is the cue to run those three steps rather than to cut.new-spec: the rubric extends “a figure you have restated twice is the defect” to clauses. A clause that has drawn a sustained finding under two wordings is the defect and neither wording is, so the repair is a question about the property rather than the text.new-spec: the rubric requires a containment check to name the region it is about. When a document restates its own claims, an artifact-wide containment check passes on the restatement and never reads the region in question.- The seeded
AGENTS.mdrule lookup now sends an agent up the whole path to the file it is changing, reading every scopedAGENTS.mdfrom that file’s own directory to the repository root. It previously named one scoped file, which read as discharging the obligation for that whole subtree and silently skipped any scoped file nested deeper.
new-spec: the over-specified-plan rule is stated once, inside the review iteration step where it is actionable. It was stated twice in two wordings, and the copy that survived sat under “after review rounds converge” while instructing the reader to act before the three-pass escalation.
[core][2.25.11] — 2026-09-10
Section titled “[core][2.25.11] — 2026-09-10”Highlights
Section titled “Highlights”- Checking where the work stands costs a fraction of what it did. The orientation payload now carries the decisions you act on rather than the full working set behind them, and the saving grows with the size of your workspace. Ask for the long form when you want it.
- The spec and traceability checks report what they found instead of listing it. A passing run prints its summary lines and says how many items it withheld, so nothing goes quietly missing. Anything that fails still prints in full.
Changed
Section titled “Changed”workspace-status: thestatussubcommand no longer emitscanonical.evaluations. Every dispatch decision it carried is already incanonical.ready,.active,.blocked, and.findings, and the list grows with the workspace. Pass--include-evaluationsto restore it;reconcileandexplainare unchanged and still carry it.workspace-status:repo_backlog.openentries now carry onlyroom,slug-or-path,summary, andneeds— the fields a consumer renders plus the dependency list. Thekind,entry_type, andsourcekeys had no reader. This applies to every mode, soreconcileandstatusstay in agreement.work-loop:lint-spec-status.pycounts warn-only findings instead of listing them, and names the count in its clean summary.--verboserestores the full listing. A run with a hard violation still lists everything, warnings included.work-loop:lint-traceability.pywithholds its per-item detail lines on a passing run, printing its summary lines plus a count of what it withheld.--verboserestores them, and any non-zero exit prints in full.
[core][2.25.10] — 2026-09-10
Section titled “[core][2.25.10] — 2026-09-10”Highlights
Section titled “Highlights”- The directory your intents land in is now described in the conventions you
install with them.
CONVENTIONS.mdreads an intent on two axes: the altitude it sits at, and how far it has travelled from a framed bet to a ratified outcome. Only a feature-level intent becomes a spec directly. - Admitting an intent that was already shaped upstream adds to it instead of overwriting it. The outcome, altitude and assumptions you framed survive the handoff into repository work.
CONVENTIONS.md§ 5b documentsdocs/product/intents/. Altitude is theLevel:field, an open set runningproduct-vision › product-strategy › capability › feature: a feature intent becomes a spec directly and that spec names it in itsDiscovery:header, a higher altitude decomposes into child intents first, andLevelstays absent until the altitude is settled. Stage is which fields the artifact carries — framed states the bet, admitted adds status, boundary, owner, unresolved questions, projection and source, and ratified reachesStatus: Acceptedafter an independent shaping review and human confirmation.
Changed
Section titled “Changed”intake-intentnow scopes its minimization rule to creation. Updating an existing intent applies the missing required fields in place and keeps every field already present, including an altitude an upstream shaping pass stamped; the renderer’s whole-document output never replaces an existing intent. Previously the creation contract — write only the minimum, omit what the source does not establish — read as licence to re-render over a framed intent, dropping its opportunity, assumptions and altitude.CONVENTIONS.md§ Intent-scoped completion names which sense of “intent” it governs: the agreed scope of a change, not the artifact class above.
[core][2.25.9] — 2026-09-09
Section titled “[core][2.25.9] — 2026-09-09”Highlights
Section titled “Highlights”- The defects a spec review keeps finding are now named where the spec is
written, not only where it is reviewed.
new-specships a spec-authoring rubric: six failure classes worked in order before criterion shape, starting with the one no criterion craft repairs — an obligation authored where an owner already exists.
new-specgainedreferences/spec-authoring-rubric.md, reached from the acceptance-criteria step and from the spec template. It orders and diagnoses the failures a criterion-shape review keeps finding: a criterion that holds on empty state, one no design satisfies, one whose value or citation goes stale at its source, one that targets generated output instead of the source that produces it, a hand-written set that has a machine-readable source, refusals with no valid input that must succeed, and a deferral that drops a control nobody may waive. The paired ablation reached four of the six from shipped shape guidance alone; the two it did not are the one-sided refusal set and the criterion aimed at generated output.- The rubric carries the two rules that decide what to do with a class rather than how to spot it: a criteria-count threshold starts a conversation and never refuses, and an artifact at the wrong altitude is moved rather than trimmed.
- A repair pass, because a repair is the likeliest source of the next defect. After changing a rule, the clause the change did not touch is re-read for a second verdict on an input the rule already governed, and any sentence left behind describing where the moved text went is treated as a value that decays.
- A criterion now has to name both verdicts. The class that catches a criterion no observation can falsify also catches its mirror — one that fires on correct work — so the author states the input that must fail and the correct input that must pass. A check also has to perform the comparison its criterion names, because a near neighbour returns a plausible different number and reads as confirmation.
- An optional five-shape criterion syntax, offered when a criterion reads ambiguously. It pairs every refusal with the positive path that must still succeed, and it is an aid rather than a house style.
Changed
Section titled “Changed”- The spec template’s
## Acceptance Criteriasection now states that it owns criterion shape and routes the failure classes to the rubric, so neither surface restates the other. - A figure gets one verdict. Removing precision that nothing reads is now decided after sorting figures into those that can go stale and those that cannot, so a dated past measurement can stay as illustration instead of being both permitted and forbidden.
[agentbundle][0.43.1] — 2026-09-09
Section titled “[agentbundle][0.43.1] — 2026-09-09”Highlights
Section titled “Highlights”- A new catalogue now gives Claude Code the same pack and profile guidance
every other agent already got.
agentbundle catalogue initwrites aCLAUDE.mdbeside eachAGENTS.mdit scaffolds, so a Claude session picks up your scoped instructions instead of missing them.
catalogue initwritespacks/CLAUDE.mdandprofiles/CLAUDE.md, each holding a single@AGENTS.mdimport line. Claude Code readsCLAUDE.mdrather thanAGENTS.md, and finds a nested one only when it reads a file in that directory, so a scaffolded catalogue previously left both scopedAGENTS.mdfiles unread by Claude Code.AGENTS.mdstays canonical for every agent and its content is unchanged. An existing file at either path is reported as a conflict and left alone.
[core][2.25.8] — 2026-09-08
Section titled “[core][2.25.8] — 2026-09-08”Highlights
Section titled “Highlights”- A cooled delivery’s parent link is now declared on its workspace entry, so
reconciliation stops guessing. When a cooled spec’s
source.parentis missing or names no registered brief,workspace-statusreportscooled_child_scope_unknownagainst that entry and holds every dependency on a brief until someone answers — instead of silently reading the missing value as “this delivery has no parent” and releasing the work. - Declaring
noneis a real answer. A delivery with no parent brief is declared as such once and dispatches normally, so the new refusal is something a maintainer clears rather than waits out.
cooled_child_scope_unknown, documented in theworkspace-statusskill and theworkspace.tomlreference with both repairs: a brief path that resolves to a registered membership, ornonewhen there is no parent brief.
Changed
Section titled “Changed”source.parenton a cooled spec entry answers three ways rather than two. A value resolving to a registered brief attributes the delivery to it; a declared empty value attributes nothing; anything else — an absent key, or a value naming no registered brief — is unestablished scope. The declared value is compared as written rather than through the filesystem, so a path that differs only in case does not resolve.- The
cool-30-dayscloseout procedure now states the precondition: declaresource.parentbefore cooling, while the body can still be read.
[core][2.25.7] — 2026-09-08
Section titled “[core][2.25.7] — 2026-09-08”- A work-loop state-lock reclaim no longer moves a lock it has not just confirmed is the one it judged stale. A contender working from a snapshot that a successful reclaim had already superseded could displace the new holder’s lock and leave the lock path briefly free while that holder was still inside its critical section, which admitted a second holder. The reclaim path now re-checks inode identity and the per-hold record immediately before moving anything, and leaves a lock it no longer recognises alone.
[core][2.25.6] — 2026-09-08
Section titled “[core][2.25.6] — 2026-09-08”Highlights
Section titled “Highlights”workspace-statusnow distinguishes unavailable cooling support from a malformed lifecycle record. It directs maintainers to install or repair the cooling capability instead of repairing a valid record.
- A missing close-work confinement authority now fails closed as
cooling_state_unavailable; no artifact is excluded when the cooled set cannot be established. Records that are independently invalid are still named alongside it, so a global cooling failure does not hide a repair someone owes.
[agentbundle][0.43.0] — 2026-09-08
Section titled “[agentbundle][0.43.0] — 2026-09-08”Highlights
Section titled “Highlights”- Installed direct skills can now move to later repository revisions.
agentbundle upgrade --skill <name>re-runs admission, shows the capability consent surface, previews changes, and removes files dropped upstream before it records the new revision.
--sourcesupplies the wanted revision for a commit-pinned direct skill. Capability widening and an uninspectable prior declaration fail closed; a content-only or capability-narrowing update can proceed.
Changed
Section titled “Changed”- An install at a different ref of an installed skill still exits 1, but as a
re-coded refusal naming
upgrade --skill --sourcerather than as a source collision. - A moved
source-pathnow refuses where it previously self-healed silently. - A byte-identical reinstall still repairs the projection in place.
- Remove-then-install is the terminating remediation for the moved-
source-pathcollision.
[core][2.25.5] — 2026-09-08
Section titled “[core][2.25.5] — 2026-09-08”Highlights
Section titled “Highlights”work-loopnow rejects unsafe or ambiguous reference providers before it calls them. Provider guidance is visibly enclosed as untrusted evidence, so it cannot quietly expand the planning workflow’s authority.
Changed
Section titled “Changed”- The agent-skill-engineering reference handoff now closes all published
selection failures before invocation and gives each its stable diagnostic.
Accepted provider content is retained in a
knowledge-evidence.v1envelope; rejected content is neither cited nor copied.
[architect][0.15.7] — 2026-09-08
Section titled “[architect][0.15.7] — 2026-09-08”Highlights
Section titled “Highlights”architect-designnow rejects unsafe or ambiguous reference providers before it calls them. Provider guidance is visibly enclosed as untrusted evidence, so it cannot quietly expand the design workflow’s authority.
Changed
Section titled “Changed”- The agent-skill-engineering reference handoff now closes all published
selection failures before invocation and gives each its stable diagnostic.
Accepted provider content is retained in a
knowledge-evidence.v1envelope; rejected content is neither cited nor copied.
[core][2.25.4] — 2026-09-08
Section titled “[core][2.25.4] — 2026-09-08”Highlights
Section titled “Highlights”- Closeout now keeps unrelated work visible when it shares a path with a
cooled legacy entry. A second entry at the same path still blocks closeout,
so maintainers are not told to invoke
close-workwhile that work remains unresolved.
- Cooled work exclusion is keyed on each entry’s position in its lifecycle list
rather than on its path. A legacy
spec/<slug>entry can no longer hide a second entry stored at the same path — including one the canonical layer rejects, which reaches closeout through its own parse and so could reproduce any value the exclusion matched on.
[core][2.25.3] — 2026-09-08
Section titled “[core][2.25.3] — 2026-09-08”Highlights
Section titled “Highlights”- A durable owner accepting an artifact now survives the session that recorded
it. The lifecycle record carries
Reclassified, so “this left delivery and someone else owns it now” persists as readable state instead of being lost at closeout. A reclassified artifact keeps its file where its record says it is, drops out of ordinary orientation, is never due for a retention review, and is not counted among the obligations someone still owes delivery work against. - It is reached deliberately and only once. Reclassification is available only from a record already retained under an exception, only when the durable owner’s acceptance is supplied and validated at the transition, and never again afterwards — nothing transitions out of it, and no deletion route admits a lifecycle record. It is not gated on a date, because a durable owner accepting an artifact is not a day-30 event.
[core][2.25.2] — 2026-09-04
Section titled “[core][2.25.2] — 2026-09-04”Highlights
Section titled “Highlights”- Light-mode review now runs until it is clean instead of stopping after a fixed number of rounds. A loop that is converging finishes. At the third round and every second round after, the loop asks whether findings are getting fewer and smaller, and keeps going while they are. A loop that is no longer converging asks whether the reviewed construct should exist at all and puts that choice to the person who asked for the work, rather than sending a small change through the heavier mode.
Changed
Section titled “Changed”- Light mode’s round budget and its escalation to full mode are replaced by a divergence checkpoint. Full mode’s iteration cap is unchanged, so the two modes now stop for different reasons, and light mode’s stop is a judgement the checkpoint prompts rather than a mechanical bound. How many findings the loop’s own repairs produced informs that judgement but never decides it. Risk-trigger escalation is unaffected and still fires on its own.
- Light mode’s procedure, eligibility and durability routing, review rounds, and trims moved into a reference the skill loads only when light mode is selected, so a full-mode run no longer carries them.
[core][2.25.1] — 2026-09-04
Section titled “[core][2.25.1] — 2026-09-04”Highlights
Section titled “Highlights”- When a
work-looptask is about a skill, a skill script or evaluation, an agent loop, a hook, or a plugin, planning now reaches the installed agent-skill-engineering reference for compiled guidance and cites the topics and provenance it used, instead of answering from model memory. - Without that pack installed,
work-looprecordsknowledge provider unavailableand completes the same planning work it did before.
work-loop’s PLAN step gains a bounded subsection that inlines its own request to the capability exposing contractagent-skill-engineering-reference/v1. The capability is addressed by contract version, never by the owning pack’s product name, installation path, or generated router path. The budget is one call with no refinement; the response is attributed, untrusted evidence that cannot change instructions, identity, tools, permissions, scope, write authority, or which review gates fire.pack.tomldeclares the seam as ahandoffwhosefallbackrepeats the target pack’s publishedknowledge provider unavailablediagnostic verbatim.- Two eval cases covering the relevant-topic and the absent-or-refused paths.
[architect][0.15.6] — 2026-09-04
Section titled “[architect][0.15.6] — 2026-09-04”Highlights
Section titled “Highlights”- When an
architect-designtask turns on how to package agent behaviour — a subagent, a hook, a skill, or a plugin — the design procedure now reaches the installed agent-skill-engineering reference for compiled guidance and cites what it used. - Without that pack installed, the procedure records
knowledge provider unavailableand produces the same design work it did before.
architect-design’s procedure gains a bounded paragraph that inlines its own request to the capability exposing contractagent-skill-engineering-reference/v1, on the same terms aswork-loop’s: addressed by contract version, one call with no refinement, and a response treated as attributed, untrusted evidence.pack.tomldeclares the matchinghandoffintegration.- Two eval cases covering the relevant-topic and the absent-or-refused paths.
[agent-skill-engineering][0.4.3] — 2026-09-09
Section titled “[agent-skill-engineering][0.4.3] — 2026-09-09”Adds the two composition behavior fixtures RFC-0097’s Gate 2 M2 expanded measure names, completing the eleven representative task fixtures it lists.
subagent-compositionandhook-plugin-designjoin the authoring workflow’s evaluation set, each with an inert payload draft that seeds defects the shipped composition floors govern, and each declaring the pattern identifiers it exercises alongside the assertion that reports its seeded defect.- Every authoring case was re-measured in one blind round rather than re-stamped: adding two cases moves the declaration digest every recorded result pins. Most inherited verdicts match the prior baseline; the ones that moved are recorded with both values and a reading.
- Graded verdicts are now bound to retained response transcripts rather than to the record’s own account of itself, so a recorded result can be read back against the bytes it came from.
- Two declarations were corrected under owner authority after measurement, each because it pinned one value from the receipt’s three-value write-status vocabulary. A new check binds every declared marker to the vocabulary the skill actually declares, so a case can no longer pin a value the workflow has no way to emit.
No ### Highlights section: this release changes the pack’s evaluation
evidence, not what a consumer of the pack can do. No skill body, reference,
mode, corpus topic, or provider contract moved.
[agent-skill-engineering][0.4.2] — 2026-09-09
Section titled “[agent-skill-engineering][0.4.2] — 2026-09-09”Highlights
Section titled “Highlights”- A skill author deciding whether to hand work to an isolated worker, or whether to ship a set of components as one package, now gets those concepts from the corpus instead of being routed to a runtime profile that does not exist.
- The portable package floor states the four behaviours the Agent Plugins v1 portable core fixes for every conforming client: the manifest’s filename and its location at the package root, confinement of every package-supplied path to the resolved package root, semantic versioning as a recommendation a client may not reject a package for failing, and component-level failure isolation under which one failing component still leaves independently valid components loadable. All seven concerns the specification delegates to clients are named as client-owned.
- The portable delegation floor states the value crossing at each direction of the delegation boundary — the worker receives only the context the parent passes it and not the parent’s conversation; the parent receives only the worker’s declared result, and the worker’s intermediate reads do not return.
- The Claude Code profile states the one runtime divergence that changes an authoring decision: this runtime reads its plugin manifest from a client-specific location beside the package root rather than at the root, so a package carrying its manifest only at the root is not discovered here. It teaches the delegation and packaging concepts through this runtime’s own component surfaces.
Changed
Section titled “Changed”- An unanswerable capability question now has a stated conservative resolution rather than only a pointer to a runtime profile: it is treated as absent rather than assumed present, and the operation stays in the parent.
- Runtime profiles beyond Claude Code are recorded as open extension rather than reserved for later delivery. Each names an admission condition a contributor can satisfy from outside any delivery sequence.
- Both retrieval records were re-measured against the recompiled router by an independent read-only reader. Precision 1.000, recall 0.910, exact selection 0.907, bounded selection 1.000, against a floor of 0.90 on each; the forty-prompt negative set still answers nothing.
[agent-skill-engineering][0.4.1] — 2026-09-04
Section titled “[agent-skill-engineering][0.4.1] — 2026-09-04”Highlights
Section titled “Highlights”- The shipped knowledge provider contract now states every diagnostic the seam can return, so a consuming pack can quote a receipt an adopter actually receives rather than one that existed only in a test fixture.
provider-contract.md’s Provider response section publishes the seam’s closed seven-value diagnostic vocabulary. Six of the seven previously appeared in no file under any pack’s.apm/, and tests are not projected to adopters, so a consumer quoting the conformance fixture would have quoted literals an adopter never receives.
[core][2.25.0] — 2026-09-04
Section titled “[core][2.25.0] — 2026-09-04”Highlights
Section titled “Highlights”- A work-loop phase now decides which behavioural rules an authoring agent is taught. A registry inside the
work-loopskill declares the policy families each phase carries, and a selector turns one phase into the ordered families it selects, each with its enforcement tier and a fingerprint of the file that teaches it.
references/policy-families.md— five policy families, twopreciseand threeadvisory, and a selection map covering every legal work-loop phase plus the reservedDIRECT-LIGHTkey for the light path, which records no phase of its own.scripts/select-policy-families.py— prints one delivery record for a phase, and refuses before delivering anything when the registry is malformed: an unknown phase, a duplicate or unknown family, a module that is unresolvable, wrongly namespaced, or resolves outside the resolution root, a bad tier, or a version pair that disagrees.guides/core/reference/phase-scoped-policy-delivery.md— how to declare a family, how to choose its tier, and how to read a refusal.
- A family names its teaching text by a locator such as
skill:new-spec/assets/spec.md, never a repository path. The registry ships to your repository, where the catalogue path does not exist and the same rule lives under.claude/skills/or.agents/skills/. - The delivery record carries
assembled_brief_digestand leaves itnull. Selection does not assemble a brief, so nothing is digested over assembled text yet; the field is declared so a later consumer reads one record shape rather than two.
[core][2.24.4] — 2026-09-04
Section titled “[core][2.24.4] — 2026-09-04”shaping-reviewernow checks a named set of recurring authoring defects in every mode, as aCheck | Tell | Fix shapetable. It covers an obligation authored where an owner already exists, a criterion that cannot fail, a criterion that decays, a numeric bound with no measurement origin, refusals with no valid input that must succeed, a set copied from an authoritative source, and exact detail that changes no decision.- Each mode gained a readiness question the previous presence checks could not answer: whether an author could actually produce the artifact below it — a narrower intent, a spec for each confirmed slice, or a design that satisfies every criterion.
Changed
Section titled “Changed”delivery-briefmode now checks altitude, asking of each section whether it decides something or names something for the spec to decide. The modes either side of it checked altitude and brief review did not, so a brief carrying spec-level content drew correctness findings and never the one finding that mattered.- An ownership finding now outranks criterion craft. The reviewer reports it alone and stops reviewing that section, and the stated repair is to move the text to its owning artifact rather than shorten or narrow it.
- A spec is no longer faulted for leaving the implementation change DAG to its plan.
[core][2.24.3] — 2026-09-04
Section titled “[core][2.24.3] — 2026-09-04”Highlights
Section titled “Highlights”- A lesson that a rule or a control has since absorbed can be retired where it
lives. Distillation now carries the lifecycle and the retirement record, so a
topic settles as
canonicalized,enforced,obsolete,merged, orinvalidated, naming the successor that took the lesson over. A retired topic stays in place for history and stops being offered as current guidance. - A topic keeps every occurrence that produced it. Reconciling a second observation into an existing topic appends to its provenance instead of replacing it, so the record of what was seen, and when, survives revision.
[product-engineering][0.13.9] — 2026-09-03
Section titled “[product-engineering][0.13.9] — 2026-09-03”Highlights
Section titled “Highlights”- Shaping skills now suggest a workspace entry that can actually be picked
up.
frame-situationanddiverge-solutionsprinted a short legacy form that is never dispatchable, so an entry added exactly as instructed never surfaced as ready work. Both now print the canonical five-field entry and route registration throughwork-intake. - A reference to a command that no longer exists is gone. The skills pointed at a retired skill name, so following the instruction did nothing.
Changed
Section titled “Changed”- Added
Triggers onexample utterances where they were missing, and corrected the workspace-entry guidance inframe-situation,diverge-solutions, and their examples.
[product-strategy][0.2.5] — 2026-09-03
Section titled “[product-strategy][0.2.5] — 2026-09-03”Highlights
Section titled “Highlights”- The OKR cascade now writes a workspace entry that can be picked up.
run-okr-cascaderecords each gap it finds, and it was writing a legacy form that is never dispatchable — so every gap it recorded was invisible to the shaping room it was recording into. It now writes the canonical five-field entry.
Changed
Section titled “Changed”- Corrected the gap-entry format in
run-okr-cascadeand its cross-pack routing reference.
[experience-design][2.0.3] — 2026-09-03
Section titled “[experience-design][2.0.3] — 2026-09-03”Highlights
Section titled “Highlights”- Every experience-design skill now tells you how to start it. None of the pack’s twenty skills documented an example phrase, so a person had to guess the wording and the agent had nothing to match against. Each skill now carries two to four phrases someone would actually type, sharpened so neighbouring skills in a twenty-skill pack do not claim the same request.
Changed
Section titled “Changed”- Added
Triggers onexample utterances to all twenty skill descriptions.
[frontend-engineering][0.2.2] — 2026-09-03
Section titled “[frontend-engineering][0.2.2] — 2026-09-03”Highlights
Section titled “Highlights”- Every frontend-engineering skill now tells you how to start it. As with experience-design, none of the nine skills documented an example phrase. Each now carries example utterances that match what the skill genuinely handles.
Changed
Section titled “Changed”- Added
Triggers onexample utterances to all nine skill descriptions.
[core][2.24.2] — 2026-09-03
Section titled “[core][2.24.2] — 2026-09-03”Highlights
Section titled “Highlights”- Evidence from a run now has a place to go that the approved plan does not. Once a plan is approved it is pinned, so a task that asked for its own observed result to be written back into it could never be satisfied. Plans now keep the obligation and a sibling verification ledger keeps the observation — the mutation that was applied, the check that went red, the digest that was compared. One convention states when substantive edits stop, and a check fails if that statement is reverted.
[core][2.24.1] — 2026-09-03
Section titled “[core][2.24.1] — 2026-09-03”- Corrected the workspace-status closeout failure-path comment to say that an unreadable record withholds the affirmative without naming the record.
[core][2.24.0] — 2026-09-03
Section titled “[core][2.24.0] — 2026-09-03”Highlights
Section titled “Highlights”- Work-loop now gives each scheduled plan task a bounded sequential implementer dispatch. The controller retains lifecycle, review, and closeout ownership while the task brief carries its execution root and applicable craft guidance.
[core][2.23.2] — 2026-09-03
Section titled “[core][2.23.2] — 2026-09-03”Highlights
Section titled “Highlights”- A local dependency can keep resolving after the delivery it names has been
closed out and pruned. Put a completion receipt with
delivery_id,outcome,completion_event, andevidence_refon the citing local need. Onlycompletedsatisfies the dependency;abandonedandsupersededkeep the refusal visible. - Completion receipts now fail before they are written when their delivery result or evidence fields do not match the published contract. This keeps a malformed receipt from becoming the only surviving account of a pruned dependency.
Changed
Section titled “Changed”- A local need can carry a completion receipt with exactly
delivery_id,outcome,completion_event, andevidence_ref. Adefect-kind need cannot carry one. - The producer now validates
outcomeagainstcompleted,abandoned, andsuperseded, and validates the other three fields against the lifecycle record’s published grammars. - This release moves every workspace’s routing identity, so an in-flight legacy migration needs a fresh confirmation.
[core][2.23.1] — 2026-09-03
Section titled “[core][2.23.1] — 2026-09-03”Highlights
Section titled “Highlights”- Closeout no longer offers to close an initiative that still has shaping or delivery-brief work open. Eligibility was read from the initiative’s spec work alone, so an initiative whose every spec had shipped was recommended for closeout while its intents and draft delivery briefs were untouched. It now reports a named blocker instead, and stops recommending the skill that distils and dispositions.
- Both record shapes now count as remaining shaping work. A shaping record written in the canonical form was invisible to the check, which read only the older shape — so an initiative whose remaining shaping work was written entirely in the current form looked empty. Retiring a record now stops it counting in both shapes alike, where before the two forms disagreed. A shipped, withdrawn, or cancelled delivery brief is still correctly treated as finished.
[core][2.23.0] — 2026-09-03
Section titled “[core][2.23.0] — 2026-09-03”Highlights
Section titled “Highlights”- The deferral-token convention now states the rule the tooling enforces. An
open register entry needs an artifact of its own in
Draft, unless it is a defect; it cannot point at the shipped document that recorded the deferral, because a shipped or accepted carrier and an open register membership cannot coexist. The previous wording directed authors to exactly that shape, so following it produced a record the tooling refuses to route. - The convention now warns that a deferral marker outlives its own record. A
(deferred: <slug>)marker left in a body that later freezes pins its register entry open permanently, because the frozen body can no longer be edited to retire the marker. - Removed a reference to a repository-only test path. The clause pointed adopters at a file that exists only in this repository, and at a count ceiling that no longer exists.
[core][2.22.0] — 2026-09-02
Section titled “[core][2.22.0] — 2026-09-02”Highlights
Section titled “Highlights”- Closeout no longer offers to close an initiative whose remaining work the status surface says it cannot route. Deciding what a lifecycle record has retired now reads the same verdict the reconciliation layer reached, instead of rebuilding a guess from the entry’s name. An entry recorded in an older shape is retired exactly when its artifact is; an entry the surface declines to route at all is never quietly treated as finished.
[core][2.21.0] — 2026-09-01
Section titled “[core][2.21.0] — 2026-09-01”Highlights
Section titled “Highlights”- An initiative whose work has all been retired now reaches closeout instead of reporting unfinished work forever. Whether anything is still outstanding is decided once, by a single pass that excludes what a lifecycle record has already retired — so two halves of the same answer can no longer disagree. An artifact named by one of a record’s alternative locators counts the same as one named by its main locator.
- When that reading is incomplete, the status surface withholds its suggestion to close out rather than making it anyway. A record that cannot be read, or whose review date cannot be judged, is reported as a named blocker instead, so a workflow that distils and disposes is never recommended on partial evidence. The prompt an agent renders reads the same facts, so the two agree.
- Repair and migration are settled as unaffected by retirement, not left pending. Planning, applying, recovering and rolling back a repair or a migration behave identically whether or not lifecycle records are present, pinned by paired runs so a later change has to alter those lines and say why.
[core][2.20.1] — 2026-09-01
Section titled “[core][2.20.1] — 2026-09-01”Highlights
Section titled “Highlights”- Quality review now spots four tests that can stay green while proving nothing. It calls out empty-set assertions without a positive control, unstubbed negative cases, source-text checks that do not exercise a security control, and prose that substitutes for a captured baseline.
[core][2.20.0] — 2026-09-01
Section titled “[core][2.20.0] — 2026-09-01”Highlights
Section titled “Highlights”- Each reviewer now owns its concerns outright, so the same defect stops arriving twice under different severities. Adversarial owns contract conformance, scope and structural fit; quality owns whether a test can actually fail and the edge cases a spec never named; security owns every threat finding. A reviewer that notices another lens’s concern says so in its own lens instead of emitting that lens’s finding.
- A clean review no longer pays for a model call to confirm it is clean. The loop classifies a persisted reviewer report structurally rather than comparing it byte-for-byte to one sentence, so an ordinary clean pass skips adjudication. A report carrying security-reviewer’s mandatory coverage-disclosure footer still takes the full adjudication path, because that footer is prose and prose is what adjudication exists to read.
- A naming quibble no longer costs the same as a correctness blocker. Nits do not block readiness and are never fixed automatically. They are recorded with their citation, deferred, and acted on only when the thread means to change the code because of one — and promoted first if that repair turns out to change behaviour, architecture, dependencies, or more than one file.
- Security findings are now priced against a named attacker. A finding has to be reachable on a path this codebase runs and must not rest on a capability that already gives the attacker an easier route. This narrows severity and never coverage: an unpriced real weakness is still reported, and a trust-boundary crossing, missing authentication check, leaked secret, or spec-required control never drops on likelihood alone.
Changed
Section titled “Changed”- The reviewer roster carries disjoint lenses. Concerns that two prompts
previously shared — acceptance-criterion verification, test strength, error
paths, edge cases, security, repository idiom, and what
Fix:must contain — each have one owner, and the prompt that gave one up names the owner. Fix:states the required outcome and its constraints instead of prescribing a mechanism. The implementer chooses the mechanism; the finding format the adjudicator and the report parser depend on is unchanged.loop-cohort review raw-classifyreports a persisted report’s classification, finding count, and whether it carries a coverage-disclosure footer. Refusals name which rule rejected the report without echoing its content.review recordgains--structural-clean-filefor a report that is clean by structure rather than by bytes: the clean sentence appears exactly once, no findings parse, and nothing else but blank lines surrounds it. It is recorded distinctly from a byte-exact clean, so an audit can still say which rule admitted the round.- The verdict record carries one authoritative finding-disposition table; its schema and residual-eligibility sections point at that table instead of restating the rule.
- A clean security review could never satisfy the completion condition, because its mandatory footer made the report structurally incapable of matching the expected sentence.
[core][2.19.0] — 2026-09-01
Section titled “[core][2.19.0] — 2026-09-01”Highlights
Section titled “Highlights”- Delivery briefs now distinguish withdrawal before execution from cancellation after execution starts. Open programmes remain Executing when their current slices have shipped but later slices are not materialized, and successful closure still needs an explicit Shipped decision.
Changed
Section titled “Changed”- Core’s brief template, authoring and closeout workflows, workspace schema, status projection, legacy migration routes, and coverage lint share the six states Draft, Ready, Executing, Shipped, Withdrawn, and Cancelled.
- A Shipped child now counts as execution evidence. Ready and Withdrawn reject that evidence; Executing and Cancelled require it; Shipped requires a non-empty all-shipped Spec map.
- Tracker refresh locks Withdrawn and Cancelled requirements with the stable
result codes
withdrawn_requirements_lockedandcancelled_requirements_lockedacross every supported profile.
[core][2.18.2] — 2026-09-01
Section titled “[core][2.18.2] — 2026-09-01”Highlights
Section titled “Highlights”- Re-issuing a review recording no longer risks counting the round twice.
loop-cohort review recordtakes an optional--operation-idnaming the round. Repeat the same recording under that id and the command reports a completed write and changes nothing; supply a different payload under it and the command refuses rather than silently accepting it. A session that dies before it learns whether the write landed can now simply repeat the command.
loop-cohort review record --operation-id <run-id>:<transition-sequence>, accepted alongside all four existing recording forms. Omit it and behaviour is unchanged, apart from the retry cap below.state.jsonrecordslast_review_record_operation_idandlast_review_record_payload_digest, so a resuming session can tell a completed write from one that never landed. Both default tonull, and astate.jsonwritten before this release keeps working.
Changed
Section titled “Changed”loop-cohort review record --fingerprintnow refuses oncereview_retry_countreachesmax_review_retries, instead of writing past it. The cap was previously enforced only by the shell&&chaining the recording to a capped transition, so a recording issued on its own bypassed it — and dropping--operation-iddoes not get around it either. A replay of an already-recorded round is unaffected: it writes nothing, so it remains a no-op.--allow-retry-cap-overridetakes one deliberate round past the review cap. It must be passed to bothloop-engine transition <spec-dir> findings-remainand the matchingloop-cohort review record: either half alone leaves the cohort and the engine a round apart. It is for a human who has looked at why the loop is not converging; the refusal it replaces tells an unattended agent to stop and surface instead. The implementation cap atgates-failedhas no equivalent.- The shipped work-loop instructions supply an operation id on every review recording, reading the transition sequence after the transition that opened the round so a resuming session recomputes the same value.
- The session-resumption guidance tells a resuming session to compare the recorded id before deciding whether a round was written, and states that the clean-round replay risk applies to a replay without a matching id.
[core][2.18.1] — 2026-08-31
Section titled “[core][2.18.1] — 2026-08-31”Changed
Section titled “Changed”close-work’s bundledfile_safety.pynow raisesBoundExceeded— a subclass ofUnsafeContentError— when a declared traversal or read bound is exceeded, carrying the breached budget, its limit, and the observed value as attributes. Callers that catchUnsafeContentErrorare unaffected; callers that need to tell a budget breach from an integrity refusal (a link-like, special, or uninspectable entry) can now do so from the exception itself rather than by matching on its message text.
[core][2.18.0] — 2026-08-31
Section titled “[core][2.18.0] — 2026-08-31”Highlights
Section titled “Highlights”workspace-statusnow tells you what closed-out work is waiting on you, and stops showing you work that is already finished. Orientation reports how many cooling reviews are due, names each one, and lists retention exceptions with the role that owns them and the date they are due. An artifact that has finished cooling is no longer offered as something to start, and is no longer opened, so a session begins on live work rather than on settled deliveries.- A retention exception stays visible, because someone still owes work against
it. Only artifacts whose lifecycle record says
CoolingorRetiredare excluded;RetainedandExternalAdvisoryrecords are projected and their artifacts remain available to start. - Orientation says whether the exclusion is complete. If a lifecycle record
or the cooling module cannot be read, the run still projects the workspace and
reports
cooling_context_visible: true. That means the exclusion may be incomplete, not that it did not happen: one unreadable record leaves every other record still cooling its artifact, and the accompanying finding says which case you are in. - A brief whose declared child has cooled holds its dependants back. When a
spec names a brief through
source.parentinworkspace.tomland that spec cools, the brief stops satisfyingkind = "brief"dependencies until its child scope is re-established. Cooling is otherwise subtractive; this is the one place it withholds work, and it exists so a lifecycle record cannot make a blocked spec dispatchable by hiding a child’s real state. - Repair and migration keep their previous behaviour and still reach cooled entries; whether cooling constrains them is a later decision.
[core][2.17.4] — 2026-08-31
Section titled “[core][2.17.4] — 2026-08-31”- The
work-loopbehavior examples for its startup step now describe what the skill actually does. Four of them still showed the superseded path, in which rawworkspace.tomlqueue membership was enough to begin work and a startup read stood in for a full reconciliation. Work-loop resumes or starts only from canonicalworkspace-statusready/active dispatch, and directs the exhaustive sweep toworkspace-status reconcile.
[catalogue-curation][0.4.6] / [governance-extras][0.10.5] — 2026-08-31
Section titled “[catalogue-curation][0.4.6] / [governance-extras][0.10.5] — 2026-08-31”Highlights
Section titled “Highlights”- Assimilated primitives finish against the target catalogue’s own release contract. Catalogue curators now close version, inventory, release-history, and projection duties instead of stopping after the content write.
- New pack proposals reuse the target catalogue’s RFC workflow. The proposal adds its primitive inventory without copying or drifting the canonical RFC template.
- Catalogue-curation now ships activation and behavior evals for primitive assimilation, repository re-sync, and pack proposals, including a self-contained three-route RFC re-sync fixture.
- Accelerator-pack policy no longer states two conflicting principle counts.
- The governance-extras RFC template uses the platform-neutral
<account-handle>placeholder instead of assuming GitHub.
[core][2.17.3] — 2026-08-31
Section titled “[core][2.17.3] — 2026-08-31”Highlights
Section titled “Highlights”- The spec-metadata check now looks at the specs you touched, so finishing a
work loop takes about two seconds instead of about thirty. It used to re-read
all 423 specs and start a Git process for each one. Two checks still cover every
spec regardless: the dangling-reference scan, and the one that resolves each
deferral marker — because retiring a tracked follow-up can invalidate a marker
in a spec you never opened. The remaining per-spec checks cover what you
changed, and
--allruns the full audit — wire that into a gate.
Changed
Section titled “Changed”lint-spec-status.pyscopes its per-spec invariants to the specs changed against the resolved base ref, and takes--allfor the full sweep. The changed set includes specs that are new and not yet committed, so a spec being written is never skipped, and it reads NUL-separated paths relative to the scanned root so an unusual filename or a subdirectory--rootcannot drop a spec silently.- Invariants (iii) and (iv) run over every spec in both modes. (iv) resolves
each
(deferred: <slug>)marker againstworkspace.toml [backlog].open, so its second input is not the spec file: closing an entry invalidates the marker in every spec citing it, none of which need have changed. Scoping it would have let the routine close-work operation break anchors unreported. - The per-spec warn-only output for unchanged specs is what narrows in the
scoped default — measured at 34 (v) and 18 (i) warnings on this repository.
--allstill reports them. - Both summary lines now name the coverage they achieved —
0 of 423 spec(s) changed against origin/mainrather than a barespec metadata clean— so a run that selected nothing cannot be mistaken for a run that checked everything. - An unresolvable base ref falls back to the full per-spec sweep instead of selecting zero specs.
[core][2.17.2] — 2026-08-31
Section titled “[core][2.17.2] — 2026-08-31”Highlights
Section titled “Highlights”- When saving project knowledge runs out of time, it now says so and tells you to try again. It used to report a storage-capacity problem and advise fixing the request, and on the save path it could even claim another writer was mid-migration — so a run that simply needed more time looked like a request you had to rewrite, and the step that records lessons could not finish for anyone who did not read the exit code.
project-knowledgegives an elapsed script deadline its own diagnostic,deadline_exceeded, carryingretryable: trueand a recovery action ofretry. It previously reusedjournal_capacity, whose contract says the request needs fixing and must not be retried; all three fields were wrong for a deadline.- Three Git read helpers no longer report a subprocess timeout as
map_mismatch, which was indistinguishable from an incoherent committed snapshot — a different cause with a different remedy. - A deadline is no longer swallowed by the handlers that fall back to a boolean
or to a default hash algorithm. Those fallbacks previously hid the timeout and
let the writer gate re-refuse as
staged_dual_writer, which was more misleading than the code it replaced. - Byte-limit refusals still report
journal_capacityand genuine snapshot incoherence still reportsmap_mismatch. One deadline deliberately keeps its old code: the call that is the repository-confinement proof still refusesconfinementand stays non-retryable, because an unfinished boundary check leaves the root unproven.
[desk-research][1.1.7] — 2026-08-31
Section titled “[desk-research][1.1.7] — 2026-08-31”Changed
Section titled “Changed”- The
desk-researchcapture gate recordsproducer.workflow_versionasdesk-research-producer-profile.v1, the identifier of the producer contract that gate defines, rather than the pack’s shipped release. The recorded value now changes when that contract’s emitted shape changes, so a pack release no longer requires a matching edit to the skill.
[governance-extras][0.10.4] — 2026-08-31
Section titled “[governance-extras][0.10.4] — 2026-08-31”Changed
Section titled “Changed”- The
new-adrandnew-rfccapture gates recordproducer.workflow_versionasnew-adr-producer-profile.v1andnew-rfc-producer-profile.v1— the identifiers of the producer contracts those gates define — rather than the pack’s shipped release. Each value changes when its own contract’s emitted shape changes, so a pack release no longer requires a matching edit to the skills.
[agent-skill-engineering][0.4.0] — 2026-08-31
Section titled “[agent-skill-engineering][0.4.0] — 2026-08-31”Highlights
Section titled “Highlights”- The corpus now answers how a skill composes with subagents, hooks and packaged bundles, and keeps the portable question separate from any one tool’s answer. Three portable floors were admitted — skills with subagents, hooks, and plugin packages. Each states the questions worth asking before reaching for a tool’s syntax, and each says out loud that event names, configuration paths and output protocols belong to the tool rather than to the floor. Sixteen of thirty-six subjects are now carried and twenty remain recorded as absent.
- A capability claim about a tool now carries a lifecycle state, so nobody
reads “we checked” where the truth is “we read the manual”. Each claim
records its first-party source, the date it was retrieved, the version that
source exposed, and one of four states. A claim confirmed by actually
exercising the behaviour reads
verified; a claim taken from documentation alone readsexperimentaland is not a support claim; a claim whose verification window has run out readsstaleand returns provenance instead of guidance; an absent capability readsunavailableand is recorded as a difference rather than a gap. - Claude Code is the first tool profiled, and three of its seven capabilities
are backed by an actual probe rather than a citation. Skill body loading,
subagent context isolation and worktree isolation were exercised directly and
read
verified. Nesting limits, hook scoping, managed hook policy and package-supplied agent precedence are documented but unexercised, and readexperimentalon purpose.
Changed
Section titled “Changed”- The pack’s page on the website stated a topic count that had been wrong since the previous release; it now states the count that matches what ships. The pack README’s count moved with this release rather than having been wrong. A check that previously crashed on an unrecognised count now reports which number it saw and which it expected.
[agent-skill-engineering][0.3.0] — 2026-08-31
Section titled “[agent-skill-engineering][0.3.0] — 2026-08-31”Highlights
Section titled “Highlights”- The reference corpus now answers language and execution questions, and says out loud which ecosystem and which versions each answer holds for. Five topics were admitted: Python with pytest, TypeScript/Node with JavaScript test runners, process and filesystem cost, pack and continuous-integration critical paths, and worktrees with state locks on a shared host. Twelve of thirty-six subjects are now carried and twenty-four remain recorded as absent.
- Two answers that a single ecosystem’s own documentation settles are now admissible. Earlier, a claim shipped only on two independent observations or two vendors agreeing. That bar silently excluded anything true of exactly one ecosystem — a language’s own test runner, for instance. Such a claim now ships only when it names its ecosystem, an explicit version range with both bounds, and the vendor documentation it comes from.
- Five governed topics covering language and execution depth. The TypeScript/Node topic separately addresses package and module contracts, clean installs that respect the lockfile, child-process behavior, test-runner worker models, browser-worker cost, cache keys, and security scanning.
- Every claim group now ships the basis a reader needs to check it: the ecosystem and version range where it applies, the documentation it rests on with the date that documentation was read, and what would require it to be revalidated. A group resting on repeated observed failures instead records the shared mechanism and the distinct subsystems and dates it was seen in, and cites no external source.
- Execution-cost guidance is bounded to skill scripts, evaluations, packs, and the environments they run in, and carries no host-identifying data — checked structurally rather than against whichever machine happens to run the check.
- The authoring workflow no longer treats a resolved target as a resolved request. Asked to change a skill without being told what to change, it now names the candidate changes and the authority each would need, instead of inferring one from the target’s current shape.
- Identifying which mode a piece of work will need is no longer reported as having entered that mode. A fully specified change that has not been authorized is still framing, and the receipt now says so.
[core][2.17.1] — 2026-08-31
Section titled “[core][2.17.1] — 2026-08-31”Highlights
Section titled “Highlights”- Exact clean reviews now finish without a redundant adjudicator call, while low-risk agent-context changes can remain in light mode. Mandatory automated reviewers no longer make work multi-person, and security review is tied to changed trust boundaries, data flows, or guarding controls.
Changed
Section titled “Changed”work-loopandnew-specpersist every completed reviewer report, then compare the persisted artifact’s bytes to the exactClean — ready to commit.sentinel. A byte-equal raw return closes the round without an adjudicator call; every other response still follows the fail-closed finding-adjudication protocol. Persistence is unconditional, so a clean round stays auditable and the exactness check never rests on a model-performed string comparison.- Full-mode cohort review state accepts that artifact through a dedicated
review record --direct-clean-file <path>form, which reads the file and refuses a near-miss without changing state.state.jsongainslast_review_clean_sourceandlast_review_clean_digest, so a resumed session can tell an adjudicated clean from a direct one instead of inferring it from an artifact whose absence is ambiguous. - Light/full and security-review routing now excludes mandatory automated reviewers, unchanged existing file/network I/O, and ordinary prompt wording, while retaining review for changed boundary controls and agent authority, input, tool, permission, sandbox, or data-handling behavior.
project-knowledgerecordsproducer.workflow_versionas the producer-profile contract version rather than the shipped pack version. The recorded value now changes when the producer contract’s shape changes, not on every release, so a version bump no longer requires a matching source edit.
[core][2.17.0] — 2026-08-31
Section titled “[core][2.17.0] — 2026-08-31”Highlights
Section titled “Highlights”- Work-loop now supplies reusable lessons through project-knowledge without having to assemble its storage and safety details.
- Added the work-loop producer profile for project-knowledge capture and review enquiry.
- Project-knowledge now refuses hard-linked source files before using them for captured lessons.
[core][2.16.6] — 2026-08-31
Section titled “[core][2.16.6] — 2026-08-31”Highlights
Section titled “Highlights”- Reviewers now test the evidence behind a finding before they emit it. They retain uncertain concerns, clearly marking an untraced consequence instead of silently dropping it.
Changed
Section titled “Changed”- Security review reports now always disclose unreviewed issue classes, even when the review is otherwise clean.
- The active work-loop no longer supplies captured project knowledge to reviewers; review stays grounded in the current target and governing inputs.
[architect][0.15.5] — 2026-08-30
Section titled “[architect][0.15.5] — 2026-08-30”Highlights
Section titled “Highlights”- Architecture work reuses before it creates.
architect-designlooks for an adequate prior design or existing capability first and creates no new artifact when no real choice remains. A Stage-0 concept is a valid final answer, not a waypoint to a full design. - Architecture reviews challenge unnecessary surface.
architect-reviewgained a design-doc reduction pass covering unnecessary components, services, dependencies, boundaries and custom mechanisms; ignored standard, native or provider capabilities; speculative scale and configurability; and complexity no named quality attribute supports.
Changed
Section titled “Changed”architect-designgrounds each necessary cross-document assertion with one bounded check of its named target or an explicit assumption, and carries a written confinement contract for the saves it directs.architect-reviewdeclares its authority for the first time —Read Grep Glob Writewith untrusted-read and write boundaries — and saves only when the user explicitly asks and names the destination. The artifact under review cannot request a save or choose where it lands.architect-review’s output assets are documented as inline templates, resolving a standing contradiction between its well-architected route and its no-file-write default. Well-architected mode is otherwise unchanged.- A direct architecture request needs no synthetic intent.
[core][2.16.5] / [governance-extras][0.10.3] — 2026-08-30
Section titled “[core][2.16.5] / [governance-extras][0.10.3] — 2026-08-30”Highlights
Section titled “Highlights”- An RFC that should not exist no longer costs you an identifier and a file.
new-rfcnow decides what artifact the work actually needs before it resolves an ordinal or writes anything. When the answer is “skip”, “an existing decision already covers this”, or “an ADR, a spec, a PR, an issue, an architecture design, or a reversible trial fits better”, it names the route and stops, leaving nothing behind. - RFCs get a review mode built for prose. The adversarial reviewer now has an RFC mode that needs no code diff, and treats the draft under review as untrusted data that cannot change its scope, severity, verdict, or routing.
Changed
Section titled “Changed”new-rfccarries a written confinement contract for the RFC target, index and companion-note writes it directs, and minimizes claims at drafting: delete what the decision does not need, and ground a necessary cross-document assertion with one bounded check or an explicit assumption.- A direct RFC request needs no synthetic intent.
- The adversarial reviewer’s three existing modes all assumed a code diff, so an RFC-only review had no home and would have been judged on what changed in a diff that does not exist.
[core][2.16.4] — 2026-08-30
Section titled “[core][2.16.4] — 2026-08-30”Changed
Section titled “Changed”- The
work-loopskill body is 798 lines, down from 950. Four procedures that only some runs need moved into the skill’sreferences/: the project-knowledge approval gates, the review-planning enquiry protocol, the parallel-dispatch and supervisor-wave rules, and unattended-loop eligibility. Each is reached from a pointer at the step where it applies and from the conditional-reference routing table, which now carries 14 predicates instead of 11. - A duplicated finding-adjudication pointer in the REVIEW step is gone. The copy that remains is the stronger of the two: it also covers an invalid report structure and an indeterminate adjudication.
No rule, gate, transition, refusal, or ordering constraint changed. Every line removed from the skill body is accounted for as moved, deduplicated, or reworded, and the tests that assert those rules now prove both that the skill routes to the reference and that the reference still carries the rule.
[core][2.16.3] — 2026-08-30
Section titled “[core][2.16.3] — 2026-08-30”Highlights
Section titled “Highlights”- Planning-only sessions can now prove TDD acceptance criteria without leaving failing tests in the repository. The approved plan carries the executable stub, and implementation sessions materialize it only when code work begins.
Changed
Section titled “Changed”new-speckeeps TDD work at contract and stubbability scope. Full-modework-loopPLAN stores exact stub code and validates it from disposable scratch; afterCODE-IMPLEMENTATION, EXECUTE copies the approved block unchanged into the real test path and completes red-green-refactor.- The loop architecture and adopter guides now explain the planning-proof and repository-materialization boundary, including the two closed no-stub dispositions.
[core][2.16.2] — 2026-08-30
Section titled “[core][2.16.2] — 2026-08-30”Highlights
Section titled “Highlights”- Spec review now separates original defects from faults introduced by a prior repair before another edit begins. Every completed report is independently adjudicated, and a green gate is used only for the behavior it actually proves.
Changed
Section titled “Changed”new-specsends every completed spec-review report, including a clean claim, throughfinding-adjudicatorbefore classification or repair. Only sustained findings can change the spec or plan; each repair-authorizing finding is markeddraft-originorprior-round-repair, while unresolved origin stops for owner direction.- A green gate used in spec-review triage now carries its proven scope and one relevant blind spot. The spec-status lint’s module contract remains the single owner of its invariant list.
- The Core planning how-to and system explanation now show the same adjudication-first review sequence.
[agent-skill-engineering][0.2.0] — 2026-08-30
Section titled “[agent-skill-engineering][0.2.0] — 2026-08-30”Highlights
Section titled “Highlights”- The authoring workflow now offers a
knowledge-providermode, and the corpus behind it will not answer a question it has no evidence for. Four topics were admitted out of seventeen candidates, because admission requires two observations at distinct skill paths in distinct packs and measured retrieval that selects the topic alone. The other thirteen are recorded as absent with the reason and what would admit them, so a reader can tell an unevidenced subject from an overlooked one.
knowledge-providerjoinsframe,create, andupdateas an advertised authoring mode. Entry is read-only and carries no write authority; a write waits for its own explicit authorization. Four mode-specific modules ship with it: the provider pattern, provenance, retrieval evaluation, and security boundaries.- The reference corpus grows from three topics to seven, each declaring the basis its claims rest on and, for observed practice, the population it was drawn from and a statement that it is not established beyond it.
- A register of the twenty-nine taxonomy leaves the corpus does not carry, each with why it is absent and what would admit it.
- A fixed forty-prompt generic-engineering negative set, measured against the corpus so precision can be falsified rather than assumed.
- The knowledge-provider topic is scoped to designing a corpus. A request to consult, query, or invoke a provider is not a design question and selects no topic, so adding the topic did not make the corpus start answering them.
Changed
Section titled “Changed”- Both workflow skills now specify the receipt lines they are graded on. The mode and write status were previously required by the evaluation fixtures and instructed nowhere in the skills, so the recorded evidence could not be reproduced by an agent that did not already know the expected answer.
updatemode names the work being done rather than doubling as the write gate; the receipt’s write status carries whether a write is authorized. Under the previous wording, read-only planning for an update had no mode to report.
[core][2.16.1] — 2026-08-30
Section titled “[core][2.16.1] — 2026-08-30”close-worknow refuses malformed lifecycle-record input with a named code instead of raising. An unresolvable time zone, an exception envelope missing a required field, a list or object where a single value belongs, and an unusable destination candidate each return a published refusal, so no host file path or error number reaches the caller.close-workno longer accepts a number where the record format requires text. A delivery id given as a whole number, and an authority status or owner role given as a number too large to represent, were converted to text and accepted; both are now refused. A converted value was stored in a form that no longer equalled what the record supplied — a delivery id of123became the text"123", and that text became the file name on disk.
[core][2.16.0] / [product-engineering][0.13.8] — 2026-08-29
Section titled “[core][2.16.0] / [product-engineering][0.13.8] — 2026-08-29”Highlights
Section titled “Highlights”- Authors can independently check an intent, delivery brief, or draft spec before construction starts. Core’s shaping reviewer tests whether the contract is bounded and observable without replacing later adversarial, security, or quality code review.
- Core now ships the internal
shaping-reviewerprimitive. Core callers use it directly, while Product Engineering’sframe-intentintegration remains optional and reports an honest fresh-context or independent-human fallback.
Changed
Section titled “Changed”- AgentBundle validates the reviewer declaration and preserves its least-privilege posture in supported adapter projections.
- Core and Product Engineering guidance now distinguish contract shaping review from later code-review lenses.
[agentbundle][0.42.0] — 2026-09-03
Section titled “[agentbundle][0.42.0] — 2026-09-03”- The portable Agent Plugin route reaches every command that works with
distribution routes.
validateaccepts a pack declaring theper-pack-agent-pluginrecipe, which it rejected before;render --target agent-pluginselects that recipe;install --emit-install-routesalso writesagent-plugins/<pack>/;install,diff, andupgradeeach recognise a portable install; andcatalogue verifyreports output drift underagent-plugins/, which it previously ignored.
Changed
Section titled “Changed”- Every route-consuming surface reads its route set from the distribution-route contract rather than from a list maintained beside it, so a route declared in the contract reaches all of them at once.
- The repo-scope install summary and the
install --forceremoval notice each list every route subtree involved, in the order the routes are built, so the two already listed keep their positions and the new one is appended. install --forcenow also removesagent-plugins/<pack>/during its pre-RFC-0012 dist-tree cleanup, because that cleanup is derived from the declared route set. With--yesthe removal is unattended, so an unrelatedagent-plugins/<pack>/beside a managed tree should be moved first. Every subtree is verified to resolve under the output root before removal.
Published package bytes are unchanged for all three routes.
[agentbundle][0.41.1] — 2026-09-01
Section titled “[agentbundle][0.41.1] — 2026-09-01”- The budget-cost measurement in the direct-install performance harness no longer runs the allocation tracer while it is timing, so the figure it reports is the cost of the code rather than of the measurement. Nothing in the shipped package changed; 0.41.0 reached the internal repository but its release gate failed on that measurement, so it never reached PyPI, and this is the version that carries 0.41.0’s contents there.
[agentbundle][0.41.0] — 2026-08-30
Section titled “[agentbundle][0.41.0] — 2026-08-30”Highlights
Section titled “Highlights”- You can install a skill straight from a repository, without a catalogue.
Point
agentbundle installat a skill folder, askills/collection, or a single pack — locally or on GitHub — and it admits the source against explicit size and shape limits, pins it to the commit its bytes came from, and shows you exactly what the publisher declared before anything is written. A collection never installs everything by default: name the skills you want, or ask for all of them. - An upgrade that widens what a skill can do now stops and tells you what changed. Added tools, changed boundaries, new payload files, or a different credentialed status each need explicit acceptance, tied to the exact list you were shown.
- Direct installation for skill folders,
skills/collections, and single packs, from a local path or a credential-freegit+https://github.com/<owner>/<repo>@<ref>URL. A defaulted branch is refused: a revision that names different bytes over time is not a pin. validateaccepts the same sources and gains--format json.- A published reference for every direct diagnostic code, held equal to the code registry by a lint.
Changed
Section titled “Changed”- Skill and pack frontmatter may use YAML block scalars for any field. Agent frontmatter still may not — adapters rewrite it key by key and would drop the text.
pack.tomlgained a top-levelschemafield. Catalogue manifests keep implicit v1.
- Adapter orphan sweeps no longer delete installed skills when the state file cannot be read. Four adapters treated an unreadable state file as “nothing is protected”, and three built no protected set at all.
list-installedshows a dash for a directly installed skill’s version instead of the internal0.0.0placeholder, in the table and the JSON.- The receipt names the command that removes what you just installed —
agentbundle uninstall --pack <name> --yes— with manual removal kept as a fallback for a tree whose state file has been lost.
[agentbundle][0.40.3] — 2026-08-29
Section titled “[agentbundle][0.40.3] — 2026-08-29”Highlights
Section titled “Highlights”- A read-only agent’s declared boundaries are now checked where they are written, and never shipped into a projection that cannot use them. Adopters get the least-privilege posture their source declares on every supported adapter.
- Source-agent
metadata.boundariesis validated in the catalogue lint pass, so a declaration broader than the agent’s tools fails before it ships.
Changed
Section titled “Changed”- The Claude Code agent projection omits source-only
metadata, which is not a recognised Claude Code subagent frontmatter key.
- The portable projection branch — the one Windows adopters run — can create a target that does not exist yet, instead of failing when no descriptor-anchored write is available.
[core][2.15.5] — 2026-08-29
Section titled “[core][2.15.5] — 2026-08-29”Highlights
Section titled “Highlights”work-loopcan now correct a sealed spec or plan before the first wave runs. Review that finds a defect in the window between sealing the baseline and executing wave 1 previously had no legal move:contract-amendmentrefused until at least one task had completed, so the only way out was resetting the run and losing its identity and amendment history.
contract-amendmentno longer requires completed-task evidence when no task has completed. RFC-0099 § 7 declares the post-seal correction route legal from implementation, verification, or review, and lists only preservation effects; four guards enforced a completed-work precondition that route never stated. The evidence binding is now conditional on completed work existing, andbegin_contract_amendment’smissing_evidencecheck remains the sole enforcer — every completed task still requires at least one binding, and owner authority, reason reference, run identity, and the approved-hash pins remain unconditional.
[core][2.15.4] — 2026-08-29
Section titled “[core][2.15.4] — 2026-08-29”Highlights
Section titled “Highlights”- An acceptance criterion that hides two contracts is now caught while it is
being written, not three review rounds later.
new-specnames the test — parts with separate failure modes and separate remedies are separate criteria — and fixes its boundary with five worked examples rather than an adjective an author can self-certify past.
Changed
Section titled “Changed”new-specstates twelve authoring rules it previously left to judgement: one criterion is one contract; a numeric limit carries the input that makes it fire first, the mechanism enforcing that order, and the origin it is measured from; a limit’s value is never delegated to whoever implements it; a refusal contract over third-party input opens with a corpus check against real inputs; a rule a criterion depends on is cited by document and identifier rather than restated; a claim earns its place by making a wrong implementation detectable; and the plan carries mechanism rather than a second copy of the criteria.new-spec’s review guidance schedules one deletion pass after the rounds converge, and treats persistent under-specification findings in the plan as a signal to reduce the plan rather than extend it.
[core][2.15.3] — 2026-08-29
Section titled “[core][2.15.3] — 2026-08-29”Highlights
Section titled “Highlights”- Spec authors can keep the contract and the plan independently sharp. An acceptance criterion now states one checkable obligation, and a plan’s tests name the verification mechanism an implementer cannot infer instead of repeating the criterion.
- A plan now tests its riskiest assumption before anyone reviews it. One cheap throwaway check can reshape the approach before reviewers spend rounds arguing about work nobody has started.
Changed
Section titled “Changed”new-specflags an overlong plan and a verification-heavy task as signals to reduce, keeps approval-time file lists and fixture shapes provisional, and reduces a plan when review keeps finding it under-specified.- TDD stub guidance makes an executable stub replace its prose test entry. An
obligation whose verification mode admits no stub records
no stub (mode)with its reason; a hard out-of-process surface still stubs the nearest in-process contract.
[agentbundle][0.40.2] — 2026-08-28
Section titled “[agentbundle][0.40.2] — 2026-08-28”Highlights
Section titled “Highlights”- Catalogue checks now admit the portable rule lookups shipped by the core pack while rejecting undeclared seed paths. Adopters can receive the new bounded rule router and scoped docs guidance through the normal seed flow.
Changed
Section titled “Changed”- Declared the three cognitive-load lookup paths in the fail-closed seed linter.
[core][2.15.2] / [governance-extras][0.10.2] / [product-documentation][0.1.1] / [user-guide-diataxis][0.3.1] / [agent-skill-engineering][0.1.1] — 2026-08-28
Section titled “[core][2.15.2] / [governance-extras][0.10.2] / [product-documentation][0.1.1] / [user-guide-diataxis][0.3.1] / [agent-skill-engineering][0.1.1] — 2026-08-28”Highlights
Section titled “Highlights”- Agents now make chat, documentation, and skill-led work easier to scan without dropping checks, warnings, evidence, or depth. Repository rules, generated artifacts, and independent skills share the same outcome-first behavior without requiring a new host primitive.
Changed
Section titled “Changed”- Added portable cognitive-load rules, focused output evals, and core seed lookups for Claude, Codex, and Gemini adopters.
[catalogue-curation][0.4.5] — 2026-08-28
Section titled “[catalogue-curation][0.4.5] — 2026-08-28”Highlights
Section titled “Highlights”- Compiled OKF skills now carry the same outcome-first output contract as hand-authored ones. A generated router or procedure skill reads the same way as the rest of the catalogue without a separate rule file.
Changed
Section titled “Changed”- Injected the managed output-rendering block into the OKF router and procedure wrappers.
[architect][0.15.4] / [experience-design][2.0.2] / [figma][0.3.3] / [product-engineering][0.13.7] / [product-strategy][0.2.4] — 2026-08-28
Section titled “[architect][0.15.4] / [experience-design][2.0.2] / [figma][0.3.3] / [product-engineering][0.13.7] / [product-strategy][0.2.4] — 2026-08-28”Highlights
Section titled “Highlights”- Architecture, design, and product artifacts now lead with the decision and keep long work easy to resume. The output stays plain and scan-friendly while preserving requested depth, evidence, constraints, and exact terms.
Changed
Section titled “Changed”- Added an independent cognitive-load contract and a scored representative output scenario to each pack.
[contracts][0.3.6] / [converters][0.9.6] / [frontend-engineering][0.2.1] / [iac-terraform][0.1.9] / [monorepo-extras][0.1.9] / [release-engineering][0.1.10] — 2026-08-28
Section titled “[contracts][0.3.6] / [converters][0.9.6] / [frontend-engineering][0.2.1] / [iac-terraform][0.1.9] / [monorepo-extras][0.1.9] / [release-engineering][0.1.10] — 2026-08-28”Highlights
Section titled “Highlights”- Engineering artifacts and handoffs now stay quiet during routine tool work while keeping exact code, errors, and verification. Results lead with the current outcome and name a next action only when one remains.
Changed
Section titled “Changed”- Added an independent cognitive-load contract and a scored representative output scenario to each pack.
[atlassian][0.9.3] / [credential-brokers][0.3.3] / [desk-research][1.1.6] / [github][0.2.3] / [linear][0.3.3] — 2026-08-28
Section titled “[atlassian][0.9.3] / [credential-brokers][0.3.3] / [desk-research][1.1.6] / [github][0.2.3] / [linear][0.3.3] — 2026-08-28”Highlights
Section titled “Highlights”- Connected-service and research workflows now ask for less at once and return the current result without routine tool narration. Safety issues, blockers, needed choices, and host requirements still interrupt silence.
Changed
Section titled “Changed”- Added an independent cognitive-load contract and a scored representative output scenario to each pack.
[core][2.15.1] — 2026-08-28
Section titled “[core][2.15.1] — 2026-08-28”Highlights
Section titled “Highlights”- Work-loop tools now reject execution state outside the current repository and finish safely when local Git stops responding.
- Confined
loop-cohortspec directories to the current repository, including paths redirected through symlinks. - Bounded local Git lookups in the spec-status lint so an unavailable Git process skips the affected diff check instead of hanging or crashing the lint.
[core][2.15.0] — 2026-08-28
Section titled “[core][2.15.0] — 2026-08-28”- Delivered work can now cool on a recorded 30-day schedule.
close-workwrites a Git-tracked lifecycle record, computes its review date in the recorded time zone, and reports when it is due for human review.
- A cooling engine for
close-workthat enrols delivered records, checks due state from an injected instant, and records the outcome of a day-30 review.
[core][2.14.0] — 2026-08-28
Section titled “[core][2.14.0] — 2026-08-28”Highlights
Section titled “Highlights”- Agents now cut unnecessary work before adding code or process. Core’s portable Razor ladder stops at the first sufficient option—skip, reuse, standard library, platform, installed dependency, one line, or the minimum working code—while preserving security, validation, accessibility, and explicit requirements.
- Repository work now enters through one clear intent and delivery path.
Neutral intake routes to
intake-intentfor a minimum repo-owned intent,author-delivery-brief create|continuefor multi-spec coordination, ornew-specfor one independently shippable feature.
intake-intent, with a minimum repository-intent contract that remains usable without Product Engineering.author-delivery-briefcreate and continue modes, including explicit governance-reference and executable-spec-map separation.
Changed
Section titled “Changed”work-intakenow owns neutral precedence and safe classification rather than intent or brief authoring.- New guidance, receipts, tracker handoffs, and internal dispatch use canonical
intent and delivery-brief names.
author-briefandreceive-briefremain bounded deprecation aliases for the accepted compatibility window. - Specs, RFCs, architecture work, and implementation review now apply the cut-before-adding principle at the artifact level that owns the decision.
Security
Section titled “Security”- New skills declare least-privilege tools and trust boundaries; external payloads remain passive, minimized data, repository paths remain confined, and aliases cannot widen their canonical target’s authority.
[atlassian][0.9.2] — 2026-08-28
Section titled “[atlassian][0.9.2] — 2026-08-28”Changed
Section titled “Changed”- Jira and Jira Align brief-intake matrices now hand multi-spec or
cross-repository work to
author-delivery-brief createwhile preserving the existing normalized-intake, authority, and refresh contracts.
[github][0.2.2] — 2026-08-28
Section titled “[github][0.2.2] — 2026-08-28”Changed
Section titled “Changed”- GitHub brief intake now writes the canonical
author-delivery-brief createhandoff instead of the deprecated brief identity.
[linear][0.3.2] — 2026-08-28
Section titled “[linear][0.3.2] — 2026-08-28”Changed
Section titled “Changed”- Linear brief intake now writes the canonical
author-delivery-brief createhandoff instead of the deprecated brief identity.
[product-engineering][0.13.6] — 2026-08-28
Section titled “[product-engineering][0.13.6] — 2026-08-28”Changed
Section titled “Changed”- Product Engineering guidance now makes intent altitude and the Core handoff explicit: a feature intent can become one spec directly, while multi-spec or cross-repository work can use a delivery brief without making Core a user-scope dependency.
[agentbundle][0.40.1] — 2026-08-28
Section titled “[agentbundle][0.40.1] — 2026-08-28”Changed
Section titled “Changed”- Workspace MCP lifecycle metadata now dispatches briefs to the canonical
author-delivery-briefowner.
[core][2.13.0] — 2026-08-27
Section titled “[core][2.13.0] — 2026-08-27”Highlights
Section titled “Highlights”- Delivery work can now close without losing the reasons and promises that
code and tests cannot explain.
close-workverifies repository-specific durable outputs, whole-document semantic freshness, obligations, dependencies, and authority before recommending a disposition. - Immediate disposal is safe by construction and never automatic. Every file removal needs a fresh human confirmation bound to the exact current target, fingerprint, disposition, evidence, authority, and session; any drift expires it.
- Core’s
close-workworkflow for completed, abandoned, superseded, paused, and initiative-level delivery work, with six RFC-0096 dispositions and stable refusal evidence. - Durable-output planning and Design/LLD extraction guidance for
new-spec, plus bounded completion-evidence handoff fromwork-loop. - Restorable reference-only pause overlays, dependency-scoped four-field
completion receipts, and read-only closeout projection in
workspace-status.
Changed
Section titled “Changed”- Newly shipped specs require every final acceptance criterion to be checked. Genuinely separable work moves through a reviewed, reapproved contract amendment to an independently owned follow-on.
- New and materially updated
workspace.tomlentries contain terse live state and pointers rather than working history, rationale, or review narrative. - Full-mode rigor no longer implies permanent spec/plan retention: approved local-only and PR-only records are supported when every required reader and stable evidence owner is explicit.
Security
Section titled “Security”- Source, write, and deletion authority remain independent. Local deletion reuses the shipped semantic resolver and canonical confinement/file-safety helpers, revalidates immediately before effect, and reports terminal residual hard-link or rollback failure rather than claiming successful disposal.
- Disposition intent grants no authority. Prompt-facing evidence is untrusted data, and external targets remain advisory without a separately authorized adapter.
- Wave 4 classifies
cool-30-daysbut adds no clock, dates, due state, retirement, ordinary-context exclusion, historical migration, or pruning. Those remain RFC-0096 Waves 5–7.
[core][2.12.7] — 2026-08-27
Section titled “[core][2.12.7] — 2026-08-27”- Capturing and distilling project knowledge no longer times out as the topic corpus grows. The writer’s coherence check read every committed topic with three Git subprocesses each — one for the object id, one for its size, one for its bytes — so a repository with a few dozen topics spent its whole script budget before writing anything, and reported the exhaustion as a corrupt store. The check now reads the whole corpus in one batched call: 546 subprocesses become 16, and the check runs 23x faster on a 76-topic store. Every coherence guarantee is unchanged, verified by mutating a committed topic’s identity, title, scopes and lifecycle and confirming each is still rejected.
[core][2.12.6] — 2026-08-27
Section titled “[core][2.12.6] — 2026-08-27”- A commented-out Acceptance-Criteria section is now rejected wherever it
appears — alone, beside a live section, or beside an opt-out marker. Criteria
that no longer apply are deleted rather than commented out; git history is
where superseded ones live. Previously a commented, superseded
- [ ]beside a live section was collected as a real criterion and blocked the ship transition on work nobody intended to do. - The rejection now names the right remedy. It previously told an author who had correctly opted out to add the marker they already had, and reported both a section and a marker at once, because section presence counted commented text as a live section. Presence, the commented-section check, and the heading near-miss check now share one notion of what is commented; HTML comments elsewhere in a spec remain welcome and untouched.
[agent-skill-engineering][0.1.0] — 2026-08-27
Section titled “[agent-skill-engineering][0.1.0] — 2026-08-27”Highlights
Section titled “Highlights”- Agents can now frame, create, update, review, and optimize portable agent skills through progressive, least-authority workflows. The foundation includes activation and behavior evaluations, deterministic compiled reference knowledge, and bounded failure contracts.
- Compatible organization or framework knowledge can inform skill work without coupling packs to another corpus. Workflows detect declared provider capabilities, invoke an eligible provider explicitly, and retain their complete baseline when no provider is available.
- Added the
author-or-update-agent-skillandreview-or-optimize-agent-skillworkflows withframe,create,update, review, and measured-optimize modes. - Added a governed three-topic OKF foundation corpus, its generated inert router, provider-contract fixtures, language-extension seams, and durable activation, behavior, precision, determinism, security, and failure-mode evidence.
Security
Section titled “Security”- Candidate content and provider guidance remain untrusted data; reads and writes are confined before content access, authentication stays external, and provider responses cannot widen authority or authorize execution.
[catalogue-curation][0.4.4] — 2026-08-27
Section titled “[catalogue-curation][0.4.4] — 2026-08-27”Highlights
Section titled “Highlights”- Pack-owned OKF routers can now expose a bounded, explicit-only knowledge provider capability for compatible workflows. Raw OKF remains governed build-time input, while generated provider metadata supports deterministic discovery without implicit corpus traversal.
Changed
Section titled “Changed”- Extended the existing OKF build profile and compiler with optional provider capability metadata whose generated description refuses direct user selection and requires an explicit compatible workflow call.
[catalogue-curation][0.4.3] — 2026-08-26
Section titled “[catalogue-curation][0.4.3] — 2026-08-26”Highlights
Section titled “Highlights”- Generated OKF routers now keep hostile concept metadata inside its intended index entry. Titles, statuses, and concept types are bounded and escaped before they reach compiler-owned Markdown indexes, preventing metadata from fabricating links or additional entries.
Changed
Section titled “Changed”- Recompile committed OKF output after upgrading. Generated index bytes
change in four independent ways, so
compile-okf --checkreportsOKF011output drift against output built by an earlier version until you recompile: concepttitle,status, andtypeare now escaped and capped at 200 input characters, so any of those values renders differently if it exceeds the cap or contains any of:\,[,],(,),<,>, a backtick,*,_, any control character (including a carriage return, a newline, or any other code pointsplitlines()breaks on), U+2028/U+2029, or a GFM autolink scheme trigger — awww.host or anhttp/https/ftp://URL, whose punctuation is escaped so the text renders identically but the link is no longer live. A backtick,*and_are the ones ordinary metadata hits: a title such ascost_modelorUse `make ci` in CIwill change. Path-derived index display text is escaped the same way, so a directory namedpatterns(v2)changes both its root-index link text and its own# OKF index:heading. Index link destinations percent-encode every character outside letters, digits,- . _ ~,/,! $ + , = @ [ ],: * ?and non-ASCII, so a concept filename holding a space," ( ) < > \ | ' ^ ` { },& # ; %, a control character or U+2028/U+2029 changes. And root-index entries are ordered by normalized source path rather than by rendered line bytes, so a root index holding a directory that is a byte prefix of another reorders. - Breaking: a bundle carrying a remote reference in frontmatter no longer
compiles.
OKF009previously matched only a value beginning withhttp://orhttps://. It now refuses any frontmatter value containinghttp://,https://,ftp://,www.,mailto:, or an email-shaped run such asops@example.com— anywhere in the value, for every key, at any nesting depth. A bundle that compiled before can now exit 1. This is deliberate: RFC-0087 rejected runtime external fetch, so a reference in metadata is never dereferenced, and what it can do is become a live link in a compiler-owned index an agent treats as authoritative. Concept bodies are not scanned — a link there is for a human to follow manually and remains supported. The email-shaped rule is bounded to what a renderer actually linkifies, so a version string such asRev@1.2is unaffected. - Breaking: a concept path containing an email-shaped run is refused with
OKF004. A directory name becomes the text of a generated# OKF index:heading, where an address renders as a livemailto:link that escaping cannot defuse, so it is rejected at the path gate instead. - Destination encoding keeps a cited path openable wherever it safely can: a
non-ASCII filename such as
café.mdis cited literally. Two of the three encoded classes are security-relevant — characters that break a CommonMark destination, and characters a renderer resolves as a character reference. The third,' ^ ` { }, is encoded for URL validity rather than safety, and that trades literal fidelity for it: a legitimately nameddon't-panic.mdis cited asdon%27t-panic.mdeven though it was usable as a literal destination before this release.
- Added exact hostile-title and all-field boundary coverage for generated index bytes, including visible newline encoding and Markdown delimiter escaping.
- Added exact-byte coverage proving a concept filename carrying an HTML character reference cannot render an attacker-chosen link destination.
- Added mutation-sensitive coverage for the
OKF012repeated-render determinism guard. - Replaced release-version literals with pack/plugin/changelog invariants.
[architect][0.15.3] — 2026-08-26
Section titled “[architect][0.15.3] — 2026-08-26”Highlights
Section titled “Highlights”- The shipped architect pack is discoverable again. Its architecture-lenses
source now declares the required content licence, so
agentbundle show architectresolves it, and it accurately describes authored source versus generated router projections.
- Recompiled the architect OKF projection from the corrected authored bundle root and added pack/plugin/changelog release invariants.
[core][2.12.5] — 2026-08-27
Section titled “[core][2.12.5] — 2026-08-27”Highlights
Section titled “Highlights”- Newly sectionless specs say why without retroactively gating adopters. The work-loop linter requires an explicit reason when a new spec omits its Acceptance-Criteria section or an existing spec removes that section, while grandfathering sectionless specs already present in an adopter’s base ref.
- An Acceptance-Criteria section that is commented out is now a hard error rather than a section, so a disabled section can no longer satisfy the presence check while its checkboxes are read as real criteria.
- Every attempted opt-out marker is now diagnosed with the specific fix needed.
An indented marker, a
*bullet, a colon outside the bold, or a double space after the bullet previously escaped both readers, so a spec passed clean with a malformed marker on the page and the author got no signal. - An explicit
--base-refthat does not resolve now warns and skips the diff-triggered invariants, as the documented contract always said. It previously made every spec look new, red-lining a clean corpus and telling each author to add an opt-out for a section that was there all along. - A spec that cannot be read, or is over the size cap, is now reported instead of skipped in silence — it was previously counted as clean.
- The Acceptance-Criteria heading now has one supported spelling,
## Acceptance Criteria. A heading differing only in case, level, or indentation no longer satisfies invariant (vi) and is reported with the exact form to use. Its criteria are still read, so invariant (ii) keeps checking them — a heading defect never silently un-gates a spec. - Diff-trigger invariant (vi) for new specs and specs that remove their
Acceptance-Criteria section. Authors opt out with the exact metadata line
- **Acceptance Criteria:** none — <one-line reason>. Existing sectionless specs, including frozen adopter history, do not acquire a retroactive hard gate; malformed markers and a real section plus a marker remain hard errors.
[core][2.12.4] — 2026-08-27
Section titled “[core][2.12.4] — 2026-08-27”Highlights
Section titled “Highlights”- Maintainers can identify every unsupported legacy workspace record from a
cold status read. Findings now retain a safe object slug instead of
collapsing unrelated records under
workspace.toml. - Deferring an acceptance criterion no longer forces a legacy workspace
record. A
(deferred: …)anchor now resolves from a canonical{path, kind}entry as well as a legacy{slug}one, so a new deferral can be recorded in the canonical shape.
- Preserve safe single-segment slugs in
unsupported_legacyfindings without admitting those object shapes as supported or dispatchable entries. - Bound every untrusted
workspace.tomlvalue before it is emitted as a finding identifier. An over-long or control-character-bearing value degrades to the unattributed fallback instead of being rendered verbatim into an agent’s context; path-shaped values are still named soinvalid_artifact_pathkeeps reporting them. - Warn when a spec’s
**Status:**field is not in the- **Status:**list-item form. The workspace engine reads only that form and treated a bare field as no status at all, so the divergence surfaced as animpossible_transitionagainst the entry’s collection rather than as a lint error on the file that caused it.
[core][2.12.3] — 2026-08-26
Section titled “[core][2.12.3] — 2026-08-26”Highlights
Section titled “Highlights”- Adjudicators can settle a cited repository-file claim without an avoidable stop. A finding may now point to the current, confined file needed to test its own predicate, while review artifacts and all other scope boundaries remain excluded.
Changed
Section titled “Changed”- Admit current, repository-confined files cited by a source finding solely for testing that finding’s predicate; preserve indeterminate outcomes when the fact cannot be established within that bounded read envelope. Admission resolves the cited path to its canonical real path first, accepts only paths the finding itself names, and excludes any path whose resolved location is a review, adjudication, or evidence artifact.
- Describe the finding adjudicator’s capabilities instead of naming specific
tools, so its shipped instructions read correctly wherever it is installed
rather than only where tools called
ReadandGrepexist.
- State that persisting the paired review artifact is the orchestrator’s step and is not optional. The adjudicator is read-only, so a verdict it returned but nobody wrote was an incomplete review unit that the validator rejected with no indication of which side owed the write.
[agentbundle][0.40.0] — 2026-08-25
Section titled “[agentbundle][0.40.0] — 2026-08-25”Highlights
Section titled “Highlights”- Catalogue maintainers can now build portable Agent Plugins 1.0.0 packages offline. The normal build emits deterministic, schema-valid root manifests and canonical skill trees for every skills-only pack, with complete reasons for packs the route excludes.
- Added the explicit
agent-plugindistribution route, immutable version-paired plugin and MCP schemas, privacy-minimal manifest projection, confined skill copying, and an allocation-gated reverse-domain extension surface.
Changed
Section titled “Changed”- Distribution-route contract version 0.2 now carries three concrete routes; the APM and Claude package outputs and direct-install behavior remain unchanged.
[catalogue-curation][0.4.2] — 2026-08-25
Section titled “[catalogue-curation][0.4.2] — 2026-08-25”Highlights
Section titled “Highlights”- Catalogue maintainers now have an end-to-end guide for shipping pack-owned
OKF knowledge. The documented path covers declaration, canonical concept
authoring, deterministic compilation, drift and ownership recovery, normal
catalogue verification, and inspection through
agentbundle show.
Changed
Section titled “Changed”- Added
compile-okfto the pack’s public entry points and operator journey. - Added OKF declarations, schemas, generated-output ownership, and the pre-release reference-only boundary to the catalogue format reference.
[core][2.12.2] — 2026-08-25
Section titled “[core][2.12.2] — 2026-08-25”Highlights
Section titled “Highlights”- Machine-checkable reviewer claims can now be adjudicated without giving the adjudicator execution tools. The work loop may supply evidence from one predeclared, confined read-only gate; the attempt consumes the existing review retry budget and produces a complete independent replacement report.
- A bad proposed fix no longer obscures a real defect. The adjudicator now distinguishes an ineffective remedy from an effective but over-broad one while staying inside the supplied finding and repository-established repair seams.
Changed
Section titled “Changed”- Added validated evidence artifacts with digest rebinding, exclusive fresh paths, fixed provenance, and closed-catalog execution authority.
- Reserved the indeterminate stop token for its exact main-loop signal so the strict whole-report classifier cannot reject an audit that discusses another indeterminate path.
- Applied the existing review retry cap to both pre-EXECUTE and post-GATES
review states without adding review state or widening the adjudicator’s exact
Read/Grepsource tools.
[core][2.12.1] / [architect][0.15.2] / [governance-extras][0.10.1] / [monorepo-extras][0.1.8] / [iac-terraform][0.1.8] — 2026-08-24
Section titled “[core][2.12.1] / [architect][0.15.2] / [governance-extras][0.10.1] / [monorepo-extras][0.1.8] / [iac-terraform][0.1.8] — 2026-08-24”Highlights
Section titled “Highlights”- Architecture designs, current-state architecture, and decision records can now follow each adopter’s own repository or external destinations. Explicit destinations, policy, established conventions, and optional configuration are resolved by semantic role; catalogue paths remain fallback offers.
- Architect stays useful as an independent user pack. It can remain chat-only, save to an exactly confirmed personal workspace, consume Core’s repository resolution when compatible, or produce a truthful repository handoff when Core is absent.
Changed
Section titled “Changed”- Architect design, assessment, and diagram workflows distinguish future design from implemented current architecture while retaining their existing reasoning, per-effort organization, and write confirmations.
new-adrresolves the decision-record destination before ordinal, filename, and index selection, then preserves the destination’s established ADR method.- Core project inception and adaptation, monorepo package scaffolding, and IaC governance request the relevant semantic role instead of treating this catalogue’s documentation layout as universal.
Security
Section titled “Security”- Mandatory repository policy rejects a conflicting explicit destination. Ambiguous, absent, contradictory, unsafe, or unavailable destinations stop before directory, ordinal, index, configuration, or artifact effects.
- Personal-workspace writes are confined to an exact confirmed root or file. External locators stay external and require a separately authorized adapter before any write.
- This release changes destination selection and related guides only. It adds no resolver, schema, dependency, registry, architecture or ADR method, product-prose route, lifecycle behavior, or external transport.
[agentbundle][0.39.4] — 2026-08-24
Section titled “[agentbundle][0.39.4] — 2026-08-24”Highlights
Section titled “Highlights”- Codex agents with read-only source permissions can read and search local files again. The design reviewer, both desk-research agents, experience reviewer, frontend reviewer, and both discovery reviewers retain Codex’s command-backed file access inside a read-only sandbox without gaining write authority.
- The Codex agent projector now preserves its default shell tool for mapped
Read,Grep, andGlobintents. Previously, it selected a read-only sandbox and then disabled Codex’s only local file read/search mechanism unless the portable source also declaredBash. Web and writable sandbox settings remain independently derived from their source intents. - Kiro agents can explicitly opt out of default skill resources. An empty
source
resourceslist now suppresses Kiro IDE and CLI skill-resource injection and is omitted from the projected consumer file.
- A portable no-skill opt-out for agent sources. Claude Code’s own
skills: []now suppresses Kiro’s default skill-resource injection, so the intent lives in the portable frontmatter schema instead of Kiro’s consumer-nativeresourcesfield.skillsjoins the agent frontmatter allowlist;resourcesdeliberately does not, because the Claude Code agent projection is a byte copy and would carry it verbatim into.claude/agents/.
Changed
Section titled “Changed”- Breaking for Kiro agent sources: the Kiro projectors now bound the field set
they emit. Kiro IDE and CLI agents previously passed unmapped source
frontmatter through verbatim. They now emit only
name,description,model,tools,resources, and — on the CLI —prompt. Any other key is dropped with onekiro: dropping … agent fieldline on stderr per key. That removes two real hazards: Claude Code fields Kiro cannot read (permissionMode,memory,maxTurns) and IDE-only keys such ashooksthat make the CLI loader silently discard the agent. Pack authors who relied on the documented pass-through should check their build log after upgrading. - A non-empty
skillslist is now a hard build failure. Turning a skill name into askill://URI needs templating the frontmatter-mapping grammar cannot express, so the build stops rather than emitting an unresolvable Kiro resource entry.
[core][2.12.0] — 2026-08-23
Section titled “[core][2.12.0] — 2026-08-23”Highlights
Section titled “Highlights”- Work-loop reviews now explain readiness without asking you to trust a
generic “clean” verdict. Reviewers trace non-local impact and rollout
safety when warranted, then hand off an evidence-bearing verdict —
BLOCKED,CHANGES_REQUIRED,READY_WITH_RESIDUAL_RISK, orREADY— so every residual risk is named, not hidden.
Changed
Section titled “Changed”- Adversarial review now performs triggered impact tracing. Public APIs, shared registries, serialization and schemas, renamed or deleted symbols, side effects, dependencies, configuration, and persistent writes prompt a hypothesis-driven trace across callers, consumers, readers, writers, tests, and deployed-version boundaries. Repository-native evidence remains primary; optional graph evidence cannot claim completeness.
- Quality review now loads focused persistent-state migration depth. The existing operational-safety modules cover old/new compatibility, expand/contract order, safe backfills, validation and reconciliation, code-and-data recovery, mixed-version tests, rollout telemetry, stop conditions, and irreversible-loss boundaries without adding a reviewer.
- Work-loop now requires a finding-adjudicator gateway and emits a closed categorical verdict record. Every completed reviewer report passes through a mandatory finding-adjudicator before classification; a missing adjudicator is a loud stop. The gateway returns sustained, refuted, or indeterminate per source finding; only sustained findings enter fingerprinting, DECIDE, or FIX. Adjudicator payloads are untrusted data. Mandatory controls cannot be skipped or compensated by strengths elsewhere, and the human merge decision remains authoritative.
[core][2.11.0] — 2026-08-24
Section titled “[core][2.11.0] — 2026-08-24”Highlights
Section titled “Highlights”- Review loops now verify reviewer findings before asking you to repair them. An independent, read-only adjudicator checks each claim against the current target and governing rules. False positives stay in an audit instead of consuming repair rounds, while missing evidence stops for your decision.
finding-adjudicatorprovides an outcome-neutral gateway for every review report. It can sustain, refute, or mark each supplied finding indeterminate; it cannot discover new defects, widen scope, edit files, execute project code, or use the web. Codex may use only bounded command-backed reads and searches over orchestrator-supplied paths inside its read-only sandbox.- A bounded artifact validator protects the path-based handoff. It admits
only deterministic, regular UTF-8 session reports beneath
.context/reviews/, rejects unsafe metadata and filesystem objects, and exposes only size and digest metadata.
Changed
Section titled “Changed”work-loopnow sends only sustained findings into fingerprinting, DECIDE, implementer briefs, and FIX. Refuted-only reports use the existing clean result without a retry or mutation. Indeterminate reports stop before state changes, clean recording, or target edits.- The adjudicator projects with the narrowest posture each supported adapter can express. Claude Code, Kiro IDE, Kiro CLI, Copilot, and Gemini retain explicit read/search allowlists. Codex retains its command-backed file access inside a read-only sandbox, Cursor uses its native read-only reduction, and both fail closed when the active managed permission profile would expose a broader capability. Kiro IDE and CLI also suppress their default skill resources for this no-skills agent.
[core][2.10.10] / [product-engineering][0.13.5] — 2026-08-24
Section titled “[core][2.10.10] / [product-engineering][0.13.5] — 2026-08-24”Highlights
Section titled “Highlights”- A confirmed product discovery can now hand bounded delivery context to Core intake without losing its source or skipping delivery approvals. One independently shippable feature enters as a delivery contract; multi-spec or cross-repository work enters as a delivery brief. Older or absent Core installations receive the same content as a portable rendered handoff.
- normalized-intake.v1 accepts an optional closed shaping handoff containing boundaries, non-goals, dependencies, design context, and delivery questions.
- Product Engineering declares an optional capability-negotiated handoff to Core work-intake; neither pack becomes a mandatory dependency of the other.
Security
Section titled “Security”- Repository handoff content is confined to regular files under the repository root. External locators remain opaque provenance and are never fetched, searched, probed, executed, or converted into filesystem paths.
- Handoff content remains attributed, untrusted context. Existing brief Ready, slice-confirmation, spec, plan, and human approval gates remain authoritative.
- This release changes only optional shaping handoff and content routing. It does not change lifecycle membership, pause/resume, completion, closeout, retention, cooling, retirement, deletion, migration, architecture/decision routing, or locator-only dispatch.
[core][2.10.9] — 2026-08-23
Section titled “[core][2.10.9] — 2026-08-23”Highlights
Section titled “Highlights”- Core workflows can resolve a semantic destination using each repository’s own paths, policy, established conventions, optional configuration, or external locator. Results preserve bounded provenance and independent authority facts, while unsafe local paths and ambiguous evidence fail closed.
work-intakenow ships one stdlib-only, read-only semantic-surface resolver and a deterministic completion matrix covering explicit, policy, custom, configured, external, ambiguous, absent, conflicting, and unsafe outcomes.- Workspace target entries accept additive semantic-role and external-locator
metadata. Existing path entries keep their behavior; locator-only entries
remain visible but non-dispatchable with
configuration_mismatch.
Security
Section titled “Security”- Repository locators reject ambiguous path forms, symlink escapes, and symlink loops after realpath resolution. External locators remain offline and reject credentials, queries, fragments, whitespace, and control characters.
[core][2.10.8] — 2026-08-23
Section titled “[core][2.10.8] — 2026-08-23”Highlights
Section titled “Highlights”- You can migrate a legacy workspace entry through a reviewed, reversible
path.
workspace-statusshows the exact retained representation and candidate routes, plans only from a human-authored selection, applies only with fresh repository-authorized confirmation, and records a durable ledger that can restore the old workspace bytes without deleting the canonical artifact. - Starting, deferring, checking, refreshing, and migrating work now follow one documented route. The shared guides distinguish source evidence, canonical artifacts, lifecycle membership, processors, local refresh decisions, and separately confirmed tracker coordination.
- Four closed migration contracts cover the reviewed selection, current-session confirmation, repository ledger, and stable command result. Acceptance-pinned fixtures cover every released legacy workspace shape, invalid/private extensions, privacy refusal, failure seams, recovery, and exact rollback.
- The integrated work-intake evaluator runs the real normalized-intake, routing, profile, refresh-lifecycle, and migration-planning seams in two clean roots and compares byte-identical results and next actions.
Changed
Section titled “Changed”workspace-statusnow exposes deterministic migration planning plus ledger-first apply, recovery, and rollback under the shared repair lock. Selection and confirmation files remain human-authored out-of-band inputs; neither the skill nor tooling creates or prefills their decisions.capture-workremains installed as a deprecation-emitting forwarding alias, and the accepted legacy reader remains installed for the compatibility window. New writers and the workspace seed emit only target structured entries.
[agentbundle][0.39.3] — 2026-08-23
Section titled “[agentbundle][0.39.3] — 2026-08-23”Highlights
Section titled “Highlights”- Installed workspace-status engines now understand reviewed legacy work-intake migrations. The bundled engine recognizes exact legacy workspace slices, validates human-selected target routes and durable migration ledgers, and keeps planning deterministic and non-mutating. Repository status refuses linked or aliased workspace input before projecting legacy bytes, and ledger validation rejects any operation whose immutable material no longer matches its digest.
[atlassian][0.9.1] — 2026-08-23
Section titled “[atlassian][0.9.1] — 2026-08-23”Changed
Section titled “Changed”- Jira and Jira Align intake fixtures now participate in the shared integrated acquisition-to-route evaluation, and their journey guidance distinguishes read-only intake, reviewed local refresh, and separately confirmed remote coordination.
[github][0.2.1] — 2026-08-23
Section titled “[github][0.2.1] — 2026-08-23”Changed
Section titled “Changed”- GitHub intake fixtures now participate in the shared integrated acquisition-to-route evaluation. A new pack journey shows content-based Issue and Milestone routing plus the separate confirmation boundary for supported coordination actions.
[linear][0.3.1] — 2026-08-23
Section titled “[linear][0.3.1] — 2026-08-23”Changed
Section titled “Changed”- Linear intake fixtures now participate in the shared integrated acquisition-to-route evaluation. A new pack journey shows content-based routing, lifecycle-aware local refresh, and separately confirmed remote coordination.
[core][2.10.7] — 2026-08-23
Section titled “[core][2.10.7] — 2026-08-23”Highlights
Section titled “Highlights”- Every successful direct core install now tells you how to reach the read-only project-readiness check. The instruction appears for repository and local scope even when a lifecycle hook is disabled, unavailable, or not trusted, and it tells you to start a new session if the skill is not yet discoverable.
Changed
Section titled “Changed”- Core documentation now reflects current Codex
SessionStarthook projection, distinguishes projection from runtime execution and repository trust, and separates theadapt-to-projectskill from the deterministicagentbundle adaptCLI. - Install-route guidance now documents the intentional local-scope omissions: no seeds, adaptation marker, layout section, or chained CLI adaptation.
[agentbundle][0.39.2] — 2026-08-23
Section titled “[agentbundle][0.39.2] — 2026-08-23”Highlights
Section titled “Highlights”- Pack installers can now provide a useful manual next step without forcing a
first-run prompt. Level A packs may add an optional
Next:instruction, giving adopters a deterministic handoff when runtime hooks do not execute.
Changed
Section titled “Changed”- The first-value contract accepts and validates an optional Level A
next-action, prints it afterVerify:, and retains the existing required Level B behavior.
[core][2.10.6] — 2026-08-23
Section titled “[core][2.10.6] — 2026-08-23”Highlights
Section titled “Highlights”- Core now adapts to a repository’s own development context instead of expecting the repository to adopt the pack’s document layout. The doctor finds existing architecture, contributor, command, and scoped guidance, labels inference honestly, and proposes only approved root or subtree deltas.
Changed
Section titled “Changed”- The portable
AGENTS.mdseed strongly recommends four ordinary minimum topics and offers documentation, security, scoped guidance, and a structure map only when evidence makes them useful. adapt-to-projectruns its repository-anchoring diagnosis without an install marker and preserves adopter-owned files and filenames. The bundled reference architecture is now explicitly optional enrichment.new-specandwork-looprecord bounded repository anchors for structural plans, while pre-execute and delivery reviewers flag only load-bearing mechanism differences—not cosmetic variation or one incidental example.
[architect][0.15.1] — 2026-08-23
Section titled “[architect][0.15.1] — 2026-08-23”Highlights
Section titled “Highlights”- Architecture design now starts from the repository’s existing sources and
implementation idioms, wherever they live. A custom
DESIGN.md, scoped guidance, or repository-owned framework primitive can steer the design without first being copied intodocs/architecture/reference.md.
Changed
Section titled “Changed”architect-designfollows effective root/scoped guidance, uses a bounded one-or-two-example fallback for structural choices, and asks before inventing an unanchored load-bearing mechanism.
[agentbundle][0.39.1] — 2026-08-23
Section titled “[agentbundle][0.39.1] — 2026-08-23”Changed
Section titled “Changed”- Catalogue seed lint now requires the optional architecture-overview seed to describe area, responsibility, and change guidance rather than shipping a generic application/package directory tree.
[catalogue-curation][0.4.1] — 2026-08-21
Section titled “[catalogue-curation][0.4.1] — 2026-08-21”Highlights
Section titled “Highlights”- Nested OKF corpora now compile and check consistently on Windows. Generated index paths use the bundle’s portable POSIX form instead of inheriting the host path separator, so Windows no longer reports clean nested indexes as stale.
- The OKF compiler now distinguishes logical bundle paths from filesystem paths. Nested index names, links, and manifest entries are stable across Windows, macOS, and Linux, with a Windows-path regression test and nested-corpus eval fixture covering the failure.
[architect][0.15.0] — 2026-08-21
Section titled “[architect][0.15.0] — 2026-08-21”Highlights
Section titled “Highlights”- You can now turn a broad “assess this repository’s architecture” request into a correctable current-state model, an evidence-backed attention map, focused drill-downs, and a sequenced action plan. The assessment starts with a read-only survey, lets you correct its map before deeper investigation, and can progressively examine assurance, optimization, growth, transformation, or disposition without confusing repository conventions with architectural evidence.
architect-assessprovides survey, standard, and deep assessment depths. It separates observed repository evidence, optional attributed enterprise context, and reusable architecture knowledge; reports confidence and coverage limits; and uses heat as an investigation aid rather than a severity verdict.- The architect pack now carries its own progressively disclosed architecture
lens corpus. The pack-local OKF authoring source compiles into the ordinary
same-pack
architecture-lenses-referenceSkill. It has no dependency on a core-pack knowledge surface and grants no runtime, retrieval, or execution authority. - A bounded optional profiler can census repository topology and basic concentration signals without executing target code. Unsupported languages and unavailable Git history degrade visibly to manual evidence gathering.
Changed
Section titled “Changed”- The first-session architecture journey now begins with a read-only survey. Creating a durable reference architecture remains an explicit follow-up, and the new assessment how-to and reference guide explain correction points, evidence levels, enterprise knowledge surfaces, drill-down selection, and report review.
- Architecture design and review reuse neutral concepts from the architect pack’s generated reference surface. Their workflow instructions, activation, permissions, and verdict semantics remain independently authored.
[core][2.10.5] — 2026-08-21
Section titled “[core][2.10.5] — 2026-08-21”Highlights
Section titled “Highlights”- Work-loop commands now run from the project root without path discovery.
The skill resolves its own installed directory before invoking the loop engine,
cohort, or freshness scripts, so Codex and Claude Code no longer lose a turn
searching for a repository-root
scripts/directory that does not exist.
- Every work-loop Python invocation uses the installed skill directory. The
skill defines
<skill-dir>as the directory containing its activeSKILL.md, keeps project-relative paths anchored at the repository root, and quotes the resolved script path as one argument in its POSIX command examples.
[agentbundle][0.39.0] — 2026-08-21
Section titled “[agentbundle][0.39.0] — 2026-08-21”Highlights
Section titled “Highlights”- Catalogue builders can now reason about package formats independently of runtime adapters. The installed CLI exposes a validated contract for the existing APM and Claude-plugin routes, including their layouts, component support, admission, marketplace, and lifecycle behavior.
agentbundle catalogue contractsnow includesdistribution-routes.tomland its closed schema, with exactly the existing APM and Claude-plugin routes and an exhaustive nine-primitive capability map.
Changed
Section titled “Changed”- Distribution recipes name their route explicitly and are validated before output creation. Route-only package fields moved out of the direct-install adapter contract; APM and Claude package bytes and direct install behavior are unchanged.
[core][2.10.4] — 2026-08-20
Section titled “[core][2.10.4] — 2026-08-20”Highlights
Section titled “Highlights”- The changelog rule now says who “user-visible” means, so you can tell whether your change needs an entry. An entry is required when a pull request bumps a released artifact’s version — a pack or a published package — and repository tooling that ships in no release needs none. The old wording asked for an entry on “any user-visible behavior change”, which read as covering maintainer-only tooling and offered no heading to write it under.
Changed
Section titled “Changed”-
CONVENTIONS.mdstates one changelog trigger, and the section shape now carries its heading level. Thedocs/product/layout entry forchangelog.mdgives the shape (## [<artifact>][<version>] — YYYY-MM-DD), the released-artifact trigger, the exemption for repository tooling, and the per-package path. The##is load-bearing, not cosmetic — see the fix below. Adopted from RFC-0095 D1 and D3. -
The two overlapping changelog obligations became two rules scoped by file. The pull-request checklist previously required public-interface changes to be “noted in
CHANGELOG.md” — a path that resolves per-package, not at the repository root, and the only reference anywhere inCONVENTIONS.mdto the per-package changelog tier. It now reads as a released-artifact reminder that also names the published-package duty, phrased so it still holds for a repository that is one published package. Adopted from RFC-0095 D2. -
The shipped changelog template and the pull-request template now state the same trigger as
CONVENTIONS.md. The template’s maintenance header asked for an entry when a PR “bumpspack.toml” — packs only, with no published packages and no exemption — and the pull-request checklist still carried the old “any user-visible behavior change” wording verbatim. Three documents, three triggers. Adopted from RFC-0095 D1. -
Deciding whether a pack release earns a
/now/highlight is now a step in the release pipeline, not something to remember.Highlightsis the only content that reaches the public/now/page, and by contract no model runs in CI or site generation — so if nobody writes the block while authoring, the release is simply never mentioned publicly. Nothing prompted for it, and 1 of 144 entries had one. The pack release pipeline now obliges the call on every pack release: read the diff, answer whether a consumer can now do something new, and either draft the bullets or record the none verdict with its reason where a reviewer will see it. The test is the nature of the change, not the semver level. Adopted from RFC-0095 D4.
- The changelog no longer claims a CI gate that does not exist. Its
maintenance header stated that CI “will warn (configurable: block)” when a
pull request changed user-visible behaviour without touching the file. No
workflow has ever implemented that. The sentence is removed rather than
implemented:
tools/repo/check_release_impact.pyremains the only mechanical check in this area, and it deliberately treatstools/repo/andpacks/as non-impacting. Adopted from RFC-0095 D5. - A release entry nested under
[Unreleased]can never reach the public/now/page, and a new test now stops that happening. 59 entries carrying real versions and dates are nested there, and the/now/projection excludes them by structure — permanently, because it applies no date window and nothing moves an entry out later. A released section is written free-standing at##, directly in the released part of the file;[Unreleased]holds only work with no version yet.test_no_new_release_is_nested_under_unreleasedratchets the count so a new nested release fails the roster suite instead of silently going unpublished. Promoting the existing 59 is separate, registered work — 48 genuinely-unreleased bare sections are interleaved with them across three[Unreleased]regions, so it needs per-section attribution rather than a level-shift. Adopted from RFC-0095 D3.
[Unreleased]
Section titled “[Unreleased]”[core][2.10.3] — 2026-08-20
Section titled “[core][2.10.3] — 2026-08-20”Changed
Section titled “Changed”- A small, low-risk change no longer has to write a spec first. Ask the agent to make one bounded change now and it plans, implements, runs your gates, takes one adversarial review pass, repairs what that finds, and hands you the result — without creating a spec directory, a plan, a queue entry, or any state file. The rigor is unchanged; only the paperwork is gone. Work that genuinely needs to outlive the session still gets the full treatment: anything that trips a risk trigger, needs queueing or a second session, is handed to someone else, is coordinated by an external system, needs an approval that survives a context loss, or defines a durable published behavior — and, of course, asking for a spec. Queue dispatch is untouched and still refuses to start anything that lacks an approved spec and plan, so a direct run is never resumable from a cold start; if it turns out to need durability, it stops at that boundary and moves onto the durable path instead of pretending it had one all along. Specs and plans you already have keep working exactly as before, with nothing to migrate.
- Briefs have one readiness checklist instead of two that disagreed. Writing a brief from an email or an issue now produces a draft that records what is known and names what is missing — it no longer demands an appetite or a rabbit hole up front, and it never marks a brief ready. Readiness is checked in one place, against six things: the outcome, what is in scope, what is not, the constraint or appetite, at least one named assumption or risk, and a durable reference to where the brief came from. Metrics, instrumentation, user stories, and design links are genuinely optional. A ready brief with no slices cut yet is valid, and the bundled template now matches that checklist — including a place to record the source, which it previously lacked.
- A spec means the behavior, and a plan means how it gets built. Several pages said or implied that a spec carries the implementation; it does not. The spec is the durable behavior contract for one delivery slice, and its plan carries the implementation and verification strategy.
[core][2.10.2] — 2026-08-20
Section titled “[core][2.10.2] — 2026-08-20”Changed
Section titled “Changed”- Completion now follows the intent you accepted, not the size of one PR. Work that belongs to that intent can continue as a separately reviewed unit; work outside it is acknowledged in the PR and remembered only when you ask.
- Intermediate review units can now reach the human gate honestly. Declare an
incomplete accepted intent explicitly and the review guard requires
Implementing; the finaldonetransition independently requiresShipped.
[core][2.10.1] — 2026-08-20
Section titled “[core][2.10.1] — 2026-08-20”- The instruction surfaces state their security rules again. A 2026-08-19
simplification compressed nineteen
AGENTS.mdsurfaces and, along the way, removed rules that no linter, test, schema, or other document asserted. The pack-authoring guidance again requires canonicalising a path before a read (because a symlink inside an approved directory escapes containment without it), treating a file loaded from a user-controlled local path as data rather than instructions, and confirming that a path taken from a user-level config shared across projects belongs to the current project. - Agents are told again to push back. The seed instructions restore the duty to record disagreement rather than comply silently, to trust internal callers and framework guarantees rather than validate everywhere, and to inline a single-use operation until a second caller appears. The seed also regains the new-top-level-directory check that the live repository copy had kept, so an adopter’s instructions and this repository’s no longer disagree.
- Illustrative examples are protected from over-zealous scrubbing. Shipped pack content must carry no internal-governance citations, and the exception that keeps teaching examples safe was lost while the rule survived — so the documented pre-commit scan flagged legitimate sample output with nothing to say it was allowed. The carve-out is restored, together with the rule that the same identifier may be internal in one file and illustrative in another and is judged by what it points at rather than by its number.
- The risk-trigger block no longer instructs an action that fails CI. Its marker comment still told maintainers to copy the block into three other documents and keep all four byte-identical. Those copies were removed, and a later decision made this skill the block’s only home — so a copy now fails the lint. The comment states the single-home rule instead.
[monorepo-extras][0.1.7] — 2026-08-20
Section titled “[monorepo-extras][0.1.7] — 2026-08-20”- The example package template prompts for two more things. It now asks the author to state that a package’s tests do not import another package’s internals, and — for a sensitive package — to list the change categories that require an architecture decision record.
[agentbundle][0.38.6] — 2026-08-20
Section titled “[agentbundle][0.38.6] — 2026-08-20”- Profile authors can now reach the schema their instructions name. New catalogues direct them to the bundled profile contract through the installed CLI, rather than a path that exists only in this repository.
[agentbundle][0.38.5] — 2026-08-20
Section titled “[agentbundle][0.38.5] — 2026-08-20”Changed
Section titled “Changed”- The bundled authoring scaffold says how to write pack tests. A skill’s
modules load under a name that includes their pack and skill rather than by
putting
scripts/onsys.path— independent skills may each ship arender.py, and a bareimport renderbinds whichever directory was reached first. The standard also asks that a suite spend its time asserting rather than spawning processes.
-
Local-scope install and uninstall ask git each structural question once.
git rev-parseanswers for the exclude-file path and worktree identity are reused for the duration of a single command and dropped at its boundary, so the same query is no longer paid for two or three times per operation. -
A repository-only test no longer ships to self-hosted catalogues.
catalogue init --preset self-hostedand both archive flavours copiedtests/conformance/wholesale, which carried a test that resolves paths only this repository has; it failed on an adopter’s first run. The shipped conformance set is now derived from the directory in one place, so plain init’s manifest and self-hosted init’s copy cannot describe different sets.
[agentbundle][0.38.4] — 2026-08-20
Section titled “[agentbundle][0.38.4] — 2026-08-20”Changed
Section titled “Changed”- The bundled authoring scaffold carries the restored pack and profile
rules. The scaffold’s
packs/AGENTS.mdregains the security and eval-coupling rules described above, and itsprofiles/AGENTS.mdagain states that a pack appears at most once in a profile and that packs declaring a conflict do not share one. No CLI behaviour changes.
[agentbundle][0.38.3] — 2026-08-17
Section titled “[agentbundle][0.38.3] — 2026-08-17”Changed
Section titled “Changed”- Workspace status clients now receive the same structured refresh facts as the core skill. MCP and CLI results expose origin mode, configured profile, compared and accepted revisions, conflict state, and known refresh or write-back availability without publishing authority maps or identities.
[core][2.10.0] — 2026-08-17
Section titled “[core][2.10.0] — 2026-08-17”- Registered tracker-origin work can now be refreshed through one reviewed
authority path.
work-intakeresolves the exact configured profile, presents a field-level delta, preserves lifecycle locks, and updates the canonical artifact plus workspace revision mirror as one guarded operation. Tracker content remains untrusted and cannot select the processor, approval, destination, or write payload.
Changed
Section titled “Changed”-
Previously materialized tracker-origin artifacts require an authority migration before refresh. Artifacts created by earlier tracker-intake adapters without a closed source-authority record remain readable but report a named migration requirement instead of being dispatched for refresh.
-
Jira Cloud searches retain their configured retry budget. Read-only JQL searches use an idempotency declaration rather than their POST method when deciding whether a transient failure may be retried.
-
Workspace status now shows refresh facts without becoming an authority store. It reports origin mode, profile, compared and accepted revisions, unresolved conflict state, and known availability while omitting ownership, decisions, receipts, and approver identities.
-
Remote coordination writes have a per-mutation confirmation and receipt. Every supported action binds one fresh confirmation to the artifact, revision, profile, destination, target, and canonical payload. A pending receipt lands before the adapter call, and failed writes are not retried automatically.
[linear][0.3.0] — 2026-08-17
Section titled “[linear][0.3.0] — 2026-08-17”- Linear refresh now supports reviewed local deltas and narrow coordination write-back. Trace links, pull-request links, display status, comments, and closure use documented GraphQL mutations, a pinned fixed destination, one fresh confirmation per mutation, and no automatic write retry.
[github][0.2.0] — 2026-08-17
Section titled “[github][0.2.0] — 2026-08-17”- GitHub refresh uses the approved fixed-host
ghboundary. It can add trace links, pull-request links, display-status labels, comments, or closure after separate exact confirmations. Tracker content stays in argv-safe or stdin data positions and cannot choose the host, repository, executable, or command options. Requirement and Issue-body rewrites remain unsupported.
[atlassian][0.9.0] — 2026-08-17
Section titled “[atlassian][0.9.0] — 2026-08-17”- Jira and Jira Align now share the reviewed tracker-refresh lifecycle. Token-authenticated Jira can comment, transition display status, or close through the pinned guarded client after a separate exact confirmation. Jira SSO-cookie writes remain zero-wire refusals. Jira Align supports local reviewed refresh and truthfully declares remote write-back unavailable.
Changed
Section titled “Changed”- Existing token-authenticated Jira writes retain their configured transient failure retry budget. The reviewed refresh path temporarily enables the guarded write policy only after its pending receipt is durable, then restores the read-only policy; SSO-cookie writes remain refused before transport.
- Running the activation evals no longer writes into the repository you are
measuring.
agentbundle pack evals runprojected the pack into a directory inside your repository and ran each probe from there, so a skill that resolves the repository root could create files in your tree — one negative eval query fired a spec-authoring skill and left a spec at the worktree root, which then read as workspace drift with no author. The projection now lives in a temporary directory outside the repository and is removed when the run ends, and the run refuses outright ifTMPDIRpoints inside the repository rather than silently losing the confinement. Eval outputs still land in.eval-workspace/, unchanged. Probes also no longer pause three seconds each waiting on standard input.
- Journey authors can record which decisions a reader meets, and in what
order. A pack’s
JOURNEY.mdmay now carry an optionalcontract.decisionGateIds— an ordered list ofhumanGates[].idvalues. It holds identifiers only; the wording readers see still comes from each gate’s label. The field is optional andyourDecisionsremains required, so every pack authored before this stays valid with no edit.
Removed
Section titled “Removed”- The
update-conventionsskill is gone. Asking to “update the rules”, “amend the charter”, or “change our principles” now reachesnew-rfc, which tells you which artifact the change actually needs — usually a plain pull request. What the skill carried: a rule that every substantive conventions edit needed an RFC, which no longer holds; a commit-footer convention, already covered by the conventions’ § Commits footer-references rule; a typo exemption, now subsumed by the routing rules; and a nudge to update an accepted RFC’s follow-on-artifacts list after merge, which is no longer prompted for (RFC-0091).
Changed
Section titled “Changed”- Keyboard focus is visible everywhere on the marketing site, not just in the dark bands. The focus outline used a gold that was too faint against light backgrounds, so on most pages the ring around the control you had tabbed to was hard to make out. Light areas now use a near-black outline; the dark bands keep the gold, which was already clearly visible there.
- You no longer need an RFC just because a change is big. What opens an RFC is
now an unresolved direction that more than one owner has to agree on, or someone
asking to circulate a proposal. Touching several packages, changing something
users can see, renaming a top-level directory, or editing
docs/CONVENTIONS.mdraises how carefully the change is reviewed — none of them, on its own, requires a proposal any more. Charter mission and scope, who may approve work, security trust models, and breaking a published compatibility promise are still reserved (RFC-0091). - A decision you have already made goes straight into an ADR. Reversing an earlier ADR when you already know the replacement is a superseding ADR, not a proposal for comment. Behaviour-preserving refactors, dependency upgrades and bug fixes are pull requests; a bounded feature whose direction is settled is a spec (RFC-0091).
- A light RFC is now genuinely lighter.
lightmeans one focused decision, a completeness check and a single review pass — not the full apparatus over a shorter draft. Citation and claim checking still apply at every weight, to whatever the proposal actually claims (RFC-0091). - Governance advice now works in a repository that has no RFC process. If you
installed
corewithout the optional governance pack, the conventions no longer tell you to run a workflow you do not have: reserved and contested decisions ask for a recorded owner decision using whatever mechanism you already use. No new file, pack or configuration is required, and a stricter local rule of your own still wins (RFC-0091). - The example session on a journey page now reads as a session. Each turn is attributed to whoever spoke it and sits on its own line in a terminal-style register, instead of running together in one paragraph with stray asterisks and backticks showing. The wording is unchanged.
- Keyboard focus on a journey decision is easier to see. Focusing a decision no longer makes its label harder to read than the ones beside it, and the heading you land on after activating one now takes the same clearly visible outline the decision itself uses.
- Every decision point on a journey page is now a link you can share. Each place the agent pauses for you has a stable address, so you can send someone straight to the decision itself rather than to the top of the page. The links survive rewording and reordering: if a decision is renamed or moved, an address you shared earlier still lands on the same decision. They also work from the keyboard — tab to a decision, press Enter, and the page moves focus to it.
- Decision labels read as plain language. They describe what you are being asked to do — “Approve the plan”, “Confirm the backlog scope” — instead of exposing internal codes. No page shows an internal identifier as visible text.
- The core, product engineering, and release engineering journeys open with a one-line summary and a worked example. Each shows an abbreviated session so you can see the shape of the exchange, and where your decisions fall in it, before committing to the journey.
[core][2.9.5] — 2026-08-19
Section titled “[core][2.9.5] — 2026-08-19”Changed
Section titled “Changed”- PR size guidance no longer asks you to split ordinary changes. The old target of roughly 100 changed lines, with a split above roughly 400, is replaced by a single tail trigger: a change is examined once it exceeds 2,000 reviewable behavior and test lines. Below that, size the change by whether it is one reviewable idea, not by a line count. Documentation prose is sized by coherence and is never split on length.
- A large change is now routed by its shape rather than sliced by length. A broad mechanical sweep is proved with the command that produced it and a zero-diff re-run, not broken into arbitrary parts. Concentrated authored work is decomposed into dependency-ordered layers that each leave the repository working.
- Mechanical ride-alongs are admitted by verifiability, not by locality. Work reproducible from a stated command, or provably inert, may now land with the change that occasions it even when it spans the repository, so routine cleanup stops accumulating as deferred backlog. Hand-made ride-alongs keep their existing same-area and size limits, and every tier still fails closed on a design call or a behavior change.
[core][2.9.4] — 2026-08-19
Section titled “[core][2.9.4] — 2026-08-19”Changed
Section titled “Changed”- Privacy obligations restored. Seed conventions again prohibit personal identifiers in all git artifacts, preserve the public-handle carve-out, and direct root guidance to the canonical privacy policy.
- Risk-trigger documentation is explicitly single-sourced. ADR-0088 records
the
work-loopskill as the sole block home without changing mode selection.
[core][2.9.2] — 2026-08-19
Section titled “[core][2.9.2] — 2026-08-19”Changed
Section titled “Changed”- Leaner seeded instructions. Core’s seed
AGENTS.mdand seeddocs/CONVENTIONS.mdnow start repositories with a map and universal invariants rather than a manual. - Risk triggers have one home. The enumerated set now lives only in the
work-loopskill, which the seed names instead of copying. Mode selection is unchanged: the same triggers select the same light/full behaviour; only the documentation home moved. - Portable seed references. Vendor-specific
.claude/...projection paths were removed from seed conventions, so guidance does not assume one adapter. - Eval artifacts stay uncommitted. The seed
.gitignorenow excludes.eval-workspace/produced byagentbundle pack evals run.
[agentbundle][0.38.2] — 2026-08-19
Section titled “[agentbundle][0.38.2] — 2026-08-19”- Optional journey decision-gate identifiers.
JOURNEY.mdmay list orderedcontract.decisionGateIdsfromhumanGates[].id; labels remain reader-facing,yourDecisionsremains required, and existing packs stay valid unedited. This shipped after the 0.38.1 tag and reaches PyPI here for the first time.
Changed
Section titled “Changed”- Leaner bundled authoring scaffold.
packs/AGENTS.mdandprofiles/AGENTS.mdare shorter and restructured, soagentbundle catalogue initstarts catalogues with leaner instructions. No CLI verb, flag, or output format changed.
[core][2.9.1] — 2026-08-19
Section titled “[core][2.9.1] — 2026-08-19”docs/CONVENTIONS.mdnow states the managed-generated-output rules. A compiler that owns a directory end to end has constraints a reader could previously only discover by tripping them: author the source rather than the output, keep hand-authored files out of a managed directory, treat check mode as the gate and write mode as the authoring step, and treat retargeting as a rename rather than a deletion. Each rule is one the OKF pilot learned the hard way.
[core][2.9.0] — 2026-08-18
Section titled “[core][2.9.0] — 2026-08-18”- Security reviewers can again select their boundary-specific depth. The
security-checklistsrouter again maps each trust boundary to its direct reference module, including the standards anchor and thetool/hybrid/reasondelegation guidance. Its compiled reference companion remains independently verifiable without owning the production router.
[catalogue-curation][0.4.0] — 2026-08-18
Section titled “[catalogue-curation][0.4.0] — 2026-08-18”Changed
Section titled “Changed”- OKF router renames can hand their former router back to authors safely.
The compiler cedes only an explicitly marked, non-generated former
SKILL.md; it continues to verify and remove every other stale generated file before writing the new managed directory. The migration is manifest-driven and applies to every pack and corpus alike.
-
Every site release is now checked in a real browser before it can deploy. Eight marketing routes and two documentation routes are exercised at five phone and desktop widths — both documentation themes — and a release cannot publish if any page scrolls sideways, reports a serious accessibility failure, breaks a keyboard path, or has a link pointing at a heading that does not exist.
-
A new
/now/page lists what has actually shipped. It is built from the optionalHighlightsblock of released changelog entries, so an outcome reaches the public site only by being written into a release and passing ordinary review. Each entry links back to the release notes it came from. Work still in progress never appears.
Removed
Section titled “Removed”- The public
/work/index is gone. It exposed internal delivery state — queues, blocked items, upstream context — to anyone visiting the site./now/replaces it with released outcomes. There is no redirect: the old address returns a 404 rather than implying the surface moved.Workin the site navigation is nowNow.
[desk-research][1.1.5] — 2026-08-18
Section titled “[desk-research][1.1.5] — 2026-08-18”Changed
Section titled “Changed”- Completed research can optionally hand reusable practice to project knowledge without merging the two systems. Repository-contained standard, applied, and deep surveys and complete project synthesis expose exact terminal handoffs for typed capture and same-gate receipt distillation. Quick answers, non-survey artifacts, project start, digest, check, status, incomplete work, and personal or external output roots remain no-integration.
- Counter-evidence review may consult bounded, untrusted candidate checks.
devils-advocatemay declare oneCQ-REVIEWenquiry, but direct sources still own verification. Retrieved knowledge cannot become a citation or claim, change scope or source selection, strengthen confidence, suppress counter-evidence, alter a verdict, or create fallback persistence.
[agentbundle][0.38.1] — 2026-08-18
Section titled “[agentbundle][0.38.1] — 2026-08-18”- Windows runners now verify knowledge-bundle output instead of being assumed
to. The Windows compat suite ran the adopter-facing pre-PR hook, which
carries no OKF gate, so no Windows runner touched the compiler at all. The
suite gains an
okf compiler checksstage: it re-renders every declared bundle and compares the result against the committed tree, so a Windows-only encoding, path, or ordering difference now fails there instead of reaching main unnoticed.
[agentbundle][0.38.0] — 2026-08-17
Section titled “[agentbundle][0.38.0] — 2026-08-17”agentbundle show <pack> --format jsonnow exposes pre-release rich catalogue discovery metadata. Live catalogue responses add pack metadata, Skill activation metadata, and declared OKF 0.2 knowledge bundles. Installed state continues to return inventory-only data, and human-readable output is unchanged.- Catalogues can publish a deterministic neutral discovery index. The new
agentbundle catalogue indexcommand validates catalogue, pack, profile, and optional journey metadata against a bundled closed schema before writing. It supports dry runs, reproducible timestamps, structured JSON command results, and content-addressable pack digests. - Journey authoring is now a published catalogue convention. The adopter
reference defines the required frontmatter contract, optional discovery
fields, declared external effects, reader-facing body sections, migration
guidance, and verification commands. Older packs without
JOURNEY.mdremain valid.
Changed
Section titled “Changed”- The
agentbundlepackage version is now 0.38.0. Its bundled public contract inventory includescatalogue-index.schema.json, and new catalogue scaffolds carry the completed journey-authoring reference.
[core][2.8.0] — 2026-08-17
Section titled “[core][2.8.0] — 2026-08-17”Changed
Section titled “Changed”security-checklistsnow has canonical OKF source. The security-reviewer depth library is compiled from pack-local OKF into a generated router while retaining the existing direct reference modules for current orchestrator loading.
[catalogue-curation][0.3.0] — 2026-08-17
Section titled “[catalogue-curation][0.3.0] — 2026-08-17”- Catalogue maintainers can compile declared OKF bundles. The new
compile-okfauthoring skill ships a confined script that projects pack-local OKF source into generated router and reviewed procedure Skills, with write and read-only check modes for committed-output drift.
- The Claude-plugin marketplace now advertises the branch it is published to.
catalogue.tomlnamedmainas the plugin branch while every published manifest and all three publish tools useclaude-plugins-dist. Nothing that ships to adopters was affected — the committed.claude-plugin/marketplace.jsonalready advertised the right branch — but a fork that builds its own catalogue from this configuration would have produced a marketplace pointing at a branch that carries no packs, andagentbundle catalogue verifyreported an unfixable generated-output-drift error on any machine with a localdist/. The value is corrected and a parity check now fails if the advertised branch, the branch the publisher pushes to, and the branch the publish ruleset protects ever disagree.
[core][2.7.5] — 2026-08-17
Section titled “[core][2.7.5] — 2026-08-17”Changed
Section titled “Changed”- One work-loop transition is now one Python process.
loop-engine transitionused to start a separate Python interpreter for each read-only guard it runs — run-ID pairing, scheduled-plan currency, approved baselines, retry caps, wave position, artifact status — up to three per transition. Those decisions moved into a shared module the engine and theloop-cohort/check-spec-statuscommands all call, so a transition costs one interpreter startup instead of four and the two surfaces cannot drift into disagreeing about whether a transition is legal. Every command keeps its arguments, exit codes and messages.
-
A broken status parser no longer lets an approval check pass silently. If the canonical parser could not be loaded, the post-approval status check treated the artifact as having no status line and skipped — reporting success for a check that never ran. It now refuses and says why.
-
Unsafe spec or plan files are refused instead of hanging or being trusted. Reads of
spec.mdandplan.mdare size-capped, rejected if the path is not a regular file, and refused rather than followed when it is a symlink. Previously a named pipe in place ofspec.mdcould block a transition indefinitely while it held the state lock. -
Malformed retry counters refuse rather than being silently coerced. A non-integer, negative, or non-finite value in
state.jsonnow produces a one-line refusal; some previously changed the retry arithmetic without comment andInfinitycrashed with a traceback. -
check-spec-status --filetakes a single filename. A multi-segment path that happened to resolve inside the spec directory was previously accepted; it is now refused, because only the final segment of a path can be checked for a symlink.
[core][2.7.4] and [architect][0.14.5] — 2026-08-17
Section titled “[core][2.7.4] and [architect][0.14.5] — 2026-08-17”Changed
Section titled “Changed”- Architecture, adversarial, security, and quality reviews can consult one
bounded project-knowledge envelope without giving it authority. Review
planning declares a consequential
CQ-REVIEWquestion only after the target, structural scope, and governing rubric or checklist are known. Retrieved topics supply candidate checks; every finding remains independently grounded in the current target, review standard, and current canonical sources. - Review knowledge is strictly read-only and degrades visibly. Reviewers never capture or distil scratch, findings, citations, severities, conclusions, or verdicts. Missing project knowledge is a named no-fallback skip; stale, quarantined, irrelevant, privacy-refused, or unverified consequential evidence remains excluded or abstaining. Embedded text cannot change instructions, tools, permissions, scope, severity, verdict, or finding suppression.
[core][2.7.3] — 2026-08-17
Section titled “[core][2.7.3] — 2026-08-17”- A spec’s
Brief:back-link is documented and resolved as a path. The canonical form is the brief’s repository-relative path (docs/product/briefs/<slug>.md) — the form workspace reconciliation requires; a bare slug blocked the spec from being dispatchable. Brief guidance, the brief template, and the adopter field reference now agree on it, and the brief-coverage lint recognises the path form when reporting a spec that back-links a brief but is missing from its Spec map.
[core][2.7.2] — 2026-08-17
Section titled “[core][2.7.2] — 2026-08-17”- Explicitly absent traceability metadata remains absent. The first
rendered pointer field is authoritative, and
nonevalues with explanatory annotations or ordinary punctuation no longer become dangling pointers when a repository adds its first discovery anchor.
[agentbundle][0.37.2] — 2026-08-17
Section titled “[agentbundle][0.37.2] — 2026-08-17”catalogue verifynow performs all 19 advertised checks. Profiles are schema-validated and confined to local pack roots; dependencies are checked for structure, supported ranges, required-pack compatibility, and cycles; adapter declarations are checked against the shipped contract; configured output is compared with a fresh confined build; pack manifests receive a narrow preflight; and skill evaluation manifests are validated without parsing opaque payload files.- External catalogue portability has an end-to-end regression fixture. A synthetic two-pack catalogue verifies successfully through the real CLI, including a portable seed that discusses this repository by name.
Changed
Section titled “Changed”- Dependency range semantics now agree across verify, lint, and install.
Caret, tilde, comparator, compound, and prerelease forms use one
dependency-free npm-compatible parser. Below
1.0.0, caret ranges keep their normal semver meaning, so^0.2no longer accepts0.3.x. - Host-only catalogue policy moved out of the distributable verifier. Seed and APM leak checks specific to this repository now run from the local build gate, so external catalogues are not rejected for host vocabulary.
- Verifier help and adopter documentation now consistently describe a 19-step pipeline.
- Malformed catalogue configuration now returns a bounded, redacted diagnostic instead of leaking exception text. The existing optional-PyYAML guard remains a structured warning and now has explicit regression coverage.
[figma][0.3.2] — 2026-08-17
Section titled “[figma][0.3.2] — 2026-08-17”- Figma now declares the credential-brokers minor it actually supports.
Dependency validation no longer relies on treating
^0.2as compatible with0.3.x.
[linear][0.2.4] — 2026-08-17
Section titled “[linear][0.2.4] — 2026-08-17”- Linear now declares the credential-brokers minor it actually supports.
Dependency validation no longer relies on treating
^0.2as compatible with0.3.x.
[iac-terraform][0.1.7] — 2026-08-17
Section titled “[iac-terraform][0.1.7] — 2026-08-17”- IaC Terraform now declares the governance-extras minor it actually supports.
Dependency validation no longer relies on treating
^0.6as compatible with0.9.x.
[core][2.7.1] — 2026-08-17
Section titled “[core][2.7.1] — 2026-08-17”-
Core 2.7 adds one front door for starting and remembering work. Describe the request to
work-intake; it selects an intent, brief, spec, or defect route from the content, materializes the artifact, registers lifecycle state, and dispatches only when both writes are durable. Status remains read-only, ambiguous work remains Draft, and requirements refresh reports unavailable without mutation. -
Core’s public guides now explain artifact routing and lifecycle. A new task guide, reference, and explanation cover the natural-language entry point, exact route table, read/write boundary, and the human decisions that remain outside automatic dispatch.
Changed
Section titled “Changed”-
P5 adoption now uses work intake and canonical workspace status. Standalone Project records are retired from current doctrine and templates; initiative work, briefs, shaping, and backlog remain the source model surfaced by
workspace-status. A static, read-only/work/index now presents those classifications, and an enterprise rollout playbook guides pilot, wave, and organization-wide adoption without adding another creation workflow. -
capture-workis now a compatibility alias forwork-intake. Existing requests receive a deprecation notice and produce the same target artifact and workspace entry; new guidance useswork-intakedirectly. A Ready brief may now contain zero specs, andreceive-briefcreates specs only for slices a human confirms.
- Remembered work now registers valid source provenance. Normalized source
locators are mapped to the workspace entry’s
source.reffield, so Draft intents reconcile cleanly instead of producinginvalid_entry. - Fresh core installs no longer link to missing maintainer guidance. The
composed
AGENTS.mdtreatsAGENTS.local.mdas optional and contains no dangling relative link when that host-only file is absent.
- Documentation pages no longer show two titles. 38 of 216 published pages rendered the frontmatter title and the body heading stacked on top of each other, usually with different wording — “Run an Audit” above “How-to: Run a frontend-engineering audit”. Pages now show one title, and a new check keeps the two in step so they cannot drift apart again.
- Wide tables in the documentation can be scrolled with the keyboard. A table wider than the page scrolled horizontally but could not be reached without a mouse, and screen readers announced every one of them identically. Each now takes focus and is named after the section it belongs to.
- The marketing home page no longer scrolls sideways on a phone. The adapter comparison table pushed the page 114 px wider than the screen at common phone widths.
- The install panel’s “Copy install commands” button is legible. It was rendering in the light-theme palette on the dark terminal, below the readable-contrast floor.
Changed
Section titled “Changed”- Four guide titles now name the job they do. “Write a Page/Screen Contract” is “Write a page or screen contract”, “Run an Audit” is “Run a frontend audit”, “Scaffold a Component” is “Scaffold a component from a screen brief”, and the Terraform pack’s guide index is “Terraform and OpenTofu guides” — which is accurate, since those guides have always covered both engines. Every page keeps its existing address, so links and bookmarks still work; only the wording on the page, in the sidebar, and in the browser tab changes.
- Guide callouts now say what kind of attention they need. Supporting context, optional techniques, pitfalls, and severe hazards render as typed notes, tips, cautions, and dangers with visible labels and icons. Prompts, transcripts, sample output, and other exact quoted wording remain blockquotes.
- Briefs, RFCs, ADRs, specs, and plans can hand reusable supporting lessons to project knowledge at exact stable gates. Draft, incomplete, rejected, or abandoned authoring work does not capture. Normative content remains in its owning artifact; missing project knowledge creates no fallback file; terminal distillation is limited to receipts returned by the same gate; and optional enquiry requires a declared competency question and remains bounded untrusted evidence. Core is now 2.7.1 and governance-extras is now 0.9.7.
- Documentation now keeps readers oriented from entry to exit. The docs home leads with one clear starting point and described outcome cards; guide pages restore previous/next navigation from the published sidebar order; and page titles now carry a semantic breadcrumb trail instead of a detached link away from the docs.
- A live-demo guide now maps three roles through one coherent problem space. Peer champions can run a 30-minute repository demonstration using Core’s direct technical path, Core’s structured enterprise handoff, or user-scoped Product Engineering shaping followed by a visible Core delivery handoff.
- Published-site links are checked after rendering. The complete marketing and technical-docs build now refuses publication when an internal page or fragment target is missing. Existing broken guide, pack, and component-demo targets have been repaired at their authored sources or owning projection rules.
- Documentation pages carry a one-line summary under the title. The
summaryeach guide already declared now reaches the page — as the visible standfirst, the search-result snippet, and the link-preview description. - Documentation prose is calmer to read. Inline code is no longer tinted in the accent colour, so paragraphs and reference tables that name files and commands read as prose instead of a field of coloured chips.
- The marketing hero fits a phone screen. The headline and intro were taking more than a full screen, pushing the main action out of sight; it is now visible without scrolling. The secondary action reads as a link rather than a second equally-weighted button.
- The site footer carries labelled columns (Product, Docs, Project) instead of three links, and the mobile navigation drawer rows are full-width, properly sized touch targets.
- Nine guides had their heading reconciled with their title. Where the two disagreed, the title now wins; the wording of those nine is queued for a follow-up editorial pass.
- Published guides no longer point at records you can’t read. Guide pages
across the
_shared,core,atlassian,credential-brokers,governance-extras, andproduct-documentationtrees cited this repository’s own decision records and specs, so those links went nowhere for anyone reading the published guides. The citations are gone and the surrounding explanation stays; generic guidance like “record an ADR”,<feature>placeholders, and documented commands are untouched. References pointing readers at the retireduser-guide-diataxisguide tree now point atproduct-documentation, which supersedes it. - Some guide sidebar labels changed. Nineteen pages gained the frontmatter the guide site reads. For the sixteen that previously carried a shorter hand-written navigation label, the sidebar now shows the page’s own title instead — “Adapt to Project” now reads “How to adapt a freshly installed pack to your project”. No page moved and no link changed. No pack version changes.
[atlassian][0.8.4], [linear][0.2.3], [github][0.1.4] — 2026-08-16
Section titled “[atlassian][0.8.4], [linear][0.2.3], [github][0.1.4] — 2026-08-16”Changed
Section titled “Changed”- Tracker intake now uses one content-based repository route. Jira, Jira
Align, Linear, and GitHub emit the same bounded normalized contract and hand
it to
work-intake. Equivalent content selects the same intent, brief, spec, defect, processor, lifecycle membership, and authority regardless of tracker object names. - Tracker intake is read-only and explicitly bounded. Versioned profiles declare destination policy, pagination, item and byte caps, timeouts, retries, and backoff. Unsafe destinations, malformed input, missing provenance, unknown profiles, embedded instructions, and confidentiality mismatches stop before repository writes.
- GitHub Milestones are no longer assumed to be briefs. GitHub uses trusted
fixed-host, shell-free
ghreads and delegates classification towork-intake; the intake path no longer comments, labels, closes, or edits Issues.
- Shared tracker guidance now explains the common route and vocabulary. Updated Jira, Linear, GitHub, selection, reference, and journey pages show the tracker read boundary, the repository write boundary, and the human decisions that remain before materialization.
[agentbundle][0.37.1] — 2026-08-16
Section titled “[agentbundle][0.37.1] — 2026-08-16”Changed
Section titled “Changed”- New catalogue scaffolds explain when guide content is a quotation and when
it needs a labelled callout. Exact quoted wording stays a blockquote;
supporting context, optional techniques, pitfalls, and severe hazards use
note,tip,caution, ordanger. Existing catalogues keep their current authoring reference until they refresh the scaffold.
[agentbundle][0.37.0] — 2026-08-16
Section titled “[agentbundle][0.37.0] — 2026-08-16”Changed
Section titled “Changed”- A local-scope install now stops rather than quietly taking over a file that is not its own. It refuses when a target is already committed to git, when a file is sitting there that no install created, or when another installed pack already owns that path — and it stops before writing anything, so a refusal leaves your tree untouched. This protects the promise local scope makes: uninstalling puts everything back exactly as it was. Reinstalling over files it already owns still works as before.
[agentbundle][0.36.2] — 2026-08-16
Section titled “[agentbundle][0.36.2] — 2026-08-16”- A single stray file could hang every command that records installed packs,
and burn a CPU core doing it. If something left a broken shortcut where the
lock file belongs,
agentbundlespun forever instead of timing out. It now refuses that file straight away and tells you to remove it. Also fixed two narrower races where a command could delete another command’s lock and let both write at once.
[agentbundle][0.36.1] — 2026-08-16
Section titled “[agentbundle][0.36.1] — 2026-08-16”- Security: installing a pack can no longer copy a file from outside that pack
onto your machine. A pack could include a shortcut pointing anywhere on the
build host —
/etc/passwd, a key file — and the installer followed it and wrote the contents into your project under an innocuous-looking filename. It now refuses to follow such shortcuts at every point they could be created or read. Packs in this catalogue contain none, so nothing you install changes.
[agentbundle][0.36.0] — 2026-08-16
Section titled “[agentbundle][0.36.0] — 2026-08-16”catalogue lintnow actually checks your pack manifests — the same defect 0.35.3 fixed incatalogue verify, in the other tool. Three checks (is the manifest valid JSON, does it declare a name and version, do those matchpack.toml) looked for it at the top of each pack folder while packs keep it in.claude-plugin/. They never found it, so they never ran.agentbundle list-targets --helpnames every editor it supports. It listed six and left out Cursor and Gemini.- Upgrading: a catalogue that linted clean on 0.35.3 may now report
CAT-L007, CAT-L008, or CAT-L009. Each is a real defect that was previously
invisible — a manifest that will not parse, one missing its name or version, or
a
pack.tomlandplugin.jsonthat disagree. A pack with no manifest at all is still fine, and every pack shipped here passes unchanged.
-
catalogue init --format jsonreports what to do next. The self-hosted version of the command already returned anext_stepslist; the plain one printed the same guidance to the screen but left it out of the JSON, so a script driving one command got it and a script driving the other did not. -
The project-knowledge capture contract ships with AgentBundle.
agentbundle catalogue contracts listnow includes the strictknowledge-captured-observation.schema.jsoncontract for offline reference.
Changed
Section titled “Changed”- Breaking, for callers of the Python API:
render_packs_to_dir()now requires you to say which scope you are rendering. It assumed you were rendering a whole catalogue, so rendering a subset printed exclusion notices that only make sense for a full build. Passaggregate_scope="catalogue"for the previous behaviour. The command line is unaffected.
[core][2.6.0] — 2026-08-15
Section titled “[core][2.6.0] — 2026-08-15”- Project knowledge now has an explicit lifecycle. The new
project-knowledgeskill captures strict observations, distills them into reviewed topics, and answers explicit enquiries from committed active topics only. Observation journals are durable handoff records, not an automatic memory source; retrieved topic text is bounded evidence and never grants authority.
[agentbundle][0.35.3] — 2026-08-15
Section titled “[agentbundle][0.35.3] — 2026-08-15”catalogue verifynow actually checks your pack manifests. Two of its checks looked forplugin.jsonat the top of each pack folder, but packs keep it in.claude-plugin/. They never found it, so they never ran: a pack whosepack.tomlandplugin.jsondisagreed on name or version passed verification, and so did a manifest that was corrupt or filed in the wrong place. Both checks now read the right location.- Upgrading: a catalogue that passed on 0.35.2 may now report CAT-V-004 or
CAT-V-005. Each one is a real defect that was previously invisible — a manifest
sitting at the pack root instead of in
.claude-plugin/, a manifest that will not parse, or apack.tomlandplugin.jsonthat disagree. A pack with no manifest at all is still fine.
[agentbundle][0.35.2] — 2026-08-14
Section titled “[agentbundle][0.35.2] — 2026-08-14”- The certificate-setup command shown on a trust failure can now be pasted as
is. It previously printed
Python 3.xas a placeholder, leaving the adopter to work out their own version first. It now names the actual version, and is left out altogether when that setup script is not present on the machine.
[agentbundle][0.35.1] — 2026-08-14
Section titled “[agentbundle][0.35.1] — 2026-08-14”-
Installing on Windows no longer fails with “seeking backwards is not allowed”. A catalogue contains symlinks, and Windows will not create them without Developer Mode enabled. Python’s tar reader then falls back to copying what the link points at, which it could not do while reading the download as a one-pass stream. The download is now buffered before extraction, so the link becomes a copy of its target and the install completes. macOS and Linux were never affected. This was never a certificate problem, though it surfaced alongside one.
-
An install now recovers when Python trusts no certificate authority at all. A python.org macOS interpreter ships without a configured certificate store — until its
Install Certificates.commandruns it trusts zero authorities, and every HTTPS request fails whether or not your network inspects traffic. The previous release read this as a probable corporate proxy, which sent the first affected adopter after a cause that did not exist, and its recovery could not help because the administrator keychain holds private roots and cannot complete a public certificate chain.agentbundlenow recognises an empty trust store, says so plainly, offers the one-command interpreter fix first, and repairs the case automatically on macOS by also reading Apple’s root program. Nothing changes for an interpreter with a working store.
[agentbundle][0.35.0] — 2026-08-14
Section titled “[agentbundle][0.35.0] — 2026-08-14”agentbundle installnow recovers on corporate networks that inspect TLS. On a network where a proxy re-signs HTTPS traffic with a private certificate authority, a catalogue fetch failed withCERTIFICATE_VERIFY_FAILED: unable to get local issuer certificate, because the authority is installed in the operating system’s trust store and Python reads its own certificate file instead. On macOS,agentbundlenow retries once against the administrator-controlled trust anchors the operating system already provides, and says so on stderr. Verification stays strict throughout: the retry adds trust anchors, never removes one, and no flag or variable disables verification. One caveat stated plainly: macOS lets an administrator mark a certificate Never Trust, and this fallback does not read those markings, so such a certificate is still used as an anchor — bounded to a keychain only an administrator can write. The login keychain is never read. SetAGENTBUNDLE_NO_SYSTEM_TRUST=1to opt out. Windows needs no fallback — Python already loads the Windows certificate store, honouring per-certificate trust settings — and Linux needs none provided the authority is installed in/etc/ssl/certs. A WSL distribution does not inherit the Windows store; install the authority into the distribution or setAGENTBUNDLE_CA_BUNDLE.AGENTBUNDLE_NO_SYSTEM_TRUST— opt out of the fallback above.
AGENTBUNDLE_CA_BUNDLEnow works ongit+https://catalogue sources. The reference documentation described it as covering HTTPS catalogue sources, but only thecatalogue+https://andarchive+https://paths read it — thegit+https://path ignored it entirely, so adopters who followed the documentation still could not install.SSL_CERT_FILE,SSL_CERT_DIR, andREQUESTS_CA_BUNDLEare honoured there too, withAGENTBUNDLE_CA_BUNDLEtaking precedence. Note the semantics differ by source form and this is now documented:git+https://adds your bundle to the default trust store, whilecatalogue+https://andarchive+https://replace it.- A catalogue fetch can no longer hang indefinitely. The request now carries an explicit 30-second timeout, so a proxy that accepts the connection and never answers fails instead of stalling.
- A failed catalogue fetch explains what to do next. The error previously surfaced only the raw OpenSSL string; it now names the probable cause and gives ordered troubleshooting steps.
Changed
Section titled “Changed”- Setting
AGENTBUNDLE_CA_BUNDLEto a path that does not exist now fails agit+https://install that previously succeeded. The variable was ignored on that path before, so a fleet-wide export pointing at a file absent on this host was harmless; it now raises before any connection is made. Unset it, or correct the path.
[agentbundle][0.34.0] — 2026-08-12
Section titled “[agentbundle][0.34.0] — 2026-08-12”- Bundled contracts are available offline from the CLI.
agentbundle catalogue contracts list,show, andexportenumerate, inspect, or copy the exact public contracts shipped with the running version. Exported files are reference copies and do not change validation behavior. - New catalogues point authors to their next checks. Successful plain
catalogue initoutput now identifies the scaffolded authoring standards guide, bundled-contract discovery command, and catalogue verification. JSON output remains unchanged.
Changed
Section titled “Changed”- The authoring standards reference documents bundled contract inspection. Section 12 records the offline commands and their read/write boundary, and the same section ships in the initialization scaffold.
[core][2.5.9] — 2026-08-12
Section titled “[core][2.5.9] — 2026-08-12”Changed
Section titled “Changed”- Work-loop captures more than speed improvements. Its closeout review now asks whether a reusable learning would have improved correctness, reliability, security, determinism, operability, maintainability, efficiency, or independence from hidden context. Speed remains one signal, not the objective.
- Repository knowledge has a lifecycle architecture. Maintainers now have a concept-first reference for shared candidate capture, topic distillation, file-based canonical storage, explicit safe enquiry, freshness, and optional cross-project promotion. Normal session start continues to leave captured observations out of model context.
[agentbundle][0.33.3] — 2026-08-12
Section titled “[agentbundle][0.33.3] — 2026-08-12”Changed
Section titled “Changed”- AgentBundle and CredBroker Windows checks now run in parallel. The AgentBundle compatibility command keeps the engine and pack portability checks, while CredBroker’s package suite runs in its own Windows CI job. The existing aggregate check remains blocking on both suites.
- Self-host writes now work across checkout ownership boundaries.
catalogue self-host --writeupdates writable existing seed and adapter files without attempting owner-only timestamp or mode changes, preserving their inode, ownership, and mode.--checkstill reports mode drift that the writer cannot repair.
[agentbundle][0.33.2] — 2026-08-12
Section titled “[agentbundle][0.33.2] — 2026-08-12”- Workspace MCP status uses the canonical routing result. The public MCP status surface now denies malformed workspace state with sanitized findings and exposes only canonical dispatchable queue work as ready.
[core][2.5.8] — 2026-08-12
Section titled “[core][2.5.8] — 2026-08-12”Changed
Section titled “Changed”- Workspace status now publishes canonical routing findings and receipt rules. The workspace reference and status skill document every canonical finding, safe recovery action, cross-repository coordination receipt block, and invalid receipt recovery path.
- Workspace repair preserves structured queue entries when moving shipped
work.
repair-applynow carries the retained inline TOML entry into[work].shippedinstead of replacing it with a bare path, while keeping fingerprint, confinement, atomic write, and comment-preservation checks.
[core][2.5.7] — 2026-08-11
Section titled “[core][2.5.7] — 2026-08-11”- Core filesystem readers now fail closed on traversal and symlink escapes. Spec-status and traceability checks confine repository-derived probes before use; work-loop state and pending-event JSON is bounded and read through a verified regular-file descriptor; event-log creation refuses links and identity changes and creates owner-only files; and knowledge appends use the shared no-follow state lock. Intentional operator-selected scan roots remain valid.
[core][2.5.6] — 2026-08-11
Section titled “[core][2.5.6] — 2026-08-11”- Core conventions no longer send adopters to catalogue-only files. The credential-broker rule now states its four supported ids without linking to this catalogue’s decision records, and maintainer hook guidance no longer points adopters to a README that is absent from the installed pack.
[atlassian][0.8.3] — 2026-08-11
Section titled “[atlassian][0.8.3] — 2026-08-11”- Jira, Jira Align, Confluence Publisher, and Confluence Crawler now resolve installed scripts before interpreting exit codes. Each skill confines and preflights its regular-file entry point under the installed skill directory, then launches it as one argument while keeping project-relative content paths unchanged. A missing or escaping script is reported as an installation or invocation failure instead of missing credentials. Headed Jira and Confluence SSO capture remains a command for the operator to run; automatic recovery remains headless.
[figma][0.3.1] — 2026-08-11
Section titled “[figma][0.3.1] — 2026-08-11”- Figma script resolution can no longer masquerade as a credential or scope
failure. The skill validates and confines its installed
figma.pybefore launch, uses an argument-safe resolved path, and reports entry-point failures without credential, token, re-authentication, or scope guidance.
[linear][0.2.2] — 2026-08-11
Section titled “[linear][0.2.2] — 2026-08-11”- Linear now distinguishes an unavailable installed client from exit 2. The
primitive resolves and preflights
linear.pybefore launch, preserving its existing credential behavior only for a script that actually ran. The pack also registers activation coverage forlinear,linear-brief-intake, andlinear-brief-sync, plus primitive behavior coverage for the corrected path.
[converters][0.9.5] — 2026-08-11
Section titled “[converters][0.9.5] — 2026-08-11”- Mermaid Renderer and Markdown to HTML now launch their installed renderer entry points from project-root sessions. Both skills use confined resolved paths, including eval and script-emitted usage surfaces. Missing scripts no longer produce false Mermaid CLI or Node-package guidance; the renderers’ existing exit meanings and content-path behavior are unchanged.
[credential-brokers][0.3.2] — 2026-08-10
Section titled “[credential-brokers][0.3.2] — 2026-08-10”- Concurrent first use of an SSO profile no longer fails spuriously on Windows. The broker now establishes its fixed lock directory before validating the profile’s lockfile path, so simultaneous first-use operations cannot make Windows path canonicalisation look like a confinement escape. Traversal and wrong-parent paths remain rejected before a lockfile is opened.
[core][2.5.5] — 2026-08-10
Section titled “[core][2.5.5] — 2026-08-10”- Workspace status now shows the complete repository backlog.
Both
statusandreconcileexpose an orderedrepo_backlog.opendisplay contract, so legacy untyped build entries no longer disappear when the shaping guard’s intentionally typed-only backlog is empty. The rendered Backlog section labels build and shaping work separately, preserves explicit dependencies and summaries, supports target path-based entries, and remains absent for an empty repository backlog.
[atlassian][0.8.2] — 2026-08-10
Section titled “[atlassian][0.8.2] — 2026-08-10”Changed
Section titled “Changed”-
Confluence SSO checks recover one unavailable stored session automatically.
confluence-crawler --checknow verifies the stored cookie session, asks CredBroker to refresh its registered profile once when that specific session is unavailable, and verifies the refreshed session with one new probe. The disclosure states that recovery is headless, shows no browser window, and takes its destination from the registered profile.Permission, configuration, cookie-confinement, dependency, TLS, transport, timeout, and server failures never trigger recovery. Crawls and token-based authentication keep their existing behavior. When automatic recovery cannot proceed, the error tells the user which existing manual setup action to run.
[core][2.5.1] — 2026-08-09
Section titled “[core][2.5.1] — 2026-08-09”Changed
Section titled “Changed”- Core now publishes the target workspace index contract. The workspace reference, starter seed, and initialization text describe the five-field target entry shape, lifecycle collections, source provenance, typed hard dependencies, legacy compatibility limits, path confinement, and strict JSON/TOML encoding expectations.
-
Concurrent SSO operations on one profile no longer corrupt its cookie jar. Two agent turns touching the same profile at once — a
jira checkresolving cookies while a prior turn’s recapture is still committing — could previously leave a jar assembled from both, or none at all. Each profile’s store transition is now serialised behind an exclusive interprocess lock, so a reader always sees one whole jar.When a profile is busy, commands exit
6andcredbrokerraisesSsoStoreContendedErrorrather than waiting indefinitely or reporting a false expiry. Every wait is bounded well inside the caller’s timeout.
Changed
Section titled “Changed”-
The Claude plugin marketplace now carries only packs you can install at user scope. Claude plugins install into a global cache, not into your repository, so packs designed to live inside a repo —
core,governance-extras,iac-terraform,monorepo-extras,release-engineering,user-guide-diataxis— are no longer offered there. Install them withagentbundle installinstead; that is the route they were always built for.catalogue-curationmakes seven: it was never published to the plugin branch, but it was still listed at the repository-root marketplace thatclaude plugin marketplace addresolves — a listing that could only ever fail to fetch. That entry is gone too.Already installed one as a plugin? Run
claude plugin uninstall <pack>@agent-ready-repo, then install at repo scope withagentbundle install. Verified against Claude Code 2.1.223: once your client refreshes the marketplace, a delisted plugin shows asfailed to loadandclaude plugin updaterefuses it. Until it refreshes, the cached copy keeps loading — so uninstall rather than wait.The pack pages and the catalogue on the site now show the plugin command only where it applies.
-
Every pack now says what it is for in its first sentence. Pack descriptions are what you read in a marketplace browser while deciding whether to install, and ours had drifted into component inventories —
coreopened with a list of thirteen skill names, and the longest ran to 1122 characters against a 177-character median in the marketplace we are listed alongside.All 22 now lead with the job you accomplish: “Supervised coding from brief to merged PR”, “Run Jira and Confluence from a conversation”, “Validate a release the way production will”. Median length drops from 227 characters to 188, the longest from 1122 to 263. Cross-pack references, internal file paths, and framework name-drops are gone; what each pack contains still follows, just after the point rather than instead of it.
Nothing about a pack’s behaviour changed, and no skill or agent description was touched — those drive activation and are a different contract. Five packs (
architect,contracts,core,experience-design,product-strategy) also had descriptions that disagreed between their manifest and the marketplace listing; all three copies now match.
-
A written standard for pack descriptions.
catalogue-authoring-standards.md§ 2 now says what a[pack].descriptionis for — display copy a person reads while deciding whether to install — and names the anti-patterns that made ours drift: component-inventory openings, repo-insider vocabulary, cross-pack references, framework name-drops, and internal paths. It also separates this field from a skill’s description, which the model reads to decide activation and where length is load-bearing.tools/lint-pack-descriptions.pybacks it with a deliberately loose 800-char drift backstop — enough to stop another 1122-character entry, not enough to adjudicate style, because a length check cannot tell good copy from bad. It is a repository policy lint, not a packaged one:pack.schema.jsonand the packaged pack lint both run against adopter catalogues, so a rule in either would turn this catalogue’s house style into someone else’s build break.
[governance-extras][0.9.7] — 2026-08-16
Section titled “[governance-extras][0.9.7] — 2026-08-16”Highlights
Section titled “Highlights”- Writing an RFC or an ADR now files its reusable lessons for you, and only once the decision is actually settled. Supporting lessons are handed to project knowledge at clean handoff and accepted-decision points, so a draft you abandon leaves nothing behind. If project knowledge is not installed, authoring proceeds unchanged and writes no stand-in file.
Changed
Section titled “Changed”- RFC and ADR authoring now hand reusable supporting lessons to project knowledge only at clean handoff and accepted-decision gates. Missing project knowledge leaves no fallback file, and enquiry remains an explicit, bounded, untrusted-evidence step.
[core][2.5.5] — 2026-08-10
Section titled “[core][2.5.5] — 2026-08-10”-
Concurrent work-loop mutations no longer lose an update during lock creation. A contender could observe the live creator’s lockfile after its exclusive creation but before its ownership record was written, mistake that fresh empty file for crash residue, and reclaim it immediately. Two writers could then enter one critical section; one would report success before discovering its lost lock, while the final state omitted an update. Fresh empty locks now remain occupied until the existing stale-recovery budget expires. Stale empty locks left by a crashed creator are still reclaimed, and no timeout or stale threshold changed.
-
The work-loop concurrency self-test now names its failing case in CI. Its shell wrapper preserves the child suite’s output, concurrency cases prove actual production-lock contention instead of scheduler timing, and hermeticity observes only each child’s throwaway repository.
[experience-design][2.0.1] — 2026-08-10
Section titled “[experience-design][2.0.1] — 2026-08-10”Changed
Section titled “Changed”- All 20 experience-design skills now route natural requests at explicit discipline boundaries. Each activation description names its design output and routes product strategy, product-engineering shaping, and routine frontend implementation away where applicable. The copy path now separates the brand register, surface content structure, acquisition-surface copy goals, and product UI strings without assigning one skill all four jobs.
- Activation evidence and adopter pages use the same routing model. Every skill gains a natural positive and an adjacent-discipline negative fixture. The pack page and guide home now lead with jobs and exits before the complete 20-skill inventory, and the reference mirrors each skill’s trigger, output, and nearest boundary.
[architect][0.14.4] — 2026-08-09
Section titled “[architect][0.14.4] — 2026-08-09”Changed
Section titled “Changed”- Architect’s pack-owned projection, rubric-parity, README, and install-command
tests now travel with the pack instead of the
agentbundleengine suite.
[core][2.5.4] — 2026-08-09
Section titled “[core][2.5.4] — 2026-08-09”Changed
Section titled “Changed”- Core’s workspace-status, seed, README, and install-marker journey tests now travel with the pack that owns those behaviours.
[catalogue-curation][0.2.4] — 2026-08-09
Section titled “[catalogue-curation][0.2.4] — 2026-08-09”Changed
Section titled “Changed”- Catalogue-curation’s removal and retained-content regressions now travel with the pack instead of the engine suite.
[credential-brokers][0.3.1] — 2026-08-09
Section titled “[credential-brokers][0.3.1] — 2026-08-09”Changed
Section titled “Changed”- Credential-brokers now carries its own manifest, install, shim, floor, broker, guide, and vendored-source tests.
[atlassian][0.8.1] — 2026-08-09
Section titled “[atlassian][0.8.1] — 2026-08-09”Changed
Section titled “Changed”- The flow-metrics upstream probe now travels with the Atlassian pack and runs from its skill-owned test directory.
[product-engineering][0.13.4] — 2026-08-09
Section titled “[product-engineering][0.13.4] — 2026-08-09”Changed
Section titled “Changed”- Product-engineering’s README install-command regression now travels with the pack.
[linear][0.2.1] — 2026-08-09
Section titled “[linear][0.2.1] — 2026-08-09”Changed
Section titled “Changed”- Linear’s primitive tests now travel with the pack and run with its declared
httpxtest dependency.
[agentbundle][0.30.1] — 2026-08-09
Section titled “[agentbundle][0.30.1] — 2026-08-09”- Catalogue verification now reports zero unclassified paths for this
repository’s current inventory without hiding future unknown files.
Repository-owned source, docs, profiles, and website trees are classified at
stable ownership boundaries. Generated
.agentbundle/binand.agentbundle/libfiles stay projected rather than excluded, and their drift now fails the self-host verifier path. Git filename enumeration is NUL-delimited with one-line escaped diagnostics. Special projection reads, writes, and orphan cleanup are no-follow; held-directory atomic writes defeat concurrent leaf-link swaps, and executable projections reject mode drift.
[core][2.5.2] — 2026-08-09
Section titled “[core][2.5.2] — 2026-08-09”Changed
Section titled “Changed”- The source-of-truth convention now names the adapter-independent runtime
projection rails. Maintainers are directed to edit
adapter-root-binsanduser-libsupstreams instead of the generated.agentbundle/copies.
[frontend-engineering][0.1.4] — 2026-08-08
Section titled “[frontend-engineering][0.1.4] — 2026-08-08”- Frontend Engineering now routes adopters by job before listing skills. The pack page opens with create, retrofit, audit, and verify paths, each with the expected output, then links to a new canonical journey from page/screen contract through implementation, gates, evidence manifest, and independent frontend review.
- Two new guides make frontend contracts and performance policy actionable. The page/screen-contract how-to helps adopters choose a full contract, a proportional subset, or an explicit no-contract decision. The performance reference fixes p75 Core Web Vitals targets while keeping numeric asset ceilings project-specific and prioritized by surface type.
[core][2.5.1] — 2026-08-08
Section titled “[core][2.5.1] — 2026-08-08”Changed
Section titled “Changed”-
Bug investigations start from more of the language people actually use and stay evidence-led through exceptional cases. The
bug-fixskill now activates on root-cause requests, CI-only failures, intermittent or flaky behavior, and active production incidents without taking over new features, behavior-preserving refactors, postmortems, or skill maintenance.Multi-component failures are localized at their boundaries before the investigation narrows; a known-good path and backward data-flow trace feed the existing rival-hypothesis record. Asynchronous tests wait on a bounded real condition instead of sleeping. Three failed evidence-backed attempts stop patch stacking and surface an architectural discussion. External or timing failures can close without a false internal root-cause claim, while active harm permits labelled containment before analysis without presenting mitigation as the permanent fix. A production mutation requires confirmation of its exact action, scope, and blast radius unless already approved in the current turn; incident evidence is minimized and sensitive fields are redacted or sequestered. The early red regression test, minimum coherent diff, coverage-gap analysis, commit rationale, and tracker sync stay intact. The production-hotfix guide follows the same rule: containment is mitigation, and the permanent fix still returns to the red regression test.
[core][2.3.1] — 2026-08-07
Section titled “[core][2.3.1] — 2026-08-07”Changed
Section titled “Changed”-
Knowledge entries are no longer replayed into sessions automatically.
session-start.pyprinted every entry indocs/knowledge/patterns.jsonlto stdout, which Claude Code inserts into model context before the user’s first prompt — and again on resume, clear, compaction and fork. Entries are captured by agents during the work-loop from material those loops encountered, so the hook turned one influenced session into a standing instruction for every session after it. The block is now rendered only when a caller passes--show-knowledge, which the wired hook does not;tier: "invariant", which bypassed scope filtering and requested unconditional replay from inside the record itself, no longer grants anything. The adapt-to-project nudge is unaffected. If you relied on entries arriving at session start, render them deliberately withsession-start.py --show-knowledge [--scope <path>], or promote the durable ones intoAGENTS.md, a skill, or an ADR — which is where guidance an agent must follow belongs. -
Knowledge entries refuse control characters other than tab, and newline in
body. A hand-edited entry carryingESC,DEL, a C1 character or a bare carriage return now failslint-knowledge.py, where it previously passed — these are replayed verbatim into every session by the session-start hook, and a bare CR can overwrite a terminal line. Multi-line bodies and tabs are unaffected: a newline inside a JSON string is escaped on disk, so it never splits a JSONL line, and the hook indents multi-line bodies on purpose. A newline intitle,scopeorsourceis newly refused — the hook prints those on a single unindented line, where a newline forges an entry header — so fold it into thebodyor remove it. Also newly refused: a run of more than eight spaces or tabs in any field, which is how a payload is pushed off the side of a diff while still being replayed. If an entry trips any of these, rewrite the offending character out; there is no format migration.These rules guarantee that a reviewer sees what the model receives; they do not make replayed entries trusted. Entries are version-controlled and PR-reviewed, and that review remains the control.
Security
Section titled “Security”- The knowledge writer refuses invisible characters. It rejected
Cccontrols only, so bidi overrides, the Unicode Tag block, and the variation selectors all passed — the last of those being 240 code points that encode arbitrary text at zero visual width. Sincesession-startreplays every entry’s title, scope and body verbatim into an agent’s context (and atier: invariantentry goes in regardless of scope), that was a durable prompt-injection channel invisible both in a diff and on screen. The rule is now Unicode’s Default_Ignorable_Code_Point property, enumerated fromDerivedCorePropertiesrather than sampled by block. Sampling failed twice —Cfalone was bypassed by the variation selectors (Mn), and adding those was bypassed by the Mongolian free variation selectors, the same construct one block over. A total-volume budget sits beside the adjacency cap, since two joiners after every visible character never trip a run limit and still carry an arbitrary instruction. Both the writer andlint-knowledge.pyenforce it from one shared predicate, because the file is hand-editable too. ZWJ, ZWNJ and the two emoji presentation selectors stay legal — they shape neighbouring characters — but a run of three or more adjacent zero-width characters is not, counting joiners and selectors together. Three is the threshold because real emoji cap at two adjacent (heart-on-fire is VS16 then ZWJ, as are the flag and bouncing-ball forms) while an alphabet needs many more; counting joiners alone left an alternating VS15/VS16 run invisible.
-
Concurrent appends no longer lose entries while reporting success. Allocating
max(id) + 1and then replacing the file is a read-modify-write; unlocked, six concurrent appends landed two entries and told all six callers their learning was recorded. The window is now serialized with a cross-platform lock. Note what makes it correct, since a first version got both halves wrong and did not exclude at all: a lock is broken only on evidence it is abandoned — its own age, never how long the waiter has waited, because a merely-slow holder still holds it — and it is released only if still owned, since a stale-breaker may have taken it over. The wait is bounded and reports rather than spinning on a lock it cannot remove. -
Appending no longer narrows the knowledge file’s permissions.
mkstempcreates0600andos.replacecarried that onto the target, taking a committed world-readable file to owner-only. Git tracks only the exec bit, so it was invisible to review and CI. The target’s mode is now preserved. -
The knowledge linter cannot be hung by the input it exists to reject. Its escape-detection pattern backtracked quadratically (measured 1.1s at 20k backslashes) and it runs unfiltered over a repo file in CI. Replaced with a non-backtracking pattern plus a line-length cap.
-
Status-regression detection now covers every verb that reads a pinned artifact, not one of three. Normalizing the status token out of the hash removed the byte-compare that used to catch a spec regressing to
Draft; the replacement assertion was only wired intoplan check-current, soapprove-plan’s already-approved branch andschedule check-currentstill passed such a spec. -
Checkbox normalization is scoped by artifact. It applied file-wide, so ticking a checkbox under a spec’s
## Boundaries— aNever doitem, precisely the scope the pin protects — collided with the approved digest. A spec is now normalized inside its Acceptance Criteria section only; a plan, which has no such section and whose checkboxes are task progress, stays file-wide. -
The hash-mismatch message no longer prescribes a recovery that fails. It said to run
loop-cohort resetand re-run the G-plan sequence, but that sequence has noinitstep, soapprove-planimmediately refused; and it omitted thatloop-engine resetmust not be run. The five recovery steps are now spelled out in the message itself — an installed skill cannot point at this file, which adopters own as their own product’s changelog. -
The approval pin no longer breaks on the writes the loop itself mandates.
loop-cohort approve-planpinned the raw bytes ofspec.md, butwork-looprequires writingStatus: Implementingbefore any code andShippedplus a ticked acceptance criterion at finish — soplan check-currentwent red one mandated step after approval, every run.plan.mdhad the same defect on a worse path:schedule check-currentguards everyCODE-*transition, so a planStatus: Donecould wedge the state machine mid-EXECUTE. Both artifacts are now hashed through one canonical form that normalizes the preamble status token and checkbox bracket contents and nothing else. Substance stays pinned: acceptance-criterion text, task text,Depends on:edges, a(deferred: <slug>)annotation, a re-indented criterion, and any free text appended after the status token all still invalidate the baseline. -
Knowledge entries have a writer, so the file stops drifting between encodings.
docs/knowledge/patterns.jsonlis line-delimited JSON, where both\u2014and a literal—are valid — so an author reaching forjson.dumps(entry)(whoseensure_asciidefaults toTrue) silently changed the file’s encoding while passing every gate, and for a non-BMP character emitted a surrogate pair that is not a valid TOML/YAML scalar downstream.append-knowledge.pynow allocates the next id, writes raw UTF-8, confines its target, and lints the candidate before installing it, so a rejected entry never reaches the file.lint-knowledge.pyrejects a\uXXXXescape for any character that should have been literal. Every C0 character bar tab (and a newline inbody, which session-start indents) and every line separator (U+0085,U+2028,U+2029) is refused in both spellings: the literal form splitsstr.splitlines(), which is how the linter andsession-startread the file, and the escaped form is worse — it survives the round trip intact, so it forges a line inside the block replayed into every session. The escape rule still exempts the three separators, but only so an entry carrying one gets a single clear error rather than two. -
The knowledge-base guidance points at the privacy rule. Capturing a learning is now a routine agent-authored commit into a permanent git artifact, and the author holds session context full of paths and identities, so all three authoring surfaces name
AGENTS.md§ Privacy alongside the encoding convention.
Upgrading
Section titled “Upgrading”A run already in flight when this lands carries a baseline pinned by the old
hash, which the new canonical form will not match. Recover with a cohort-only
reset — do not reset the engine, whose plan-locked transition is legal only
from SPEC-PLAN-APPROVED, so resetting it strands the run:
- Restore
Status: Approvedin bothspec.mdandplan.md;approve-planrefuses unless both readApproved. loop-cohort reset <spec-dir>, thenloop-cohort init <spec-dir> --run-id <run_id>, takingrun_idfromloop-engine status <spec-dir> --json.loop-cohort approve-plan <spec-dir> --expect-run-id <run_id>, thenloop-cohort schedule <spec-dir> --expect-run-id <run_id>.- Restore the status you were on and continue.
Two things to know before you do it. Re-running approve-plan re-pins whatever
bytes are on disk — that is a re-approval in substance, so it is the plan
approver’s call to re-affirm them, not something to self-serve. And the reset
returns implementation_retry_count, review_round_count, review_retry_count
and the recorded finding fingerprints to zero, so retry caps restart and stasis
detection loses its baseline.
[core][2.3.0] — 2026-08-07
Section titled “[core][2.3.0] — 2026-08-07”-
A nonexistent or non-directory
--rootno longer reports success.lint-spec-statusandlint-traceabilityaccepted any path you gave them. Point either at a directory that does not exist and it scanned an empty tree and announced “spec metadata clean” — a green result that meant nothing. Both now refuse an unusable--rootand name the offending path. A valid root, an omitted root, and a relative root all behave exactly as before. -
A crafted
Contract:header can no longer read files outside the repo.lint-spec-statusmatched contract paths with a pattern that allowed.and/, so a spec file containing- **Contract:** contracts/../../secret.jsonmade the linter read that file from outside the directory it was scanning and reveal, through which warning it printed, whether the file existed and roughly what it contained. A symlinked spec directory could escape the same way. Both are closed, and files are now size-capped before reading.
Changed
Section titled “Changed”-
Review fingerprints now use SHA-256 instead of SHA-1. These are internal markers used to notice when a review round returns the same findings twice; they are never shown to you. A run already in progress when you upgrade keeps working — its older markers stay valid.
-
Path arguments are validated where they enter. The work-loop scripts already confined every file they read to within
--root; that check now also happens at the point the argument is read. This is a legibility change for security scanners: the existing confinement runs across several functions, which taint analysers cannot follow, so scanners in adopter repositories reported path-traversal against code that was never vulnerable. No file the scripts would previously read is now out of reach.Upgrade note: an invocation that passed a nonexistent or non-directory
--rootused to exit 0 and now exits non-zero. If CI depends on that false pass, fix the path — the previous result was not a real check.
[agentbundle][0.30.0] — 2026-08-08
Section titled “[agentbundle][0.30.0] — 2026-08-08”Changed
Section titled “Changed”-
The wheel is about a fifth smaller, because it stops shipping the engine’s own test suite. It carried 45 test entries of 184 — a quarter of the uncompressed payload. The suite moved out of the importable package; the package itself did not move, so every import path except one is unchanged.
The cause was not the obvious one.
setuptools’ package discovery defaults to PEP 420 namespace packages, so the tree was found whether or not it carried an__init__.py— deleting that marker would have removed exactly one entry of the forty-five. -
ALLOW_FIXTURE_PACKSnow requires an explicit1,true, oryes. It previously bypassed the self-host fixture guard on any non-empty value, soALLOW_FIXTURE_PACKS=0disarmed a destructive-write control while reading as “off” — and stayed disarmed for every later invocation in that shell or CI job. If you set it to anything else, the guard now refuses.
Removed
Section titled “Removed”-
The source distribution no longer carries the build-pipeline test suite. 0.29.8’s sdist held 45 of them; 0.30.0 holds none. They sat inside the importable package, so setuptools swept them in; from their new home they need an explicit
MANIFEST.ingraft, which lands with the catalogue carve-out. Eight top-leveltests/test*.pymodules still ship — the default sdist glob reaches those — and they do run (20 passed, 47 skipped from an installed sdist), withouttests/conftest.py’s autouseHOME/XDG_CONFIG_HOMEisolation. That last part is not new: atests/test*.pyglob never matchedconftest.py, so 0.29.8’s sdist shipped those eight the same way. What this release removes is the build-pipeline suite. Build from a git checkout until the graft ships. -
import agentbundle.build.testsno longer resolves. Nothing imported it; the module existed only to make a directory look like a package.
-
build self --packs-dir <a fixture tree>refuses again. The destructive-write guard matched a fixed substring, so relocating the suite broke it silently and the command would have overwritten a working tree with fixture data. It now matches path components and the original substring, so it refuses strictly more than before. -
agentbundle catalogue self-host --writenow refuses a fixture packs path too. That entry point takes its packs directory from[catalogue.paths] packsrather than a flag, and was never guarded — a catalogue pointing at atests/.../fixtures/tree performed the same destructive overwrite. It now exits non-zero with aCAT-SH-001diagnostic, visible under--format json. This is a new refusal, not a restored one. -
catalogue init --preset self-hosted --tooling vendoredno longer copies test content into your repository. The vendored copy is an install source — the command tells you topip install -eit — so it is treated like the wheel. Your own packs and shared guides keep their tests, which is what catalogue archives are for.Upgrade note: if you vendored tooling from an earlier release, the engine tests, a stray
conftest.py, and build residue (__pycache__,.pytest_cache,*.egg-info) are sitting in.agentbundle/tooling/. They are inert; deleting them is safe, and re-runningcatalogue initwrites a clean copy — verified by running it, not inferred.
[agentbundle][0.29.7] — 2026-08-06
Section titled “[agentbundle][0.29.7] — 2026-08-06”Changed
Section titled “Changed”catalogue initstops handing you apacks/AGENTS.mdfull of dead links. Six of its references pointed at files that exist only in the upstream catalogue, so the pack-authoring rules arrived without the means to follow them — including a test-layout rule credited to a linter you do not have. Every rule now stands on its own or points at a guide the scaffold ships, and a new gate fails the build if a future edit cites something unshipped.
[credbroker][0.5.0] — 2026-08-06
Section titled “[credbroker][0.5.0] — 2026-08-06”-
Re-establish an expired SSO session from your own code.
refresh_sso_session(profile)re-captures without a human;register_sso_session(...)performs a first capture;validate_sso_profile(profile)is the shared grammar guard; andderive_sso_destination(base_url, strategies=())asks a resource server where it sends users to sign in (RFC 9728, then OIDC discovery, then an opt-in vendor probe). All four are additive.Derivation is an outbound fetch whose later targets come out of the server’s own responses, so it is bounded hard: https-only at every hop, redirects not followed, a 5 s socket timeout under a 15 s budget, a 64 KiB body cap, strict TLS, no auth headers, and — for any hop that is not on your configured
base_url’s origin — a refusal when the host resolves to loopback, link-local, RFC 1918 or another internal range.refresh_sso_sessiontakes only a profile, deliberately: the signature is structurally incapable of forwarding a sign-in destination, so an automated caller cannot choose where the browser goes.register_sso_sessionis the sole function that accepts one. -
New exception types, so a caller can tell “your session expired” from “the broker failed”:
SsoProfileNotRegisteredError(subclasses the existingSsoSessionUnavailableError, so current handlers keep working),SsoInteractionRequiredError,SsoRecaptureFailedErrorandSsoBrokerUnavailableError.
Changed
Section titled “Changed”-
load_sso_cookiesno longer hands your whole environment to the broker, and no longer runs unbounded. It composes the child environment from an allowlist — so a spawned process cannot inherit an unrelated*_API_TOKEN— and applies a 30-second bound.Behaviour change worth reading: a timeout, a spawn failure, or an engine-internal error now raises
SsoBrokerUnavailableErrorrather thanSsoSessionUnavailableError. If your code retries or re-registers on the latter, a slow keychain no longer sends it down that path. CatchSsoErrorfor the old blanket behaviour. -
load_sso_cookiesvalidates the profile against the grammar before spawning.
[credential-brokers][0.3.0] — 2026-08-06
Section titled “[credential-brokers][0.3.0] — 2026-08-06”Changed
Section titled “Changed”-
sso-broker refreshreturns4, not3, when the profile was never registered. A caller reading3as “not registered” was wrong: the engine returns it from a dozen distinct sites, including playwright being absent and a sign-in the operator did not finish. If you read exit codes from this engine, re-read them. -
sso-broker refreshis now headless, and can return5. It waits a bounded 20 seconds for a warm browser profile to complete the IdP flow unaided; if it cannot, it returns the new exit5instead of opening a window. Arefreshthat used to prompt now fails fast — by design: an unattended refresh must never leave a login page in front of whoever happens to be at the machine. -
sso-broker refreshrejects every connection argument (--login-url,--success-url-pattern,--cookie-domain,--validation-endpoint,--session-filename,--ttl-hint-minutes) with exit 3. Destinations come only from the stored profile. -
sso-broker register --ephemeralchanges where the session is captured. Capture runs in a throwaway browser context which then seedsbrowser-state/<profile>, rather than capturing in that profile directly. A caller relying onregisterleaving a reusable profile now gets a seeded one. The verb’s default is unchanged;--ephemeralis opt-in. -
profileis validated and its store paths confined.register,get-cookies,testandrefreshrefuse a name outside^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$or matching a Windows reserved device name.rmis exempt from the grammar so a profile registered under a now-invalid name stays deletable.
get-cookiesserved a stale cookie jar after every re-capture on macOS and Windows. It materialised the jar only when the file was absent, while the primary store on those platforms is the OS keychain — so a successful refresh wrote to the keychain and the next read returned the pre-refresh file. Linux was unaffected (both surfaces are the same file there), which is why CI never caught it. The write is unconditional now, via a unique temp name per write.
[atlassian][0.8.0] — 2026-08-06
Section titled “[atlassian][0.8.0] — 2026-08-06”-
jira.py checkre-establishes an expired SSO session and retries, in one command. No second step and no browser: the recapture is headless and takes no sign-in destination. If your identity-provider session has expired too,checkstops with exit 2 and names the command to run — it never leaves a login page on screen. -
jira.py check --registercaptures a new session and completes the check in one command. It is the ordinary first run, and the only capture path that attempts to verify the sign-in destination against the instance — where the configured sign-in host is the instance host (SP-initiated SAML), that check short-circuits and confirms nothing.scripts/setup_sso.pyremains for a scripted pre-bake and for the case where--registerrefuses.
Changed
Section titled “Changed”-
--insecureis honest on both auth paths. On the token path every subcommand now warns whenever the flag fires, which they should always have done. On the SSO-cookie path it is inert — the session cookie is a bearer secret — andchecksays so rather than implying verification was disabled. -
The SSO config loader rejects input it previously accepted, in
jiraandconfluence-crawler, which shares the file: aprofileoutside the broker grammar or supplied as a non-string, a non-integerttl_hint_minutes, and any quote, backslash or control character in a[sso]string field. Control characters matter because URL parsing strips CR/LF before validation while the broker writes the value into a quoted TOML string. -
confluence-crawler’s registration inherits the new spawn bounds — timeout, whole-process-tree kill, and the environment allowlist — becausesetup_sso.pynow callscredbrokerinstead of spawning the broker itself. -
Both skills require
credbroker>=0.5.0. An older pinned install shadows the vendored floor;checkon the SSO-cookie path detects it and exits 2 with the upgrade command. -
Installing
atlassiannow requires thecredential-brokerspack. The install gate names the fix. Previously the install succeeded and failed at runtime with no remediation.
[figma][0.3.0] — 2026-08-06
Section titled “[figma][0.3.0] — 2026-08-06”Changed
Section titled “Changed”- Installing
figmanow requires thecredential-brokerspack. It ships a credentialed skill and has always depended on the broker layer; the dependency is now declared, so a missing broker is refused at install time with a named fix instead of failing at runtime. If you installed the library withpipbut not the pack, the upgrade will refuse until you install the pack.
[linear][0.2.0] — 2026-08-06
Section titled “[linear][0.2.0] — 2026-08-06”Changed
Section titled “Changed”- Installing
linearnow requires thecredential-brokerspack. Same change, same reason, same upgrade-time refusal asfigmaabove.
[core][2.3.0] — 2026-08-07
Section titled “[core][2.3.0] — 2026-08-07”-
Concurrent work-loop verbs no longer lose state silently. Every verb that mutates
state.jsonorengine-state.jsonwrote atomically but decided unguardedly, so two of them at once — a supervisor and a hand-run verb, or two agents in one workspace — overwrote each other with both callers exiting 0. Measured on the old code: two concurrentrecord-attemptcalls lost an increment in 20 of 20 trials, so a retry cap could never fire; two concurrenttransitioncalls were both admitted in 10 of 10 trials, where the second must failillegal transition, leaving duplicate(spec, seq)records in the.loop-run/events.jsonlaudit log; and six concurrentinitcalls all succeeded. Each verb now decides and writes while holding a lockfile beside the state file, so concurrent callers either both take effect or the loser is told why it did not. -
A verb that cannot be sure its write landed now says so. If a verb’s lock is reclaimed while it is running, it exits non-zero naming the state file instead of reporting success — the one case where “it worked” would have been a lie.
Changed
Section titled “Changed”- Waiting for a busy state file is bounded and reported: a verb that cannot take
the lock within 10 seconds refuses, naming the lock path and the process
holding it. A lock left by a killed process is reclaimed automatically after
5 minutes; to clear one sooner, delete the
.lockfile beside the state file it names. A lock path that is not a regular file (a stray directory or symlink) is refused immediately rather than waited on. Lockfiles and their reclaim residue are gitignored, including for new adopters.
[agentbundle][0.29.5] — 2026-08-06
Section titled “[agentbundle][0.29.5] — 2026-08-06”Changed
Section titled “Changed”catalogue self-host --windowscan no longer report a pass it did not earn. It runs the atlassian SSO suites from the packs’ test trees now, and probescredbrokerandhttpxfirst. Both suites skip themselves at import when those are missing, and the step runner judges by exit code alone — so on a machine without them, both suites skipped silently and the step went green.- Three suites whose subject was pack content moved out of the package’s test tree to the packs that own them. A pack edit could otherwise turn the published package’s suite red.
catalogue packagestops shipping build residue. If you had ever run the tests or annpm installin a skill before packaging, the archive carried the resulting__pycache__,.pytest_cacheandnode_modules— the deny-set meant to prevent it was never applied. 104 files on this catalogue. Your archives get smaller and match what the authoring standards say they contain. Packaging also no longer fails on a tree with a realnode_modulesin it — the symlink check refused its.bin/entries. No flag, verb, exit code, or schema changed.
[architect][0.14.3] — 2026-08-06
Section titled “[architect][0.14.3] — 2026-08-06”Changed
Section titled “Changed”-
Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.For
architect-diagramthis also removesscripts/entirely — it held nothing but the fixture suite and its.mmdcorpus.
[atlassian][0.7.1] — 2026-08-06
Section titled “[atlassian][0.7.1] — 2026-08-06”Changed
Section titled “Changed”- Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.
[catalogue-curation][0.2.3] — 2026-08-06
Section titled “[catalogue-curation][0.2.3] — 2026-08-06”Changed
Section titled “Changed”- Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.
[converters][0.9.4] — 2026-08-06
Section titled “[converters][0.9.4] — 2026-08-06”Changed
Section titled “Changed”-
Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.msg-to-markdown’s## Scriptslist drops its test-material bullet, since those files are no longer in the skill.
[credential-brokers][0.2.3] — 2026-08-06
Section titled “[credential-brokers][0.2.3] — 2026-08-06”Changed
Section titled “Changed”- Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.
[desk-research][1.1.4] — 2026-08-06
Section titled “[desk-research][1.1.4] — 2026-08-06”Changed
Section titled “Changed”-
Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.The
desk-researchskill body no longer cites a repository path for its closed cue tuples — that path did not exist in your tree.
[figma][0.2.3] — 2026-08-06
Section titled “[figma][0.2.3] — 2026-08-06”Changed
Section titled “Changed”- Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.
[governance-extras][0.9.6] — 2026-08-06
Section titled “[governance-extras][0.9.6] — 2026-08-06”Changed
Section titled “Changed”- Tests no longer ship into your skills tree. Projection adapters copy
.apm/skills/<skill>/wholesale, so every test file this pack kept under.apm/was being written into your tree on install. They now live atpacks/<pack>/tests/, which is never projected. Nothing you invoke changed — no skill, script, command, hook, reference or eval was removed, renamed, or edited. If you have an older install, the staletest_*.pyfiles under your installed skills are safe to delete.
[agentbundle][0.29.4] — 2026-08-06
Section titled “[agentbundle][0.29.4] — 2026-08-06”Changed
Section titled “Changed”- The package’s test tree is catalogue-level only. Suites whose subject was
pack content — core’s hook bodies, skill bodies and
work-loopscripts, and theproduct-documentationpack check — moved to the owning pack’stests/tree. They tested pack content that happens to share a repository with the engine, so renaming a private helper in a pack could turn the published package’s suite red. Engine tests that use a pack as fixture data (install, upgrade, projection, adapter parity) are unaffected: the distinction is subject, not mention.README-pypi.mdgains thetests/tree and the three-boundary model. No flag, verb, exit code, schema, or output changed.
[agentbundle][0.29.3] — 2026-08-05
Section titled “[agentbundle][0.29.3] — 2026-08-05”Wording-only release. No flag, verb, exit code, schema, or output structure changed — but the text an adopter reads changed almost everywhere, so it ships as its own version rather than riding along with the next feature.
Changed
Section titled “Changed”-
Internal governance citations removed from every shipped surface. The package previously carried
RFC-0NNN/ADR-0NNNordinals, internal acceptance-criterion labels (AC7,AC22b), anddocs/specs/<slug>paths throughout. Those point at documents no adopter has — a dangling reference in the sdist, which ships source, and in the wheel. Each now states the rule directly instead of citing where it was decided:# RFC-0052 D8: v0.3 state is hard-refusedbecame# v0.3 state is hard-refused. Roughly 2,700 occurrences across ~290 files. Specifically:--helpoutput for the root command and every subcommand —install,upgrade,uninstall,catalogue,catalogue lint,init-state,reconcile,diff.- Runtime diagnostics:
catalogue lint’s three findings, theinit-state --migratemessage,commands/install.py’s short-circuit notice, and the workspace-mcp git errors. - The bundled adapter contract (
_data/adapter.toml), whose comments are read from inside the wheel. Its per-version history was restructured from an RFC-keyed list into a version-keyed one; every declared value is unchanged and the file remains byte-identical tocontracts/adapter.toml. - Source comments and docstrings across the engine, and the 46 files under
agentbundle/build/tests/that land on disk on everypip install. templates/install-marker.py, which projects into the adopter’s own repo. Re-installing or upgrading will rewrite it with the new comments; the file’s behaviour is unchanged, and the existing Tier-1/Tier-2 machinery handles it as it would any projected-file content change.
IETF references are untouched —
RFC 9106in the credential broker survives byte-identical. Ours are zero-padded four digits; IETF numbers never start with0.
-
init-state --migrateprinted a stranded token. The message readMigration is greenfield D8) — reinstall…, with an unmatched parenthesis. It now readsMigration is greenfield — reinstall the pack(s) to regenerate state instead. -
catalogue lintcontradicted itself onpatterns.jsonl. The refusal for a non-empty knowledge seed told the operator to “seed the file with a placeholder entry” — the exact thing it had just refused. It now says the file must carry no entries at seed time. -
The codex
AGENTS.mdstrip warning over-promised recovery. It claimed the removed region was recoverable from git history; it now says that holds only if the file was committed.
- A behavioural test for projection exclusion.
_is_excluded’s existing coverage only exercised the glob→regex translation against synthetic strings, so it stayed green if a caller stopped consulting the guard. The new test drives a real file at an excluded path throughrun_self_hostand asserts it is absent from the unclassified-path enumeration.
[credbroker][0.4.1] — 2026-08-05
Section titled “[credbroker][0.4.1] — 2026-08-05”Wording-only release; no library code changed. It exists so the corrected PyPI project page and the swept docstrings actually reach installers.
Changed
Section titled “Changed”- Internal governance citations removed from the shipped text. The two
design-doc links on the PyPI project page keep their working URLs and lose
only the
RFC-00NNprefixes from their link text, so the page reads for someone with no access to our numbering. Package docstrings and comments were swept on the same principle. RFC 9106is deliberately retained in_vault.py— that is the Argon2 IETF specification, not one of ours, and it survives byte-identical.
[agentbundle][0.29.2] — 2026-08-05
Section titled “[agentbundle][0.29.2] — 2026-08-05”-
self_host— preferred-adapter respected:run_self_hostnow restricts projection to the adapter named incatalogue.toml’spreferred-adapterfield when that adapter is not inSELF_HOST_ADAPTERS(e.g.kiro-ide). Previously onlyclaude-codeandcodexwere ever projected, producing false drift for downstream repos using a different adapter. -
self_host— shadow-clone and seed-copy paths useshutil.copy: neither callsos.utime, fixing CI environments that restrict timestamp writes.shutil.copy(content + permissions, no timestamps) preserves source mode bits so the drift gate never false-positives on permission bits —copyfilewould produce umask-derived mode on new files and cause spurious drift in strict-umask CI environments. Symlinked seeds are now dereferenced rather than copied as links (prior behavior wasfollow_symlinks=False). -
adapter_root_bins—shutil.copy2replaced withshutil.copyfile+os.chmodguarded withtry/except OSError: the bin-projection path no longer callsos.utime; POSIX executable-bit setting is now best-effort so environments that restrictchmoddo not abort the build. -
self_host— Claude-specific artifacts omitted for non-claude-code repos:CLAUDE.mdand.claude-plugin/marketplace.jsonare no longer written (or drift-checked) when the effective adapter set does not includeclaude-code. Downstream repos withpreferred-adapter = "kiro-ide"(or any adapter not inSELF_HOST_ADAPTERS) no longer accumulate Claude-specific files on--writeand no longer see false drift on--check.
[agentbundle][0.29.1] — 2026-08-05
Section titled “[agentbundle][0.29.1] — 2026-08-05”-
workspace_mcp._GitTools— FSM mode guard:git_branch,git_commit, andgit_pushare now blocked wheneverWORKSPACE_MCP_SPEC_PATHis supplied — including whenWORKSPACE_MCP_DISPATCHED_ITEMis also present (SPEC_PATH wins with a startup warning) and when the path fails containment validation (fail-closed: raw env var presence inos.environ, including an empty string, is the FSM trigger). Previously a stale harness supplying both vars, or an invalid SPEC_PATH, left FSM mode disabled and enabled git writes during a work-loop session. Requires agentbundle >= 0.29.1 — updating thecorepack alone does not deliver this fix. -
workspace_mcp._build_tools_list: refined git tool descriptions for harness clarity;shaping[]items marked informational-only in Stage 1.
[core][2.2.1] — 2026-08-06
Section titled “[core][2.2.1] — 2026-08-06”- A failed fetch is no longer misreported as a wrong branch name. The
work-loop’s base-freshness check classified any fetch failure whose stderr
mentioned “remote ref” as “branch not found on remote” — and a remote URL
containing that phrase is enough to trip it. The agent then went off to
correct a
--targetthat was never wrong, while the actual auth or network fault went unreported. Only git’s own not-found wording now selects that message; everything else falls through tocheck network/auth. That wording is a gettext string, so every git subprocess the check runs now setsLC_ALL=C— on a git build with translation catalogues installed the match would otherwise never fire. - A dirty tree is told to commit, not to stash.
refs/stashis not a per-worktree ref, so every linked worktree of a repository shares one stash stack — work stashed in one worktree is visible, and poppable, from all the others. The check now recommends committing the work in progress on the current branch before rebasing, says why, and names the unwind (git reset --soft HEAD~1). The untracked/tracked distinction is kept: it selects betweengit add -A+ commit andgit commit -a. The suggested subject ischore: wip, so the command survives acommit-msghook. - The unmerged-files message no longer implies committing is unavailable.
git stashrefuses an unmerged index, butgit commit -asucceeds and commits the conflict markers — and it is the command the sibling branch now recommends. The message names both. - An unreadable commit count fails closed. When
git rev-list --countexited 0 with output that was not a number, the count fell back to0, which the next line reported as “head is current” — the one answer this check must never give by accident. It now Surfaces instead.
Changed
Section titled “Changed”- The pack no longer tells you to stash, anywhere. Three surfaces still
did, which left the guidance self-contradictory once the freshness check
stopped.
work-loop’s pre-existing-failure triage replaces the stash-check (git stash -u && <gate> && git stash pop) with a worktree-check —git worktree add --detach, run the gate there, remove it — which answers the same question without touching the shared stack; the dependency caveat and the commit-first fallback are named.adapt-to-project’s dirty-state escalation offers committing rather than “stash or commit”.
[core][2.2.0] — 2026-08-06
Section titled “[core][2.2.0] — 2026-08-06”-
The knowledge-base linter ships with the pack.
lint-knowledge.pynow lives beside the otherwork-loopscripts and projects into your tree at<skills-dir>/work-loop/scripts/. Its self-test stays in the catalogue.docs/knowledge/patterns.jsonlis seeded by this pack and appended to by the work-loop’s Capture-learnings step, so the gate that validates it ships with it. Previously the linter was catalogue-local: the seeded README told adopters to run a script they had never been given. -
pre-pr.pygates the knowledge base automatically. The shipped hook findslint-knowledge.pyunder whichever skills root your agent tool installed into and runs it overdocs/knowledge/patterns.jsonl— nothing to wire by hand. Skipped cleanly when the file or the skill is absent.Upgrading from 2.1.x: this gate is new and strict — it rejects unknown keys as well as missing ones. If you added a field of your own to
patterns.jsonl, the firstpre-pr.pyrun after upgrading will fail on it. Fold the extra data intobody, or drop the field.
work-loop§ Capture learnings now states the knowledge-entry schema inline. The step pointed atdocs/knowledge/patterns.jsonland deferred the shape to a second file, so entries were authored from memory and landed without the requiredsourcekey. The six required keys —id,kind,scope,title,body,source— plus the optionaltier, and a one-line example entry, are now written at the point of writing.- Verification is explicit at every surface.
work-loop,docs/knowledge/README.md, and its seed tell the writer to run the gate unfiltered and read its exit code.<gate> | tail -2returns tail’s exit status — always 0 — and truncates the per-entry error lines, so a broken entry reads as clean locally and fails in CI. The general form is now awork-loopanti-pattern: never judge a gate throughtailorgrep. - A drift guard covers the guidance, not just the schema. The linter’s self-test now fails when any surface that tells a writer to author an entry omits a required key from its inline list, or carries an example that does not lint clean — the pack source, both projections, and the seeded README.
[core][2.1.1] — 2026-08-04
Section titled “[core][2.1.1] — 2026-08-04”- Pack documentation: added autonomous-dispatch section to
JOURNEY.mdand headless-mode pointer toREADME.md.
- The workspace-mcp FSM git guard (blocking
git_branch/git_commit/git_pushin FSM mode) is delivered by agentbundle 0.29.1, not by this pack update. This pack’s server wrapper imports whicheveragentbundle.workspace_mcpis installed — update agentbundle to >= 0.29.1 to get the fix.
[experience-design][2.0.0] — 2026-08-02
Section titled “[experience-design][2.0.0] — 2026-08-02”copy-directionskill added to theexperience-designpack. New skill for naming the copy direction for a specific marketing or acquisition surface — ranked copy goals grounded in stable referents (persona language, copy precedents, persuasion standards), plus copy arbitration rules for that surface. Copy twin ofcreative-direction: same 8-step interrogation rhythm applied to what a surface says rather than how it looks. Scope: per-surface acquisition copy positioning (hero headlines, above-fold narrative, taglines, announcement copy, onboarding copy voice). References:tone-of-voicebrand-register doc as optional upstream anchor; writescopy/<surface-slug>.mdwithtype: copy-direction. (spec)
Changed
Section titled “Changed”tone-of-voicere-scoped to brand-level cross-surface register.tone-of-voicenow names the brand-level copy register — the cross-surface voice personality that all per-surface copy decisions reference — rather than per-surface acquisition copy positioning. Output path changed fromcopy/<slug>.md(per-surface slug) tocopy/brand-register.md(stable brand-level doc). Per-surface acquisition copy positioning (hero headlines, above-fold narrative, taglines, announcement copy, onboarding copy voice) now belongs to the newcopy-directionskill. Thecontent-designandux-writingboundary notes updated accordingly. (spec)
[product-engineering][0.13.3] — 2026-08-02
Section titled “[product-engineering][0.13.3] — 2026-08-02”Changed
Section titled “Changed”ux-writingboundary note updated: onboarding copy voice routes tocopy-direction. Theux-writingskill’s scope boundary note now routes per-surface marketing/acquisition copy voice — including onboarding copy voice — tocopy-direction(experience-design pack) rather thantone-of-voice. The onboarding tri-point (content-design/copy-direction/ux-writing) is now explicit in the boundary note. (spec)
[core][2.1.0] — 2026-08-04
Section titled “[core][2.1.0] — 2026-08-04”workspace-mcpStage 1 — per-session MCP server. Newagentbundle.workspace_mcpmodule provides a per-session stdio MCP server exposing six tools:workspace_status,elicit,git_status,git_branch,git_commit,git_push. The event bridge polls.loop-run/events.jsonland emits_agentbundle.core/skill-state-changeand_agentbundle.core/human-gate-pendingMCP notifications on FSM transitions. Theworkspace-statusalias script is projected topacks/core/.apm/skills/workspace-status/scripts/workspace_mcp_server.py. Requires Python 3.11+, stdlib only. (spec)
[core][2.0.1] — 2026-08-02
Section titled “[core][2.0.1] — 2026-08-02”workspace-statusdeterministic repair planning (Order 2B). Two new subcommands —repair-planandrepair-apply— automate cleanup of stale Type 2 queue entries without manualworkspace.tomlediting.repair-planruns a full reconciliation scan, builds a deterministic plan for all automatically-resolvable findings (Shipped → move to[work].shipped; Archived → remove from[work].queue), and writes a plan file with a SHA-256 fingerprint.repair-applyverifies the fingerprint, re-reads each spec’s Status from disk at apply time, and writes atomically viatempfile.mkstemp. TheApprovedlifecycle invariant is preserved — Approved entries are never automatically touched. Type 1, Type 3, andactive-list entries appear inmanual_findingsfor human review. See SKILL.md §1b for the full two-step workflow.
[core][1.0.4] — 2026-08-01
Section titled “[core][1.0.4] — 2026-08-01”Changed
Section titled “Changed”work-loopStep 0 no longer scans the full portfolio for stale entries (Order 2A). The stale-queue check — which read everyqueueandactivespec.md to detectStatus: Shippeddrift on everywork-loopinvocation — is removed.work-loopnow orients only (initiative, milestone, active spec, shaping guard). For exhaustive workspace integrity checks (stale entries, untracked live specs), runworkspace-status reconcile. The same stale fixtures are still detected as Type 2 findings byanalyze()— behavior moves, not disappears.
[core][1.0.3] — 2026-08-01
Section titled “[core][1.0.3] — 2026-08-01”workspace-statusprogressive read modes (Order 1B). Theworkspace-statusskill now exposes three explicit subcommands:status(bounded — Type 2 + 3 only, O(declared entries)),reconcile(exhaustive — Type 1 + 2 + 3, same as prior behavior), andexplain --item <selector>(focused in-memory lookup for one item).statusis now the default invocation in SKILL.md. JSON output gainsmode,scan.*, andreconciliation.{performed,complete, types_performed}fields. Invoking without a subcommand still works as areconcilealias with a deprecation warning on stderr.
[core][2.0.2] — 2026-08-03
Section titled “[core][2.0.2] — 2026-08-03”Changed
Section titled “Changed”- work-loop — doctrine additions and hardening to
SKILL.md:- Base freshness check (new, before Step 0 ORIENT): run
python scripts/check-base-freshness.pyto fetch the merge target and check staleness. Exit 0: head is current. Exit 1: Surface — message includes the exactgit rebasecommand to run. Handles single-remote auto-detect, explicit--target REMOTE/BRANCHfor forks and stacked PRs, rebase-in-progress detection, detached HEAD, and SSH batch mode when no custom transport is configured. Surfaceverb: recovery rung taxonomy added (steer / rerun / salvage in cost order) — every surface event must name the minimum viable rung.- Visual/manual QA: per-task UI check cadence — check after each task that modifies user-visible state, not just at finish.
- DECIDE: execution-path check before routing any finding to
apply. - DECIDE: scratch-note discipline — after routing each finding, save a one-liner to the IDE’s native scratch; feeds Capture learnings.
- Capture learnings: write the generalizable lesson; review scratch notes from DECIDE passes; promote to
docs/knowledge/patterns.jsonlwhen generalisable. - Finish checklist: trust the running artifact, not the build exit code.
- FIX items 2 and 3: shape-based split and own-fix adversarial verification.
- Base freshness check (new, before Step 0 ORIENT): run
- work-loop evals — two evals updated to require naming the minimum viable recovery rung.
docs/knowledge/README.md— curation contract changed from append-only to living-doc: edit, remove, or promote entries as the codebase changes; git history is the record.docs/knowledge/patterns.jsonl— schema extended: optionaltierfield (invariant|observation, defaultobservation); multi-globscope(comma-separated).tier: invariantentries are injected unconditionally by session-start regardless of--scope.tools/lint-knowledge.py— validatestierand multi-globscope; type-guards both fields against non-string values and explicit null; reports all errors on a line in one pass.tools/hooks/session-start.py— tier-aware injection and multi-glob scope matching.packs/AGENTS.md/packages/AGENTS.md— symlink-copy security rule added; both scopes covered.
[core][2.0.0] — 2026-08-02
Section titled “[core][2.0.0] — 2026-08-02”Changed
Section titled “Changed”- loop-engine/loop-cohort (breaking): Replaced the single
SPEC-PLAN-HUMAN-GATEstate and the combinedplan-approvedexit event with two separate human-wait states and a three-event approval sequence. Anyengine-state.jsonparked atSPEC-PLAN-HUMAN-GATEfrom core 1.x will return “illegal transition” on every event after upgrade — reset withloop-cohort reset+loop-engine resetand re-init on the new sequence (spec.md and plan.md are preserved).- New states:
SPEC-HUMAN-GATE(scope decision; spec approver writesspec.md Status: Approved),PLAN-HUMAN-GATE(build decision; plan approver writesplan.md Status: Approved),SPEC-PLAN-APPROVED(durable intermediate after both approvals). - New events:
spec-approved(guard: spec.md Approved),spec-rejected→ SPEC-PLAN-DRAFTING,plan-locked(replaces the old single-step plan-approved handoff; guard: spec Approved + schedule binding). plan-approvednow means “plan approver approved” and targets SPEC-PLAN-APPROVED; the old meaning (machine handoff to CODE-IMPLEMENTATION) is replaced byplan-locked.loop-cohort approve-planis now idempotent: same run ID + unchanged hashes = no-op; changed hash = refuse.check-spec-status.pygains--expectand--fileflags so the plan-approved guard can check plan.md independently. Path traversal fixed:--fileis now confined to spec-dir.
- New states:
[governance-extras][0.9.5] — 2026-08-02
Section titled “[governance-extras][0.9.5] — 2026-08-02”Changed
Section titled “Changed”- Updated core dependency constraint from
^1.0to^2.0. No skill or agent changes.
[iac-terraform][0.1.6] — 2026-08-02
Section titled “[iac-terraform][0.1.6] — 2026-08-02”Changed
Section titled “Changed”- Updated core dependency constraint from
^1.0to^2.0. No skill or agent changes.
[monorepo-extras][0.1.6] — 2026-08-02
Section titled “[monorepo-extras][0.1.6] — 2026-08-02”Changed
Section titled “Changed”- Updated core dependency constraint from
^1.0to^2.0. No skill or agent changes.
[release-engineering][0.1.9] — 2026-08-02
Section titled “[release-engineering][0.1.9] — 2026-08-02”Changed
Section titled “Changed”- Updated core dependency constraint from
^1.0to^2.0. No skill or agent changes.
[Unreleased]
Section titled “[Unreleased]”-
58 guide pages that were published but unreachable now appear in the docs site navigation. The sidebar was a hand-maintained list in
docs-site/astro.config.tscarrying 119 entries against 177 navigable files, so adding a page and forgetting the config edit was the default outcome. It is now generated from the guides tree on every build — writing the file is all that navigation requires. Group labels and order are declared insite.toml’s new[[guide_groups]]table. -
Guides can now be read as a sequence rather than a taxonomy. A page’s
orderfrontmatter sorts it within its pack group across Diátaxis kinds, so a tutorial, a how-to and an explanation can form one reading path. Theiac-terraformpack ships the first: a three-part explanation of how infrastructure work runs through the release loop.
Changed
Section titled “Changed”- Diátaxis buckets now render in a consistent Tutorials → How-to → Reference →
Explanation order in every guide group. Bucket order previously varied by
pack; 11 of 17 groups change. Page labels are unchanged — the pre-generation
labels are frozen in
guide-nav-baseline.tomlso none regressed.
-
Installing a pack from the marketplace now delivers its skills, agents and commands. Previously
claude plugin install <pack>@agent-ready-reporeported success and installed an empty plugin —claude plugin detailsshowedSkills (0) Agents (0) Hooks (0). Two defects caused it. The marketplace entry used agithubsource withbranchanddirectorykeys, which Claude Code’sgithubsource does not support: both were silently dropped and the installer cloned the repository’s default branch at its root. Entries now use agit-subdirsource with an explicit clone URL,pathandref. Separately, components were published under<pack>/.claude/, but plugins loadskills/,agents/andcommands/from the plugin root; they are now published there. Verified against Claude Code 2.1.223:corereports Skills (13), Agents (4), Hooks (1). The install commands are unchanged.If you already added this marketplace, run
claude plugin marketplace update agent-ready-repoand reinstall your packs — a cached catalogue keeps serving the old entries. -
Marketplace entries are now validated in CI. Nothing checked them before: the build strips
sourcefromplugin.jsonbefore validation, and the verifier inspectedmarketplace.jsononly for a strayhookskey. Both the published and the repo-root marketplace now validate every entry against a dedicated schema, so a malformedsourcefails the build instead of reaching adopters.
-
work-loopPhase-1 loop-infrastructure split (core 1.0.0 — major). The work-loop tooling is split into two scripts with a hard boundary.loop-engine.pyis a pure FSM phase tracker (read-only exceptinit/transition/reset; ownsengine-state.json) with two modes (code, 13 transitions;spec-plan, 5 transitions).loop-cohort.pyis rewritten as the sole writer ofstate.json; new verbs includeidentity,plan check-current [--require-schedule],record-attempt,wave check,wave advance, andreview inspect.check-spec-status.pyguards thereviewers-cleanevent in code mode. Arun_idUUID generated at engineinitis shared between both state files and verified on every mutating call via--expect-run-id. Phase-1 parallel verbs (worktree,dispatch-decision,auto-parallel) are disabled — they exit non-zero. Thepre-pr.pyenforcement hook now readsengine-state.jsonto skip thecheck --phase reviewcap check when the FSM is not inCODE-REVIEW(avoids false positives duringCODE-IMPLEMENTATIONand afterCODE-HUMAN-GATE/DONE). Breaking changes (version classification: major):worktreesubcommands are disabled (they exit non-zero). Dependent packs governance-extras (0.9.4), iac-terraform (0.1.5), monorepo-extras (0.1.5), and release-engineering (0.1.8) updated their core constraint from^0.1to^1.0. -
governance-extras 0.9.4 — patch: updated core dependency constraint from
^0.1to^1.0to track the core 1.0.0 major release. No skill or agent changes. -
iac-terraform 0.1.5 — patch: updated core dependency constraint from
^0.1to^1.0to track the core 1.0.0 major release. No skill or agent changes. -
monorepo-extras 0.1.5 — patch: updated core dependency constraint from
^0.1to^1.0to track the core 1.0.0 major release. No skill or agent changes. -
release-engineering 0.1.8 — patch: updated core dependency constraint from
^0.1to^1.0to track the core 1.0.0 major release. No skill or agent changes. -
agentbundle0.27.0 —[[pack.integrations]]convention: packs can now declare optional cross-pack behavior seams inpack.toml. The new[[pack.integrations]]array (governed bycontracts/pack.schema.json) carries ten fields:id,pack,kind(input/augment/review/handoff),role,consumers,providers,when,purpose,fallback, and an optionalversionsemver range.agentbundle catalogue verifyvalidates integration refs (uniqueness, primitive resolution, self-target prohibition, semver range grammar, provider presence when the target pack is in the same catalogue).agentbundle show <pack>surfaces declared integrations in table and JSON output. Five first-party integration entries ship acrosspacks/core(two, targetingfrontend-engineering) andpacks/governance-extras(three, targetingdesk-research,product-engineering, andarchitect). -
agentbundle0.26.1 — bundled schemas: the wheel now bundlesguide.schema.json,skill.schema.json,skill-manifest.schema.json, andtarget-vocab.tomlfrom the canonicalcontracts/source (plus correctedprofile.schema.jsonannotations). Enables offline skill and guide validation without network access to the source catalogue. -
Catalogue authoring standards hub:
guides/_shared/reference/catalogue-authoring-standards.mdis now part of the init scaffold — a portable routing table to every authoritative contract and authoring guide, available in everyagentbundle catalogue initoutput. -
Contract parity gate:
tools/catalogue/check_contract_parity.pyadded to thebuild-checkchain, verifying that every contract incontracts/is byte-identical to itsagentbundle/_data/counterpart on every PR. -
agentbundle catalogue init --preset self-hosted: enterprise-derived catalogue initialization. Copies selected packs, profiles, and guides from a source catalogue; generates a newcatalogue.tomlwith target identity fields; runs a fail-closed leak check. Two tooling modes:external(curation installed separately) andvendored(agentbundle source and curation copied into.agentbundle/tooling/for air-gapped deployments). Two identity modes:white-label(zero upstream trace) andattributed(upstream declared in designated surfaces only). Replaces the formerexport-catalogueskill. -
agentbundle catalogue package --flavor source: source-distribution packaging for self-hosted catalogues. Produces a versionedcatalogue-source-<release>.tar.gzfrom a positive allowlist with per-file SHA-256 digests and aself-hosted-source-manifest.json.
Changed
Section titled “Changed”-
catalogue-curationpack 0.2.1:assimilate-primitivelint gate updated fromlint-agent-artifacts(deleted at v0.13.0) toagentbundle catalogue verify; stale_Depends on core + governance-extrasfooter removed (those deps were dropped in 0.2.0). -
catalogue-curationpack 0.2.0:export-catalogueskill removed (superseded byagentbundle catalogue init --preset self-hosted). Hard dependencies oncoreandgovernance-extrasremoved — the three remaining skills operate portably against the target catalogue’s own contracts. -
Atlassian pack — complete Product Documentation pilot (Phase 3). The
atlassianpack is now the first end-to-end pilot of the Product Documentation architecture. Six connected public surfaces ship together: a 17-step tutorial (whole-team backlog → story improvements → Jira writes → stand-up summary), a 7-task how-to, a skills reference covering all 11 skills, a system-model explanation, a retrofitted pack README, and a four-stage JOURNEY.md. All six surfaces share one canonical Team Atlas scenario (184 issues, canonical IDs APP-206/APP-219/API-104) and use the Phase 2A flat-source-path model withslug:frontmatter to preserve public URLs.packs/atlassian/JOURNEY.mdis the pack-owned journey source; version stays at 0.7.0 (documentation-only; no skill content changed). -
Pack-owned canonical journeys (Phase 2B). Packs can now define their primary journey in
packs/<pack>/JOURNEY.md, the canonical source that generates the central Astro content file.tools/build-site.py --journeys-onlysyncs pack-local journeys before the web build;pages.ymlruns this step automatically in CI. -
lint-pack-journeys.py— new validator forpacks/*/JOURNEY.mdfiles; enforcesjourney_id, skill existence and count, state vocabulary, write-stageYou deciderequirement, dual-ownership detection, and duplicate ID detection. -
State vocabulary — nine machine-readable state values (
read-only,draft,proposed-write,confirmed-write,publish,destructive,no-action-required,decision-required,blocked) with enforcement inlint-pack-journeys.py. -
product-documentationpilot migration —packs/product-documentation/JOURNEY.mdis the first pack-owned journey. The central file is now generated from the pack source; the URL (/journeys/product-documentation/) is unchanged. -
Maintainer how-to at
guides/_shared/how-to/pack-journey-authoring.md— covers when to addJOURNEY.md, the full frontmatter contract, stage contract, state vocabulary, skill validation, route preservation, installation exclusion, migration procedure, and dual-ownership rules.
[core][1.0.2] — 2026-08-01
Section titled “[core][1.0.2] — 2026-08-01”Changed
Section titled “Changed”- work-loop Step 0: remove “Exactly one →” sub-item from the Active spec bullet; add inline echo instruction so the orientation block surfaces “Beginning on
docs/specs/<slug>/spec.md” alongside Initiative and Milestone output. Remove unreachable “Zero or multiple active items → stop after surfacing” bullet from the closing paragraph. Adds three evals covering Branch-1 (echo), Branch-2 (zero), and Branch-3 (multiple).
[core][1.0.0] — 2026-07-31
Section titled “[core][1.0.0] — 2026-07-31”loop-engine.py— new Phase-1 FSM phase tracker for the work-loop. See[Unreleased]for full detail.
Changed
Section titled “Changed”loop-cohort.py— Phase-1 rewrite with new verbs and split counter semantics. See[Unreleased].
Removed (breaking)
Section titled “Removed (breaking)”worktreesubcommands — disabled in Phase 1; all exit non-zero.
[core][1.0.1] — 2026-07-31
Section titled “[core][1.0.1] — 2026-07-31”Changed
Section titled “Changed”work-loopsession-resumption table:reviewers-cleanrow consequence language. Thereviewers-cleanrow now explicitly names double-increment ofreview_round_countand overwrite of fingerprint audit history as consequences of replayingreview record --reportwithout authorization.
[release-engineering][0.1.8] — 2026-07-31
Section titled “[release-engineering][0.1.8] — 2026-07-31”Changed
Section titled “Changed”- Core dependency constraint updated from
^0.1to^1.0.
[monorepo-extras][0.1.5] — 2026-07-31
Section titled “[monorepo-extras][0.1.5] — 2026-07-31”Changed
Section titled “Changed”- Core dependency constraint updated from
^0.1to^1.0.
[iac-terraform][0.1.5] — 2026-07-31
Section titled “[iac-terraform][0.1.5] — 2026-07-31”Changed
Section titled “Changed”- Core dependency constraint updated from
^0.1to^1.0.
[governance-extras][0.9.4] — 2026-07-31
Section titled “[governance-extras][0.9.4] — 2026-07-31”Changed
Section titled “Changed”- Core dependency constraint updated from
^0.1to^1.0.
[product-documentation][0.1.0] — 2026-07-28
Section titled “[product-documentation][0.1.0] — 2026-07-28”- New pack:
product-documentation. Replacesuser-guide-diataxisas the documentation authoring primitive. Installs theauthor-product-docsskill — a single entry point for five modes: create (new guide or README), revise (update an existing artifact), retrofit (reconnect a fragmented doc set to its Diátaxis contracts), audit (gap report with evidence and fix suggestions), and verify (checks that documentation claims match shipped behavior). Diátaxis governs what each page does for the reader, not which directories you must create. No four-quadrant seed scaffold is installed.
[user-guide-diataxis][0.3.0] — 2026-07-28
Section titled “[user-guide-diataxis][0.3.0] — 2026-07-28”Changed
Section titled “Changed”- Deprecated.
user-guide-diataxisnow depends onproduct-documentation; installing it still works and deliversauthor-product-docsas a result. Thenew-guideskill is a thin shim that routes toauthor-product-docs. Existing installs are unaffected. New projects should installproduct-documentationdirectly.
[catalogue-curation][0.1.6] — 2026-07-28
Section titled “[catalogue-curation][0.1.6] — 2026-07-28”Changed
Section titled “Changed”export-cataloguestrip rules extended to subdirectories. The strip list now uses**/AGENTS.local.md(was root-onlyAGENTS.local.md) and adds**/README-pypi.md, so forks produced byexport-cataloguecorrectly exclude insider AGENTS context and PyPI-specific README files anywhere in the tree.
[agentbundle][0.21.0] — 2026-07-28
Section titled “[agentbundle][0.21.0] — 2026-07-28”- Catalogue pack defaults: catalogue operators can declare per-pack config defaults in
catalogue.tomlunder[pack-defaults.<pack>]; these are baked in at publish time and merged with user config when a pack reads its settings. - Custom user directory:
[catalogue] user-diroverrides the default~/.agentbundleinstall root; the override persists instate.tomland is honoured by all CLI commands. - Pack config API:
pack_dirandload_pack_configinagentbundle.configfor resolving per-pack directories and reading the three-layer config cascade from pack scripts. - Operation log API:
write_entryinagentbundle.oplogfor appending JSONL operation records to<pack_dir>/ops.jsonlwith atomic append semantics. agentbundle pack-configCLI:get,set,show, andpathsubcommands.agentbundle oplogCLI:append,show, andclearsubcommands.
[release-engineering][0.1.6] — 2026-07-27
Section titled “[release-engineering][0.1.6] — 2026-07-27”- Ephemeral environment qualification (
release-loopskill): outer-loop ephemeral environments must meet the L5 isolation floor (dedicated cloud account/project, or an L4/L4+ k8s namespace/vCluster that passes a three-dimension policy audit — prod reachability, data isolation, inter-env isolation). An environment below the floor is a consent-gate crossing; L4/L4+ qualifies only after the policy audit passes. - Polyrepo / value-stream topology (
release-loopskill): fleet manifest (release-fleet.yaml) schema, canonical e2e host repo definition (Must/Must-NOT rules), five-term harness-neutral deploy sequencing vocabulary (Component / Stage / Gate / Depends-on / Release manifest), and a collect-then-validate pre-deploy phase that runs RFC-0072 D6 provenance verification for every component beforeinfra-apply.
[core][0.15.5] — 2026-07-27
Section titled “[core][0.15.5] — 2026-07-27”fidelity-ladderreference module (operational-safety/references/): seven-level EXECUTE/QUALIFY reference (L0 in-memory fake through L6 staging) with per-level coverage, gaps, budget heuristics, the three-dimension outer-loop qualification test, and an isolation provability classification (self-evident / requires-policy-audit / programmatically-auditable). Companion to the existingenvironment-isolationREVIEW module; new module is constructive (how to choose / build), existing is audit (does it meet the bar).- Fidelity-ladder section (
work-loopskill): inner-loop budget heuristic (sub-5-min rule; L0–L1 always; L2–L3 ceiling for most services), seven-level summary table, cross-reference tooperational-safety/references/fidelity-ladder.md, and a build-pack handoff note.
[release-engineering][0.1.5] — 2026-07-27
Section titled “[release-engineering][0.1.5] — 2026-07-27”- Six new RFC-0072 doctrine sections in
release-loop/SKILL.md. Adds the G4 handoff package schema (release-handoff.yaml— all mandatory fields), a four-phase deploy ordering protocol (infra-apply → service-deploy → smoke → canary), canary analysis defaults with four-outcome protocol (PROMOTE / ROLLBACK / PAUSE / HALT) and traffic steps 5%→25%→50%→100%, feature flag lifecycle (six states: created → deployed-off → enabled-pct → full-rollout → deprecated → removed), service vs. IaC rollback procedures, and SLSA L2 artifact provenance verification with cosign/keyless signing. - New
define-sloskill. Produces an OpenSLO v1 YAML document (slos/<service>.yaml) with anerror_budget_policyblock (halt_at / warn_at / postmortem_at / trailing_window). The release-loop PRR gate reads this artifact to resolve theerror-budgetfield to one of four states:not-defined,within-budget,warning: <N>% remaining, orexhausted: halt-releases. Includes authoring-time query validation protocol and toolchain translation notes (Sloth, Pyrra, Nobl9, Datadog). - PRR error-budget paragraph updated. Replaces the “supplied by a follow-on
SLO-authoring capability (home provisional)” paragraph with the four-state resolution
protocol referencing
define-slo.
[frontend-engineering][0.1.2] — 2026-07-27
Section titled “[frontend-engineering][0.1.2] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
css-architecture,responsive-layout,token-architecture. Skills now declare rendering shape for inline output. No functional change.
[core][0.15.4] — 2026-07-27
Section titled “[core][0.15.4] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directive added to
init-project. Skill now declares rendering shape for inline output. No functional change.
[user-guide-diataxis][0.2.1] — 2026-07-27
Section titled “[user-guide-diataxis][0.2.1] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
new-guide. Skills now declare rendering shape for inline output. No functional change.
[product-strategy][0.2.2] — 2026-07-27
Section titled “[product-strategy][0.2.2] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
write-prfaq,define-content-strategy,run-bcg-matrix,run-swot,synthesize-stakeholder-research,define-ux-strategy. Skills now declare rendering shape for inline output. No functional change.
[product-engineering][0.13.2] — 2026-07-27
Section titled “[product-engineering][0.13.2] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
identify-opportunities,frame-intent,decompose-intent,diverge-solutions,voice-and-microcopy,frame-domain,lean-canvas,align-value-stream. Skills now declare rendering shape for inline output. No functional change.
[linear][0.1.4] — 2026-07-27
Section titled “[linear][0.1.4] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directive added to
linear. Skill now declares rendering shape for inline output. No functional change.
[frontend-engineering][0.1.1] — 2026-07-27
Section titled “[frontend-engineering][0.1.1] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
fe-performance,component-contract,a11y-engineering,rendering-strategy,fe-status. Skills now declare rendering shape for inline output. No functional change.
[figma][0.2.1] — 2026-07-27
Section titled “[figma][0.2.1] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directive added to
figma. Skill now declares rendering shape for inline output. No functional change.
[experience-design][1.6.2] — 2026-07-27
Section titled “[experience-design][1.6.2] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
design-principles,informational-design,content-design,tone-of-voice,design-system,creative-direction. Skills now declare rendering shape for inline output. No functional change.
[desk-research][1.1.3] — 2026-07-27
Section titled “[desk-research][1.1.3] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
decision-archaeology,desk-research,desk-research-project-start,build-outline,source-map,identify-perspectives,desk-research-project-check. Skills now declare rendering shape for inline output. No functional change.
[contracts][0.3.5] — 2026-07-27
Section titled “[contracts][0.3.5] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
api-contract,event-contract. Skills now declare rendering shape for inline output. No functional change.
[catalogue-curation][0.1.4] — 2026-07-27
Section titled “[catalogue-curation][0.1.4] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
assimilate-repo,propose-catalogue-pack. Skills now declare rendering shape for inline output. No functional change.
[atlassian][0.6.2] — 2026-07-27
Section titled “[atlassian][0.6.2] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
confluence-crawler,jira-align,jira. Skills now declare rendering shape for inline output. No functional change.
[core][0.15.3] — 2026-07-27
Section titled “[core][0.15.3] — 2026-07-27”Changed
Section titled “Changed”- Output rendering directives added to
work-loop,receive-brief,contract-acquisition,capture-work,author-brief,adapt-to-project,new-spec,bug-fix. Skills now declare rendering shape for inline output. No functional change.
[frontend-engineering][0.1.0] — 2026-07-27
Section titled “[frontend-engineering][0.1.0] — 2026-07-27”- New standalone pack:
frontend-engineering(0.1.0). Promotes thefrontend-engineeringskill from core to a first-class pack. Ships nine skills:frontend-engineering(design pre-flight, craft rules, gates),token-architecture,a11y-engineering,fe-performance,rendering-strategy,component-contract,responsive-layout,css-architecture, andfe-status. Includes afrontend-reviewerdiff-level subagent. Co-installs withexperience-designfor full genre routing.
[agentbundle][0.20.0] — 2026-07-27
Section titled “[agentbundle][0.20.0] — 2026-07-27”-
agentbundle docs <pack>— read pack documentation from the catalogue source.--listenumerates available files;<file>displays a specific file by stem. Works across all source types. -
[pack.runtime-dependencies]in pack schema — declare external runtime dependencies per pack (ecosystem, package, version, optional, skills, install, note).
[agentbundle][0.13.0] — 2026-07-26
Section titled “[agentbundle][0.13.0] — 2026-07-26”-
agentbundle catalogue lintnow covers profiles, seeds, first-value contract, and credentialed-skill conventions. Four checks previously in standalonetools/scripts are now in the CLI: profile validation, seed blocklist enforcement, first-value contract completeness, and credentialed-skill AST inspection. Requirespip install 'agentbundle[lint]'for the AST pass. -
agentbundle catalogue lint --deepruns the agentskills.io spec compliance pass on everySKILL.md. Checks frontmatter key set, description length cap, name format, layout, and eval structure. Exits 2 with a clear message when PyYAML is absent. -
agentbundle catalogue verifynow runs agent-artifact lint (step 11) and plugin-manifest schema validation (step 13). Step 11 validates projected skill/agent/command frontmatter; step 13 validatesplugin.jsonagainst the bundled schema. Both requirepip install 'agentbundle[lint]'. -
agentbundle pack evals run— new CLI command for pack activation evals. Runs Tier-A skill-activation evals viaclaude --output-format stream-json; writes results to a gitignored eval workspace. Report-only. -
Windows cp1252/UTF-8 guards. All scripts and subprocess calls now include UTF-8 reconfigure guards. Lazy
import asyncioin credentialed scripts. -
New
[lint]optional dependency.pip install 'agentbundle[lint]'pullspyyaml>=6.0.
Removed
Section titled “Removed”- Six standalone
tools/linter scripts deleted.lint-agent-artifacts.py,lint-catalogue-seeds.py,lint-profiles.py,lint-first-value-contract.py,lint_credentialed_skills.py, andvalidate-claude-plugin-manifests.pyremoved. All functionality preserved incatalogue lintandcatalogue verify.
[Unreleased]
Section titled “[Unreleased]”Changed
Section titled “Changed”-
jira-team-statusandjira-story-triagereframed for safe team-backlog orientation (atlassian pack 0.7.0). Two readiness concepts are now explicitly distinct: team readiness (the default — scope + eligible open-work state + no known blocker + minimum definition) and agent-execution readiness (the five-question bar, activated only when the user explicitly asks for “agent-ready”, “one-PR”, or “coding-agent candidates”). The five-question bar is labeled an agent-execution readiness standard, not a universal team story quality standard.jira-team-statusoutput starts with a header block (scope, coverage, Jira-not-changed confirmation, summary counts) before grouped sections — not a trailing summary line. Backlog items with insufficient definition go to Needs story work (renamed from “Needs detail”) rather than silently to “Not ready”. Pagination is now to completeness (Cloud cursor-based, Server offset-based), with an accurate coverage disclosure (Complete — N items,Cap reached — N items,Permission-limited — N items accessible) rather than a silent 100-item truncation. Stand-up summaries disclose when historical comparison is unavailable.jira-story-triageper-item output now includes: issue ID/title, readiness result, missing information, why that gap matters, proposed rewrite, proposed ACs, unresolved human questions (questions that must be answered by a human before improvement can proceed), expected readiness after draft, and Jira-not-changed confirmation. Write payloads show old values, proposed values, protected fields (status, assignee, sprint, priority, labels — never changed without explicit request), and total count before writing; partial failures report per-issue success/failure with a safe recovery path. Pack first-value starter-prompt changes from a personal assignment query to a team-oriented request. Deterministic and judgment evals (evals.json) added for both skills covering 16 fixture scenarios. (spec) -
voice-and-microcopyrenamed toux-writingin theproduct-engineeringpack (RFC-0066 D7 / spec:ux-writing-rename). All operative references acrossexperience-design,product-strategy, guides, and web content updated in the same PR. Alias-free clean retire per ADR-0038 precedent. -
All output-producing skills now declare an
## Output renderingsection so agents know which output shape each skill emits (15 pack patch bumps). ~70 skills across architect (0.14.1), atlassian (0.6.1), catalogue-curation (0.1.3), converters (0.9.2), core (0.15.1), desk-research (1.1.2), experience-design (1.6.1), github (0.1.2), governance-extras (0.9.1), iac-terraform (0.1.3), linear (0.1.3), monorepo-extras (0.1.4), product-engineering (0.13.1), product-strategy (0.2.1), and release-engineering (0.1.4) gained an## Output renderingsection with the directive lines that match what each skill actually emits — Table, Status list, Severity list, Tree / hierarchy, Diagram / flow, Key–value, Code change, or Rationale / narrative — rather than loading the full catalog into every skill. The full directive catalog ships atguides/_shared/reference/output-rendering.md. Skills that write files, interact conversationally, or emit raw data streams for machine consumption carry no directive. -
workspace-statusrenders its queues in predictable status-list and table shapes (core pack 0.15.0). The skill now carries explicit rendering directives so its output is scannable and consistent across sessions. Ready to start, Blocked, Backlog, and signals render as status lists led by a glyph —○ready ·●active ·⚠blocked ·✓shipped, glyph first, one item per line with any runnable command left intact. Active initiatives render as a Markdown table (with a right-aligned shipped count) when more than one is active, and as the one-line form otherwise. The brief queue renders as an alignedlabel: valuelist, and the Step 6b dependency graph prefers a fencedmermaidflowchart in chat while keeping the ASCII block as the terminal-only fallback. Findings registers stay full Markdown tables. -
workspace.tomlentries gain asummaryfield;capture-workwrites it (core pack 0.15.0). Queue, shaping, and[backlog]entries now carry a shortsummary = "…"label thatworkspace-statusrenders as the item’s title — so rows read as a human-legible line instead of a bare slug, and the reader no longer has to scrape the first comment line for the backlog summary (it falls back to that only for un-migrated entries).capture-workwrites thesummaryalongside the fuller cold-start comment; the entry schema is nowslug/path,needs,source,summary, and (shaping-only)type. The liveworkspace.tomlwas migrated: all 58 backlog and 7 shaping entries got summaries, and the two completed initiatives’ fully-shipped queues (367 lines of commented-out shipped-spec bodies) were collapsed toqueue = []. -
Initiatives can be marked completed when their last spec ships (core pack 0.15.0).
workspace-statusskipspaused/closedinitiatives from the active surface, and its closeout check now fires at two moments: when an initiative’s last item has shipped (elicits settingstatus = "closed") and when exactly one unshipped item remains (flags that shipping it completes the initiative).work-loop’s done step, after moving the last spec to[work].shipped, elicits marking the initiative completed and writesstatus = "closed"in the same PR. -
list-installedgains--format json,--updates-only, andaheadstatus (agentbundle 0.13.0).--format jsonemits a stable JSON contract (schema_version: 1, per RFC-0072 D5) to stdout with all diagnostics on stderr — enables CI automation of upgrade decisions.--updates-onlyhidesup-to-daterows from output while keeping the summary counts over the full pre-filter set. The command now resolves each row’s recorded source catalogue independently (multi-source grouping), so a single source failure no longer suppresses rows from other sources. Status is now four-valued:up-to-date,upgrade-available,ahead(installed version is newer than catalogue),unknown; everyunknownrow includes a machine-readable reason code (source-unknown,source-unavailable,malformed-catalogue,pack-not-found,incompatible-contract,adapter-no-longer-supported,unparseable-catalogue-version,unparseable-installed-version). A conditional SOURCE column appears in table output when 2+ distinct sources are present. Rows sort by (scope, pack, adapter). (spec) -
information-architectureskill gains 12 page-archetype references, product-object mapping, card-use test, and attention + permission contracts (experience-design 1.3.0). A newreferences/page-archetypes.mdcovers 12 surface types — marketing landing, onboarding, product workspace, dashboard/admin, transactional flow, pack/catalogue, journey, tutorial, task how-to, reference index, explanation, and multi-surface — each with 10 required fields (primary user, job, first-screen contract, primary action, expected result, next action, proof, read/write consequence, critical states, navigation behavior). Product-object mapping guidance names the five object roles (creates / receives / inspects / changes / approves) and the visual weight rule for each. A card-use test with non-card alternatives prevents card misuse. The attention contract (no-action / optional-progress / decision-required / blocked-pending) and read/write permission contract (read-only / draft / proposed-write / confirmed-write / destructive / undo-recovery) apply to every surface. The SKILL.md procedure gains two new steps — archetype identification and product-object mapping — before hierarchy design begins. A new IA how-to guide ships with a 12-archetype quick-reference table and a decision procedure. The experience-design journey page names archetype identification and product-object mapping as explicit steps. (spec) -
place-betskill requires four new fields:thin-slice,first-success-event,specialist-lenses, andlearning-contract(product-engineering pack 0.13.0). The thin-slice field enforces the four-criterion definition — one user, one real task, one meaningful result, one material failure and recovery, plus a named instrumentation event.first-success-eventnames what “adopted” looks like for one user 30 days out.specialist-lensesdefaults to product, experience, architecture, safety.learning-contractrequires signals, review cadence, and a pivot trigger. Three anti-patterns added: betting without a thin slice, first-success-free briefs, and blank learning contracts. (spec) -
de-risk-intentskill gains evidence ladder (product-engineering pack 0.13.0). Assumptions are now classified on a five-level evidence ladder:observed | supported | inferred | assumed | unknown. Step 2 instructs testing from the lowest rung first —unknownbeforeassumed,assumedbeforeinferred. Thevalidation_hookoutput template gains anevidence_levelfield. (spec) -
jira-team-statusandjira-story-triagereshaped to activate from natural team language (atlassian pack 0.6.0). Both skills now trigger from the words delivery leads and POs actually use — no need to name the skill.jira-team-statusis a read-only status view organized by the dimensions people ask about (Ready to pull · In progress · Blocked · Unassigned · Needs detail, plus recently-changed and stale markers), answering “what can the team pick up next?”, “what is blocked?”, “what is sitting unassigned?”, “what changed in this sprint?”, and “team status for stand-up”. “Ready to pull” is now a documented, team-overridable rule — in the selected scope + an eligible backlog state (defaultstatusCategory = "To Do") + no known blocker + meets the five-question readiness bar — and signals it can’t read are labelled “needs confirmation” rather than asserted.jira-story-triagenow explains why each item is not ready (which question failed and the specific gap, not a bare tier label) and can improve weak items — draft acceptance criteria, clarify the outcome — writing back viaupdate-issueonly after per-item approval. The write/improvement path moved fromjira-team-status(now read-only by default, routing “shape this” to triage) intojira-story-triage. The five-question bar remains the shared engine; “agent-readiness / Tier A/B/C” is retired as the headline framing. (spec) -
new-guideskill broadened to create or substantially revise guides (user-guide-diataxis 0.2.0). The skill now triggers on rewrite, audit, simplify, and modernize requests in addition to new-guide creation — covering pack pages and journey pages alongside the four Diátaxis quadrants. The audience contract is replaced by a seven-field conversation contract (reader, job, natural_start, minimum_scope, first_result, write_boundary, next_request) as the gated checkpoint before any prose is drafted. Per-page-type contracts for all six surface types now live in a dedicatedreferences/page-contracts.md. Three new reference files ship with the skill:conversation-first.md(sequencing rules),page-contracts.md(six surface contracts), andusability-review.md(pre-publish checklist).clear-prose.mdgains a## Conversation-first structuresection with eight page-level structural rules. Evals updated with revise/audit trigger cases and a conversation-first output-quality rubric. Key doctrine: Diátaxis determines where information lives. User intent determines how readers enter it. (spec)
-
Story quality gate on
jira: create-issue(atlassian pack 0.5.0). Thejiraskill now runs a pre-create quality gate before everycreate-issuecall: it detects the invocation repo viagit remote -v(“Invocation repo” label), then checks the candidate story against the five-question actionability bar (self-contained change, reachable repo scope, binary ACs, no mid-flight decision, right-sized for one PR — Q5 added because Jira stories are a legacy capacity-allocation mechanism and oversized stories cannot be handed to a single agent or engineer). Six concrete checks with story-points as the primary Q5 signal. Gate fires oncreate-issueonly;update-issueis unaffected. (spec) -
jira-story-triageskill (atlassian pack 0.5.0). Audits a Jira backlog, sprint, or JQL-scoped set of stories for agent-readiness. Scores each story against the five-question actionability bar, applies a Blocked pre-check (image-only descriptions and discovery issuetypes short-circuit before Q1–Q5), classifies into Tier A (all five pass), B (exactly one named external gate fails), or C (any content failure or Q5 fail), then groups Tier A by complexity: Quick (≤ 2pts or ≤ 100 words), Standard (3–5pts), Involved (> 5pts). Read-only; composesjirafor all reads. (spec) -
jira-team-statusskill (atlassian pack 0.5.0). Session-entry-point for sprint planning and daily coordination — modelled on theworkspace-statuspattern. Shows a scored sprint snapshot in four sections (§1 Agent-ready grouped by Quick/Standard/Involved, §2 Parallel batching candidates, §3 Gated, §4 Needs shaping), then offers a pick-up hand-off: Option A routes delivery tojira-defect-flow(bugs) ornew-spec(tasks/stories); Option B shapes a blocked story collaboratively and callsupdate-issueonce with explicit user consent. No reference to local workspace files or workspace.toml — completely separate from local queue management. (spec)
Changed
Section titled “Changed”capture-workcaptures machine-readable dependencies for backlog items (core pack 0.13.7). When a[backlog]entry’s unblock condition is the completion of another tracked item (a[backlog]slug or a[work]spec) as a hard prerequisite,capture-worknow adds the matchingneedsedge instead of recording the dependency in prose only — soworkspace-statuscan resolve it. Disjunctive (“A or B”), untracked-target, and external (“credentials provisioned”, “someone takes the PR”) unblocks deliberately stay prose. Theworkspace.tomlseed and[backlog]schema header now state the same rule.
-
First-value handoff block in
agentbundle install(agentbundle 0.12.0). A successfulagentbundle installnow prints a guidance block after theinstalled:line. Level B packs (non-technical audience,level-b = true) show four labelled lines —Verify:,Try:,Expected:, and optionallyNext:— drawn from the pack’s[pack.first-value]schema. Level A packs showVerify:only. Packs without[pack.first-value]are unchanged. Dry-run, upgrade, and profile-install paths are not affected. (RFC-0064 Amendment #4 · spec) -
workspace.tomlseed (core pack 0.13.6).agentbundle install corenow delivers a minimalworkspace.toml— schema comments and a[backlog]section — so the file exists from day one. Closes the gap where the installed CONVENTIONS.md referencesworkspace.toml [backlog].openbut install never created the file. The workspace-status “offer to initialise” path remains the upgrade tool for adding the full initiative schema. (RFC-0069) -
Tracker intake guides — decision tree + vocabulary mapping table. Adds two cross-cutting guides in
guides/_shared/:choose-a-tracker-integration.md(decision table and per-tracker sections covering GitHubgithub-brief-intake, Linearlinear-brief-intake, Jirajira-brief-intake, Jira Alignjira-align-brief-intake, and the no-trackerauthor-briefpath) andtracker-vocabulary.md(cross-tracker object-level mapping table + brief-intake skill routing table). P4 guide slice for the RFC-0064 tracker intake phase. (spec) -
governance-extras 0.8.2 — first-session tutorial (preview-confirm write pilot). Adds
guides/governance-extras/tutorials/governance-extras-first-session.md: a step-by-step walkthrough of thenew-adrpreview-confirm write gate — decision framing, ADR content preview, target path preview, confirm/stop/revise, recovery, and next actions. Addstutorialfield to[pack.first-value]inpack.toml. Completes theportfolio-first-run-pilot-governance-extraspilot (RFC-0064 Amendment #4 preview-confirm write archetype). -
architect-first-session.mdfirst-session tutorial (architect pack 0.13.3). First-value guided tutorial for the no-terminal architecture path; wires thetutorialpointer in the pack’s first-value contract. Covers install verification, verbatim starter-prompt, expected-result (docs/architecture/reference.md), recovery, and next action. Pilot transcript confirms the path works via direct model reasoning (no skill required for the starter-prompt). -
jira-align-brief-intakeskill (atlassian pack 0.4.0). Turns a Jira Align Feature into a product brief and shippable specs: fetches the Feature and its child stories, tasks, and defects via thejira-alignskill, maps them onto a Shape B product brief using a configuration-guided field mapping reference (customised for org-specific workflow state names and Program Increment cadences), and hands off toreceive-briefto elicit gaps, decompose, and build. 1-way intake only — never writes to Jira Align. Mirrors thejira-brief-intakechoreography pattern for Jira Align’s program-level delivery unit. (RFC-0064 M5) -
New
githubpack (v0.1.0) withgithub-brief-intakeskill. Pull a GitHub Milestone and its issues via theghCLI, map them to a Shape B product brief (milestone title → Outcome draft; open and closed issues →US-n (#NNN)stories, closed issues annotated[closed]; milestone URL →Epic:provenance pointer), write the brief todocs/product/briefs/<slug>.md, and hand off toreceive-brief. Three-way auth model: authenticated → proceed; unauthenticated + public repo → note posture and continue; unauthenticated + 404 → ambiguous message (private and nonexistent repos are indistinguishable). Graceful degradation whenreceive-briefis absent. Optional post-intake write-back (comment / label / close — never body edits). Ships with a Diátaxis how-to guide. (spec) -
figmapack (0.1.6) — first-run tutorial for the credentialed read-only archetype. Addsguides/figma/tutorials/figma-first-session.md: a step-by-step tutorial for non-technical designers to reach their first visible result (page and frame structure from a Figma file they own). The tutorial coverscredential-brokersprerequisite install, user-initiated credential setup via thecredential-setupskill (token entered at the terminalgetpassprompt, never in chat), connection verification viafigma check+figma whoami, and the starter task. Corrects a factual error in the pack’s[pack.first-value]verificationfield (workspace-listing was not a real capability; corrected tocheck/whoamipath). Adds thetutorialfield to[pack.first-value], making the contract independently verifiable. (spec) -
architect 0.14.0 — Stage-0 concept stop point + adopter front-door fixes.
architect-designnow treats the Stage-0 concept as a valid stopping point: you can save the concept on its own (or stop at chat) without proceeding to the full design doc, and the skill ends with a Stage-0 completion receipt — eitherResult: chat only; no file was created.or the exact saved path and what it contains. The README leads with plain outcomes (shape a concept / draw a system / review an architecture) before internal vocabulary, adds a surface-aware route cue, corrects the install example toagentbundle install --pack architect <catalogue>(the bareinstall architectform the current parser rejects), and lists the correct adapter names. Adds a regression test locking the README’s documented install commands to the live CLI parser. (RFC-0064 Amendment #4 adopter-persona mechanical fixes.) -
figma 0.2.0 — render completion receipt + credential source-of-truth fix + front-door prerequisites. Every
export-imagesrender now ends with a mandatory receipt: source frame, exact local output path, format, skipped/lower-fidelity warnings, andNo Figma changes made. The SKILL’s credential-resolver reference is corrected from the stalecredentials_shimto the standalonecredbrokerlibrary (matching the live client), and the shared pack-catalogue guide’s stalefrom agentbundle.credentials import …line is corrected tocredbrokerfor bothfigmaandatlassian. The README leads with plain outcomes, states the precise remote consequence (no REST node edits; collaborator-visible comments that require confirmation), front-loads the Figma account / plan / token-scope / 403 conditions, and gives one authoritative setup sequence with<catalogue>explained. (RFC-0064 Amendment #4.) -
governance-extras 0.9.0 — preview-confirm write gate + completion receipt for
new-adr/new-rfc. Both skills now resolve and display the repository root, detect a non-default ADR/RFC location, draft the content, and show a preview (identifier, status, target path, index path, content) that waits for explicit confirmation — no file is created and no index updated before you confirm. After writing, each returns a completion receipt (identifier, file path, index path, status, files changed, owner, next step). Identity fields no longer assume GitHub handles. The README leads with outcomes (record a decision / propose a change / change the rules) before the ADR/RFC acronyms, corrects the skill count (four skills, includingrfc-status), states the repo-scope consequence (adds capabilities and files to the current project), and shows a--dry-runpreview route. (RFC-0064 Amendment #4.)
-
Shared install/upgrade guides — removed the stale
--to <version>flag. Theagentbundle upgradeverb no longer accepts--to; version selection is by pointing<catalogue>at a git ref. Corrected the flag out ofpreview-install-or-upgrade,install-user-scope-pack-into-kiro,install-user-scope-pack-into-codex, and thefile-safety-contractexplanation. -
Invalid bare
agentbundle install <name>forms corrected across the remaining packs. The install verb requires--pack; the bare-positional form the current parser rejects was still documented inlinear(0.1.2),iac-terraform(0.1.2),product-strategy(0.1.2),product-engineering(0.12.2 — including a two-pack-in-one-command line split into two invocations), andrelease-engineering(0.1.3) READMEs, plus thecatalogue-curation,desk-research,figma, andgovernance-extrasfirst-session tutorials. All now useagentbundle install --pack <name> …; thedesk-researchtutorial also drops the pre-renameresearchpack name. Follow-up to the RFC-0064 Amendment #4 adopter front-door fixes. -
Claude plugin marketplace manifest now passes
claude plugin validate(Claude Code 2.1.209). Three generator defects caused 35 errors: (1) marketplace missing top-levelnamefield, (2) pluginauthoremitted as a plain string instead of a{name, email}object, (3) pluginsourcefield absent entirely. All three are fixed in the build pipeline (derive_projectable_subset,_run_aggregate,_aggregate_marketplace). The.claude-plugin/marketplace.jsonin the working tree now validates with 0 errors.
Changed
Section titled “Changed”-
RFC-0064 Amendment #4 — cross-pack first-value adoption overlay. Records Level A/B pack obligations, a pilot-first rollout contract, and eight decisions governing non-technical pack onboarding. Adds five work queue entries (
spec/portfolio-pack-first-value-contract, three pilot specs,spec/agentbundle-first-value-handoff) and two shaping entries toworkspace.toml. Reconcilesspec/m2-frame-intent-jtbdfrom queue to shipped. (RFC-0064 Amendment #4) -
frame-intentskill (product-engineering pack 0.12.0) — three-tier JTBD elicitation in step 5. The Opportunity framing step now explicitly elicits a functional job, emotional job, social job, and struggling moment. The intent template’s Opportunity section carries four corresponding optional sub-fields. Existing intents with free-form Opportunity prose remain valid without migration. -
workspace-statusskill (core pack 0.13.3) — Findings step shows inline tables. When eitherdocs/product/findings/rfc-candidates.mdordocs/product/findings/roadmap-intents.mdhas data rows,workspace-statusnow prints both tables inline rather than a bare count. When both registers are empty, a single summary line is shown (0 rfc candidates · 0 roadmap intents — both registers empty) instead of silently omitting the section. -
work-loopskill (core pack 0.13.5) — pre-existing failure capture + progressive disclosure. Adds a “Pre-existing failure triage” step to GATES: when a gate fails on a file not in the diff, the loop captures it toworkspace.toml [backlog].openas apre-existing-*slug and treats it as a known-skip rather than going to FIX. Full schema in newreferences/pre-flight-failures.md. Also collapses the self-coverage gate section (~30 inline lines → 4-line summary +references/self-coverage/protocol.md) and removes the infra/deploy multi-artifact preflight paragraph (already covered byreferences/infra-verification.md). -
work-loopskill (core pack 0.13.2) — experience-reviewer rendered-output clarification for web surfaces. Theexperience-reviewerbullet in the REVIEW section now explicitly states that for web surfaces (HTML/CSS/JS), “rendered output” means the built site — run the build and describe key pages from the output; the code diff alone cannot serve as the rendered artifact for genre-rubric or cross-page consistency checks. Backlog itemwork-loop-xd-rendered-output. -
Claude plugin install command updated to use marketplace format. The documented install flow in
README.mdand the web catalogue now usesclaude plugin marketplace add eugenelim/agent-ready-repofollowed byclaude plugin install <pack>@agent-ready-repo, replacing the deprecated repository-tree-URL form (claude plugin install https://github.com/…/tree/claude-plugins-dist/<pack>). -
check-workspacerenamed toworkspace-status(core pack — clean retire, no alias). The workspace-level cold-start orient skill is now invoked asworkspace-status. All operative references swept in one PR. Adopters invokingcheck-workspaceby name will receive a “skill not found” signal; update toworkspace-status. The new description triggers cover all phrasing the old skill responded to, plus “workspace status”, “where am I”, “orient me”, “session start”. (RFC-0067, ADR-0054)
-
linearpack (0.1.0) — Linear integration: credentialed CLI + brief intake/sync. New opt-in user-scope pack. Adds three skills: (1)linear— a credentialed GraphQL CLI for read-only access to Linear Issues and Projects (check, get-issue, get-project; Personal API Key viacredbroker; paginated up to 250 issues; 429 Retry-After); (2)linear-brief-intake— maps a Linear Issue (with sub-issues) or Project onto a Shape B product brief, caps at 10 stories, hands off toreceive-brief; (3)linear-brief-sync— delta catch-up for existing briefs: diffs Linear-sourced fields, presents section-level before/after for PE approval, refuses when Status is Executing. (RFC-0068) -
Pack first-value contract — all 17 packs (RFC-0064 Amendment #4). Every pack now carries a
[pack.first-value]section inpack.tomlrecording audience posture, verified surfaces, prerequisites, verification steps, and recovery steps. Level B packs (10 of 17) additionally carry a starter task, starter prompt, expected result, and next action for non-technical or mixed audiences. Two packs (governance-extras,user-guide-diataxis) include asafety-gatebecause their starter task writes a shared governance or structural record.tools/lint-first-value-contract.pyenforces the contract at build time;tools/build_gate_chain.py build-checknow includes the new gate. -
frontend-engineeringskill (core pack 0.13.1) — XD genre routing step (step 1b). After naming the aesthetic reference (step 1), thefrontend-engineeringPLAN phase now routes to the matching XD discipline skill by surface type:conversion-designfor marketing pages,documentation-designfor docs/help,analytical-designfor dashboards,informational-designfor editorial pages,interaction-designfor form flows and component state machines,content-designfor content strategy. T2 conditional — experience-design pack detected by checking forconversion-designin available skills; absent pack records a named skip and proceeds to step 2. Backlog itemxd-genre-routing-frontend-engineering. -
capture-workskill (core) — classify-then-triage front-door forworkspace.toml. Replacesqueue-add. Before writing,capture-workclassifies each item as[build](implement, fix, spec, refactor) or[shape](research, strategy, design, signal) and surfaces that classification for confirmation. Build items route to the same destinations asqueue-add(active initiative’s[work].queueor[backlog].open), with all prior behaviors preserved: slug derivation + collision check, dependency inference from explicit language only, grouping (independent batch / atomic bundle), prioritization elicitation, escalation rubric, cold-start-sufficient comments, comment-preserving write, graceful degradation. Shaping items route to[shaping_queue].backlog(initiative-scoped) or[backlog].openwith atypefield (repo-level);signalitems route to[shaping_queue].active. After writing, the skill offers a progressive capability-detected hand-off to the matching shaping skill if its pack is installed, or emits a named install hint if not. Triggers on “capture this”, “add these to the queue”, “capture these as queue items”, “queue this up”, “add this to the backlog”. (RFC-0064 Amendment #3) -
workspace-statusmode tags — every item in the Ready-to-start and Backlog sections is now prefixed with its room:[build](work queue items and untyped backlog entries),[shape](shaping queue items and typed backlog entries),[brief](brief queue items). The two-room model is immediately visible at session start. -
work-looporient-step guard — step 0 now checks whether the argument slug matches a shaping entry in[shaping_queue](active or backlog) or a typed[backlog].openentry. If matched, the skill emits a redirect naming the appropriate shaping skill and stops before PLAN. Prevents accidentally runningwork-loopon items that belong in the shaping room. -
Verb taxonomy section in
guides/_shared/how-to/author-a-skill.md. A new## Naming your skillsection (after## Body structure) documents the canonical five-verb taxonomy (status,start,check,init,resume) and the banned-label list (arrive,orient,onboard,return,onboarding) from ADR-0054. Pack authors now have a lookup table before naming a new skill. -
product-strategypack 0.1.0 — the strategy seat upstream of product engineering and experience design (RFC-0063, ADR-0053). A new user-scope, pure-markdown pack with 9 skills across 3 pillars. Pillar 1 — Market and competitive strategy:run-swot(SWOT analysis →swot-analysis.md);run-porters-five-forces(industry structure analysis →competitive-landscape.md);run-pestle-analysis(macro-environment scan →macro-environment.md);run-bcg-matrix(portfolio position by quadrant →portfolio-position.md);run-okr-cascade(company → team OKR derivation + gap identification →okr-cascade.md; gaps routed as{type = "strategy"}entries to the active initiative’s["ini-NNN".shaping_queue].backloginworkspace.tomlforframe-situation(PE pack) to pick up);write-prfaq(altitude-0 press release + FAQ forcing function →prfaq.md);synthesize-stakeholder-research(consumes desk-research pack outputs →stakeholder-synthesis.md). Pillar 2 — UX strategy:define-ux-strategy(NN/g three-layer model + Jaime Levy four tenets + Gothelf/Seiden OKR-linked framing →ux-strategy.md). Pillar 3 — Content strategy:define-content-strategy(Halvorson quad: Purpose + Process + Structure + Governance →content-strategy.md). All artifacts resolve their write path through the[product-strategy]table ofagentbundle-layout.toml(config → defaultdocs/product/shaping/→ discover-by-marker). Each skill ships trigger evals (eval_queries.json) and a Tier-4 LLM-judge eval (evals.json). The OKR-cascade → PE-pack cross-pack routing contract is documented inpacks/product-strategy/.apm/skills/run-okr-cascade/references/cross-pack-routing.md;workspace-statusroutes{type = "strategy"}items toframe-situation(M2) orframe-intentas interim. Journey:docs/product/journeys/product-strategist-sets-direction.md. -
experiencepack 0.6.0 — surface-genre uplift: 9 canonical renames, 7 new skills. The experience pack moves from 11 skills at 0.5.x to 18 skills at 0.6.0. Nine skill renames to canonical industry vocabulary (ADR-0052):map-customer-journey→journey-mapping,blueprint-service→service-blueprint,map-screen-flow→user-flow,map-internal-process→process-mapping,aesthetic-direction→creative-direction,layout-and-information-architecture→information-architecture,design-critique→design-review,design-system-foundations→design-system,copy-direction→tone-of-voice. Seven new skills:design-principles(Define-phase: NNGroup 4-step model, arbitration test, evidence-level carry-through);conversion-design(marketing surfaces: hero approach, above-fold spec, scroll story, social proof tier);documentation-design(docs surfaces: Diátaxis type map, navigation-at-scale strategies, TTFV target, machine-readability as design-phase decision);analytical-design(dashboard surfaces: domain-model-first, business-question anchoring, 3-tier widget hierarchy, Shneiderman’s mantra, spatial layout grammar);marketplace-design(catalogue surfaces: card IA hierarchy, filter/facet architecture, comparison affordances, browse-first vs. search-first);informational-design(editorial surfaces: typography as primary design tool, F/Z-pattern calibration, editorial grid, “what’s next” chain);workspace-design(productivity and agentic surfaces: context-persistence, session arc, collaboration state IA, agentic UI patterns). Surface-genre contract:user-flow/assets/screen-brief-template.mdgains asurface-genre:frontmatter field; genre declared once in the brief propagates to all downstream skills. Seven D5 extensions across six existing skills:journey-mappinggains peak-moment identification and evidence-level elicitation;interaction-design/references/pattern-families.mdadds 5 pattern families (wizard-and-stepper, data-table, destructive-action escalation, save-state, analytical-dashboard-widgets);service-blueprintgains evidence-of-service row and fail-point marking;information-architecturegains success-metric binding and genre routing;design-reviewgains design-principles integration chain and 6 genre-specific rubrics;creative-directiongains genre canonical reference tier for all 7 genres. -
rfc-statusskill added to governance-extras (0.7.0) — RFC landscape dashboard. A new read-only skill scansdocs/rfc/*.mdand groups RFCs by lifecycle state (Draft,Open,Final Comment Period,Accepted,Rejected,Withdrawn,Experimental,Superseded); surfaces active RFCs by name and resolved RFCs by count. Also counts non-header rows indocs/product/findings/rfc-candidates.mdanddocs/product/findings/roadmap-intents.mdand surfaces them as a findings summary. Useful at session start alongsideworkspace-status. Read-only — never creates or modifies RFC files. -
docs/product/findings/registers seeded (RFC-0064 M3). Two new governance registers:rfc-candidates.md(candidate RFCs surfaced by work-loop scope-deferrals orframe-situationescalations) androadmap-intents.md(deferred roadmap items not yet shaped into specs). Both use the same five-column schema:Problem | Source | Surfaced by | Date | Priority | Disposition. -
workspace-statussurfaces findings count (core 0.13.0). After resolving the queue DAG,workspace-statusnow surfaces a count line — “N rfc candidates · M roadmap intents” — from the findings registers when either count is non-zero. Omitted when both are zero or the files are absent.
Changed
Section titled “Changed”-
experience-designpack 1.1.0 — multi-surface audit protocol, 6-element above-fold spec, and surface-specific mobile paths. Seven gaps identified by a UX audit benchmarked against Linear and Stardog (the skills got within-surface findings right but missed every cross-surface and surface-specific mobile finding — root cause: no multi-surface protocol and no surface-specific mobile path in the quality floor pass). Multi-surface protocol (Gaps 1, 3):design-reviewandinformation-architectureeach gain a Step 0 surface inventory for multi-surface platforms;design-reviewgenre routing andexperience-reviewerboth state that a marketing surface and a documentation surface require separate passes with a third cross-surface integration pass after. Above-fold spec (Gap 2): the marketing genre rubric item 2 now enumerates all six required above-fold elements (IC-first headline ≤10 words, conviction-building subheadline, outcome-language primary CTA, optional secondary CTA, adjacently-positioned proof signal, friction microcopy — absence of friction microcopy is a blocker when the primary CTA implies commitment) and adds a tone collision check between headline approach and subheadline register. Cross-surface wayfinding (Gap 4):information-architecturestep 6 gains a cross-surface wayfinding check — the docs→marketing bridge must be present on every page (not just the footer or landing page) and its absence is a blocker finding. Docs landing page hub structure (Gap 5): documentation genre rubric item 3 now verifies the three hub jobs (Start Here entry point, four Diátaxis-typed entry points named by reader outcome, above-fold search) and flags the search-first requirement for >200-page sites. Surface-specific mobile checklists (Gap 6):design-reviewstep 2 andinteraction-designstep 6 each gain surface-specific mobile priorities for marketing surfaces (above-fold CTA visibility on small-phone viewports, full-width drawer targets, grid overflow) and documentation surfaces (code block horizontal scroll, sidebar collapse, comfortable reading width). Cross-surface copy voice continuity (Gap 7): marketing genre rubric gains item 4 — register mismatch flags as minor; contradicted product claims flag as major; requires reading the docs landing page and one how-to page alongside the marketing surface. -
work-loopdeferred-items step prompts for findings registers (core 0.13.0). After recording a deferred item indocs/backlog.md, the loop now prompts: “Does this look like an RFC candidate or a roadmap intent? If so, also add a row todocs/product/findings/rfc-candidates.mdordocs/product/findings/roadmap-intents.md.” The backlog anchor remains the primary durable record; the findings registers add governance visibility. Prompt skipped when neither file exists.
-
new-rfcsession-fragmentation guard (governance-extras 0.8.0). Generating specs or ADRs for an already-Accepted RFC in a follow-on session now re-surfaces theworkspace.tomlqueue-write prompt for anyspec/<path>entries absent from the active initiative’s queue. Previously the prompt fired only when an RFC transitioned to Accepted within the current session; a follow-on session silently skipped it. Thenew-rfctrigger description is also extended to activate on “generate follow-on specs for RFC-NNNN” and similar phrasing, routing those sessions through the queue-write guard. -
desk-research-project-startno longer silently falls back to.context/research(desk-research 1.1.0). The pre-fix skill defaulted to.context/research/when noagentbundle-layout.toml [research]config was found — a gitignored scratch path that does not survive workspace resets or session boundaries. The fix removes this silent fallback and replaces it with two-branch elicitation: the agent asks whether to commit output to the repo (docs/product/research/) or to a personal workspace (user-supplied absolute path, e.g. an Obsidian vault). Elicitation writes the chosen path to the appropriateagentbundle-layout.tomlso subsequent projects skip the prompt. The config key is renamed fromparenttooutput_dir; resolution order is now user-scope first (personal vault wins across repos), then repo-scope, then elicitation. -
iac-terraformpack (v0.1.0) — Terraform and OpenTofu IaC accelerator. A new opt-in accelerator pack for generating and maintaining Terraform/OpenTofu infrastructure code. Two skills:generate-iac(8-stage generation loop from ADR gate through G4 handoff) andreconcile-iac(drift audit required before every follow-on change). Dual-engine — the engine-neutral HCL baseline runs unchanged on both Terraform ≥ 1.6 and OpenTofu ≥ 1.6 (the validation floor); the native S3 lockfile feature (use_lockfile = true) requires Terraform ≥ 1.11 or OpenTofu ≥ 1.7 and is configured separately inbackend.hcl; OpenTofu-only features (state encryption, early variable eval) are opt-in via the.tofuoverride mechanism. Zero seeds, zero agents — the pack emits provider files and pipeline config into the adopter’s repo viagenerate-iac, not via scaffold seeds. Validated providers in v1: AWS (both engines), GCP, and Databricks; Azure, Kubernetes workloads, edge/CDN/DNS, HashiCorp platform (Vault, HCP), data platforms, and observability vendors are experimental. Standards: terraform layout, networking, security/IAM, tagging, observability, OPA/Conftest policy-on-plan (Sentinel incompatible with OpenTofu — not supported). CI templates for GitHub Actions (reference), Azure DevOps and GitLab (experimental). G4 handoff artifact set: deploy-ready TF directory, pinned plan + digest, OPA/Conftest exit-0 evidence, Trivy/Checkov exit-0 evidence, reversibility classification per resource, and optional Infracost delta. Depends oncore >= 0.1andgovernance-extras >= 0.6. -
governance-extras0.6.0 — governance-index template, extension-contract how-to,new-adrinfra mode. Three companion additions from RFC-0065 D16: (1)seeds/governance/manifest.example.yaml— the governance-index template (a domain → ADR/standard manifest loaded first bygenerate-iacStage 0; tool-neutral, used by any governed repo); (2)new-adrskill gains infra mode (mode: infra), which loads a new reference (references/infra-decisions.md) with the seven IaC ADR topics and their framing questions —state,layout,iam,tagging,networking,pipeline_auth,remediation; (3) new how-to guides for the governance index and extension-contract conventions. -
architect-reviewProposal rubric gains an extension-contract check. When a design doc introduces a plugin, hook, or customisation point, the Proposal rubric now checks that the extension contract is named, its shape is described, and what is stable vs unstable is stated. -
workspace-statusskill added to core pack (core 0.12.0, originallycheck-workspace— renamed in this release). A new session-start skill reads the repo-levelworkspace.tomland surfaces ready-to-start items, blocked items with reason, parallel candidates, and active signals — all in one command. Resolves the dependency DAG across all queues and initiatives usingneedsprefix notation (work:,shape:,research:,brief:, and cross-initiativeini-xxx:work:prefixes). Surfacestype = "signal"entries as “active context” separately from actionable “ready to start” items; surfaces each shaping entry with the matching skill invocation for the installed packs. Offers to initialiseworkspace.tomlwhen absent. Runworkspace-statusat every session start from Batch 2 onward. -
workspace.tomlcommitted tomainas the repo-level declared-intent coordination artifact. Pre-populated with the INI-002 (Platform Core) M1 bootstrap queue: three queues (shaping_queue,brief_queue,work) with all Batch 3–5 specs pre-seeded and theirneedswiring in place.spec/m1-workspace-coreis marked shipped (this PR). Theagentbundle-layout.toml [product]table is documented inworkspace-status’s reference file:projectsandshapingpaths are configurable;briefsstays pinned.
Changed
Section titled “Changed”voice-and-microcopyhuman-craft check gains vocabulary tells, an editorial methodology, and voice authenticity tests (product-engineering 0.11.0).human-craft-check.mdnow covers three additional layers beyond its existing structural tells: a vocabulary-tell section (hollow verbs, inflated adjectives, abstract container nouns, hedging openers — each with a concrete replacement rule); a three-pass editorial methodology (vocabulary scan → delete the opening → specificity audit); and three voice authenticity tests (pub test, founder test, one-person test). Scoped to the same context as before — longer copy: onboarding text, feature descriptions, help text — not short UI strings.
voice-and-microcopygains a human-craft structural-tell check (product-engineering 0.10.1). A new reference file,human-craft-check.md, inlines six structural AI tells — treadmill effect, symmetrical lists, false precision, performative thoroughness, nice-nice wrap, subtext vacuum — and a four-question self-check for longer copy (onboarding text, feature descriptions, help text). The content checklist gains an eighth item, Human-crafted, that routes longer copy through this check. Self-contained within the pack; no cross-pack references.
Changed
Section titled “Changed”architect-diagramgains Mermaid layout guidance, ELK renderer docs, and an explanation guide (architect 0.12.0).mermaid-flowchart.mdgains three new sections:## Edge routing — curve style(thecurve: steporthogonal-routing recommendation for architecture diagrams, with a full routing-value table),## Layout control(subgraph direction override,inheritDir, diagram-global spacing keys, thesubGraphTitleMarginworkaround, and label wrapping), and## ELK renderer — for complex graphs(Brandes-Köpf node-placement strategy,mergeEdges,LINEAR_SEGMENTSoption, and a venue-caveat matrix).mermaid-c4.mdgains## Layout config(c4ShapeInRow,c4BoundaryInRow,UpdateLayoutConfig()syntax, and a note thatLay_*direction directives are silently ignored).mermaid-mindmap.mdgains## Layout algorithms(cose-bilkentvstidy-tree, determinism trade-off,maxNodeWidth,padding).## Common architecture pitfallsin the flowchart reference adds three new entries: invisible links as a layout crutch, non-grammatical edge labels, and edge-label overlap. A new Diátaxis explanation guide (guides/architect/explanation/architect-diagram-skill-design.md) documents the design principles behind the skill — Sugiyama / dagre / ELK algorithm choices, direction defaults, Gestalt visual-encoding rationale, notation-routing logic, portability constraints, and the anti-pattern register. 16.mmdfixture files covering all supported diagram types and apytest-based validation harness (scripts/test_fixtures.py+scripts/testdata/) are added to the skill source.architect-diagramgains portable Mermaid title, accessibility, and pipeline-orientation guidance (architect 0.11.0). Three Mermaid-native additions to the skill’s references: (1)flowchart LRis now explicitly the orientation for pipeline / ETL / CI-CD / data-flow diagrams (a decision-table row plus strengthened flowchart guidance); (2) the config-frontmattertitle:is documented as the in-source diagram title (Mermaid ≥ 10.5), with the prose scope sentence kept as the always-portable baseline; (3)accTitle/accDescrare documented as the diagram’s screen-reader alt text. The change also explicitly rejects three renderer-proprietary conventions (:::external,label\|tech,%% title:) that no-op or break in stock Mermaid (GitHub, Confluence,mmdc, and the repo’s own renderers) — they contradict the skill’s “survive enterprise wiki rendering” north star. Guidance only; no renderer or skill-contract change.
aesthetic-directiongrounding reference now cites WCAG thresholds by name, not literal values (experience 0.4.1). The Standards section of the grounding reference described contrast thresholds using specific ratio and point-size literals, which violated RFC-0033’s portable-method rule. The section now refers to the named WCAG SC thresholds and the OS-level reduced-motion preference concept rather than reprinting the values table. No change to skill behavior — only the reference prose that informs the aesthetic-direction pass.
-
Platform marketing site — Phase 1 (Astro homepage). A new Astro marketing site in
web/(approved as a top-level directory by RFC-0061, toolchain recorded in ADR-0050) becomes the platform anchor at/, with the existing MkDocs reference docs co-deployed at/docs/from one GitHub Pages origin. The homepage ships all nine sections from the platform-site spec in the amber-gold Option B aesthetic (dark hero + stat strip, light content bands, dark closer); all interactions — install tabs, catalogue expand, mobile nav — are CSS-only (zero JavaScript) and the page passespa11yWCAG 2.2 AA. The CI pipeline now builds Astro first, then MkDocs, into a singlebuild/artifact. -
frontend-engineeringskill added to core pack (core 0.11.0). The work-loop now loads inline craft rules — design pre-flight, HTML semantics, CSS token discipline, accessibility, state completeness, and verification commands — whenever a task’s primary output is HTML, CSS, or JS. The design-intent pass is mandatory (not a recommendation) for that surface. -
OWASP Agentic Skills Top 10 v1.0 compliance pass — all non-core packs. All non-core packs audited and hardened against AST01–AST10. Three classes of changes: (1) AST05 —
researchskill now explicitly declares that fetched web content is untrusted data, never instructions; (2) AST06 —confluence-crawlerandjiraskills now declare the SSRF pre-flight host check the agent must run before invoking a user-supplied base URL (scripts validate scheme only; the agent verifies the host and rejects private-IP ranges and cloud-metadata endpoints); (3) AST10 — all non-credentialed skills that cross a security boundary now carrymetadata.boundariesin their SKILL.md frontmatter (network_fetch,filesystem_write,filesystem_read_untrusted,network_egress, ordeploy_action). Theassimilate-primitiveskill also gains an explicit AST01–AST10 security review step so any ingested primitive is checked before landing. Compliance record indocs/architecture/security.md. -
New
agentic-skillsmodule insecurity-checklists— OWASP Agentic Skills Top 10 v1.0 coverage (core 0.10.0). Thesecurity-reviewernow has control-altitude depth for the OWASP Agentic Skills Top 10 v1.0 (AST01–AST10): malicious skill content (AST01), permission over-declaration (AST03), insecure metadata parsing (AST04), external reference pinning (AST05), isolation declaration (AST06), version drift (AST07), governance gaps (AST09), and cross-platform security metadata (AST10). AST02 (Supply Chain) defers to the existingsupply-chainmodule; AST08 (Poor Scanning) is addressed by the three-bucket delegation legend. The module fires when a diff authors or modifies a skill file, parses skill metadata, builds a distribution package, or adds skill execution sandbox config. Accompanied by a newdocs/architecture/security.mdreference documenting all enforced security frameworks. -
New
agentbundle show <pack>command — a pack’s skills and agents, derived live (agentbundle). Answers “what does this pack contain?” by walking the pack’s.apm/source tree on each call, printing itspack.tomlmetadata alongside the full, sorted skill and agent inventory.--format jsonemits a stable object (name,version,description,skills,agents,source) for scripts and agents. Nothing is persisted and no manifest is touched, so the answer can’t drift from what the pack ships. When the catalogue can’t be resolved, an installed pack still reports its inventory from the install-state files (source: installed-state); a not-installed pack errors and exits non-zero. Implements RFC-0060 / ADR-0049. -
design-critiquenow includes a marketing clarity pass (experience 0.4.0). A new fourth mode runs when the artifact has above-fold copy with a persuasion/conversion goal (landing pages, pack cards, product announcements — not settings screens or forms). It checks the tweet test (headline stands alone as a conviction statement), the five-second scan (above-fold answers what / who / should I care), and painkiller-first structure (copy leads with the reader’s problem, not the author’s feature list). Each finding maps to the violated criterion with amarketingsource label and a 0–4 severity using the existing frequency × impact × persistence rubric, where impact means conversion/persuasion cost. -
new-specnow prompts for design-readiness on ui-shaped specs (core 0.9.0). WhenShape: uiis confirmed, a new step 4d checks whether a grounded aesthetic reference (aesthetic-directionoutput) exists before the Acceptance Criteria are written, offers to rundesign-critiqueon any existing affected surface, and requires at least one design-intent AC whose outcome is observable from the rendered surface — not derivable from code. If the experience pack is absent, it notes that in Assumptions and proceeds. This is the spec-authoring complement towork-loop’s pre-EXECUTE design-intent pass: both target the same failure mode (technically correct surfaces with no design sense) at different stages of the loop. -
work-loopnow includes a pre-EXECUTE design-intent pass and anexperience-reviewergate for user-facing surface diffs (core 0.8.0). When a change produces a user-facing surface — a new page, a redesigned screen, a pack card, a docs page — the PLAN section now recommends runningaesthetic-directionand/ordesign-critiquebefore writing code (advisory in both light and full mode, analogous to “write the test first”). For full-mode user-facing surface diffs,experience-revieweris added to the specialist reviewer roster alongsidesecurity-reviewerandquality-engineer: it receives the rendered output plus the grounded aesthetic reference and constraints, and runs with the standard select-or-note fallback when the experience pack is absent. Decision recorded in ADR-0047. -
New
catalogue-curationpack — the catalogue-operator’s toolkit (opt-in, repo-scope). Skills to grow and maintain an agent-skill catalogue:propose-catalogue-pack(stand up a new pack),assimilate-primitive/assimilate-repo(bring external skills/agents/hooks in — safely, and reshaped to the repo’s craft, resumable via a ledger), andexport-catalogue(produce a white-label or attributed derivative for another org or domain, with a fail-closed leak check). Ingested code runs the repo’s own lints + SAST/SCA before it lands; a guard blocks any change to theagentbundleengine or credential brokers through the pack. Domain-agnostic — the same toolkit serves a non-SDLC catalogue. Requirescore+governance-extras; not in any default profile. (RFC-0059, ADR-0048.) -
msg-to-markdownis now a pure-Python skill that also reads.eml, and emits the unified output contract (converters 0.6.0). The Outlook.msgconverter is re-hosted from Node.js onto Python:.msgis read viaolefile+ first-party MAPI decoding (replacing themsg-parser/extract-msg/npm readers — see ADR-0046), and MIME.emlis now supported through the same render path (multipart bodies, nestedmessage/rfc822, richer headers). Every conversion now carries the same versioned frontmatter contract (contract-version,tier: 0-no-ml,content-type,ingestion-quality) thatfile-to-markdownemits, so email ingests into a context layer exactly like documents. It preserves headers (From/To/CC/BCC/Date/Importance), the body (HTML reduced to Markdown, or plain text), and an attachments table, and it closes the attachment-extraction path-traversal sink the old Node script carried (every write is basename- reduced and confined). No Node.js, no ML/OCR model, no network call. -
file-to-markdowngains three opt-in higher-fidelity capabilities (converters 0.5.0). All three are off by default — the default one command (python scripts/convert.py "<file>") is unchanged. (1)--enrichturns on Docling’s local-model enrichment on the Tier-2 path — formulas → LaTeX, code understanding, figure classification and captioning. It is local-model-only by construction (Docling’s remote-services / remote-VLM path is never enabled), so enrichment can never become a hidden data-egress channel; enriched captions are treated as untrusted model output (inert body content, never instructions). (2)--chunkalso writes DoclingHybridChunkeroutput (tokenizer-aware, structure-preserving chunks) to a<basename>.chunks.jsonlsidecar — one JSON record per chunk carrying the full contract field set — so an extraction can feed a retrieval store as chunks, not just a flat file (needs thedocling-core[chunking]tokenizer extra, installed on demand). (3)--tier3assembles adopter-obtained managed-OCR text into the unified contract withtier: "3-managed-api"andrequires-review: true. Tier 3 crosses a data-egress boundary, so it is explicit-only and never auto-reached, and the skill itself makes no network call — you run the approved vendor through your own transport, and the skill validates an egress declaration ({endpoint-allowlist, residency-region}), stamps the contract, and records the destination in provenance. See the skill’sreferences/tier3-managed-api.mdfor the adopter controls (vendor retention/no-training, transport-binding, and redaction as your responsibility — documents are sent unmodified). No ML model or per-vendor data ships with the pack. -
file-to-markdownreads scans and non-diagram images via agent-vision (converters 0.4.0). The image branch gains a generaltext-tablestrategy for non-diagram content — a screenshot of prose, a table image, a form, a receipt, a scanned page — that emits Markdown prose and tables instead of forcing everything through the diagram extractor. For a scanned or image-only PDF (the case the Tier-0 floor flagsrequires-reviewand points at Tier 1), a newscripts/rasterize_pdf.pyrenders each page to an image, which the in-session model then reads. This is Tier 1 (agent-vision): the already-running model reading a rendered image — not an installed OCR model. The read carriestier: "1-agent-vision"with an honestextraction-confidence/requires-reviewsignal, treats all document text as untrusted data (transcribe, never obey — a prompt-injection defense), and, when the PDF has a digital text layer, is cross-checked against it to bound hallucination. The page rasterizer ispdf2image(MIT), installed on demand (python scripts/rasterize_pdf.py --check) and needing a system poppler; it is never auto-installed, and when it is absent the skill keeps the Tier-0 output and says so rather than crashing. Tier 1 adds no new network egress from the skill — though a cloud-hosted in-session model still receives the page content at its already-approved endpoint. -
file-to-markdowngains a no-ML Tier-0 floor and a versioned output contract (converters 0.3.0). Where Docling’s ML models are banned or un-fetchable,file-to-markdowncan now convert a digital PDF (viapypdf), Office files (.docx/.xlsx/.pptx, degrading to a stdlib path when the ordinary library is absent), and the everyday text formats (HTML, EPUB, CSV/TSV, OpenDocument,.eml) to Markdown using only pure-Python or standard- library parsers — no ML model, no network. Docling stays as the higher- fidelity Tier 2 for.xlsand images. Every extraction, across both the document and image branches, now carries one versioned YAML frontmatter contract recording provenance and a quality signal (contract-version,tier,extraction-confidence,requires-review), so a scanned PDF that yields sparse text is flaggedrequires-reviewand pointed at an escalation tier instead of passing silently. The default invocation is unchanged (python scripts/convert.py "<input-file>"); the Tier-0 PDF/Office libraries install on demand (python scripts/convert.py --check), and untrusted input is parsed defensively (XXE-safe XML, decompression-bomb guards, output-path confinement, resource ceilings).
file-to-markdownimage extraction no longer silently loses elements (converters 0.2.3). The image reconciler used to collapse every element that shared a(type, name)into one before checking where it sat — so two genuinely distinct nodes with the same label (a second “Validate” step, a repeated “Queue”) were merged into a single element with no warning, and elements the model saw but couldn’t label were dropped entirely. The reconciler now clusters by position: same-named nodes that overlap across tiles still merge, but spatially distinct ones are kept as separate elements, and unlabeled elements are retained and shown as(unlabeled). The document branch (convert.py) now fails with actionable guidance — naming password-protection/encryption and corruption as likely causes — instead of a bare stack trace, and the image branch warns (to stderr; stdout stays clean) when handed a multi-frame image (animated GIF, multi-page TIFF) that only its first frame is read.
architect-diagramnow draws timeline, quadrant, and mindmap diagrams (architect 0.10.0). The diagram skill routes three new intents to Mermaid: a timeline for roadmaps / chronologies / release history, a quadrant (quadrantChart) for 2×2 prioritization and positioning, and a mindmap for hierarchical decomposition — joining the existing C4 / sequence / state / ER / flowchart set. Each has its own on-demand syntax reference and rubric budget. Because the three are newer Mermaid grammars with uneven enterprise-wiki rendering, the skill offers them with the same rendering-support caveat it already applies toarchitecture-beta(with a table / bullet-list fallback), so flowchart and C4 stay the defaults. The diagram rubric also gains explicit per-type complexity budgets plus additive accent- and edge-count caps.- Docs now call out the catalogue and skill/pack format as first-class, and ship an
llms.txt. Newdocs/architecture/catalogue.mdnames what a catalogue is on disk (thepacks/+.claude-plugin/marketplace.jsonmarkers), howagentbundleresolves one through its four-layer chain, and how to point it at your own — the starting point for standing up your own catalogue. Newdocs/architecture/skill-and-pack-format.mdmaps the format in three layers (the agentskills.io skill standard, the pack envelope, projection). A rootllms.txtindexes the key docs so an agent can read the relevant pages instead of scanning the whole repo. The architecture and top-level READMEs route to both. - The
methodologyoutput shape for research (research 0.6.0). Ask “the best way to do / run / build / train X, end to end, for my situation” and/researchnow answers with a method, not a reading list — a staged, contingency-adapted, maturity-aware, evidence-graded description of how the activity is done. The shape produces<topic-slug>-methodology.md(episodic) ormethodology.md(project mode) from six sections, each grounded in a discipline: a SIPOC scope frame, a stage spine, mandatory contingency branches (which path your situation takes) and a mandatory maturity ladder (novice→expert, or crawl→walk→run for one-off deliverables), failure modes, and GRADE evidence tags. It defaults toapplieddepth, is slide-ready formarkdown-to-pptxwith no reshaping (sections at H1, stages at H2, no H3), and is fenced againstframe-domain(product/MVP grounding) andmap-internal-process(your own operations). Prompt-only — no new dependency, no runtime engine. agentbundle list-installed— see what you actually have installed (CLI 0.10.0). A new read-only command lists every installed(pack, adapter)row across the user and repo scope with its version and anup-to-date/upgrade-available/unknownstatus against the catalogue. The status check runs by default and degrades tounknown(never an error) when the catalogue can’t be resolved;--no-check/--offlineskips it for a fast, network-free listing;--scopefilters to one scope;--check-driftadds a per-row count of files edited locally since install. Closes the gap where no command could report installed state — only what a catalogue offered.- The release loop — a new opt-in
release-engineeringpack (release-engineering 0.1.0). Adds the SRE/ops outer loop abovework-loop’s inner build loop: arelease-leadagent (the outer-loop supervisor — a peer ofwork-loop’s supervisor anddiscovery-lead, not awork-loopmode) and arelease-loopskill that deploys the integrated whole to an ephemeral environment, runs e2e, observes telemetry, feeds deployed findings back to the inner loop (no human relay), redeploys, and iterates until the deployed whole converges — then stops at the human consent gate for the prod ship (G5), surfaced as a release-readiness record to ratify rather than a bare go/no-go. Autonomy is carved by minimum-regret: the agent runs the inner and outer loops on reversible ephemeral envs unwatched; humans gate the irreversible exits (first real users or data, data migrations, spend over threshold, security/auth-boundary changes, anything irreversible, and prod). Convergence up to that gate is judged by policy (canary SLOs + e2e coverage of the changed surface + flake < 2%), with DORA as the health signal. The pack is repo-scope (co-located in the build repo wherecoreis installed) and reusescore’soperational-safetymodules +quality-engineer+security-reviewer, consuming the discovery sidecar by convention — no new runtime engine and no new reviewer. This completes the company OS: product (discovery) → engineering (build) → SRE/ops (release). (Implements RFC-0049, now Accepted; ADR-0044 records the inner/outer split + the minimum-regret deploy carve; therelease-loopspec is Shipped, all 15 ACs checked.)
Changed
Section titled “Changed”- Shipped skill content is now self-contained — internal RFC/ADR citations removed.
Skills, subagents, reference docs, and scripts across
core,governance-extras,atlassian,converters,research, andproduct-engineeringno longer cite the bundle’s own governance artifacts (RFC-00xx,ADR-00xx,docs/rfc/…, spec task/AC numbers) as load-bearing references — each rule now reads on its own terms. Adopters install these skills without the bundle’sdocs/tree, so a danglingRFC-00xxpointer was an unresolvable reference; the rules are unchanged, only the provenance citations are gone. Real external standards (e.g. RFC-1918, RFC-9457) are left intact. Also: the.claude/skills/README inventory now matches the projected skill set, the scaffoldeddocs/product/roadmap.mdis marked as a template, and thework-loopactivation hook’s docstring points attools/hooks/README.mdfor wiring. agentbundle upgradereports honestly, and its multi-adapter refusal is actionable (CLI 0.10.0). A same-version re-apply no longer printsupgraded: X -> X; it readsre-applied: <pack> @ <scope> <version> (already current), or names the count of locally edited files kept as.upstreamcompanions when there were edits — and an upfront notice before the confirm tells you how many edits will be preserved. The “pass —adapter” refusal (also indiff/uninstall) now lists each installed adapter with its version, e.g.claude-code (0.9.0), codex (0.9.0), so the next command is obvious without a second lookup.- The traceability lint gains a root→leaf reachability pass (core 0.7.1). On the
authoritative sidecar graph,
work-loop’slint-traceability.pynow flags every node that does not lie on a path fromrootto a leaf — aUNREACHABLE(disconnected subtree) finding, additive to and non-overlapping with the existing per-node orphan check. Where the presence check caught only the orphan tip of a broken branch, reachability catches the whole stranded subtree — the refinement thediscovery-loopcascade backstop depends on (RFC-0053 AC34). A cross-repo reference resolved through the value-stream rollup is a clean terminus (a legitimately federated graph is never failed); an unresolvable cross-repo hop is surfaced informationally, never silently counted as closed (the sidecar is untrusted input — a fabricated edge must not green a stranded subtree).UNREACHABLEjoins the--stricttier (exit 1); dangling edges and cycles stay hard in every mode. Reachability runs in sidecar mode only — a standalone derived graph is legitimately partial and multi-root. Thediscovery-loopskill’s traceability seam is updated to record the dependency as met. (Amends thetraceability-lintspec; closes thediscovery-loop-traceability-reachabilitybacklog item and the RFC-0048 § Amendments 2026-06-30 cross-spec gap.)
-
The discovery-side producer skills now emit the traceability markers the structural-orphan lint reads (experience 0.3.0, product-engineering 0.10.0).
map-screen-flow’s per-screen brief carries a bold-body- **Type:** screen-brief;map-customer-journeyrecords each frontstage action as a- **Action:** <slug>marker andblueprint-serviceeach backstage service as a- **Service:** <slug>marker;frame-intent’s intent template gains an optional- **Kind:** outcome|opportunityfield (beside the existingLevel:), anddecompose-intentcarriesKind:/Level:onto decomposed child intents.work-loop’slint-traceability.pyrecognizes each producer node by marker, not path — previously onlyframe-domainemitted markers, so a fail-closed traceability up-edge would have been load-bearing on markers that didn’t exist. Three reconciliations ride along: CONVENTIONS § 4 is corrected to describe the marker as the bold-body field the lint reads (it had said “frontmattertype:” — a factual erratum); the lint’srecognize_screensnow recurses (core0.7.1 → 0.7.2) so a real nested per-screen brief (screens/<slug>/<screen>.md) is found, not only a flat one; and the intent↔chain rung mapping is documented inproduct-engineering’sintent-model.md(Kind:→ outcome/opportunity rung,Level: capability→ capability rung), landing therecognize_ladderdocstring. (Closes thediscovery-loop-type-marker-producersandscreen-brief-nested-path-globbacklog items; RFC-0053 AC36 / DRIFT-G, RFC-0048 note 04 + § Amendments 2026-06-30.) -
new-rfcnow drafts RFCs that read from zero prior context and hands you decisions you can make in the chat message itself (governance-extras 0.5.0). The skill glosses every project-coined term, acronym, and sibling-RFC back-reference in plain language on first use (inline, not a glossary), so a reviewer who hasn’t read the related RFCs can still follow it; a new cold-reader check in the pre-handoff gate dispatches a context-denied subagent — given only the RFC text — to flag any jargon it can’t resolve, so inherited vocabulary gets caught before a reviewer hits it cold. The research/de-risk handoff now presents each decision self-contained — the plain-language question, the concrete options with their trade-offs and the consequence of each, and a recommendation — so you can decide without opening a file. The how-to guide and the Tier-4 eval ride along. -
The
product-engineeringpack gains the discovery loop — adiscovery-loopskill, adiscovery-leadagent, and two discovery reviewers (product-engineering 0.9.0, implementing RFC-0053 / thediscovery-loopspec). The upstream loop turns a raw idea into a ratified, build-ready decision brief: it diverges across candidate product shapes (the newexplore-optionsskill), converges the chosen one through a lens roster, pauses at three consent gates (G0 / G1.5 / G2), emits a connected hypothesis with validation hooks (the newplan-validationskill — converged ≠ validated), and hands off towork-loopat G3 — with no new engine, scheduler, or service. It ships as content: the agent + skills, a carried, versioned sidecar-schema reference, and a plan-tree template asset.de-risk-intentgains a validation-hook field anddecompose-intentan optional ranking step. The two discovery reviewers (discovery-threat-reviewer/discovery-reliability-reviewer) are distinct fromwork-loop’s code reviewers, required at G2, degrading only in depth. A coordinator ADR (ADR-0043) records the no-engine, spike-confirmed shape, and a four-page Diátaxis guide set underguides/product-engineering/covers it. The discovery loop is the full-battery home of the self-coverage gate (RFC-0051), wired as its pre-G2 phase. (Eval coverage for the three new skills is a tracked follow-up, matching theframe-domainprecedent.) -
new-specand the spec-metadata contract gain an optionalDiscovery:up-edge header + discovery-artifacttype:markers (core 0.7.0, format-only — DRIFT-G). A spec descended from an upstream discovery artifact records it in aDiscovery:header (the discovery-side sibling ofBrief:), the producer edge a traceability check walks; discovery-side artifacts carry atype:marker so a check finds them by marker, not path. Format only — no operating-model doctrine. This resolves RFC-0048 acceptance blocker #4; the traceability lint’s--strictflip is sequenced after the header lands (warn-only until then). -
The
work-loopskill now carries the self-coverage gate as a thin, named phase (core 0.6.0, implementing RFC-0051 for thework-loopslice). The loop doctrine now names its existing passes as the gate’s steps (REVIEW is the fresh-context-adversarial step; the PLAN assumption trio + declined-pattern register are the pre-mortem hook;Surface+ DECIDE’s apply/defer routing are the resolve-vs-surface bones), and adds two net-new spec-time checks governed by the existing light/full mode — a resolve-vs-surface disposition record (every open item is resolved-with-referent or surfaced-with-reason) and a conditional domain-grounding check (fires only on an ungrounded load-bearing domain claim, else degrades). One new end-of-session-checklist refusal item makes the disposition record non-skippable. A self-containedreferences/self-coverage/resolve-vs-surface.mdcalibrates the resolve-vs-surface call. No new reviewer, no new pack, nodocs/CONVENTIONS.mdchange, no second right-sizing knob; the heavy seven-module design-convergence battery staysdiscovery-loop’s, never bolted onto the build loop. -
The
design-craftpack grows up into theexperiencepack — the design/UX seat that carries the whole design thread from journey to realization (experience 0.2.0, implementing RFC-0050 D1–D10; the rename is bridged by the already-Accepted ADR-0038, frozen governance untouched).design-craftis renamed in place toexperience(dirs, manifests, guides dir, the catalogue rows, and the framework-agnosticism CI lintlint-design-craft-agnostic.py → lint-experience-agnostic.pyretargeted topacks/experience/, envDESIGN_CRAFT_ROOT → EXPERIENCE_ROOT; the RFC-0033 docstring citation and the(design-craft-pack AC8)CI step tag stay pinned; no install-time alias). The seat gains five new pure-markdown skills: the connective triomap-customer-journey(stages × actions / emotions / pains / opportunities, with a platform/surface axis),map-screen-flow(the journey’s screens sequenced — transitions, error/edge flows, the per-screen state matrix, one per-screen brief per screen, a cross-brief consistency pass, and a non-droppable whole-journey steel thread that degrades from an MCP prototype to a text-only walk but never to nothing, plus an optional design-tool handover that is instructions-not-pixels), andblueprint-service(frontstage / line-of-visibility / backstage / support, the backstage column the slicing instrument handed toarchitect/contractsby-name); the inside-outmap-internal-process(APQC L3→L4, as-is + to-be with a delta table, SIPOC, a mermaid swimlane, a pain/waste register); and the behavioral-pillar craft skillinteraction-design(feedback & timing, input & forms, component state machines as mermaidstateDiagram-v2, purposeful motion honoring reduced-motion, navigation-as-behavior, gesture, cognitive-law fit — enriching the per-screen brief, owning no artifact). The three-partquality-floor(handle-all-states + accessibility + reduced-motion, now withpermission/deniedas an additional gated state) becomes the pack-shared floor every consuming skill defers to.aesthetic-directionnow grounds each named goal in persona + precedent + standards + platform conventions and carries the surface axis;design-critiquegains a taste mode while staying an interactive authoring-time skill. A forked-contextexperience-revieweragent gives the design step an independent design-time review (grounded aesthetic reference + platform fit + cross-brief coherence + the full quality floor incl. accessibility) — the only independent a11y check between human-value-add gates; collision-hardened name + a design-time-onlydescriptioncue (never code diffs, never architecture design docs). Artifact paths resolve through a new[experience]layout table (parent = "docs/design", config → default → discover-by-marker). The five new skills join the pack’s eval surface (trigger + Tier-4 judge). Pure-markdown method + manifests + one CI-lint rename — no runtime, hook, validator, values table, or pixel comp (RFC-0033 / ADR-0024 guardrails unchanged). User-scope-default: re-aggregatesmarketplace.json, not projected into this repo’s tree. -
voice-and-microcopy(inproduct-engineering) learns the screen flow (product-engineering 0.8.0, RFC-0050 D5). When amap-screen-flowper-screen state matrix is present it writes copy per screen × state, keyed to the matrix; absent one it behaves as before (detect-and-degrade). Theexperienceandproduct-engineeringREADMEs now cross-link, so the design seat reads as one even though the words live in PE. -
A new
lint-traceability.pywork-loop script in thecorepack mechanically checks that the product-team artifact chain holds together —outcome → opportunity → capability → screen → action → service → contract → spec → component— and flags every structural orphan (a node with no producer above it or no consumer below it), across repositories (core 0.5.0, implementingdocs/specs/traceability-lint; RFC-0048 Decision 6, consuming the RFC-0053 traceability slot). It generalizesreceive-brief’s brief↔spec coverage lint to the full nine-layer chain: it reads an authoritative sidecar_state/traceability.jsonwhen present (by convention + itsschema_versionstamp) or derives the edge set from local artifacts when absent, resolves each cross-repo edge endpoint to local / satisfied-by-reference / unresolvable (an unresolvable target is reportedunknown / not-yet-catalogued, never a false orphan), and reports orphans informationally (exit 0) while failing hard (exit 1) on a dangling edge or a cycle.--strictadditionally fails on any orphan for the convergence / CI gate. It is structural only — it never judges whether a node is parented to the right outcome (semantic scope-creep stays a human call). It no-ops cleanly in a repo with no discovery chain, runs stdlib-only, and projects to every adapter likelint-spec-status.py. -
A new
frame-domainskill in theproduct-engineeringpack grounds a product in its real-world domain and bounds its MVP before any screen, service, or architecture is drawn (product-engineering 0.7.0, implementing RFC-0048 Decision 4). Run at the discovery loop’s G1.5 Domain & MVP point or standalone, it produces two typed artifacts from oneresearch-grounded pass: Domain Framing (domain-framing.md,type: domain-framing) — a real-world-activity half (how the activity is really done · best practice · naive-design failure modes, grounded by wrappingresearchapplied mode) plus a brownfield current-system half (reverse-engineered viadecision-archaeology+ architecture extraction, omitted with a note when greenfield); and Scope Boundary (scope-boundary.md,type: scope-boundary) — the MVP out-of-scope register, each excluded capability paired with its appetite reason, the scope-creep guard the brief inherits and refines at G3. Each artifact carries a stable marker and resolves its write path in three tiers (config → designed default → discover-by-marker); findings the wrapped research could not ground surface as named residual assumptions, never silent assertions; absent optional dependencies degrade cleanly rather than fail. Prompt-only (Charter Principle 3).
Changed
Section titled “Changed”- The
new-rfcskill now documents a convention for recording post-publication RFC corrections (governance-extras 0.4.0, implementing RFC-0055). A published RFC’s body is frozen, but it can still need a correction — a spec finds a gap, a later RFC reframes a decision. The skill now names two lifecycle-keyed sections for recording one inside the RFC:## Erratafor a Frozen RFC (Accepted/Rejected) and## Amendmentsfor an in-flight Open one. Corrections are append-only, and once a section accumulates (more than one entry, or any entry supersedes another) it splits into an optional two-layer structure — an authoritative current state layer over a dated audit trail, where the current-state layer wins on disagreement. The bundledassets/rfc.mdtemplate carries the same shape as a clearly-conditional commented scaffold, so it travels into every RFC an adopter drafts without being filled into empty sections. Forward-only — existing correction sections are untouched. - The
new-adrskill now helps you isolate the decision before drafting, so ADRs stay lean (governance-extras 0.4.0). Four guidance refinements, none of which changes the ADR template’s sections or fields: (1) a “frame the decision before drafting” step that offers, doesn’t force — it infers the frame when the decision is already crisp and walks a short decision frame (the decision in a sentence, the problem, the alternatives, the winning driver, the tradeoff, any prior ADR it amends) when the request arrives tangled; (2) stronger title discipline — the title identifies the decision rather than encoding the whole rationale; (3) a one-decision-wide push-back that routes an umbrella of three or more load-bearing sub-decisions to an RFC spawning smaller ADRs; (4) pointer-like metadata guidance —Consulted/Relatedare short reference lists, not prose. The behavioral evals gain matching usability assertions. - The
new-rfcskill now sizes each RFC to its two humans — the author and the reviewer (governance-extras 0.4.0, implementing RFC-0054). Four changes, the deferred half of the human-consumption work whose RFC-0014-clean half shipped in 0.3.2: (1) aDecision weight: light | standard | heavyheader field that right-sizes research depth and the pre-handoff gate — an author-picked prose heuristic offwork-loop’s risk triggers, defaulting tostandard; (2) a top-of-doc## Reviewer brieforientation grid that gives a reviewer first-screen bearings above “The ask”; (3) “The ask” decisions rendered as a table (with a per-decision reviewer action column) instead of numbered prose; (4) a guided shape/intake step before research that asks framing questions when intent is vague and infers when it’s already specified — offered, never forced. Weight-based right-sizing changes how much research and draft an RFC carries, never whether a mandated pre-handoff gate check runs. - The
new-rfcskill now drafts more reviewer- and author-friendly RFCs (governance-extras 0.3.2). Three refinements, none of which changes the answer-first template or the research→draft→gate flow: (1) the skill draws an explicit body-as-argument line — a section that changes the reviewer’s decision stays in the RFC body, while proof-of-work (research transcripts, prior-art matrices, review logs) is summarized and its detail linked from the optionalNNNN-notes/companion; (2) the pre-handoff gate runs the same checks but hands back a concise, reviewer-oriented readiness summary with the heavy proof linked rather than pasted; (3) RFC titles are kept short and identifying, with the fuller explanation living in “The ask” so the RFC index stays scannable. - One pack can now be installed for several adapters at the same scope, and
the adapters that all read
.agents/skills/share one skill copy (RFC-0052). Theagentbundleinstall identity is now the footprint — the set of file paths a(pack, adapter, scope)install writes, each with its content SHA — not the pack name. Installingresearchforcodexafterclaude-codenow succeeds (their trees are disjoint), and installing it forcursoraftercodexshares the existing.agents/skills/skill files instead of fighting over them. A genuine collision — the same path at different content, or two different packs claiming one path — is refused, naming the conflicting paths;--forcekeeps your copy as a.upstreamcompanion.uninstall,upgrade, anddiffgain an--adapterdisambiguator (required only when a pack has more than one adapter row at the scope);uninstallremoves a shared file only when its last owner goes. Behaviour change: cursor, gemini, and copilot now project the skill primitive to the shared.agents/skills/home (joining codex) instead of their native.cursor/skills//.gemini/skills//.github/skills/; their agents/hooks/commands are unchanged. After an install that writes a shared skill, stderr names the other adapters that read it. - The install state file is now schema
v0.4([pack.<name>.adapters.<adapter>]). Migration is greenfield: a pre-v0.4 state file is refused (on read and write) with a re-install prompt — there is no auto-converter, and existing installs re-install to regenerate state. Existing cursor/gemini/copilot installs may leave a now-unused.cursor/skills//.gemini/skills//.github/skills/(or.copilot/skills/) tree behind; re-installing lands skills at the shared home. - The
work-loop’s two reviewer routing tables now live in the depth-library skills they route into, not inwork-loop’sSKILL.md. The security boundary→module table moved intosecurity-checklists’s Module index and the operational failure-mode→module table moved intooperational-safety’s Module index; thework-loopsecurity-reviewerandquality-engineerreview steps now dispatch against those indexes. This removes the last copy-paste duplication betweenwork-loopand the two depth libraries — the routing table and the modules it routes to can no longer drift apart — and trimswork-loop’sSKILL.mdfurther under its size cap. The routing behavior is unchanged: orchestrator-loaded (never subagent-self-discovered), loaded 1–3 / 1–N and never a flat march, with the reliability-vs-security carve and the infra-mandatory security pass intact. work-loop’sSKILL.mdmoves more situational depth into on-demandreferences/. Three blocks that only matter in a subset of loops were relocated out of the always-loadedSKILL.mdbody, each leaving a load-bearing trigger/contract one-liner inline: the visual / manual-QA verification-mode depth → newreferences/verification-modes.md(loaded when a task picks that mode); the pre-EXECUTE review depth (how the reviewer measures a structural change, the re-plan re-fire, the gate mechanism, the infra-mandatory secure-design detail) → newreferences/pre-execute-review.md(loaded when a trigger fires); and the supervisor parallel-dispatch gate detail → the existingreferences/supervisor-mode.md(it had been duplicated inline). No behavior change — the doctrine is identical, just disclosed progressively;SKILL.md’s body drops further under its size cap.
- The
agentbundleCLI now writes LF line endings on every platform. Every generated text artifact — adapter projections (Kiro, Cursor, Codex, Gemini, Copilot), the composedAGENTS.md, the self-host tree, merged.claude/settings.json, hooks, and TOML/JSON config — is emitted with\nregardless of OS. Previously, running the CLI on Windows produced CRLF (Python’s text-mode writers translate\n→\r\nthere), so a repo populated on Windows drifted from one populated on macOS/Linux and polluted diffs with line-ending churn. All 24 text-mode writers now passnewline="\n", a repo-root.gitattributespins* text=auto eol=lfat the commit boundary, and an AST guard test fails CI if a future writer omits the kwarg.
-
The ADR template now offers three optional fields — a first-screen Decision summary, a named Revisit-if trigger, and a structured Confirmation (governance-extras 0.4.0, implementing RFC-0056). Distinct from the track-1
new-adrchange above (which refined guidance and changed none of the template’s sections or fields), this track-2 change adds template surface, all optional and lean-keyed: (1) a## Decision summaryblock before Context (Decision / Because / Applies to / Tradeoff accepted / Revisit if), offered once an ADR is long enough that the decision isn’t on the first screen and skipped on a short one; (2) a namedRevisit if:trigger whose canonical home is Consequences (so it survives deletion of the optional summary), withstable — no foreseeable triggeras a valid explicit value; (3) aMode/Signal/Ownersub-structure for the existing Confirmation section, where an explicitMode: noneis preferred over silently dropping the section. None of the three is mandatory, the skill and how-to guide describe them in the offer-don’t-force shape, and the behavioral evals gain three matching format-dependent assertions. Forward-only — no existing ADR is converted. -
Guides for shaping a new engagement — product vision, product strategy, and the architecture concept. Three new how-tos document the top of the shaping funnel that previously had no guide: Frame a product vision and Shape a product strategy in the
product-engineeringpack (the two product altitudes offrame-intent, with their market-existence de-risk), and Shape an architecture concept in thearchitectpack (the ≤½-page Stage-0 conceptarchitect-designagrees before a full design doc). A new cross-pack explanation, Shaping a new engagement, ties them together — how product intent and the architecture concept co-shape each other at engagement start — and the affected pack indexes and existing guides gain cross-links. -
An optional grounding surface lets you record where you deploy and how you verify — in files you already own. The
coreseedAGENTS.md“Commands you’ll need” gains an optional infra/verification command block (<deploy>/<smoke / verify-status>/<teardown>/<seed-test-data>), and thereference.mdgolden-path slots now prompt for the managed-runtime / platform target, framework-/library-level contracts, and where verification tooling lives. The work-loop infra preflight reads these recorded coordinates if present and falls back to cold oracle discovery if absent — a repo that fills nothing runs exactly as before. Recorded values seed oracle acquisition, never replace it; a coordinate that contradicts the live oracle is surfaced as a drift signal. No new config file, and absence never fails the loop or any CI gate.adapt-to-projectandinit-projectnow optionally offer to record these coordinates. -
A how-to for shipping your organization’s standard stack as a reusable pack. Ship your organization’s standard stack as a reusable pack walks a platform lead through composing an org-stack pack from primitives that already exist — a filled-in
reference.mdseed (plus optionalCONVENTIONS.md/AGENTS.mddeltas),.apm/skills/<framework>/skills as the work-loop’s framework-grounding detect target, and a repo-scope profile that installs the org’s forkedcorefirst — distributed from a detached fork the organization owns via the editable-install path, with no upstream dependency. No new machinery. (RFC-0100 Decision 5, ADR-0037 D3.) -
architectgrounds the design phase in platform reality — a backed serverless workload-class lens plus two dual-consumed disciplines. Thearchitectpack gainslens-serverless.md(in botharchitect-designandarchitect-review), the cloud-agnostic serverless workload-class lens that fills the slot the well-architected rubric named but never backed. It carries five durable, concern-grouped concerns — execution & throughput limits + the sync-vs-async gate, cold-start & readiness, scale-to-zero economics / capacity floors / cost cliffs, statelessness & idempotency & delivery semantics, and private-serverless network reachability — applied across the whole serverless class (compute, data, search/analytics, event glue). Two cross-cutting disciplines ride the same routing axis: a platform-contract grounding discipline (architect-designgrounds every load-bearing managed-service contract on a critical path in an authoritative source with stated confidence — never model memory — andarchitect-reviewindependently re-checks it) and a synchronous-path viability check (sum worst-case latency across every hop, compare it to the binding front-door timeout, and force a sync-vs-async gate for a long-running operation — caught at design and re-checked at review). The lens stays cloud-agnostic; version-specific numbers route to curated platform skills. The agentic lens gains a one-line cross-reference into the gate. No new skill, reviewer, or executable tooling, and no per-vendor numbers ship. (RFC-0045, ADR-0035.) -
work-loopgrounds its infrastructure inner loop in the platform’s real contract, not model memory. A newcoreskill,infra-contract-acquisition, runs a tiered, tool-keyed protocol that acquires a stack’s real contract from the deterministic oracles its own toolchain ships (terraform validate+plan,cdk synth,pulumi preview, CloudFormation change sets,kubectl --dry-run=server+ a machine-readable schema slice), declares its oracle tier and confidence, and degrades honestly to a runtime probe when the toolchain ships no strong static oracle.work-loopgains an EXECUTE contract-grounding gate (“acquire the contract before you guess a flag, schema shape, field constraint, or packaging assumption” — the infra generalization of “grep to verify a function exists before importing it”). A newoperational-safetymodule,cloud-implementation-craft, is inlined into the implementer’s EXECUTE brief (least-privilege-but-sufficient permissions, eventual-consistency waits, timeout / cold-start / backoff, dependency ordering, terminal-failed-state, the managed-runtime packaging / entrypoint model, and externalized script configuration). The infra preflight gains a fifth artifact (a durable credential session — establish once, reuse), a reusable-script corollary (every live interaction goes through a reusable, idempotent, externally-parameterized script), phased oracle fidelity (the cheap early oracle is necessary, not sufficient), a readiness-aware data-plane probe (in-network-if-private, write → read-back, poll-with-backoff, self-teardown), and a symptom→layer log playbook for failure localization. Contract-conformance review rides the existingquality-engineer, which re-derives the contract independently from the oracles — no new reviewer or agent, and no executable tooling or per-vendor data ships. (RFC-0044, ADR-0034.) -
product-engineeringgains two product altitudes abovecapability— andLevelis now decoupled fromScale. You can shape a greenfield product concept (or a multi-feature bet) as aproduct-visionintent (the existence bet: why this product should exist, for whom, through what wedge) or aproduct-strategyintent (the path: central challenge, guiding policy, coherent actions, problem/segment sequence), instead of being forced into afeature.Levelis now an open recognized set (product-vision › product-strategy › capability › feature);Scaleonly suggests a starting altitude you override in a word, andframe-intentasks the altitude for concept-shaped input. The product-existence bet is de-risked once at the top asmarket-existence(market desirability and viability), distinct from feature-leveldesirability. A sibling-spawn detector offers to frame a product parent when work won’t reduce to one shippable slice, and a retroactive-parent affordance back-links orphaned siblings at an inferred altitude. Existingcapability/featureintents stay valid — the change is additive. -
init-projectrecognises anintentfromframe-intentas a fourth discovery source. When theproduct-engineeringpack is installed, theframe → de-risk → decomposeloop hands its leaf intoinit-project’s value gate as an optional upstream source, alongsideresearch, a PRD, and areceive-briefbrief.
Changed
Section titled “Changed”-
The catalogue’s seed lint is now opt-in by construction and renamed
lint-catalogue-seeds.tools/lint-seeds.pybecomestools/lint-catalogue-seeds.py(the CI job, its path filters, thepre-pr-catalogue.pygate, and thetools/hooks/README.mdreference are renamed in lockstep), and all of its checks — the anti-leak blocklist and the placeholder-shape checks — now run only on packs whosepack.tomlcarries[pack].lint-seeds = true. The four first-party scaffold packs (core,governance-extras,monorepo-extras,user-guide-diataxis) carry the flag, so their seeds stay enforced exactly as before; any other pack — including an organization pack that intentionally ships filled-in instance content — omits the flag and is unenforced by construction, with no edit to the lint or any central pack list. The flag is catalogue-internal metadata and is not projected toplugin.json/marketplace.json. (RFC-0100 Decision 6 / ADR-0037 D4.) -
The work-loop’s EXECUTE contract-grounding gate now fires on unfamiliar frameworks and libraries, not just infrastructure. Before generating code against an unfamiliar internal framework or third-party library whose contract (a versioned signature, a deprecation, a call-order or lifecycle constraint) the agent doesn’t already hold, the gate routes to the same tiered oracle protocol in
contract-acquisition(the skill formerly namedinfra-contract-acquisition, renamed now that it grounds both surfaces) that infra uses: T0 detect the installed version (the contract is version-specific); T1 run the type checker / compiler against the call site (mypy/pyright,tsc --noEmit,go build/vet,cargo check) plus extract the installed package’s API surface — the deterministic signature oracle; T2 consult a curated framework-library skill for the behavioral contract no type encodes (the supplied-not-bundled tier — detect-and-recommend, never bundled); T3 versioned docs / changelog; and a runtime invoke-and-observe probe. It declares its oracle tier honestly — strong (typed / stub-equipped) → medium (untyped-but-introspectable) → weak (dynamic / C-extension → probe-primary) — andreferences/oracle-table.mdgives the concrete commands per ecosystem (Python / TypeScript / Go / Rust / Java). The bare “grep to verify a symbol exists” rule confirmed existence but never the contract; this closes that gap. The optional doc-retrieval surface stays Tier-1 detect-and-stop — never auto-installed, retrieved docs are treated as untrusted data, andquality-engineerre-derives the cited software contract slice at REVIEW, symmetric with infra. No new skill, no bundled per-library data. -
agentbundle uninstallgains--dry-runand--yes, and confirms before removing anything. Previouslyuninstalldeleted every bundle-owned (Tier-1) file immediately with no preview. It now classifies each recorded file (removeTier-1 /keepTier-2) and:--dry-runprints that plan and writes nothing; without--dry-runit asks before the first removal (--yesskips the prompt; a non-interactive stdin refuses rather than hanging). Adopter-edited files are still preserved exactly as before. -
agentbundle install --forceconfirms before its destructive cleanup, andinstalloffers to upgrade an already-installed pack.--forcenow lists the paths it will remove (the pre-RFC-0012 dist-tree subtrees, or orphan files) and asks before deleting;installgains--yesto skip that prompt. Used purely as a cross-scope bypass (no deletion),--forceis unchanged and never prompts. Migration: CI that runs the deleting form ofinstall --forcenon-interactively must now add--yes(a non-TTY without--yesrefuses rather than deleting unattended — mirroringupgrade). Separately, installing a pack already installed at the requested scope now offers to runupgradeinstead of flatly refusing;install --yesruns it, and a non-interactive stdin keeps the olduse 'upgrade'refusal. -
agentbundle reconcileandlist-targetsdrop their dead--scopeflag.reconcile’s--scopehad a single legal value (user) equal to its default, andlist-targets’s--scopewas parsed but never read; both are removed, so passing--scopeto either now reportsunknown flag for <verb>: --scope. Default behaviour of both verbs is unchanged. -
agentbundle upgradeno longer takes--to; it derives the version and confirms (breaking). The upgrade target is now read from the catalogue you point at (itspack.toml[pack] version) instead of an operator-supplied--tothat was never validated against the catalogue. The command showsinstalled → target, asks before writing (--yesskips the prompt; a non-interactive stdin refuses rather than hanging), names both versions in the recap, and says so when you’re already current. To upgrade to a specific past version, point the catalogue at that git ref. See the agentbundle CHANGELOG for the full migration note.
- Agentic security boundaries are now control-level checks in the
security-checklistsllm-agentmodule (core 0.4.13 → 0.4.14; architect 0.8.0 → 0.8.1; RFC-0029 / ADR-0032). Thellm-agentmodule — the orchestrator-inlined depth thesecurity-reviewerreasons from — gains three control-altitude checks for the agentic boundaries the well-architected overlay previously named only at design time: execution isolation & blast radius (the three confinement axes — filesystem scope, network egress, resource/time caps — distinct from authorization), inter-agent identity/privilege propagation (a sub-agent must not amplify the spawning request’s authority), and memory poisoning (a write gate that trust-checks content before it is persisted, plus the read side). The module’s Standards surface adds the OWASP Top 10 for Agentic Applications:2026 (ASI02 / ASI03 / ASI05 / ASI06) and OWASP LLM04 (Data & Model Poisoning), keeping the existing LLM01/02/03/05/06/10 surface and the module’s delegation legend, spec-stage proactive-control, and established-helper-bypass sections intact. As the ride-along, thearchitectGenAI/agentic lens (lens-genai-agentic.md, both skill copies) drops its now-stale “these boundaries reach beyond the module’s current checks” caveat — they route to a namedllm-agentcheck like every other security-boundary concern. - Agentic well-architected overlay, applied at design time (architect
0.7.1 → 0.8.0; ADR-0032 / RFC-0042). Designing an agentic system — one
that uses tools, takes autonomous action, or runs an agent loop — now gets
the GenAI/agentic well-architected overlay by construction, not only when
a reviewer later runs well-architected mode.
architect-design’s Stage 0 gains a workload-class routing axis alongside its provider axis: an agentic concept loads the sharedlens-genai-agentic.mdoverlay (and, on a named cloud, the provider pillars too — the axes are orthogonal). The shared lens is reorganised into a progressive, capability-tiered taxonomy — Tier A (the LLM is on the path) → Tier B (the system acts) → Tier C (the agent persists or collaborates) — so a plain RAG/chat design applies only the baseline tier while a multi-agent system with spend authority applies all three. Tier B makes the trust triad first-class — human oversight, intent verification, and auditable action trails — alongside tool-use authorization, tool/MCP source provenance, output handling, execution isolation, and reliability under non-determinism; Tier C adds memory & context integrity, sub-agent provenance, and inter-agent identity/privilege propagation. Graduated autonomy is framed as engineering judgment bounded by irreversibility and blast radius, never a standards mandate. Design time and review time consume one shared lens file, so the two never diverge. Security-boundary concerns name the boundary at design altitude and route control-level verification tosecurity-reviewer/security-checklists(llm-agent). Prose only — no new reviewer, skill, or tooling ships. operational-safetyreference library for infra/destructive work (core 0.4.12 → 0.4.13; RFC-0041 P3 / ADR-0031). Infrastructure and destructive operational work now gets a first-class operational-safety depth library — a newoperational-safetyskill of six failure-mode-keyed prose modules (state-and-idempotency,blast-radius,environment-isolation,cost-and-teardown,drift-and-rollback,observability-and-smoke), structurally identical tosecurity-checklists. When the work-loop detects infra/destructive work, the orchestrator loads only the matching modules (1–N, never all six) and inlines them into the existingquality-engineerreviewer’s brief — so idempotency, blast radius, environment isolation, cost/teardown, drift/rollback, and observability/smoke get reviewer depth with no fourth reviewer (ADR-0023). The split againstsecurity-checklistsis clean: security config →security-checklists(security-reviewer); reliability/ops config →operational-safety(quality-engineer).security-checklists’config-misconfigalso gains a URL-free, version-free deferred-authority pointer (CIS Benchmarks + the per-provider well-architected security guidance) noting the real per-provider depth lives in the self-updating scanner. Prose only — no executable code ships.- One consolidated, namespaced pack-output layout file —
agentbundle-layout.toml(RFC-0040 / ADR-0030). An adopter who wants to control where a pack’s durable output lands now edits one namespaced file instead of a per-pack config.agentbundle-layout.tomlcarries one[<pack>]table per output-producing pack (research,architect,product-engineering), each with a singleparentbase under which the skill creates a topic-named folder per unit of work. Two locations resolve with clear precedence — a checked-in./agentbundle-layout.tomloverrides a personal~/.agentbundle/agentbundle-layout.toml, per table. The file is adopter-owned and never shipped: it comes into being by hand, or anagentbundle installstep appends a pack’s default section to one that already exists (never creating it, never overwriting a section you wrote). Reading stays prompt-only (Charter Principle 3 — no engine, index, daemon, or watcher); each consumer confines the resolved path (realpath-resolve, reject.., surface the absolute path before the first write) and treats a repo-sourced out-of-treeparentas an Ask-first, untrusted-origin case. Each consuming pack ships areferences/agentbundle-layout.mdschema doc and a scope-keyed[pack.layout]manifest default;pack.tomlgains the optional[pack.layout]table (adapter contract → v0.16).architect(0.6.1 → 0.7.0) andproduct-engineering(0.4.2 → 0.5.0) become consumers;research(0.4.0 → 0.5.0) migrates from the undistributedresearch-layout.tomlby a clean rename, no alias. - Infra-aware
work-loop— the loop can now drive an infrastructure inner loop end-to-end (corepack, bumped to0.4.12; RFC-0041 / ADR-0031). The loop’s verification modes previously assumed the verification mechanism already existed and assumed a fast, local, stateless, single-hop gate — so a cloud deploy stalled the agent and the human became a relay, pasting deploy errors back into the session by hand. Four doctrine additions close that gap, all prose (no executable tooling, no new reviewer, no new risk trigger): (P1) a generalized verification-mechanism preflight — picking a verification mode now obligates confirming its mechanism exists, and if not, building it is task zero; this is agnostic (a missing test runner or build command, not just an infra smoke check) and universal across light and full mode, with the infra mechanism enumerated as a multi-artifact set (verify-status + teardown + test-data/mock-user seeding + a provider-appropriate policy-as-code/CSPM scanner). (P2) a fourth infra/deploy verification flavor whose contract is a layered GATES sequence (static preflight → plan/preview → idempotent convergent apply → active end-to-end smoke → rollback), cross-linked to the plan’s## Rolloutsection. (P4) an agent-drives-verification doctrine — the agent runs the deploy and reads real environment output itself, with the human-as-relay named as the anti-pattern and Claude Code background tasks /asyncRewake/PreToolUseas accelerant only. (P5) mandatory infra security — infra-flavored work non-skippably runssecurity-reviewerat both spec stage and on the diff, force-loading the infra-relevantsecurity-checklistsmodules, paired with the P1 policy-as-code/CSPM scanner for per-provider depth. - Research project mode — a four-skill lifecycle for sustained investigations
(
researchpack, bumped to0.4.0). Alongside the existing depth axis (/researchquick/standard/applied/deep), the pack gains a lifecycle axis for multi-week investigations that accumulate a corpus:research-project-startscaffolds a three-layer project folder (rawsources/→ asynthesis-matrix.md+memos.mddigest middle layer the pack previously lacked → a typed synthesis);research-project-digestclusters sources into emergent, constructed matrix columns;research-project-synthesizeemits the typed verdict and a single-file, self-contained<topic-slug>-brief.mdthat governance can lift whole into an RFC; andresearch-project-checkis a passive saturation stop-signal that reads the matrix by eye and recommends — it never advances the lifecycle. Projects live in scratch / out-of-repo by default (configurable via the[research]table of an adopter-createdagentbundle-layout.toml); the corpus is never committed to the repo, only the distilled brief. Prompt-only by construction (no engine, index, or counter); the seven existing skills are reused as phase operations. RFCs may now carry an optionaldocs/rfc/NNNN-notes/companion folder for promoted research. - Pack activation evals (Tier A) —
tools/run-pack-evals.py+[pack.evals](RFC-0037 / ADR-0028). A catalogue maintainer can now measure, repeatably and empirically, whether each covered skill activates on the prompts it should and stays quiet on the near-misses it shouldn’t. Each covered skill shipsevals/eval_queries.json(a flat[{query, should_trigger}]array); a pack’spack.toml[pack.evals].skillslists the covered skills; the runner projects the pack in isolation, runs each query through the headlessclaudedetector, computes atrigger_rateover N runs, grades against a 0.5 threshold, and writes a gitignored, iteration-numbered eval-workspace. It runs report-only in a scheduledpack-evals.ymlworkflow — never on the PR critical path — and the first cut covers thecoreandconverterspacks.lint-skill-spec.pynow accepts and validateseval_queries.jsonand enforces[pack.evals].skillscoverage. A second, in-harness mode (run-pack-evals.py --mode in-harness, RFC-0037 § Errata E2) extends the reach to Kiro IDE and interactive Claude Code where there is noclaudeCLI: the host agent dispatches a read-only sub-context per query and reports activation — a lower-fidelity (reported, not observed) proxy, labelled as such in the summary so it is never mistaken for the headless baseline. A lightweight behavior/output check (--check behavior, RFC-0037 § Errata E3) goes further where it’s safe: the agent runs the skill in a confined per-eval working dir and the runner re-derives deterministic post-conditions (anevals/evals.jsonexpectblock — produced files, output substrings) plus attested assertions (tier: B-lite). And a report-only LLM-judge (--mode judge, RFC-0037 § Errata E4) grades the quality layer against the eval rubric, behind a config-driven, multi-adapter backend seam: built-inclaude-code(same model) +codex(independent model/IDE), and adopters add their own — e.g. akiro-cliheadless judge — and pick the model purely by a--judge-configentry, no code change. The judge is judgment-only and fails closed on an unparseable verdict. The full Tier-B grading (pass-rate deltas, with/without-skill, train/validation, the human-feedback loop) stays a future RFC. - Per-prompt work-loop activation hook (
corepack). A newwork-loop-checkhook nudges the agent, on every prompt, to load the work-loop skill for non-trivial work — closing a gap where the loop was not reliably activated. It ships as a matched pair so it reaches both surfaces: aUserPromptSubmithook-wiring + hook body for Claude Code (and Copilot / Cursor / Gemini / Codex), and a standalonepromptSubmitaskAgent.kiro.hookfor Kiro IDE, which reads only.kiro/hooks/files and ignores hook-wiring. (agentbundle validate core’s info line now lists both core hook-wirings as not projecting to the Kiro CLI adapter —session-start.tomlandwork-loop-check.toml— since neither declaresattach-to-agent; this is informational, not a refusal.) - Markdown → Office publishing skills (
converterspack, RFC-0036). Three new skills publish a Markdown artifact back out as a distribution-ready, on-brand Office file by filling a user-provided template at its existing fill-points —markdown-to-docx(Word, viadocxtpl),markdown-to-pptx(PowerPoint, viapython-pptx), andmarkdown-to-xlsx(Excel, viaopenpyxl). A designer’s cover page, slide master, logo, and named cell regions survive because the skill fills the template rather than converting Markdown into a fresh document. Each detects a template, confirms or elicits one, and proceeds unbranded only on the user’s explicit opt-out — it never invents a brand and never auto-installs its Tier-1 render library. This completes the pack’s Office round-trip, which until now ran only inward (Office → Markdown). Theconverterspack is bumped to0.2.0. See Publish Markdown as a branded Office file. - SSO web-session cookie auth for
jirareads +confluence-crawler(atlassian pack, RFC-0035). On an Atlassian Data Center instance behind corporate SSO where API tokens are blocked, both skills can now authenticate by a captured web session instead of a token: pre-bakereferences/sso-config.toml(auth_default = "sso-cookie"), runpython scripts/setup_sso.pyonce to register the session, and reads work with no token. The session is resolved through thecredbrokerSSO resolver (newload_sso_cookies, credbroker 0.2.0) and the captured jar is confined to the declaredcookie_domains; noAuthorizationheader is sent and redirects are not followed (the session cookie never crosses to another host). Both skills keep acreds(token) fallback — token users with no SSO config see no change. Data Center reads only; writes are refused pending XSRF design; Cloud is unchanged. See Authenticate Jira / Confluence with an SSO web session. jira-brief-intakeskill (atlassian pack). Turns a Jira epic — or a board / sprint / JQL selection of issues — into shippable specs for teams who plan kanban-style in Jira. It pulls the epic and its children via thejiraskill, maps them onto a Shape B product brief (epic → Outcome, child issues →US-nuser stories tagged with their Jira key, epic key →Epic:provenance pointer) atdocs/product/briefs/<slug>.md, then hands off to thereceive-briefskill to elicit any missing fields, decompose, and build. It is read-only against Jira and degrades gracefully — whenreceive-briefis not installed it inlines a decompose/execute instruction for the agent to act on directly. Pure choreography, mirroringjira-defect-flow.
Changed
Section titled “Changed”-
architect-designwrites each design effort into its own per-effort folder (<parent>/<topic-slug>/) instead of scanning for a loose-file home every run (RFC-0040). The previousdocs/design/→design/→architecture/→docs/scan-then-elicit becomes the default when no[architect]layout section resolves. Additive — a folder around what was a file — and documented in the pack’sreferences/agentbundle-layout.md. -
new-rfcnow surfaces the optionalNNNN-notes/companion (governance-extraspack, bumped to0.3.0). The skill and its RFC template point authors at the optional siblingdocs/rfc/NNNN-notes/folder for promoted research — a distilled brief and supporting material summarized into Evidence & prior art and linked, rather than pasted into the RFC body. Pairs with the companion convention added todocs/CONVENTIONS.md§ 3, and is the landing place for aresearch-pack project’s<topic-slug>-brief.md. -
The
work-loopskill’s Context hygiene section now covers output, not just input (corepack, bumped to0.4.11). A new Emit less, too note adds two zero-cost habits to the existing window-management guidance: don’t restate code, files, diffs, or tool output already in the conversation — reference them by path and line — and continue with the substance instead of narrating a tool call’s success. It is framed as waste reduction, not terseness for its own sake: the rationale, edge cases, and findings prose that review and the human actually read stay in. -
Research outputs are now named by topic and type (
researchpack, bumped to0.3.0). Episodic/researchartifacts are written as<topic-slug>-<type>.md(e.g.oauth-pkce-survey.md) instead of the genericresearch.md, so two investigations in one working directory no longer overwrite each other and a file’s name says what it is —survey,fact-check,comparison-matrix,shortlist,blueprint,hypotheses, orcounterpoints. The scoping skills (source-map,build-outline,identify-perspectives,decision-archaeology) gain the same<topic-slug>-prefix. Quick mode is unchanged (inline, no file). The former nameresearch.mdis retained as a recognised legacy alias for one release. -
The
new-adrskill and ADR template now follow MADR conventions (governance-extraspack, bumped to0.2.0). The ADR template gains aRejectedstatus (a declined proposal is now kept as a record, not deleted) and two optional sections — Decision drivers (the criteria a choice was judged against) and Confirmation (how conformance with the decision will be verified). Frontmatter adopts MADR’s decision-roles split: theDecidersfield is renamed toDecision-makersand gains optionalConsultedandInformedlines. The H1 title now names the problem and the chosen solution together (theADR-NNNNordinal prefix is unchanged), and the skill now carries the full post-acceptance lifecycle discipline inline (bidirectional supersession,Deprecated-vs-Superseded, backfilling). The decision stays first in the body (answer-first; no options-first reordering). Breaking for the template only: new ADRs useDecision-makers; existing ADRs keepDecidersand are not rewritten (ADRs are immutable). -
credential-setupnow gives a clear install hint instead of a traceback whencredbrokeris missing. Running the setup script without thecredbrokerresolver installed prints a single line telling you how to install it from your repository checkout and exits cleanly (code3), rather than dumping aModuleNotFoundErrorstack trace. A different import failure (a brokencredbrokersubmodule, say) still surfaces unchanged.
- Kiro custom agents now reach the bundle’s skills — CLI and IDE (contract
v0.15). On both Kiro targets, only the default agent auto-discovers
skills; a custom agent (
kiro --agent <name>, including every headless--no-interactiverun, or an IDE subagent) loaded zero skills unless it declared them in itsresourcesfield. Packs projected agents without that field, so agent-driven runs saw none of the catalogue’s skills. Both thekiro-cliandkiro-ideadapters now inject a skill-resources glob (skill://.kiro/skills/**/SKILL.mdand the~/.kiro/skills/**/SKILL.mduser-scope twin) into every projected agent — CLI into the agent JSON, IDE into the.mdYAML frontmatter (quoted, YAML-safe). An agent that declares its ownresourceskeeps it; the deprecatedkiroalias inherits the IDE behavior. Default-agent runs were already fine and are unaffected. (RFC-0022 erratum E4; kiro #6887/#6888/#4993.) agentbundle install --adapter kironow behaves exactly likekiro-ide. The deprecatedkiroalias (RFC-0022) was honored bymake buildbut not by the install path, which still emitted.jsonagents and merged hook-wiring — the legacy behavior. Installing, upgrading, or uninstalling viakironow projects.mdagents and drops hook-wiring (the IDE shape), consistent with the build registry. The legacy.json-agents + hook-wiring-merge behavior is unchanged — it lives under thekiro-cliadapter. The dropped- primitives warning forkironow names what is actually dropped (hook-wiring and commands).state.adapterstill records the name you chose (kirostayskiro), so the alias remains a working, named adapter. Theattach-to-agentvalidation and path-confinement rails now also fire forkiro-cli, so a malformed or path-traversing wiring declaration is refused for the adapter that performs the merge.
-
Pack profiles — install a curated set of packs in one command (RFC-0034).
agentbundle install --profile <name> <catalogue>reads a first-partyprofiles/<name>.tomlfrom the catalogue and installs its packs at the profile’s single declared scope, in deps-first order, on one pinned adapter, with all preconditions checked before any write.agentbundle list-profiles <catalogue>lists the available profiles (id, scope, description). Two profiles ship:solution-architect(user scope →architect+research+contracts) andfull-ceremony(repo scope →core+governance-extrasuser-guide-diataxis+monorepo-extras).--profileis mutually exclusive with--pack, and--scopeis rejected with it (a profile declares its own scope). Already-installed packs are skipped, not reinstalled; per-pack state rows recordinstall_route = "profile". No new state schema, no adapter-contract bump, no new install route — distribution hygiene over the existing single-pack install path.
-
New
inceptionprofile. A user-scope toolkit for taking an idea from zero to a buildable repo —research+product-engineering+architect, installed once and carried across ventures. Install withagentbundle install --profile inception <catalogue>, then use as much of it as the venture warrants: architecture alone for a learning project, plus product shaping for a side project, plus research when sizing a market. The build loop itself stays the repo-scopecorepack, installed into the new repo at bootstrap. -
designjoins the softcategoriesvocabulary.agentbundle validatenow recognizesdesignas a known pack category, so thedesign-craftpack (and any future design pack) declares it without a soft warning. The vocabulary is extensible by design (RFC-0031 D8) — this grows it by one slug, no RFC required, no behavior change for any other pack. -
New
design-craftpack for interaction/visual designers (design-craft 0.1.0). An opt-in, user-scope pack of four pure-markdown skills —aesthetic-direction(turn a vague vibe into named, ranked goals),design-system-foundations(derive a token/scale taxonomy from intent),layout-and-information-architecture(hierarchy, reading flow, wayfinding as concepts), anddesign-critique(severity-rated heuristic evaluation) — plus a sharedquality-floorchecklist (handle all states, accessibility floor, “motion communicates state, honor reduced-motion”). Designers author the upstream design intent the build consumes, the design-side twin ofproduct-engineering’s product-intent seam. Every skill is strictly framework-agnostic: it points to the recognized standards (WCAG, the W3C Design Tokens interchange shape) and ships the method to derive values, never a stack or a values table — enforced by a pack-scoped agnosticism lint wired into CI. No hooks, no engine, no in-pack validator, no reviewer subagent. Installs across all seven adapters; user-scope by default. -
decompose-intentrecords the decomposition decision (product-engineering 0.4.1). When a cut drops or replaces a branch — most often after an upwardde-risk-intentkill bubbles up — there was no instruction to record why on the parent, so a parent intent read as if its tree were always this shape and a later reader re-litigated branches already ruled out. A new procedure step (and an optional “Decomposition decisions” log in the intent template) asks for the grouping rationale plus any dropped/replaced branch, pointing to the killed child’s verdict. This mirrors the de-risk trail, which already records why a bet was tested the way it was; a line or two per decision, omit if the cut was obvious. No new fields are required and the artifact stays a template, not a schema. (Pure-markdown; dependency-contract paths between siblings and confidence in a bet were audited and already covered by the business-unit provider/consumer projection and the survive/kill verdict respectively — no change there.) -
architectships a forked-contextdesign-reviewersubagent (architect 0.6.0, RFC-0032). A read-only sibling of thearchitect-reviewskill: the same genre-routed verdict critique and well-architected risk register, with the same severity and mechanical/judgment tags — but run in an isolated context that hasn’t seen the authoring, so it can’t mark its own homework. It is the fresh-context (preferred) rung ofarchitect-design’s convergence loop (which previously had only an in-thread skill and a weaker cold-re-read floor); its tools areRead, Grep, Glob, so it flags and never rewrites the design. Thearchitect-reviewskill is unchanged and the two coexist. The convergence loop stays a soft dependency — it degrades gracefully when the subagent isn’t installed. ADR-0023 records that the charter’s “three reviewers is the ceiling” scopes the core code-review lenses, not opt-in design-side review. -
work-loopmakes “run it as a real user” first-class for non-UI tools (core 0.4.9). The manual-QA verification mode was framed almost entirely around UI rendering and UX flows; it now explicitly covers any artifact a user invokes — a CLI, a library’s public API, an agent or skill, a service endpoint. The doctrine: when a change ships something a user invokes, verification includes exercising the real built artifact end-to-end through its documented happy path and recording what you observed (real stdout/exit code, returned value, file written, on-screen result), not internal state or a unit gate standing in for the real invocation. Framed harness-agnostic like the EXECUTE simplify pass — done by hand on any agent, with Claude Code’s native/verifyand/runas an optional accelerant. The DECIDE end-of-session checklist gains a line that refuses “done” until that end-to-end exercise has happened. Existing UI-specific guidance is preserved as the UI instantiation of the general rule. -
architect-diagramlearns deliberate visual encoding (architect 0.5.3). A newreferences/visual-encoding.mdturns scattered correctness rules into one design heuristic: when a diagram distinguishes more than one category of thing or relationship, map each visual channel (shape, grouping, position, edge style, marker) to meaning by the data type it carries, rather than decorating arbitrarily. It names which channels are robust across enterprise wiki renderers versus fragile (colour, opacity) — colour is reinforcement, never the sole carrier — and notes honestly that Mermaid can’t size nodes, so magnitude goes in a label. Mermaid-only; no rendering-library code. The draft step in the skill now loads it when a diagram carries more than one dimension. -
quality-engineercatches two more test/edge-case shapes (core 0.4.8). The tautological-tests finding now also flags a test that asserts on the mock’s own configured return value (it can never fail, so it pins nothing), and the edge-case enumeration addspermission-deniedandresource-exhaustedto the cases the reviewer checks for. -
The
architect-designNFR lens gains a performance-budget optimization discipline (architect 0.5.2). The “Performance and scale” checklist now asks for a performance budget committed up front (a latency, throughput, or resource target stated as a testable claim), and adds an “earn each optimization against the budget” prompt: measure before optimizing (no optimizing an unmeasured hotspot), spend effort on the hotspot where most of the cost sits, and weigh each optimization’s ongoing complexity cost against the gain it actually buys. Framework- and stack-agnostic — no profiler or tool names. The optimization discipline was previously absent; budget-setting itself stays cross-linked to the existing quality-attribute-scenarios guidance rather than restated. -
The
product-engineeringpack gains a content layer —voice-and-microcopy(product-engineering 0.4.0). A fifth pure-markdown skill that turns shaped product intent into the words a user reads in the UI — the angle the pack’s intent-shaping habits (frame-intent,de-risk-intent,decompose-intent) deliberately left open. The adopter characterizes their product’s voice along a few axes (humor / formality / respect / enthusiasm) and records it in a travelling voice-chart template, writes the recurring UI states — error, empty, button, label — from blame-free, actionable formulas (each with a before/after), and runs a content checklist before copy ships. Voice is constant, tone flexes by context (calm in errors, warm in success). Fully framework-agnostic and habits-shaped — no engine, no schema,SKILL.mdunder 100 lines with depth inreferences/. Distinct from thehouse-voice-writing-craftclear-prose rules, which shape documentation prose, not product UI copy. -
The
bug-fixskill gains two debugging-discipline moves (core 0.4.6). A new “list candidate causes, then falsify each” step sits between reproduction and the root-cause assertion — name 2-3 rival causes and rule each in or out with Expected / Actual / Verdict, so you don’t fixate on the first plausible cause. And a “Why wasn’t it caught?” question joins the root-cause set, so the regression test closes a named coverage gap rather than only pinning the observed input. Both are language- and framework-agnostic. The renumbering shiftsbug-fix’s tracker-loopback step from 8 to 9; the atlassianjira-defect-flowskill’s references to it are updated to match (atlassian 0.1.4). -
Spec and guide authoring skills teach two doc-writing disciplines: retcon writing and context poisoning (core 0.4.7, user-guide-diataxis 0.1.4). Retcon writing —
new-specandnew-guidenow instruct authors to write spec/guide bodies in the present tense, as if the feature already exists and always worked this way: no “will be implemented”, no “previously X, now Y”, no deprecation timelines, no version-stamped history in the body (decision history stays in ADRs and the changelog). The rule lands as a failure-mode bullet innew-specstep 4, a guide-voice anti-pattern innew-guidestep 4, a reminder in thenew-specspec.mdtemplate, and aclear-prose.mdchecklist item;plan.mdis exempt, since it keeps its own changelog. Context poisoning —new-specnow names the failure mode its single-source-of-truth / drift-is-a-bug discipline prevents (an agent loading a stale, duplicated, or self-contradicting doc and deciding wrong from it) in one canonical place, tying the one-canonical-home rule and the retcon body together as the two halves of the defense. -
work-loopgains a “Scale with a tool, not turns” technique for large, repetitive tasks (core 0.4.5). When a task spans many similar items — applying one change across N files, transforming a large set, auditing every module — the skill now points you at writing a small enumeration script backed by a resumable tracking file (progress.jsonlor a checklist with per-itempending/done/failedstate), so an idempotent re-run skips finished items and the loop reliably reaches 100% completion instead of stalling when context turns over. A short headline lands in the EXECUTE phase; the full playbook — tracking-file schema, idempotency, when to shell out to the agent per item, and keep-vs-delete the tool — is a new on-demand reference,references/scale-with-a-tool.md. -
The research pack learns to preserve irreducible ambiguity instead of always collapsing to one rated answer (research 0.2.0). Four skills gain a first-class way to hold a question open when the honest output is not a single verdict:
/identify-perspectivesadds a tension map recording, per irreducible disagreement, the conditions under which each camp holds and what a forced resolution would destroy;/devils-advocateadds a do-not-resolve verdict for productive tensions where both sides are well-evidenced under different conditions, distinct from its confidence-downgrade;/researchadds a first-class known-unknowns / unknowables gap section, distinct from rating a weak finding[uncertain]; and/decision-archaeologyadds a revival check that flags a rejected alternative whose original rejection rationale no longer holds because a constraint changed. Each is additive — no existing schema field or downstream contract changes. -
The rest of the catalogue-internal references are swept from shipped content (core 0.4.4, figma 0.1.3). Following the first pass, the remaining
make build-*build-target mentions, an internal RFC citation, and the “this catalogue” identity asides are removed from the work-loop and receive-brief skill scripts, the session-start hook, thepre-prhook, and the adapt-to-project reference; figma’s exit-code test drops a dangling internal-RFC comment. Comment, docstring, and prose only — no behavior change. (credential-brokers, which is frozen, is left for a separate pass.) -
Shipped pack content sheds catalogue-internal references (core 0.4.3, atlassian 0.1.3). The
conventions-checkcommand no longer instructs running this repo’s owntools/lint-*scripts — which never install into an adopter tree — and is reframed as checks you (or your own linters) perform directly. Thejiraskill’s error-handling guidance drops amake build-selfremediation hint in favour of “reinstall the pack”, and four shipped atlassian test scripts drop dangling internal-RFC comment citations. -
make build-selfno longer litters the tree with by-quadrant guide scaffolds. Self-host projection skipsguides/**: guides are repo-owned and reach adopters through install-time seed delivery, so a repo that organizes its guides by pack no longer gets untrackedguides/{tutorials,how-to,reference,explanation}/README.mdre-created on every build. -
new-guidenow coaches prose, not just structure (user-guide-diataxis 0.1.3). The skill ships aclear-prosechecklist. It names the tells that make docs read machine-made (hedges, uniform sentence rhythm, em-dash overuse, throat-clearing openers, inflated verbs) and the habits that keep them human (one claim per sentence, concrete over abstract, strong verbs, omit needless words). The voice section points to it. An optional copyedit pass hands the draft to a read-only subagent when one is available. -
A guide home for every pack, and real guides for the packs that lacked them (ADR-0020).
guides/is reorganized from flat Diátaxis quadrants to a per-pack hierarchy —guides/<pack>/{tutorials,how-to,reference,explanation}/for each pack,guides/_shared/for cross-cutting topics (install routes, the adapter support matrix, the catalogue model, authoring a skill). All 12 packs now have a guide home reachable from[pack.links].documentationand a “go deeper →” link from the pack README, and the README catalogue points each pack at its guides. The seven previously-undocumented packs (atlassian,contracts,converters,figma,governance-extras,monorepo-extras,user-guide-diataxis) gained full Diátaxis guides;architectgained diagram and review how-tos; flow-heavy guides carry ASCII diagrams; andcore’s explanation now leads with why loop engineering. The adopter-facinguser-guide-diataxisseed scaffold stays organized by quadrant; thenew-guideskill is layout-aware (user-guide-diataxis 0.1.2). Every pack’s version is bumped for the newdocumentationlink. -
architect-designnow consults the enterprise’s own knowledge when the environment exposes a retrieval surface (architect pack 0.3.0). A new progressive-disclosure reference (knowledge-surfaces.md) carries an 8-area MECE knowledge taxonomy — business domain, current landscape, interfaces, operational reality, constraints & standards, patterns, decisions, in-flight — plus a harness-agnostic detection mechanism that discovers a retrieval surface (an MCP knowledge tool, an internal CLI, an in-repo doc set) from the session itself, hardcoding no tool name. A single conditional procedure step loads the reference only when a surface is detected, and otherwise degrades gracefully — asks for the missing context, lowers confidence, and never fabricates landscape/standards/in-flight facts — reusing the existing compose-with-researchframing. No knowledge server or RAG engine ships (out of charter); no registry, shared config, or cross-pack dependency. Thearchitect-review,architect-diagram, andproduct-engineeringsiblings have all since shipped (see below) — the line is complete. -
architect-reviewnow checks that a design was grounded in the enterprise’s own knowledge (architect pack 0.4.0). The review-side counterpart of thearchitect-designawareness above: a duplicated, verification-lensknowledge-surfaces.mdreuses the same 8-area MECE taxonomy as a checklist — is this area’s claim grounded? — and one conditional procedure step flags any landscape / standards / in-flight / interface claim asserted as fact without grounding (no cited surface and no “unverified — confirm” marker), plus any available knowledge surface the design ignored. It does not redesign and does not consult surfaces to author a better answer — if an internal surface is reachable it may spot-check the claims (naming what it checked against, or “none”); if not, it flags them for the author to confirm rather than guessing, and never fabricates a “ground truth” to judge against. Harness-agnostic detection (no hardcoded tools, public web excluded); no registry, shared config, or cross-pack/cross-skill dependency. Thearchitect-diagramandproduct-engineeringsiblings have since shipped (see below). -
architect-diagramnow consults the enterprise’s own knowledge to draw an accurate as-is diagram (architect pack 0.5.0). The third and final architect-skill sibling of the awareness above, with a deliberately different lens: in document and update mode only, when the as-is system integrates beyond the repo boundary and a retrieval surface is reachable, a duplicated as-is-drawing-lensknowledge-surfaces.mdextends “read the repo” to “read the landscape” — so the boxes, arrows, and edge labels beyond the repo boundary are grounded from the descriptive current-system facets (current landscape, interfaces, operational reality — areas 2/3/4) instead of guessed. It reuses the same 8-area MECE canonical core (kept byte-identical across all three copies; only the trigger column, lens paragraph, and detection/degrade framing change) and one conditional procedure step. Mode-scoped: it does not fire in design mode (the user’s hypothetical — fabrication is allowed-but-flagged) or review mode (routes toarchitect-review). Harness-agnostic detection (no hardcoded tools, public web excluded); three honesty rails recast for drawing — name what you drew from, leave an ungroundable node<unnamed>or ask rather than guess, flag a surface-derived edge the repo contradicts rather than drawing over it — strengthening the skill’s standing never-fabricate-names discipline. No registry, shared config, or cross-pack/cross-skill dependency.architect-designandarchitect-revieware unchanged. The new copy is registered intools/lint-knowledge-surface-parity.py(the drift guard shipped alongside theproduct-engineeringsibling, extended here + its self-test) so the canonical core is mechanically guarded. This completes the knowledge-surface line — all three architect skills plus theproduct-engineeringsibling now ship it. -
The
product-engineeringpack gains its business-unit cross-component layer (pack 0.2.0). A product org whose work fans out across many component repos can now stand up a value-stream meta-repo — a coordinating repo with no app code — via a new pure-markdown skill,align-value-stream. It holds the cross-cutting artifacts a polyrepo has nowhere else to put: a federated Backstage catalog (Domain→System→Component→API, referencing each repo’s owncatalog-info.yaml, never re-authored), the shared-contract authority (referenced bycontract@versionwith a read-only courier snapshot, never forked), the C4/bounded-context architecture, and a cross-component delivery rollup. At business-unit scaledecompose-intentnow slices a feature intent per component into onecorebrief per repo, each carrying an optionalparent-intent:provenance pointer (the one additive, never- interpretedcorebrief field, distinct fromEpic:), a versioned contract reference, and aprovidesApi/consumesApirole; each brief crosses into its component repo wherereceive-brief→new-spec→work-looptake over, and the meta-repo rolls up “delivered across all components?” The rollup is a markdown snapshot (absent-source rows showunknown / not-yet-catalogued, never silently delivered) — no runtime hub, no live API, no validator, no new subagent. The hard limits are stated honestly: no atomic cross-repo commit, no shared release train, snapshot-not-live. Habits, not infrastructure (RFC-0030 phase 2, ADR-0022). -
frame-intentnow consults the enterprise’s own knowledge through a problem-framing lens when the environment exposes a retrieval surface (product-engineering pack 0.3.0). The product-engineering counterpart of thearchitect-designawareness above — same mechanism, different lens. A new progressive-disclosure reference (frame-intent/references/knowledge-surfaces.md) carries a strict four-area subset of architect’s taxonomy — business domain & meaning and in-flight & roadmap (both primary), current landscape (brownfield-only), and operational reality (light) — and deliberately omits the four solution-design areas (interfaces, standards, patterns, decisions) so framing stays in problem space. The same harness-agnostic detection (no hardcoded tool name) and three honesty rails apply; a single conditional step loads the reference only when a surface is detected and otherwise degrades gracefully — asks for the missing domain/in-flight context, lowers confidence into the intent’sAssumptions, and never fabricates. The current-landscape area wires intoframe-intent’s existing brownfield maturity gate. A shared-canonical-core anchor names the architect reference as canonical so the copies don’t diverge. The detection audit home (“name what you detected, or ‘none detected’”) is pinned to a fixed slot in the intent template’s## Assumptionsand — symmetrically — inarchitect-design’s Stage-0concept.md(bumping the architect pack0.4.1 → 0.4.2). A new stdlibtools/lint-knowledge-surface-parity.pyCI gate guards every copy of the shared taxonomy core —architect-design(canonical),architect-review, andframe-intent— against silent drift. No knowledge server or RAG engine, no registry, shared config, or cross-pack dependency. -
pack.tomlis now the rich source of truth for pack metadata, projected into every catalogue listing (adapter contract → 0.14). Packs can declarelicense,display_name,[[pack.maintainers]],[pack.links](homepage/repository/documentation/changelog/issues/icon),categoriesandkeywords(each capped at 5), an opaque[pack.metadata.<tool>]table, and areadmepointer — all optional, so packs that omit them build and validate exactly as before. The build projects the cleanly-mappable subset (author ← first maintainer,category← first category,displayName, plus license/keywords/homepage/repository) — and each pack’sREADME.md— into the claude-plugins and APM routes’plugin.json/ aggregatedmarketplace.jsonentry, so a pack is described richly rather than with a single sentence.categoriesis a soft vocabulary: an unknown slug warns (exit 0), never fails.agentbundle list-packsrenders a pack’s canonical identity as@<catalogue>/<pack>when[pack].catalogueis set (declare-only — no resolution change). All 12 shipped packs now declare the enriched metadata and bump a patch version. (RFC-0031, ADR-0021; the per-pack guide-homedocumentationlinks and theguides/per-pack reorg land in a follow-on, ADR-0020.) As part of the same sweep,product-engineering’s intent/rollup templates moved from repo-scaffoldingseeds/into the owning skills’assets/(so the pack carries noseeds/and stays user-scope). -
A new opt-in
product-engineeringpack shapes product intent into the specs your delivery loop already builds (pack 0.1.0). Three pure-markdown skills —frame-intent,de-risk-intent,decompose-intent— work a recursive, level-taggedintent(a capability intent and a feature intent are the same artifact at different levels; a PRD is a feature intent written as a document). Name an outcome and the opportunity behind it, de-risk the riskiest assumption against a predeclared kill condition under a choosable prototype-approach (prototype-led↔validate-first), then decompose to a shippable spec — at app scale the leaf is acorebrief, soreceive-brief→new-spec→work-looptake it from there with no change tocore. One global Scale axis (app ↔ business-unit) plus per-intent maturity / reversibility / prototype-approach flags; one-way tracker projection (Linear / Jira Align / none); habits, not infrastructure. v1 is app/solo + single-component; the business-unit cross-component value-stream layer is a later phase (RFC-0030, ADR-0019). -
The
architectpack designs and reviews cloud architecture to the well-architected standard, and the design skill now converges (architect pack 0.2.0).architect-designshapes a one-page concept first, makes the design well-architected by construction for the chosen provider — AWS / Azure / GCP, primitives providers like Hetzner (it names the capability gaps you must build yourself), or local-first (the local→production delta + graduation path) — and then runs a convergence loop: it obtains a review pass, auto-resolves the mechanical findings without asking, re-reviews, and surfaces only the judgment calls (tradeoffs, risk acceptances, low-confidence assumptions) to you as decisions.architect-reviewgains a well-architected / lens mode (security · FinOps · SRE · DR · data · compliance · green concern-lenses, plus ML / GenAI-agentic / SaaS / serverless workload-class lenses) that emits a risk register with every finding tagged mechanical / judgment — the signal the design loop consumes. The loop is an enhancement when both skills are present and degrades to an embedded rubric self-check when it isn’t; for genuinely novel domains the design takes a leading-edge path that composes with theresearchskill when available and degrades to flagged-novelty + lowered-confidence when absent. Pure-markdown, no subagents, no new pack; the loop is an in-conversation procedure with no script or state file.architect-diagramgains acloud-primitivesdiagram vocab for parity with its AWS/Azure/GCP references. -
The
security-revieweris stronger, current, and shifts left (core pack 0.4.0). Security review is no longer only a late gate: on security-boundary work thework-loopnow dispatches the reviewer in a spec-stage secure-design mode at the pre-EXECUTE step, asking whether each control is specified as an acceptance criterion at the right depth (confinement, not just traversal; a scheme/host allowlist, not “validate the URL”; broker-mediated secrets, not ad-hoc reads) — collapsing post-implementation round-trips into one design-time pass. The awareness stack is current — OWASP Top 10:2025 (replacing the 2021 list), ASVS 5.0, API Security Top 10:2023, OWASP LLM Top 10:2025, CWE Top 25 — and a STRIDE + LINDDUN open pass adds the privacy lens STRIDE blind-spots. Depth ships through a newsecurity-checklistsskill: ten boundary-keyed modules the orchestrator loads per boundary the change crosses and inlines into the reviewer’s brief, so the lens is deep without bloating the prompt and travels to every adapter with no contract change. Tool-delegation is now language-agnostic (npm audit/pip-audit/govulncheck/cargo audit/ Snyk / Semgrep / CodeQL) and fails honestly (degraded: no scanner) rather than silently skipping. A new established-helper bypass meta-check flags code that rolled its own where the repo has a blessed helper — customize the list via a light “blessed security tools/helpers” point inAGENTS.md. Complements, does not replace, the SAST/SCA scanners (ADR-0017). See RFC-0029 / ADR-0018. -
The default quality floor is now higher by doctrine (core pack 0.3.0). Agent output tends to clear a strict external static-analysis gate (a SonarQube quality profile, a CI-only coverage threshold) regardless of tech stack, without bundling any linter, shipping any threshold, or detecting the repo’s shape. Three coordinated, stack-agnostic changes: (1) the
quality-engineerreviewer gains four universal code-smell findings — bounded complexity (split what’s reducible, complementing the existing comment-the-irreducible finding), nesting depth (idiom-appropriate flattening, not a mandated earlyreturn), duplicated production blocks past the rule-of-three (tests stay DAMP), and magic-literals/parameter-bloat (judgment-based, threshold-free) — plus a mutation-testing-mindset Test Design headline (“a test must be able to fail”) as the Goodhart-safe stand-in for chasing a coverage number; (2)work-loopgains a simplify pass in EXECUTE/REVIEW that shrinks the diff before review — harness-agnostic doctrine, with Claude Code’s/simplifyan optional accelerant, never a dependency; and (3) light mode now retains thequality-engineerpass when the adopter declares in theirAGENTS.mdthat the repo is judged by a strict external gate the local loop can’t run (adopter-declared policy, not repo detection). Mode mechanics begin migrating out ofCONVENTIONS.mdinto thework-loopskill as their single owner. -
The repo now has a SAST/SCA gate —
make sastruns Bandit (Python pattern SAST), pip-audit (dependency/SCA), Semgrep (cross-cutting SAST, including custommode: taintrules undertools/semgrep/), and a CodeQL code-scanning workflow (deep interprocedural taint — the open-source analogue of Snyk Code). The first three are chained intomake build-checkso every PR is scanned by the repo’s own single native gate (locally and inbuild-check.ymlCI); CodeQL runs as its own workflow. Bandit fails on medium-or-higher findings (tuning inbandit.yaml). The genuine findings surfaced were fixed in the same change: weak SHA-1 digests markedusedforsecurity=False; the arXiv retriever upgraded to HTTPS; thesession-starthook’s env-var path overrides sanitized against directory traversal (a fix every adopter inherits); and the SSO broker’stestverb now rejects non-http(s)URL schemes. A committed.snykpolicy file is the Snyk-native suppression vehicle for the organisational scan. All four scanners are CI-only dev tools (tools/requirements-sast.txt) and are never added to a shipped package’s runtime dependencies. See ADR-0017. -
Gemini CLI is now a full-parity adapter —
agentbundle install --adapter gemini(repo or user scope) projects every catalogue primitive to Gemini CLI’s native.gemini/*layout: skills →.gemini/skills/, subagents →.gemini/agents/<name>.md(thetools:allowlist is kept and name-mapped to Gemini’s tool ids —Read→read_file,Bash→run_shell_command, … — andmodelmaps tier-preserving to the Gemini 2.5 line), commands →.gemini/commands/<name>.toml, and hook bodies →.gemini/hooks/with the wiring + a managedcontext.fileName = ["AGENTS.md", "GEMINI.md"]bridge merged into.gemini/settings.jsonso the canonicalAGENTS.mdis read. Every pack admitsgeminiat both scopes. Previously Gemini CLI got nothing (it doesn’t readAGENTS.mdby default). Contract v0.12 → v0.13 (RFC-0027 / ADR-0016). Distribution-only. -
Cursor can now install the
researchandarchitectpacks — both packs addedcursorto theirallowed-adapters, soagentbundle install --pack research --adapter cursor(and--pack architect) now projects their skills to.cursor/skills/— and, forresearch, the two retrieval subagents to.cursor/agents/withreadonly: true— instead of refusing the install up front. The Cursor adapter shipped in the previous release, but no pack had opted in. (The credentialed packs are covered by the next entry.) -
Credentialed packs can now install via Cursor and Copilot —
atlassian,contracts,converters,figma, andcredential-brokersaddedcopilot+cursorto theirallowed-adapters, so a Cursor- or Copilot-based adopter can install them (and the SSO/token broker lands at~/.agentbundle/bin/as before — the broker delivery is adapter-independent). Previously these packs admitted onlyclaude-code,kiro-ide, andcodex. Recorded as an RFC-0013 § Errata decision; no contract change (both adapters already declare the.agentbundle/install prefix the broker needs). -
--dry-runpreviews an install or upgrade without writing anything —agentbundle install --dry-runandagentbundle upgrade --dry-runrun the full read-only pre-flight, print a per-file plan to stdout (one<action> <tier> <target>line each —create/overwrite/companion, with Tier-2 lines naming the.upstream.<ext>companion the real run would drop), and exit 0 without touching the tree, state, or install marker. A present Tier-2 collision does not change the exit code; the preview is informational.install --dry-run --forceis refused (--force’s destructive cleanup is incompatible with a read-only preview). The install preview covers the rendered adapter projection; it does not yet enumerate the governance seeds (AGENTS.md,docs/CHARTER.md,docs/CONVENTIONS.md) a real install also delivers. See the preview how-to.
Changed
Section titled “Changed”-
agentbundle upgradetells you when it keeps your edits — when a projected file you edited since install collides with the new version (Tier-2), the upgrade preserves your file and drops the upstream version as a<path>.upstream.<ext>companion, exactly as before. It now also prints, on stderr after the upgrade commits, how many files were kept and the companion path of each — so you can find them and runadapt-to-projectto merge. Parity with whatinstallalready reports; no change to the file-safety contract (the CLI still never clobbers or prompts). Per RFC-0001 § Errata (2026-06-11), which reconciles the original draft’s unbuilt in-CLI Tier-2 prompt with this deterministic companion-drop design. -
Leaner work-loop context use, same rigor — the review reviewers (
adversarial-reviewer,security-reviewer,quality-engineer) now return only their distilled findings block (orClean — ready to commit.), with no pre-findings methodology recap or process narration. Thework-loopskill drops the full reviewer report from resident context once findings are recorded — the on-disk report plusstate.jsonfingerprints are the durable record — and gains a## Context hygienesection with three context-saving levers (reference-read reduction, task-boundary compaction, narrowest-gate during FIX), each with a portable no-subagent floor, plus a “reduce, never lossily transform” guardrail. No verification surface changes: gates, the iterate-to-Clean loop, fingerprint stasis detection, the quality-engineer floor, and the iteration cap all behave exactly as before. -
Codex receives full skill bodies — the
skillprojection for the Codex adapter flips frommanaged-block-inline(one-line teasers inAGENTS.mdbetween<!-- agent-skills:start -->/<!-- agent-skills:end -->) todirect-directory. Codex users now read.agents/skills/<name>/SKILL.mdbyte-equal to source — the same surface Claude Code and Kiro have always had. Per RFC-0009 § Adapter contract change. On the first install after upgrade, the adapter strips the legacy<!-- agent-skills:start --> … <!-- agent-skills:end -->region from any pre-existingAGENTS.mdin place; outside-block content is preserved. The strip is destructive by design: hand- edited content between the delimiters is not migrated (RFC-0009 § Failure modes). The strip mechanism (_strip_legacy_skill_block+ the retained_splice_managed_blockhelper) is kept for one minor release as the migration window (released N) and then removed in the release after (N+1). Self-host mirrors Codex repo projection. The self-host allow-list includes bothclaude-codeandcodex, so this repo now carries Codex’s repo-scope projection alongside Claude Code:.agents/skills/for full skill bodies,.codex/agents/for subagent TOML, and.codex/hooks.jsonfor hook wiring.make build-checkenforces those paths the same way it enforces.claude/. -
Uniform multi-pack entry point across
direct-directoryadapters —codex,claude-code, andkiroall exposeproject_packs(pack_paths, contract, output_root)as the canonical orchestrator-facing surface. Single-packproject()is retained as a wrapper. Same-name skill collisions across packs resolve deterministic-last-wins by source-order. -
Orphan-skill cleanup across
direct-directoryadapters — after every multi-packproject_packs(...)call, the projected skill directory is swept: child directories whose names are not in the union of source skill names across the call’s pack list are removed. Bound to theskillprimitive only; symlinks are removed viaPath.unlink()(never followed).
Deprecated
Section titled “Deprecated”- (nothing yet)
Removed
Section titled “Removed”- (nothing yet)
- (nothing yet)
Security
Section titled “Security”- (nothing yet)
[Unreleased]
Section titled “[Unreleased]”[agentbundle][0.55.0] — 2026-10-21
Section titled “[agentbundle][0.55.0] — 2026-10-21”Highlights
Section titled “Highlights”- A new bundled contract describes the shape of the release archive manifest, and
catalogue verifynow rejects a booleanschemavalue.
[agentbundle][0.54.0] — 2026-10-21
Section titled “[agentbundle][0.54.0] — 2026-10-21”Highlights
Section titled “Highlights”- Every contract now loads from the copy bundled with
agentbundle, so acontracts/folder in or above a catalogue no longer overrides it, andcatalogue lintreports a missing pack schema as an error.
[agentbundle][0.53.1] — 2026-10-21
Section titled “[agentbundle][0.53.1] — 2026-10-21”Highlights
Section titled “Highlights”- A new blank catalogue from catalogue init now packages and verifies with no hand edits.
- Breaking: a
[catalogue.package].includeentry that names a_directory underpacks/, such aspacks/_example, now fails withCAT-PKG-001. Remove it. If that leavesincludeempty, packaging ships every non-_pack, so list the packs to ship instead.
Changed
Section titled “Changed”agentbundle catalogue initwrites a rootAGENTS.md, the markercatalogue packageships, and a rootCLAUDE.mdthat holds@AGENTS.md. A new catalogue packages and verifies as an empty but valid release. An existing rootAGENTS.mdorCLAUDE.mdis kept and reported as already present with its on-disk hash.- A bad
[catalogue.package].includeentry now failscatalogue packagewith aCAT-PKG-001diagnostic, not a Python traceback. - A catalogue made by an earlier release does not gain the root file when you re-run init, because
catalogue.tomlconflicts. Add a rootAGENTS.mdby hand.
[agentbundle][0.53.2] — 2026-10-21
Section titled “[agentbundle][0.53.2] — 2026-10-21”Highlights
Section titled “Highlights”installand.adapt-discovery.tomlerror messages state their rule directly instead of citing internal design records, and the legacy layout notices now saylegacy dist-tree.
[agentbundle][0.53.0] — 2026-10-20
Section titled “[agentbundle][0.53.0] — 2026-10-20”Highlights
Section titled “Highlights”- Catalogue publishers can compare a release with a prior archive, and a release version is never silently replaced.
Changed
Section titled “Changed”agentbundle catalogue package --compare <archive>lists every pack and profile added, removed or changed since a prior release, and flags a pack whose content changed under the same version.--format jsonwrites the same result as one JSON object on stdout.- Packaging now refuses to replace a release archive that already exists, for both the runtime and source flavours. The command exits 2 and changes nothing.
--forcereplaces the release on purpose. catalogue-manifest.jsonlists apathand adigestfor each pack and profile, andcatalogue verify --archivechecks them. The manifestschemastays2.- Breaking: the refusal exits 2, where it exited 1. The subcommand rejects shortened options such as
--forc. Eachprofilesentry is now an object, not a name string.
[core][3.1.14] — 2026-10-21
Section titled “[core][3.1.14] — 2026-10-21”Highlights
Section titled “Highlights”- The finding-adjudication commands
classify,raw-classify,inspect, andrecordnow live inreview-artifact.py. They print exactly what theloop-cohort.py reviewverbs print, and those verbs keep working. - Without cohort state,
review-artifact.py record --run-id <uuid>keeps onerecordfile per review round under.context/reviews/<run-id>/and counts the review budget from those files. Lifting the cap needs anownerauthority reference. - The reviewer roster, each role’s boundary and fallback, and the high-risk definition now also live in
review-rules.json. A check fails if they drift from the work-loop skill text. - The supervisor, still dark-launched, now picks reviewers from that rules file and a recorded selection. It closes review only when structured review readiness says so, and it records repair,
fixed-by, andaccept-riskdecisions. - Policy families can now be selected by supervisor stage, or by the new
PRE-APPROVALconstant. Each key selects what its engine states select today.
[core][3.1.15] — 2026-10-21
Section titled “[core][3.1.15] — 2026-10-21”Highlights
Section titled “Highlights”- The offline intent view can now show what is ready to work on: pipe the workspace-status status output into the export with —readiness - and the view lists active, ready and blocked items, marks the one work-loop would pick, and shows each blocked item’s findings in What is broken. If the check fails, the page says why and the export still succeeds.
[core][3.1.13] — 2026-10-21
Section titled “[core][3.1.13] — 2026-10-21”Highlights
Section titled “Highlights”- The work-loop traceability check now reads an intent’s
Kind:,Level:andSlug:only from its header block above the first##heading, and ignores commented-out lines. It places each intent on the outcome, opportunity and capability ladder exactly as the intent navigator shows it. - A retired (tombstoned) intent no longer appears as a node on the ladder.
- An intent whose
Kind:sits only in its body, in a comment, or under a lowercasekind:label no longer counts as a ladder rung. Move theKind:line into the header block to keep it on the ladder.
[core][3.1.12] — 2026-10-20
Section titled “[core][3.1.12] — 2026-10-20”Highlights
Section titled “Highlights”- A spec’s
Discovery:line, which names the intent or research the spec came from, can now name its intent asoutcome:<slug>,opportunity:<slug>,capability:<slug>, orintent:<slug>. Close-out still finds the same parent intent. - A spec you add or change is refused before the work loop completes the change when its
Discovery:points at an intent by file path or link, or names no existing intent of that kind. Research and notes paths stay plain paths and are not checked. - Older specs you do not touch keep working with their legacy paths.
[product-engineering][2.0.2] — 2026-10-20
Section titled “[product-engineering][2.0.2] — 2026-10-20”Highlights
Section titled “Highlights”- The longer shaping route now continues from the capability map into intent decompose, and align-value-stream proposes a hard-limits README section.
Changed
Section titled “Changed”- The longer shaping route continues from
capability-map.mdintointent decompose. Each Build capability becomes a capability-level child intent. align-value-streamproposes a “Hard limits” section for the solution repo’s README and writes it only after you confirm. Whenarchitect-designis installed, it also offers to write the solution repo’s shared system reference.- Shaping skills now agree on who writes a brief:
lean-canvaswrites the one-page initiative brief andauthor-delivery-briefowns the delivery brief.
[converters][0.9.9] — 2026-10-20
Section titled “[converters][0.9.9] — 2026-10-20”Highlights
Section titled “Highlights”- The render-proof skill’s locked markdown-it moves to 14.3.3, which fixes two high-severity quadratic-time rendering advisories.
[architect][0.15.19] — 2026-10-20
Section titled “[architect][0.15.19] — 2026-10-20”Highlights
Section titled “Highlights”- Architect-design can write a solution repo’s shared system reference and offers a physical architecture with a bill of materials after a design.
Changed
Section titled “Changed”architect-designhas a solution reference mode for a coordinating repo with no app code. It draws the whole-system diagrams and the boundaries between domains, and writes the shared rules each component repo follows.- It writes that reference one confirmed section at a time. A repo with app code still uses Core’s
adapt-to-projectorinit-project. - After a design is accepted,
architect-designoffers a physical architecture and a bill of materials, which is a list of every item the design needs and what it costs. Each line names the exact item, such as a cloud service plan or a container image. - Each price is cited, or marked unpriced and left out of the total.
- For a change to an existing system, it lists what the change adds, removes, or resizes, with the monthly cost difference.
[product-engineering][2.0.1] — 2026-10-20
Section titled “[product-engineering][2.0.1] — 2026-10-20”Highlights
Section titled “Highlights”- When the architect pack is installed, intent de-risk and intent decompose now offer architect-design before the work is cut, and you can decline once; teams without it see no change.
[core][3.1.11] — 2026-10-20
Section titled “[core][3.1.11] — 2026-10-20”Highlights
Section titled “Highlights”- Authors and agents get a check that catches untyped or broken
Parent intent:andBrief:pointers in the artifacts a change adds or modifies, so a bad link to an intent or brief is fixed before it merges. - Artifacts a change leaves untouched are never checked, so older documents with legacy pointers do not block new work.
- Skills now write typed pointers by default, so new specs and briefs start out well formed.
- The work-loop finish step and the repository gate both run the check, and an incomplete check counts as a failure, not a pass.
[core][3.1.10] — 2026-10-19
Section titled “[core][3.1.10] — 2026-10-19”Highlights
Section titled “Highlights”- Picking an item in the offline intent view now shows a ready-to-paste prompt that starts the named skill on that file, copied with one click or selected for you to copy by hand.
Changed
Section titled “Changed”- The detail panel’s “Next step” in the
navigate-intentsoffline view gains a prompt block and a “Copy prompt” button for the seven next steps that start a skill. The prompt is one fixed sentence plus the item’s file path, nothing else from the record. When the browser refuses the clipboard, the prompt is selected so you can copy it by hand. When a path is too long or uses characters a prompt cannot carry safely, the panel says so in plain words and shows no prompt.
[code-intelligence][0.1.10] — 2026-10-19
Section titled “[code-intelligence][0.1.10] — 2026-10-19”Highlights
Section titled “Highlights”- Runs on Wicked Estate 0.30.0 — re-run the install command to upgrade. The documented capabilities are unchanged; this release tracks the new upstream release and raises the floor and pin to 0.30 / 0.30.0.
Changed
Section titled “Changed”- Floor and pin move to 0.30 / 0.30.0 for
wicked-estateandwicked-estate-mcp. Install withcargo install wicked-estate --version 0.30.0 --locked; a binary older than 0.30 now reports exit 4. - The capability map, evidence, and gaps references were re-verified against the 0.30.0 CLI and
wicked-estate-mcpsources. Upstream 0.30.0 changes only the memory-plane semantics this pack does not document, so every behavioural claim — paging, the lineage default depth of 24, the blast-radius depth ceiling, the MCP tool inventory, and the read-only empty-store note — carries over unchanged.
[core][3.1.8] — 2026-10-17
Section titled “[core][3.1.8] — 2026-10-17”Highlights
Section titled “Highlights”- The offline intent view now answers “How far along is each capability?”: every capability under its product strategy, with how much of the work beneath it is delivered, being built or not yet started, and a Browse tree you can narrow to open or done work and regroup by capability.
Changed
Section titled “Changed”navigate-intents: the exported view’s questions are grouped by job — Work, Progress, Tidy and Browse — and gain “How far along is each capability?”, which shows delivery-stage counts and a progress bar over all work beneath each capability, grouped under its product strategy, and never a health judgement.navigate-intents: “Browse all intents” gains Show (all, open, done, keeping parents as marked context rows), Group (full hierarchy or by capability), Expand all and Collapse all.navigate-intents: the rail links show short labels — “Next up”, “Broken”, “Capability progress”, “Open by capability”, “No parent” and “All intents”. Each list shows its full question (“What can I work on next?”, “What is broken?”, “How far along is each capability?”, “What is still open under a capability?”, “What has no parent?”, “Browse all intents”) in a line above its title, and each rail link carries that question as its accessible description.navigate-intents: “All intents” names its sort key — “Under each parent, by name”, “Under each capability, by name”, or “By name” while a filter is set — and its lead follows the filter and Show choice.
navigate-intents: when capabilities name each other as parent, directly or through other intents, “Capability progress” and Browse’s “By capability” now list each of them once instead of dropping them.
[core][3.1.7] — 2026-10-17
Section titled “[core][3.1.7] — 2026-10-17”Highlights
Section titled “Highlights”- The offline intent view has a calmer, more polished look: soft panels, tinted state labels that still read as a word and a shape, a clearer detail card, and short fades that stop when your system asks for reduced motion.
Changed
Section titled “Changed”navigate-intents: the exported intent view’s script is authored as named source parts that the export joins into its one hashed script, with no library or build step; the page keeps the same content security policy.navigate-intents: the view’s shared style uses soft zones, tinted state pills, a labelled detail card with called-out broken entries, and colour and fade motion of at most 200ms that runs only underprefers-reduced-motion: no-preference.
[architect][0.15.18] — 2026-10-15
Section titled “[architect][0.15.18] — 2026-10-15”Highlights
Section titled “Highlights”- Architect-diagram can export a saved Mermaid diagram to an editable draw.io file on request.
Changed
Section titled “Changed”architect-diagramcan now turn a saved Mermaid diagram into an editable draw.io file when you ask for one. It uses the draw.io desktop command-line tool.- If that tool is missing, the skill offers one package-manager install command and runs it only after you say yes. If you decline, it writes the draw.io file itself.
- Mermaid is still the default output and stays the source of the diagram.
[core][3.1.6] — 2026-10-15
Section titled “[core][3.1.6] — 2026-10-15”Highlights
Section titled “Highlights”- Pack page rewritten to the catalogue’s pack-page template.
Changed
Section titled “Changed”- The core pack page follows the catalogue pack-page template: install, what your agent can do, skills, works with, questions, and details. The repository grounding, repository exploration, and post-install sections keep their wording.
[catalogue-curation][0.4.7] — 2026-10-14
Section titled “[catalogue-curation][0.4.7] — 2026-10-14”Highlights
Section titled “Highlights”- The propose-catalogue-pack shell check now names
agentbundle catalogue verifyinstead of a removed lint script.
[experience-design][4.2.0] — 2026-10-14
Section titled “[experience-design][4.2.0] — 2026-10-14”Highlights
Section titled “Highlights”- Experience Design now writes the words your screens show:
ux-writingdrafts error, empty-state, button, and label copy keyed to each screen and state.
-
ux-writing, from product-engineering 2.0.0. It characterizes your product’s UI voice, then writes error, empty-state, button, and label copy. With auser-flowstate matrix it writes one string per screen and state, in the voice of thecontent-designbrand register. Its name, description, and voice-chart path (docs/product/voice/<slug>.md) are unchanged. -
If you also have product-engineering, use the scope you installed at (
userorrepo) in every command.agentbundle upgradeandagentbundle uninstallask you to confirm; add--yeswhen no one is at the terminal. If you use more than one adapter, run each command once per adapter and add--adapter <name>to it, including eachinstall.If you have both packs:
-
Upgrade both packs, in either order:
agentbundle upgrade --pack product-engineering --scope <user|repo>agentbundle upgrade --pack experience-design --scope <user|repo>If you upgrade experience-design first, the product-engineering upgrade prints “1 installed file(s) have local edits”. That is expected: you did not edit anything, no
.upstreamfile is written, and the next step clears it. -
Reinstall product-engineering:
agentbundle uninstall --pack product-engineering --scope <user|repo>agentbundle install --pack product-engineering --scope <user|repo>
If you have product-engineering and are installing experience-design for the first time:
- Upgrade product-engineering:
agentbundle upgrade --pack product-engineering --scope <user|repo>. - Reinstall product-engineering with the two commands above.
- Then run
agentbundle install --pack experience-design --scope <user|repo>. Before step 2, this install is refused because product-engineering still claims theux-writingfiles.
-
[core][3.1.5] — 2026-10-14
Section titled “[core][3.1.5] — 2026-10-14”Highlights
Section titled “Highlights”- See what an intent waits for and what waits for it, in the query, its text output and the offline view.
- Pick an intent in the offline view and its Dependencies part lists “A waits for B” lines, with Show and Steps controls; dependency problems also appear in “What is broken?”.
Changed
Section titled “Changed”navigate-intentsgains adependenciesquery operation (--id,--direction prerequisites|dependents|both,--depth,--format text) over intents’Depends on:headers. It accepts typed references and legacy repository paths, lists values it cannot resolve as diagnostics, reads no workspace dependencies and decides no readiness.- The offline view’s data carries a
dependenciesmember, and a--fromexport also carries the dependency records of intents linked to its subtree and names those outside it by id.
[core][3.1.9] — 2026-10-14
Section titled “[core][3.1.9] — 2026-10-14”Highlights
Section titled “Highlights”- Plans can now declare the external effects a task performs, and stub fences carry the command and exit codes that prove a test fails first.
Changed
Section titled “Changed”- The
new-specplan template documents an optional**Effects:**line: a task names the external effects it performs, unique across the plan, and a header-level line names effects that run once when the whole plan is done. - The work-loop TDD stub reference documents the
stubfence:path, theruncommand with{path}expansion, andred-exitcodes, so a stub’s red can be observed mechanically. - Core ships a dark execution supervisor in the work-loop skill’s scripts. Nothing in the skill calls it yet, and the existing loop engine is unchanged.
- On Windows, a safe-process launch runs in a Job Object that denies breakaway and ends the whole tree on timeout.
[atlassian][0.10.2] — 2026-10-14
Section titled “[atlassian][0.10.2] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[product-engineering][2.0.0] — 2026-10-14
Section titled “[product-engineering][2.0.0] — 2026-10-14”Highlights
Section titled “Highlights”ux-writingnow ships in the experience-design pack, beside the screen flows and brand register it writes from. After upgrading, reinstall product-engineering once so it lets go of the old copy; the product-engineering 2.0.0 release note has the steps.
Removed
Section titled “Removed”-
ux-writingleaves this pack and ships inexperience-design4.2.0. Its name, description, and behavior are unchanged, and it still writes voice charts todocs/product/voice/<slug>.md. A prompt or script that names product-engineering to getux-writingneeds experience-design instead. -
Every product-engineering adopter runs one extra step.
agentbundle upgradeleaves the oldux-writingfolder in place, still claimed by this pack. Use the scope you installed at (userorrepo) in every command. Files you edited by hand are kept.agentbundle upgradeandagentbundle uninstallask you to confirm; add--yeswhen no one is at the terminal. If you use more than one adapter, run each command once per adapter and add--adapter <name>to it, including eachinstall.If you have both packs:
-
Upgrade both packs, in either order:
agentbundle upgrade --pack product-engineering --scope <user|repo>agentbundle upgrade --pack experience-design --scope <user|repo>If you upgrade experience-design first, the product-engineering upgrade prints “1 installed file(s) have local edits”. That is expected: you did not edit anything, no
.upstreamfile is written, and the next step clears it. -
Reinstall product-engineering:
agentbundle uninstall --pack product-engineering --scope <user|repo>agentbundle install --pack product-engineering --scope <user|repo>
If you have only product-engineering:
- Upgrade it:
agentbundle upgrade --pack product-engineering --scope <user|repo>. - Reinstall it with the two commands in step 2 above.
- To keep
ux-writing, install experience-design:agentbundle install --pack experience-design --scope <user|repo>. Do this only after step 2; before it, the install is refused because product-engineering still claims the files.
-
[product-engineering][1.0.3] — 2026-10-14
Section titled “[product-engineering][1.0.3] — 2026-10-14”Highlights
Section titled “Highlights”- Requirements ingest now says when it applies: a multi-slice or cross-repository document goes to author-delivery-brief create, a single-feature one to new-spec; shipped skills state the content-not-runtime rule directly instead of citing internal records.
Changed
Section titled “Changed”- Requirements ingest in
discovery-loop, its requirements crosswalk, and the run-a-discovery guide now routes a multi-slice or cross-repository BRD, PRD, or SRS toauthor-delivery-brief createand a single-feature document tonew-spec. The discovery-loop evals gain a single-feature case. discovery-loop,discovery-lead,explore-options,plan-validation,frame-domain,intent,align-value-stream, and two discovery guides now state the content-not-runtime rule and the three-reviewer ceiling directly instead of citing internal governance records. Meaning is unchanged.
[product-engineering][1.0.5] — 2026-10-14
Section titled “[product-engineering][1.0.5] — 2026-10-14”Highlights
Section titled “Highlights”- Every product-engineering skill now ships activation evals, so you can check that each shaping step fires on the right requests and stays quiet on its neighbours’.
- Activation eval queries for
frame-situation,identify-opportunities,diverge-solutions,place-bet,map-capabilities, andlean-canvas: eight should-trigger and eight near-miss queries each, with the near-misses owned by each skill’s nearest neighbour. Every skill in the pack now ships Tier-A activation evals.
[desk-research][1.1.10] — 2026-10-14
Section titled “[desk-research][1.1.10] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[figma][0.3.4] — 2026-10-14
Section titled “[figma][0.3.4] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[core][3.1.4] — 2026-10-14
Section titled “[core][3.1.4] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[product-engineering][1.0.4] — 2026-10-14
Section titled “[product-engineering][1.0.4] — 2026-10-14”Highlights
Section titled “Highlights”- The nine longer-route shaping skills now open with what they produce, in the words people use, and take 45% less room in the skill listing every session loads.
Changed
Section titled “Changed”frame-situation,identify-opportunities,diverge-solutions,explore-options,plan-validation,place-bet,map-capabilities,frame-domain, andlean-canvashave shorter descriptions: 2,801 characters together, down from 5,059. None opens with its step number any more; each still points to the neighbours it is most often confused with. Names and behavior are unchanged.
[converters][0.9.8] — 2026-10-14
Section titled “[converters][0.9.8] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[experience-design][4.1.6] — 2026-10-14
Section titled “[experience-design][4.1.6] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[contracts][0.3.8] — 2026-10-14
Section titled “[contracts][0.3.8] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[architect][0.15.17] — 2026-10-14
Section titled “[architect][0.15.17] — 2026-10-14”Highlights
Section titled “Highlights”- The pack’s activation-eval comment now names the live
agentbundle pack evals runcommand instead of a removed script.
[core][3.1.2] — 2026-10-13
Section titled “[core][3.1.2] — 2026-10-13”Highlights
Section titled “Highlights”- The offline intent view opens on four session-start questions: what to work on next, what is open under a capability, what has no parent, and what is broken.
- Each item shows its name first, its state as a word plus a shape, and a plain next step that names the skill to use and why.
Changed
Section titled “Changed”navigate-intentsexport: the page opens on four questions (what can I work on next, what is still open under a capability, what has no parent, what is broken), with Browse all intents, a header search over intents, briefs, and specs, a Key that opens on demand, and a detail panel with a Next step, what is open beneath, what is broken, and where the item sits. The page says readiness is not checked in the snapshot.- The layout adapts at narrow and wide widths and follows the system light or dark theme.
- A new eval case covers asking for the offline view to pick what to work on this session.
[core][3.1.3] — 2026-10-13
Section titled “[core][3.1.3] — 2026-10-13”Highlights
Section titled “Highlights”- Review failures recorded by a shadow-enabled run now surface as read-only knowledge candidates through a pull scan, and one invalid merged knowledge record is quarantined on enquiry and the distillation pending page instead of breaking every read.
[product-engineering][1.0.2] — 2026-10-13
Section titled “[product-engineering][1.0.2] — 2026-10-13”Highlights
Section titled “Highlights”- Discovery guidance now hands off through work-intake at G3 and ingests an outside requirements document as a new brief.
Changed
Section titled “Changed”discovery-loop, thediscovery-leadagent, and the product-engineering discovery guides now say the loop hands off throughwork-intakeat G3;work-loopstays its downstream peer.- Requirements ingest names
author-delivery-brief create: an outside BRD, PRD, or SRS becomes a new Draft brief, sincecontinueonly reviews an existing repository brief. frame-domainno longer callsdiscovery-loopunbuilt.
[core][3.1.1] — 2026-10-13
Section titled “[core][3.1.1] — 2026-10-13”Highlights
Section titled “Highlights”- Open briefs and specs are now named by their title in
navigate-intentsquery results and in the offline export, so you can tell them apart without opening each file.
Changed
Section titled “Changed”- Brief and spec nodes carry a
heading: the title line above the first##heading, kept as written, or empty when there is none.outstandingitems carry their node’s heading.searchmatches an intent’s title only when it sits above the intent’s first##heading.