v1.45.0
Package Changelog
Minor Changes
- 90364bb: Add an MCP tool-trust envelope constraining
cadence_draft_approveandcadence_spec_approve— the two MCP tools where the tool call itself previously acted as the approval, with no expiry, capability scope, or revoke logic. Each of the 18 registered MCP tools is now tagged with acapabilityClass(READ_ONLY|LEDGER_WRITE|LOOP_WRITE|APPROVAL_BYPASS|SETTLE); the twoAPPROVAL_BYPASStools now refuse (naming the failing check, before anystate.jsonwrite) unless the caller holds a trust grant that matches the tool's live structural def-hash (name + description + inputSchema), was issued for the running CADENCE version, and has not expired. Grants are issued exclusively via a new CLI-only command family —cadence mcp trust grant --tool <name> [--ttl-days <n>],cadence mcp trust revoke --tool <name>,cadence mcp trust list— never reachable from any MCP tool call, so an MCP client can never self-grant approval-bypass trust. Grants are stored in a new operator/machine-local.cadence/mcp-trust.jsonledger (gitignored, not shared repo state likestate.json).cadence_settleis classifiedSETTLEbut deliberately left ungated this phase. Seedocs/concepts.md's new "MCP tool-trust envelope" section anddocs/reference/commands.md'smcp trustentries for full detail. - 424aa8c: Add
cadence milestone status <id>, a read-only reconciliation command that maps a milestone's converted recommendations to their phases, resolves each phase's owning worktree (local or sibling) viagatherHandoffCandidates, and reports that worktree's live loop position — replacing N manualcadence statusround-trips with one. Recommendations not yet converted to a phase, and converted phases with no matching worktree, are reported (asnot-yet-converted/no-worktree-found) rather than dropped. Supports--json; refuses with exit 1 for an unknown milestone id, matching the existingaccept/defer/closerefusal shape. Never writes to any ledger,state.json, or worktree.
Patch Changes
- 5b426dd: Thread an optional
{ signal?: AbortSignal; traceId?: string }through the verifier call path so long verifier runs can be cancelled cleanly and correlated via a trace id in logs.host-cli-client.ts's headless-CLI subprocess spawn now honors an externalAbortSignal(killing the child and rejecting with a newHostCliErrorreason'aborted', distinct from the existing'timeout') alongside its existing internal spawn-timeout timer.Verifier.verifyandSecurityAuditVerifier.verifyboth gain the same optional second parameter —LocalVerifier/LocalSecurityAuditVerifierforwardsignalinto the underlyingfetch/localChatJSONcall,AnthropicSecurityAuditVerifierforwardssignalinto the Anthropic SDK's request options, andMockVerifier/MockSecurityAuditVerifieraccept-and-ignore it. Thesecurity-auditgate now generates a fresh per-run trace id and passes it through end-to-end as a concrete proof the plumbing is connected, not just added-and-unused. Purely additive: every existing call site that omits the new parameter keeps compiling and behaving exactly as before.local-client.ts's network-error handling now also preserves the original error via{ cause }and includes its name in the message, so an aborted call can be told apart from a genuine network failure. Scoped topackages/core/src/gates+security-audit.ts's verifier hierarchy per rec-20260712-010; the same pattern is left for a future phase to apply toPerTaskVerifier/CodeReviewVerifier/PlanReviewVerifier/SpecReviewVerifier. - 462f239: Harden the
host-cliverifier provider against three risks: invisible consumption of the host CLI's own subscription/usage quota during verification calls, an unguarded self-invocation path whencadenceitself is already running inside the same host CLI it would spawn, and a subprocess hang when the spawned process never exits.hostCliJSONnow emits a one-time-per-process stderr notice on the first real spawn (never on provider selection alone); refuses to spawn — falling back tomockvia the existing per-call fallback path — when theclaudefamily's session env var (CLAUDECODE=1) indicates cadence is already running inside a headlessclaudesession (codexhas no reliable documented equivalent and is left unguarded); and bounds the spawn with a configurableCADENCE_HOST_CLI_TIMEOUT_MStimeout (default 3 minutes) that kills a hung subprocess and rejects with a newHostCliError(reason: 'timeout')instead of hanging forever. Seedocs/providers.md'shost-clisection for full operator-facing detail, including the consequence thathost-clicalls always fall back tomockwhencadenceruns from inside a Claude Code terminal, hook, or Bash tool call. - c8b197a: Redact secrets/credentials from persisted intelligence-ledger and security-audit output.
Evidence.summary(free-text quotes attached viaaddRecommendation'sevidenceSummary) andsecurity-auditgateFinding.message(bothSUMMARY.securityAuditand the per-critical stderr log) now pass through a newredactSecretsutility before being written, replacing AWS access keys, GitHub tokens, bearer/basic Authorization header values, JWT-shaped strings, PEM private-key blocks, and generickey=/token=/password=/secret=assignments with[REDACTED]. The four intelligence ledger JSON files (recommendations.json,evidence.json,assumptions.json,decisions.json) are now also written with0o600(owner-only) file permissions, applied atomically at file-creation time rather than via a create-then-chmod race. - Updated dependencies [90364bb]
- @manehorizons/cadence-types@1.45.0
Published Packages
All public packages are published on npm as 1.45.0:
@manehorizons/cadence-core@manehorizons/cadence-host-claude-code@manehorizons/cadence-host-codex@manehorizons/cadence-types
Verification
- npm publish completed with provenance in the Release workflow.
- Remote tag
v1.45.0is verified before the GitHub Release is created. - npm package versions and GitHub Release metadata are verified after publish.
- Workflow run: https://github.com/manehorizons/cadence/actions/runs/29451252247