Repository navigation
Releases: crenshawdev/cadence
Release list
v3.9.0
Four test switches, all off by default, hold a plan's tests to evidence that
each one can fail. The Cadence module and both Codex paths are gone.
Added
-
Four test switches, all off by default.
workflow.test_attack,
workflow.test_evidence,workflow.check_inspectionand
workflow.independent_rerun, set with/cad-configorconfig.mjs set.
Any one of them has the planner write an evidence map, one check per
acceptance criterion, and a table per task naming what each test supplies,
asserts and catches, and plan review raises any criterion no check covers.
With all four off, plan, execute and verify run as they did in 3.8.6.test_attack: plan review names, for each listed check and test, a wrong
implementation that would still pass it.test_evidence: the executor records each check's red run and a negative
control for each test, and a report missing one is not complete.
/cad-executeonly, never/cad-task.check_inspection: once a plan completes, you are asked to confirm its
checks and tests, and SUMMARY.md carries the answers.independent_rerun:/cad-verifyruns each check's command itself
instead of trusting the executor's report, and fails a check that could
not have failed.
/cad-executereads the plans throughplanning.mjs test-checksbefore any
executor runs and stops on a test section it cannot parse, so a malformed
plan is caught before the work is paid for. -
Review effort goes to
xhigh.review.triggers.<trigger>.efforttakes
xhigh. OpenAI gets it as written. Gemini'sthinkingLeveland DeepSeek's
reasoning_effortstop at high, so those adapters sendhigh. -
The README and
/cad-helpsay where to ask and where to report. Questions
go to #cadence on the jcrenshaw.dev Discord, https://discord.gg/fedQDmhRrx,
and bug reports go to GitHub issues.
Fixed
- git-guard checks the repository a commit lands in.
git -C <dir> commit
was judged by the session directory's branch, so a commit into a scratch repo
under/tmpasked as if it were a commit on the project'smain. A literal
-Cpath is now followed, and the commit is policed in that repository, or
not at all when it is not a Cadence project. A-Cthe guard cannot read
before the shell expands it, such as"$S", keeps the old reading of the
session directory and the prompt says which-Cit could not follow, so
nothing that asked before goes quiet.
Removed
- The Cadence module is gone, and
/cad-panelwith it. Anthropic's plugin
directory blocks a mod that keeps a copy of its engine and also calls
config.set, and the module did both, so the listing could not go live
with it.hooks/hooks.jsonnames no module, thepanelsetting is out of
plugin.json, and the libraries only the module loaded are deleted. That
takes away the band and the pane, the cache meter, the step-window token
figures, the listing filter, and the prefix safety net. The 30 rung agents
and the six contract skills are back in the model's listings, and
route.mjsalready hands every dispatch thecadence:name, so nothing
dispatches a bare stem. Atrace.jsonlwritten before this still renders
the step-window figures it holds. git-guard, read-trace and subagent-trace
are plain command hooks and stay as they were. Self-verify drops check 26,
the one-line listing rule, which only the filter needed, and the old check
27 is now 26. - Codex is out of Cadence. A 3.9.0 development build could hand each plan
task tocodex execunder aroles.cad-executor.codex.*switch, and send
an OpenAI review throughcodex execunder
review.providers.openai.transport. Neither reached a tagged release. Every
plan task is written by the Claude executor, and every cross-model review is
an API call. A config that still holds one of those keys gets a warning
naming theconfig.mjs unsetthat drops it, and nothing reads the value. design-notes/is out of the repository. The thirteen dated working
notes took 14 of the plugin directory's 512 files and folders, and the repo
sat at exactly 512, so nothing new could be added. Git history keeps them:
git show v3.8.6:design-notes/<name>prints any of them. The schema and the
config catalog now cite the plan-task-ceiling arithmetic that way. Nothing
Cadence runs read them.
v3.8.6
A switch for the band and token capture, off by default.
Changed
- The band and token capture are off by default. On a mods host the band
above the prompt, its[ pane ]button and the token-count facts the module
writes for/cad-reportrun only with the plugin'spanelsetting on, so
upgrading turns them off./cad-panel onor the "Cadence band and token
capture" row in/configturns them back on. With it off, whatever another
mod draws above the prompt shows as it was,/cad-reporttakes its figures
from the returns and thesubagent-tracehook alone, and a subagent's own
trace closegoes through as written. The pane, the listing filter, the
agent-name prefix and the cache meter run either way.
Added
/cad-panel onand/cad-panel off. They write thepanelsetting the
way its/configrow does, and Claude Code reloads the module with the new
value.offcloses the pane first./cad-panelalone still opens the pane,
band on or off.
v3.8.5
The pane's cache figure on a loop's first request.
Fixed
- A loop's first request shows what it wrote, not a hit rate. A first
request has to write whatever of its prefix the cache does not hold yet, so
the pane opened every session near 60% and every agent's row lower, a figure
that said nothing about whether the cache was holding. Until a loop has sent
a second request, the CACHE section readsmain first request, 16.6k written
and an agent's row readscache first request, 9.0k written, and the main
loop's(last ...)rate waits for the second request too. The meter, its
rate and its breaks are unchanged. It says first and not cold because after a
module reload the first request the meter sees may already be cached.
v3.8.4
The prompt cache, on the band and in the pane.
Added
- The band and the pane show the prompt cache. On a mods host the module
reads the token usage the host reports for every request, the main loop's and
each agent's, and keeps a hit rate per loop: the share of what it sent that
the cache served. A cache break is a request that read back less than the same
loop's previous request cached, on the same model with no compaction,/clear
or rewind in between, and a cache that expired between requests counts. The
band counts the session's breaks after the status once there is one. The pane
gets a CACHE section after SPEND with the main loop's rate, its last request's
rate, its breaks and the tokens the last one lost, and the breaks in agents,
and each running agent's row ends in its own rate and breaks. The figures are
this session's, held in memory and gone on a module reload, and none of them
reach the trace yet (GH-309).
v3.8.3
The band and the pane, and the README section that shows them.
Fixed
- A phase being executed no longer reads
planned. Nothing sets an
executingstatus, so through a whole/cad-executerun the band and the
pane's status chip saidplanned, beside a runningcad-executorand a plans
bar already partway done. Both now drawexecutingwhile the phase is
plannedand acad-executoris running. It is display only: the cursor and
the derived status keep their values. An executor that/cad-task --plan
dispatches on aplannedphase shows the same way, because the running list
cannot tell the two apart.
Changed
- The README shows the pane. The section is now The pane, with a
screenshot of it mid-execute, and it says thatnputs the next command in
the prompt. Its paragraph on what the module does besides drawing moved into
The module's list.
v3.8.2
Test fixtures only. Nothing a user runs changed.
Changed
- No test source carries a token-shaped literal. The directory's scan of
v3.8.0 heldreview-provider.test.mjsfor what read as a credential. The
lastsk-prefixed value and the threeBearertokens the redaction tests
plant are now assembled when the test runs, so the bytes under test are the
same and no file ships them whole. Theread-tracetest's leftover check for
ansk-livetoken, which could no longer fail after v3.8.1 renamed the
planted value, now checks the value that is planted.
v3.8.1
Fixes for what v3.8.0's reviews and UAT left open (GH-301, GH-302, GH-303), and
the changes the Claude plugin directory's pre-submission checks asked for. Two of
those change behavior on upgrade, both in the same direction: a repository's
committed config can no longer turn on something that acts with your
credentials. Read Changed before you upgrade if you use git.auto_close or a
cross-model reviewer.
Changed
git.auto_closeneeds both layers. An unattended close now runs only when
the repository's.planning/config.jsonAND your user-global
~/.claude/cadence/config.jsonboth set it true. A cloned repo can no longer
authorize an unattended push and merge on its own. If you relied on the repo
setting alone, runconfig.mjs set --global git.auto_close=trueonce. The
refusal names the missing half, and says so when both paths are the same file.- Cross-model reviewers need your user-global config to name them. A
provider inreview.reviewers(openai,gemini,deepseek) runs only when
your user-globalreview.reviewersnames it too, so a repo's config cannot
send your code to a provider with your key. An enrollment written before this
release sits in the repo layer only and goes inert until the provider is also
named globally./cad-config --reviewnow asks before writing that global
half, and its wrap-up flags a repo-only enrollment. - Context7 is optional in
/cad-decision-review. It grounds library and API
claims against Context7 when its tools are available, and otherwise against
the installed source, lockfile or vendored docs, naming any claim it could not
check. - Generated lint and typecheck commands no longer go through
npx. A tool
innode_modules/.binis named by that path, one only onPATHby its bare
name, and anything else leaves the slot empty, so no detected command can
fetch a package. - The CHANGELOG is split. Releases 1.0.0 through 2.7.0 moved to
CHANGELOG-v1-v2.md, which keeps every file under the directory's 256 KiB
limit. Release tooling is unchanged.
Added
agent_typeon everyroute.mjs resolve. The resolved agent with the
plugin's own prefix fromplugin.json(cadence:cad-reviewer-xhigh), which
Cadence's dispatches now name directly.route.mjs agent-type --stem <name>
answers the same for the reviews that dispatch without routing.resolvealso
returnsreviewers_global, the providers your user-global config names.- Self-verify check 27. Fails on any tracked file over 256 KiB that is not an
image or font, and on more than 512 tracked files and folders: the plugin
directory's two file limits, held in CI. - "What Cadence sends, writes and reads" in the README. Every external host
and what goes to it, the provider key read, every forge write, the optional
MCP tools, what the mods module does, the transcript and read logging, every
write outside the project, why the skills keepBashpre-approved, and a
privacy note. - Contract skill descriptions name the agents that preload them, and say they
are not for direct use.
Fixed
- A user's own agent keeps its name (GH-303). On a mods host the module no
longer rewrites a barecad-*call to Cadence's agent when a project or user
agent owns that exact name. It still prefixes a bare rung stem nobody else
owns, as a safety net. renumberleaves shipped history alone (GH-301, GH-303).renumber remove
shifts or blanks only Pending Traceability rows, leaves Complete and Deferred
rows and## Shippedbyte-identical, names any Complete row citing a removed
or moved phase inwarn, and lists every changed line inreq_row_changes.
Bothinsertandremovere-point the phase number in the cursor'sNext:.risk-carryrefuses by name (GH-302). An unsearchable or unwritable
.planning/risk-carry/, an unreadable source ruling and an unreadable carried
copy each get their own reason, the path and a hint, neverinternaland never
carry-existsfor a copy it could not read. Every source is read before any
directory is made.- Check 26 reads descriptions the way YAML does (GH-303).
\x0a,\u000aand
\U0000000ain a double-quoted description now fail as a line break, and a
one-line description followed by a comment line passes. - Held step windows are bounded (GH-303). The mod holds at most 64 stopped
subagent windows waiting for a close and evicts the oldest, so stops no close
ever names cannot pile up for the life of a session. - No test fixture looks like a real credential. Every key-shaped test value
was replaced with one that matches no real key pattern.
v3.8.0
Cadence can now show you where the loop stands without a command. On a Claude
Code version with mods support it loads a small module that draws a band above
the prompt and a pane on demand, and keeps its own agent listing out of every
session's prompt. On an older version the module never loads and nothing else
changes.
Added
- The band. One line above the prompt in any repo with
.planning/: the
phase, its status, any Cadence agent running right now with its rung, and the
next command. It redraws when an agent starts or returns and after every tool
call, and it composes with other mods that pass their neighbour's drawing
through. /cad-panel, andpon the band. A pane with the current phase's plans
and which are done, each running agent with the role, rung and model it was
routed, the UAT counts with bars, the open captures, the phase's token spend
as/cad-reporttotals it, and the next command. Cursor drift is named, not
hidden.- Host-priced token figures. A subagent dispatch whose return carried no
token count is priced from the host's own usage for that agent, filed under
the phase of the close that names it, and a return's own figure always wins. - A
plugin-validateCI job.claude plugin validate --strictruns on both
manifests and fails if the validator stops reporting the module. - Self-verify checks. Check 25 resolves every
modulesentry the way the
host does, and check 26 keeps every Cadence agent and contract-skill
description on one line, so the listing filter can always find the entry's
end.
Changed
- Cadence's agent listing leaves the prompt on hosts with mods. The 30 rung
agents' entries and the six contract skills' entries are filtered out of the
listings the model reads, in every session and every repo, about 8,000
characters. The agents still dispatch: the module restores the plugin prefix
on the bare nameroute.mjsreturns. - The
.planning/walk is defined once and the three command hooks share
it. git-guard otherwise behaves exactly as before; it stays a command hook.
Fixed
/cad-phase insertrewrote shipped history. It now shifts phase
references only on Pending## Traceabilityrows, leaves Complete and
Deferred rows byte-identical, lists every REQUIREMENTS line it will change at
the confirmation gate, and names a Complete row left citing a moved phase.- Risk carry crashed on an unreadable phase directory. A non-searchable
phases/, or a phase directory that is readable but not searchable, now
refuses asunlistable-phasewith a hint to make the path readable and
searchable, instead ofinternalwith a rawEACCES. - Stale docs. Every claim the docs-verify pass found stale in the README,
the docs, INTERNALS, METHOD, MANIFESTO, LINEAGE, DESIGN and the figures now
says what the code does.
v3.7.13
The planning records are out of the repository. Nothing a user installs ever
read them, and the only things that did were tests.
Removed
.planning/from the repository. The 269 tracked planning files are gone
and/.planning/is ignored, so a working planning directory stays local.
Changed
- Tests that read those records now build their own. The
/cad-whytier
and join tests make their close in a temp repository, the record parsers take
verbatim excerpts inline, and the PHS-02 status check runs against a roadmap
in its own directory. Thirteen tests that checked only this repository's
records, or repeated a case a built fixture already covers, are deleted.
v3.7.12
One word used to decide what all six roles ran at. It is gone, and thirteen
questions that say what each role costs are what a project meets instead.
Removed
-
stakes, and every table keyed on it. The single level that set six roles'
models and rungs at once is deleted, along with the 18-cell routing grid, the
review/verify/tiers/effortsgrids beside it, and
cadence-core/route-table.jsonitself. Breaking, and there is no alias. A
config still carrying the key meets the migration below on its next command; a
config that skips the migration gets the retirement message naming its
replacement rather than anunknown keyrefusal. -
model_aliases, and the enum on the sixmodel.overrides.*keys. A model
is now a string the user typed. Nothing in this repository holds a list of
model names to check it against, because nothing in this repository could keep
such a list current: naming a new model used to be seven edits, and the model
was unroutable until every one of them landed. -
route.mjs replay. No workflow or skill invoked it, and it orphaned no
shared helper on the way out.
Added
-
/cad-config --rolesasks thirteen questions in four prompts. Six name a
role and ask which model it runs on, six ask which effort rung it starts at,
and the last asks what a detected risk surface may do. Every question states
what that role does in the phase loop and what a stronger or weaker answer buys
there, so the interview is the documentation rather than a pointer at one.
/cad-new-projectand/cad-adoptrun it in full against the user-global
layer on a first run;/cad-config --rolesre-asks it for one project into the
repo layer, and--roles --globalre-opens the machine-wide answers. -
A migration for a config that still carries
stakes. The level is expanded
into twelve explicit per-role values, shown with what each one will become,
confirmed, written in one validated call, and then the key is taken off disk. A
config with nostakeskey never sees it. -
config.mjs unset <key>... [--global]. The write face had no way to REMOVE
a key, andvalidaterefuses a file carrying an unknown one, so retiring
stakesalone could not make "the key is gone from the file afterwards" true.
unseton a key the file does not hold returnsok:trueand changes no bytes. -
Catalog rows for the twelve
roles.*keys, so/cad-config's plain walk
reaches them like any other key. The exclusion that kept per-role model and
effort keys out of the catalog existed because the routing cells decided them,
and the cells are gone. -
Every role offers every rung. Eleven new agent files take
agents/from 19
to 30, six per rung, which is what lets the interview ask one uniform question
per role instead of six different ones.
Changed
-
A role's model and rung are its own two keys.
roles.<role>.modeland
roles.<role>.effort, with nothing deriving one role's answer from another's.
An unset model key sends NO model parameter, so that dispatch runs at the
session's own model - which is not the same as naming a default. A name this
host does not accept resolves anyway: it is reported inwarnings[]and the
parameter is dropped, so a typo can never redirect spend. -
The review gates and the reviewer tiers take real schema defaults instead
of anullsentinel meaning "the level decides":planadvisory,diffoff,
phase_diffoff,risk_surfaceblocking, andcheapfor all four reviewer
tiers. The start rungs default tohighfor the planner, the assumptions
analyzer, the executor and the verifier,mediumfor the reviewer, andlow
for the plan checker. -
The plan-time risk floor moves two things and nothing else. A phase whose
declaredfiles:touch an answered surface gets a blockingplanreview and
the deep-verify pass turned on, and every role's model and every role's rung
stay exactly where the user set them.
review.triggers.risk_surface.waive_routing_floorkeeps its name with its
meaning re-pointed at those two effects, and it still cannot reach the
risk_surfacereview itself. The deep pass has no config key of its own: it is
onwhen the floor raised andoffotherwise, with--deepthe manual
switch. -
Escalation climbs exactly one rung.
model.escalate_on_failurere-dispatches
a failed attempt one rung above where it started and holds at the top rung,
rather than jumping to a retry rung some cell named. -
The run record says what decided a dispatch.
model_source- a dotted
config key, orsessionwhen no key set one - replacesstakeson the
routing.resolvetrace event and on the spawn envelope, which is what keeps
the record able to answer why a dispatch cost what it did.