• v1.5.0 a1453c3ab9

    v1.5.0 Stable

    crenshawdev released this 2026-07-28 20:21:47 +00:00 | 0 commits to main since this release

    Signed by john
    GPG key ID: 693AB15F91734B0C

    Four 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 new agent-skills check fails loudly instead, and also
      flags a resolved skill that sets disable-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 in agents/ 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-checker and cad-plan-checker-high share one, which is
      what that pair always claimed to be. They carry user-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-high no longer reads another agent file at runtime.
      The @-include workaround is retired. The file itself stays, because it
      exists to carry effort: high - frozen in frontmatter, and named by string
      in route-table.json's escalate_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.md called it host-owned and NOT caller-controllable, and five other
      surfaces restated that binding on the strength of it. The host's
      worktree.baseRef setting decides it: fresh (the default) forks from the
      remote default branch, head forks 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. The fresh default 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 head is that
      worktree's own HEAD.

    • /cad-execute no longer parallelizes into worktrees that lack its plans.
      choose_path runs a new read-only seam, cadence-core/bin/worktree-base.mjs,
      which resolves the effective worktree.baseRef through the Claude Code
      settings cascade; under fresh, unset, or an unreadable answer the phase
      runs sequentially and names the fix. /cad-config offers 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 effort no longer claims to apply where it cannot reach.
      fire(trigger) resolved {gate, tier, effort} and consumed effort on the
      cross-model arm only. The claude-subagent arm 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: effort is 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.md states which fields reach which backend,
      config.schema.json says it at the point of setting, and a fire whose
      configured effort differs from cad-reviewer's frontmatter-pinned high
      now names the difference in one line rather than silently ignoring it.
    Downloads