Skip to content

Releases: crenshawdev/cadence

v3.9.0

Choose a tag to compare

@github-actions github-actions released this 12 Oct 20:06
v3.9.0
f50587b

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_inspection and
    workflow.independent_rerun, set with /cad-config or config.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-execute only, 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-verify runs each check's command itself
      instead of trusting the executor's report, and fails a check that could
      not have failed.

    /cad-execute reads the plans through planning.mjs test-checks before 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>.effort takes
    xhigh. OpenAI gets it as written. Gemini's thinkingLevel and DeepSeek's
    reasoning_effort stop at high, so those adapters send high.

  • The README and /cad-help say 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 /tmp asked as if it were a commit on the project's main. A literal
    -C path is now followed, and the commit is policed in that repository, or
    not at all when it is not a Cadence project. A -C the guard cannot read
    before the shell expands it, such as "$S", keeps the old reading of the
    session directory and the prompt says which -C it could not follow, so
    nothing that asked before goes quiet.

Removed

  • The Cadence module is gone, and /cad-panel with 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.json names no module, the panel setting 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.mjs already hands every dispatch the cadence: name, so nothing
    dispatches a bare stem. A trace.jsonl written 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 to codex exec under a roles.cad-executor.codex.* switch, and send
    an OpenAI review through codex exec under
    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 the config.mjs unset that 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

Choose a tag to compare

@github-actions github-actions released this 06 Oct 16:46
v3.8.6
e529479

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-report run only with the plugin's panel setting on, so
    upgrading turns them off. /cad-panel on or the "Cadence band and token
    capture" row in /config turns them back on. With it off, whatever another
    mod draws above the prompt shows as it was, /cad-report takes its figures
    from the returns and the subagent-trace hook alone, and a subagent's own
    trace close goes through as written. The pane, the listing filter, the
    agent-name prefix and the cache meter run either way.

Added

  • /cad-panel on and /cad-panel off. They write the panel setting the
    way its /config row does, and Claude Code reloads the module with the new
    value. off closes the pane first. /cad-panel alone still opens the pane,
    band on or off.

v3.8.5

Choose a tag to compare

@github-actions github-actions released this 06 Oct 15:57
v3.8.5
de3cad2

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 reads main first request, 16.6k written
    and an agent's row reads cache 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

Choose a tag to compare

@github-actions github-actions released this 06 Oct 13:57
v3.8.4
4735de3

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

Choose a tag to compare

@github-actions github-actions released this 06 Oct 01:58
v3.8.3
73388cc

The band and the pane, and the README section that shows them.

Fixed

  • A phase being executed no longer reads planned. Nothing sets an
    executing status, so through a whole /cad-execute run the band and the
    pane's status chip said planned, beside a running cad-executor and a plans
    bar already partway done. Both now draw executing while the phase is
    planned and a cad-executor is running. It is display only: the cursor and
    the derived status keep their values. An executor that /cad-task --plan
    dispatches on a planned phase 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 that n puts the next command in
    the prompt. Its paragraph on what the module does besides drawing moved into
    The module's list.

v3.8.2

Choose a tag to compare

@github-actions github-actions released this 06 Oct 01:24
v3.8.2
c1ee533

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 held review-provider.test.mjs for what read as a credential. The
    last sk- prefixed value and the three Bearer tokens 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. The read-trace test's leftover check for
    an sk-live token, which could no longer fail after v3.8.1 renamed the
    planted value, now checks the value that is planted.

v3.8.1

Choose a tag to compare

@github-actions github-actions released this 05 Oct 22:46
v3.8.1
f2c0915

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_close needs both layers. An unattended close now runs only when
    the repository's .planning/config.json AND your user-global
    ~/.claude/cadence/config.json both 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, run config.mjs set --global git.auto_close=true once. 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 in review.reviewers (openai, gemini, deepseek) runs only when
    your user-global review.reviewers names 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 --review now 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
    in node_modules/.bin is named by that path, one only on PATH by 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_type on every route.mjs resolve. The resolved agent with the
    plugin's own prefix from plugin.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. resolve also
    returns reviewers_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 keep Bash pre-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 bare cad-* 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.
  • renumber leaves shipped history alone (GH-301, GH-303). renumber remove
    shifts or blanks only Pending Traceability rows, leaves Complete and Deferred
    rows and ## Shipped byte-identical, names any Complete row citing a removed
    or moved phase in warn, and lists every changed line in req_row_changes.
    Both insert and remove re-point the phase number in the cursor's Next:.
  • risk-carry refuses 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, never internal and never
    carry-exists for 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, \u000a and
    \U0000000a in 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

Choose a tag to compare

@github-actions github-actions released this 04 Oct 21:55
v3.8.0
93c10ca

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, and p on 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-report totals 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-validate CI job. claude plugin validate --strict runs on both
    manifests and fails if the validator stops reporting the module.
  • Self-verify checks. Check 25 resolves every modules entry 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 name route.mjs returns.
  • 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 insert rewrote shipped history. It now shifts phase
    references only on Pending ## Traceability rows, 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 as unlistable-phase with a hint to make the path readable and
    searchable, instead of internal with a raw EACCES.
  • 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

Choose a tag to compare

@github-actions github-actions released this 25 Sep 20:53
v3.7.13
1417711

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-why tier
    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

Choose a tag to compare

@github-actions github-actions released this 05 Sep 18:47
v3.7.12
c39bbd8

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 / efforts grids beside it, and
    cadence-core/route-table.json itself. 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 an unknown key refusal.

  • model_aliases, and the enum on the six model.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 --roles asks 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-project and /cad-adopt run it in full against the user-global
    layer on a first run; /cad-config --roles re-asks it for one project into the
    repo layer, and --roles --global re-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 no stakes key never sees it.

  • config.mjs unset <key>... [--global]. The write face had no way to REMOVE
    a key, and validate refuses a file carrying an unknown one, so retiring
    stakes alone could not make "the key is gone from the file afterwards" true.
    unset on a key the file does not hold returns ok:true and 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>.model and
    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 in warnings[] 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 a null sentinel meaning "the level decides": plan advisory, diff off,
    phase_diff off, risk_surface blocking, and cheap for all four reviewer
    tiers. The start rungs default to high for the planner, the assumptions
    analyzer, the executor and the verifier, medium for the reviewer, and low
    for the plan checker.

  • The plan-time risk floor moves two things and nothing else. A phase whose
    declared files: touch an answered surface gets a blocking plan review 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_floor keeps its name with its
    meaning re-pointed at those two effects, and it still cannot reach the
    risk_surface review itself. The deep pass has no config key of its own: it is
    on when the floor raised and off otherwise, with --deep the manual
    switch.

  • Escalation climbs exactly one rung. model.escalate_on_failure re-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, or session when no key set one - replaces stakes on the
    routing.resolve trace event and on the spawn envelope, which is what keeps
    the record able to answer why a dispatch cost what it did.