-
v1.5.0 Stable
released this
2026-07-28 20:21:47 +00:00 | 0 commits to main since this releaseFour corrections to things Cadence said about itself, and one structural
change so there are fewer places left to say them.Added
- Self-verify asserts every preloaded agent contract resolves. A
skills:
entry naming a skill that does not exist is skipped by the host silently,
with only a debug-log warning, which leaves an agent running with no contract
at all - a failure that reads as an agent ignoring its instructions rather
than as a typo. The newagent-skillscheck fails loudly instead, and also
flags a resolved skill that setsdisable-model-invocation: true, which
cannot be preloaded and produces the same end state by a different route.
The tools lint now scans preloaded contracts as agent prose, so moving the
contracts out of the agent bodies did not silently empty its input.
Changed
- Each agent's contract is stored once, as a skill preloaded through the
skills:frontmatter field. The seven files inagents/are now
frontmatter plus a pointer, between 464 and 592 bytes each, down from as
much as 8786. Six contract skills hold the prose, one per role rather than
per file:cad-plan-checkerandcad-plan-checker-highshare one, which is
what that pair always claimed to be. They carryuser-invocable: false, so
they never appear in the slash-command menu. Behaviour is unchanged; five of
the six moved byte-identical. The exception is the plan-checker pair, whose
high variant carried real behaviour of its own - shipping behaviour in a file
whose only job is to name a rung is the failure this design exists to
prevent, so it moved into the shared contract as a<rung>section and both
files now state only which rung they are. cad-plan-checker-highno longer reads another agent file at runtime.
The@-include workaround is retired. The file itself stays, because it
exists to carryeffort: high- frozen in frontmatter, and named by string
inroute-table.json'sescalate_effort_variant- and retiring it needs a
rung ladder that does not exist yet.
Fixed
- The worktree fork point is selectable, and v1.4.0 said it was not.
seams.mdcalled it host-owned and NOT caller-controllable, and five other
surfaces restated that binding on the strength of it. The host's
worktree.baseRefsetting decides it:fresh(the default) forks from the
remote default branch,headforks from the local HEAD and carries the
integration branch's unpushed work - which is the documented use case for
isolating subagents on in-progress work. Thefreshdefault is the whole
cause of the phase-4 failure the false claim was written to explain. Every
surface now states the setting, the version it holds for (Claude Code= 2.1.208), and the nuance that inside a worktree
headis that
worktree's own HEAD. - /cad-execute no longer parallelizes into worktrees that lack its plans.
choose_pathruns a new read-only seam,cadence-core/bin/worktree-base.mjs,
which resolves the effectiveworktree.baseRefthrough the Claude Code
settings cascade; underfresh, unset, or an unreadable answer the phase
runs sequentially and names the fix./cad-configoffers to set"head"in
the project's or the user's settings file - offers, and never writes a
user's settings without being told to. The executor's<worktree_mode>
assertion stays either way: a setting the user can change back, and a
session CLI override no script can see, are not guarantees. - Per-trigger
effortno longer claims to apply where it cannot reach.
fire(trigger)resolved{gate, tier, effort}and consumedefforton the
cross-model arm only. Theclaude-subagentarm dispatches through a seam
whose surface is(agent_name, prompt, model?), so on a stock install the
configured value was read, resolved, and dropped with nothing said - every
trigger, every fire. Wiring it through is not available:effortis a
subagent definition field with no per-dispatch override on the Agent/Task
path, so varying it needs per-rung agent files. The key is scoped instead.
review-triggers.mdstates which fields reach which backend,
config.schema.jsonsays it at the point of setting, and a fire whose
configured effort differs fromcad-reviewer's frontmatter-pinnedhigh
now names the difference in one line rather than silently ignoring it.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Self-verify asserts every preloaded agent contract resolves. A
-
v1.4.1 Stable
released this
2026-07-28 18:04:37 +00:00 | 21 commits to main since this releaseTwo internally-inconsistent contracts, both closed by subtraction.
cad-executor's terminal success-criteria check is gone (#65). Its<process>block required the check; its<report>block had no field to put the answer in, andexecute.mdnever asked for it.goal_checkalready redoes that assessment one step later with the full phase diff in view and a stated purpose. Deleted rather than wired, because the consumer that would have justified it already exists. The per-task predict-then-verify at process step 2 is untouched.conventions.mdstates its real reach (#67). The file opened with "Shared rules every skill and workflow follows" while being@-included by exactly one skill and named in prose by 18 other files, so its rules reached a model only when something happened to read it. The header now says what is true: an on-demand reference, cited by path where a rule applies or@-included where a workflow needs the whole set, and nothing in it reaches an agent that has not read it. Including it everywhere was the rejected alternative, since it would spend resident context in every session on rules most invocations never need.Full changelog: https://github.com/crenshawdev/cadence/blob/main/CHANGELOG.md
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Cadence 1.4.0 Stable
released this
2026-07-28 16:47:20 +00:00 | 25 commits to main since this releaseCadence parsed four formats it owns with regexes that accreted a case at a
time, and every one of them failed silently in both directions. An over-read
invented a requirement id that came back later as an/cad-auditorphan. An
under-read dropped a real path and handed the parallel-safety gate a false
overlaps: [], so the gate dispatched two plans that both write
src/shared.rsonto the same file. Both of those look exactly like success
from the outside, which is the whole problem.I replaced those four readers with grammars I wrote down. Each one gets a
reference file stating what it accepts, a table of the shapes it deliberately
refuses and what it does with them instead, and a parser-level test per row.
An input outside the grammar now earns a named diagnostic instead of quietly
changing what the reader took.The plan-file frontmatter reader
One normalized classifying pass replaces the accreted arms. The greedy
\[(.*)\]is gone, sofiles: [a.md, b.md] # [see notes]reads two files
instead of swallowing the comment's bracket, andrequirements: # TODOabove
a block list reads the block instead of the comment. That second one was a
regression I shipped in v1.3.1.Everything outside the grammar now reports on the
auditandplan-overlap
envelopes asfrontmatter_issues. The shipped template's own former shape was
one of the broken ones: afiles: [] # commentkey line with indented paths
under it took the inline arm, so every path beneath it vanished with no
diagnostic at all. Four more shapes earn names now: a quoted value with
trailing text, a commented-out key line inside an open block, a missing space
after the colon, a backslash escape, and a backtick-wrapped value.Paths reach
plan-overlapbyte-exact as the plan wrote them, sosrc/x(1)and
lib/a`b.mjssurvive unrewritten.One tokenizer for the git rails
I closed the six rail-3 holes from the v1.3.1 known-gaps list, plus a seventh I
found while gathering context. A quoted-Cpath with a space,&as a
separator,$(...), backticks, a subshell, an escaped\", and the
bash/sh/zsh/dash/evalwrapper set with-call reached the network
with no prompt before this. They ask now.Six more regex arms was the alternative, and regex patching is what produced
the two push-rail regressions this repo already paid for, so I deleted the arms
instead of extending them. One left-to-right pass in
cadence-core/bin/lib/shell-tokens.mjscarries a single quote and escape
state, keeps word boundaries, descends into substitutions and subshells, and
re-tokenizes a wrapper's operands. Both rails read that one output, so they
agree on what a wrapped command is.One deliberate regression comes with it. The guard detects a wrapper at any
position, so it seessudo bash -c "git push", but it only hard-refuses when
both the wrapper and the git word sit at command position. Under
git.on_protected: refusethat meanssudo git commitandtimeout 60 git commitnow ask instead of hard-blocking. I dropped the enumerated prefix and
shell-keyword sets that used to deny them: every prefix carries its own option
grammar, three review rounds kept finding new members, and the enumeration
falsely deniedcommand -v git commit, which runs nothing. A missing deny
costs a prompt on a real commit. A wrong deny blocks read-only work.The roadmap phase list
An empty
## Phasesderives a closed-milestone state now instead of
unparseable-roadmap, so/cad-progressworks in the window between a
milestone close and the next cycle rather than calling the roadmap broken.
statusreturnscycle: "none"as an additive field.A wiped checkbox list whose
### Phase N:detail sections survived is the
signature of an interrupted prune, and it reports as one. A heuristic read that
same tree as a cleanly closed milestone, which is why I reverted the first
attempt at this during the v1.3.1 close.The
## Activerequirement sectionAn
## Activerequirement no phase has picked up now breaks/cad-auditas
unpicked. The gate used to hold only against a zero-row traceability table,
so it went quiet as soon as one phase had a plan, which is the state a
milestone spends most of its life in. That blind spot is how the v1.2.0 and
v1.3.1 closes both got through without their audits firing.Two things to know before you upgrade.
counts.totalnow counts traceability
rows plus unpicked ids rather thanrows.length, so anything you wrote against
total === rows.lengthreads a different number. Andunseededmoves the
verdict now, reversing the additive shape I shipped one milestone earlier: a
diagnostic that never moves the verdict leaves the ship gate exactly as
permeable as it was. A project with no## Activeheading gains no break from
any of this.The spine's own bookkeeping
/cad-planseeds its own traceability rows through a newseed-reqs
subcommand, so a milestone close no longer needs a hand-populated table before
/cad-auditpasses. It needed one at the last two closes, and that is exactly
why neither audit fired.A worktree executor now checks that its own
PLAN-<k>.mdexists before task 1
and halts with ablockedcheckpoint naming the missing path, rather than
planning against a stale merge point. Three executors caught that one only by
noticing. It repairs nothing on its own, and it cannot merge, rebase or fetch
inside the worktree.Known gaps
I wrote these into CHANGELOG.md under
[1.4.0]rather than leaving you to find
them. Markdown decoration inside a frontmatter value that touches neither
boundary still resolves silently, and I cannot flag an interior backtick
without also flagginglib/a`b.mjs, which has to stay clean. Closing that
means stating one rule about markdown in values, not adding a sixth arm.727 tests,
tsc --checkJsclean on Node 22 and 24, self-verify clean.Install
/plugin marketplace add https://github.com/crenshawdev/cadence.git /plugin install cadence@cadenceFull Changelog: https://github.com/crenshawdev/cadence/compare/v1.3.1...v1.4.0
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Cadence v1.3.1 Stable
released this
2026-07-27 16:48:53 +00:00 | 120 commits to main since this releaseWhat's Changed
- Cadence/v1.3.1 by @crenshawdev in https://github.com/crenshawdev/cadence/pull/57
Full Changelog: https://github.com/crenshawdev/cadence/compare/v1.3.0...v1.3.1
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
v1.3.0 Stable
released this
2026-07-24 20:06:26 +00:00 | 206 commits to main since this releaseFull Changelog: https://github.com/crenshawdev/cadence/compare/v1.3.0...v1.3.0
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Cadence 1.2.1 Stable
released this
2026-07-23 15:23:33 +00:00 | 220 commits to main since this releaseThree high-severity fixes from a post-1.2.0 cross-model review sweep over the
executable seams. All three corrupted state or weakened protection while
reporting success - the silent class the sweep was hunting. Each ships with a
regression test written failing-first.Fixed
- A newline in verifier-authored UAT text can no longer flip a verdict.
renderUatflattens every field value to one line on write, so an evidence
string containing"\nstatus: pass"stays inert instead of reparsing as a
second status line where last-assignment-wins silently turned a failed item
into a pass and opened the phase gate. (#35) renumber insertno longer corrupts the phase directories when the
highest phase is a decimal insertion. The dir-move ceiling is computed
over integer phases only, so with a2.1present the countdown visits the
integer dirs it must shift and leaves the decimal dir untouched - previously
it did the exact opposite and still reported ok. (#36)git-guardhonors the config it documents.on_protected: "deny"now
hard-blocks as an alias ofrefuse(it previously fell through to a soft
ask), and a lone-stringprotected_branchesguards the named branch instead
of silently reverting to['main','master']- ingit-publishtoo. (#38)
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- A newline in verifier-authored UAT text can no longer flip a verdict.
-
Cadence 1.2.0 Stable
released this
2026-07-23 03:44:57 +00:00 | 227 commits to main since this releaseThe judgment-sharpening cycle, dogfooded on Cadence itself. It repairs the
cross-model review seam so a second opinion actually fires instead of silently
no-opping, sharpens how the planner splits work and how context decides which
decisions are worth remembering, adds an on-demand way to stress-test one
load-bearing decision, and grows the cross-model roster with DeepSeek.Cross-model review, repaired
- The run-as-script guard now compares realpaths on both sides, so
review-provider.mjsno longer no-ops when the plugin is installed through a
symlink - cross-modelreview/consult/detect-modelsreach the real
provider instead of degrading to the subagent unnoticed. A symlink regression
test invokes the script through a link and asserts a non-empty JSON line. - An empty or unusable provider result surfaces one line in the caller
before falling back toclaude-subagent, rather than degrading silently.
Sharper planning and context
cad-plannercarries a standing separation-of-concerns nudge - a
heuristic, not a hard rule - that prefers small single-purpose tasks over a
shared core and splits responsibilities that differ on trigger, size,
lifecycle, failure-resume, freshness, or ownership. It applies to every plan
with no per-phase restatement and never forces a split that does not earn
itself.cad-contextmarks a decision durable only when it passes a three-part
filter (hard-to-reverse, surprising-without-context, and the result of a
real trade-off). Durable decisions are written under a## Durable decisions
heading and resurface via recall; the phase-local rest stay under
## Decisions. LegacyCONTEXT.mdfiles with only## Decisionsstill
resurface unchanged - no retrofitting.
Decision review
/cad-decision-review <path>runs an on-demand refute-then-adjudicate
pass over one load-bearing decision (aCONTEXT.mdline or aPROJECT.mdKey
Decisions row) through the existing review subsystem.cad-reviewer- and a
cross-model provider when one is configured - refutes the decision; the main
model grounds each objection against Context7 (library/API claims) and the
real codebase, then rules itsurvives | partial | refutedwith a concrete
amendment list. It never auto-fires and reports its cost qualitatively. New
review.decision_review.{tier,effort}config governs the model.
DeepSeek cross-model provider
- DeepSeek is a third cross-model review provider, via its own Chat
Completions adapter (not an OpenAI Responses base-URL swap). Because DeepSeek
has no server-sidejson_schema, the adapter usesjson_objectmode with the
finding schema injected into the prompt and the shared validate-on-return
guard, so a schema-ignoring response degrades to a structuredbad-shape
rather than bad data.reasoning_effortmaps the effort dial and keys resolve
viaDEEPSEEK_API_KEY, never logged. Selectable throughreview.reviewers
andreview.providers.deepseek.tiers.*.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- The run-as-script guard now compares realpaths on both sides, so
-
Cadence 1.1.0 Stable
released this
2026-07-17 21:05:18 +00:00 | 265 commits to main since this releaseThe stable
1.1.0, promoting therc.1andrc.2line to a public release. The
full feature detail lives in those two entries below - recall, measured context,
the two-tier git model, and the release lifecycle all shipped there and carry
forward unchanged.This final round closed the one acceptance the candidates could not: the
autonomous close (git.auto_close) was exercised live end-to-end against the
real remote - audit, tag, PR, merge, then reset to a pulled base with the merged
integration branch reaped - confirming the close chain therc.2tests proved in
isolation also holds in a real publish. The never-auto-push rail via the
git-publish seam stays intact;auto_closeremains opt-in and off by default.Full rc.1/rc.2 feature detail: CHANGELOG.md.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
-
Source code (ZIP)
-
Cadence 1.0.0 Stable
released this
2026-07-16 17:13:24 +00:00 | 370 commits to main since this releaseFirst public release.
Cadence is a planning and execution system for a single developer working in Claude Code. It runs one disciplined loop, discuss then plan then execute then verify, with an atomic commit per task, opinionated defaults, and a deliberately small surface. State lives in files, not in the conversation, so you can /clear aggressively and the next command rebuilds from disk.
What's inside:
- 22 skills, 7 agents, and nothing you didn't ask for
- Deterministic seams: every read and write of .planning state, model routing, and config validation runs through small zero-dependency Node scripts that emit one JSON line and never block the loop
- Adversarial review as a first-class subsystem: a fresh-context Claude reviewer by default, pluggable OpenAI and Gemini reviewers via direct API calls with enforced structured output
- Model routing: three canned profiles plus an auto mode with guardrails; failure escalation only ever raises
- Git rails enforced by the harness, not prose: protected-branch guard as a PreToolUse hook, no automatic pushes, a land step that asks how you want to publish
- Parallel execution with worktree isolation, gated by an arithmetic file-overlap check
- Self-verifying: CI lints the prose against the code, so a documented flag, key, or path that doesn't exist fails the build
The release was preceded by a full claims audit and a four-pass code sweep; all 43 findings were fixed before this tag, not deferred. 132 tests, typechecked, drift-linted.
Install:
/plugin marketplace add https://github.com/crenshawdev/cadence.git /plugin install cadence@cadenceSee CHANGELOG.md for the full release notes and LINEAGE.md for the GSD ancestry.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads