Skip to content

v1.45.0

Choose a tag to compare

@github-actions github-actions released this 15 Jul 21:20
b04534a

Package Changelog

Minor Changes

  • 90364bb: Add an MCP tool-trust envelope constraining cadence_draft_approve and cadence_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 a capabilityClass (READ_ONLY | LEDGER_WRITE | LOOP_WRITE | APPROVAL_BYPASS | SETTLE); the two APPROVAL_BYPASS tools now refuse (naming the failing check, before any state.json write) 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.json ledger (gitignored, not shared repo state like state.json). cadence_settle is classified SETTLE but deliberately left ungated this phase. See docs/concepts.md's new "MCP tool-trust envelope" section and docs/reference/commands.md's mcp trust entries 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) via gatherHandoffCandidates, and reports that worktree's live loop position — replacing N manual cadence status round-trips with one. Recommendations not yet converted to a phase, and converted phases with no matching worktree, are reported (as not-yet-converted/no-worktree-found) rather than dropped. Supports --json; refuses with exit 1 for an unknown milestone id, matching the existing accept/defer/close refusal 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 external AbortSignal (killing the child and rejecting with a new HostCliError reason 'aborted', distinct from the existing 'timeout') alongside its existing internal spawn-timeout timer. Verifier.verify and SecurityAuditVerifier.verify both gain the same optional second parameter — LocalVerifier/LocalSecurityAuditVerifier forward signal into the underlying fetch/localChatJSON call, AnthropicSecurityAuditVerifier forwards signal into the Anthropic SDK's request options, and MockVerifier/MockSecurityAuditVerifier accept-and-ignore it. The security-audit gate 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 to packages/core/src/gates + security-audit.ts's verifier hierarchy per rec-20260712-010; the same pattern is left for a future phase to apply to PerTaskVerifier/CodeReviewVerifier/PlanReviewVerifier/SpecReviewVerifier.
  • 462f239: Harden the host-cli verifier provider against three risks: invisible consumption of the host CLI's own subscription/usage quota during verification calls, an unguarded self-invocation path when cadence itself is already running inside the same host CLI it would spawn, and a subprocess hang when the spawned process never exits. hostCliJSON now emits a one-time-per-process stderr notice on the first real spawn (never on provider selection alone); refuses to spawn — falling back to mock via the existing per-call fallback path — when the claude family's session env var (CLAUDECODE=1) indicates cadence is already running inside a headless claude session (codex has no reliable documented equivalent and is left unguarded); and bounds the spawn with a configurable CADENCE_HOST_CLI_TIMEOUT_MS timeout (default 3 minutes) that kills a hung subprocess and rejects with a new HostCliError(reason: 'timeout') instead of hanging forever. See docs/providers.md's host-cli section for full operator-facing detail, including the consequence that host-cli calls always fall back to mock when cadence runs 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 via addRecommendation's evidenceSummary) and security-audit gate Finding.message (both SUMMARY.securityAudit and the per-critical stderr log) now pass through a new redactSecrets utility before being written, replacing AWS access keys, GitHub tokens, bearer/basic Authorization header values, JWT-shaped strings, PEM private-key blocks, and generic key=/token=/password=/secret= assignments with [REDACTED]. The four intelligence ledger JSON files (recommendations.json, evidence.json, assumptions.json, decisions.json) are now also written with 0o600 (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