v1.55.0
Package Changelog
Minor Changes
-
c8333f8: Added a new
cadence doctorcheck,conduction-reachability, that reports — separately forcode-reviewandsecurity-audit, since the two gates are asymmetrically gated in this repo — whether the current configuration can produce a real-provider (non-mock) finding at all.Two independent, deliberately-retained blockers make this structurally unreachable in normal, headless-agent-driven operation: the
autogate profile excludes both review gates from every tier, and the self-invocation guard forces amockverifier fallback whenevercadenceis already running inside a headless Claude Code session. A third, ordinary (non-safety-related) blocker can also apply: a gate's ownproviderconfig being set to'mock'.The check evaluates three axes per gate — profile inclusion (
gatesForacross all tiers), provider configuration (seamProvider), and the self-invocation session guard (conditioned on the gate's own provider being'host-cli', since the guard only applies to that spawn path) — and reportsseverity: 'warning'naming exactly which axis or axes block each gate, withfixId: null(no safe auto-repair exists; every remediation is an operator decision).status: 'ok'only when both gates are fully reachable.Neither blocker is modified or bypassed by this change —
isSelfInvocation,SELF_INVOCATION_ENV_VAR, and theDELTASgate matrix are untouched. The check adds visibility only, so an operator can tell "no real finding has been produced yet" apart from "no real finding can currently be produced," anddocs/providers.mdnow documents the exact operator procedure (a DRAFT-levelprofile:override, run from a real interactive terminal) to produce one when needed. -
db8209f: Fixed a real coverage-scanner defect: the JS/TS
test-coveragegate'sclassify()state machine had no concept of a regex literal, so a paren, quote, or backtick inside an unrecognized/regex/— not just parens/backticks, as originally reported — was read as a real structural character. This corruptedfindMatchingParenIndex's depth-aware paren matcher and/or flipped the scanner into real string/template mode for the rest of the file, silently undercounting or dropping test-block spans (and, in rarer cases, silently dropping a real assertion from a span without changing its count). A repo-wide sweep found this affected 20 of this repo's own 446 JS/TS test files before the fix; all 20 are now confirmed resolved with no file-content edits needed, since the fix lives entirely in the scanner.classify()(packages/core/src/verify/coverage-profiles/mask.ts) now recognizes JS/TS regex literals as their own lexical category, opt-in per language profile via a newLanguageSyntax.regexLiteralsfield (set only for the built-injs-tsprofile — no other language profile is affected). Regex-vs-division disambiguation uses a masker-only heuristic (no new runtime dependency) against an explicitly documented, bounded preceding-token vocabulary; a/in a context outside that vocabulary resolves conservatively, the same as division, rather than guessing regex-open.That conservative fallback is now also surfaced instead of staying silent:
cadence verify coverage --explainreports a[mask diagnostic]line naming the out-of-vocabulary context, so a scanner blind spot is visible instead of quietly under-counting coverage.findSpansForProfile's existing signature and behavior are unchanged for every existing caller; the new diagnostics are opt-in via a sibling function. -
8098aee: Persisted
codeReview/securityAuditfindings on aSUMMARY.jsonare now rendered in both Markdown summary surfaces — the on-disk<id>-SUMMARY.mdsidecar (renderSummaryMd) andcadence summary render's output (renderSummaryForReview) — under a shared## Findingssection, placed after## Tasksand before the gates heading in both. Previously these findings were JSON-only: a refused settle or a pasted PR summary gave no visibility into the finding that actually caused the refusal without opening the raw.jsonrecord.Findings are grouped and ordered deterministically:
codeReviewfindings by file path (codepoint order), then severity (critical > high > medium > low), thenid;securityAuditfindings by severity thenid, with original array order as the stable tie-break whenidis absent (as it always is forsecurity-auditfindings under the current schema). Each rendered line includes severity, message, and — when present — line, id, target, anchor (kind/ref/tier), disposition, and waiver expiry. The## Findingsheading itself is omitted entirely when there is nothing to render, so every historical summary predating this change (nocodeReview/securityAuditfields at all) renders byte-identically to before, andcadence summary verify'scontentHashcheck — which hashes the parsed JSON, never the Markdown — is unaffected; a new test sweeps all 269 existing.cadence/phases/**/*-SUMMARY.jsonrecords in this repo to prove it.Every rendered finding message passes through the existing
redactSecretsutility.security-auditfindings were already redacted upstream before reachingSummaryZ; this adds the same protection forcode-reviewfindings, which previously were not. Only the credential shapesredactSecretsalready recognizes (PEM keys, JWTs, AWS access keys, GitHub tokens, Authorization headers,key=/token=/password=/secret=-style assignments) are redacted — webhook URLs and bare local file paths are not, and are deliberately out of scope; wideningredactSecrets's shared patterns (it also backsgates/security-audit.ts,intelligence/finding-routing.ts, and others) is left to a future phase if ever needed. -
a5e729d: Added a new
cadence doctorcheck,roadmap-currency, that reports drift between the highest phase number under.cadence/phases/and the highest phase number referenced inROADMAP.md/MILESTONES.md— an anti-recurrence mechanism for the 113-phase/6-week ROADMAP drift fixed in PR #321.Drift is computed against the lower of the two reference files (using only files that contain at least one
Phase Nheading — a file with zero matches is excluded from the comparison, never treated as0, so a consumer repo that only maintains one of the two files doesn't warn forever).severity: 'warning'when drift exceeds 10 phases,'ok'otherwise, andfixId: nullalways — generating roadmap prose is deliberately not automated. The check silently passes on a fresh consumer repo (no phases yet, orROADMAP.mdstill theinitstub), and degrades to a best-effort "not determinable"okon any unexpected read failure rather than throwing.
Patch Changes
- @thomas-powers-jr/cadence-types@1.55.0
Published Packages
All public packages are published on npm as 1.55.0:
@thomas-powers-jr/cadence-core@thomas-powers-jr/cadence-host-claude-code@thomas-powers-jr/cadence-host-codex@thomas-powers-jr/cadence-host-toolkit@thomas-powers-jr/cadence-types
Verification
- npm publish completed with provenance in the Release workflow.
- Remote tag
v1.55.0is verified before the GitHub Release is created. - npm package versions and GitHub Release metadata are verified after publish.
- Workflow run: https://github.com/thomas-powers-jr/cadence/actions/runs/31215217214