v3.7.0 - the refusal that names the next step #251
No reviewers
Labels
No labels
already-shipped
bug
documentation
duplicate
enhancement
external-review
good first issue
help wanted
in progress
invalid
needs-decision
proposal
question
security
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: crenshawdev/cadence-archived#251
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "cadence/v3.7.0"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Two phases, 37 commits off v3.6.1. Three requirement ids seeded at the open and all three traced to a verified phase: HNT-01, HNT-02 (#238) and SCP-01 (#249). /cad-audit PASS on both arms, 13 of 13 acceptance criteria covered.
Phase 1 wrote hints at every in-scope refusal under cadence-core/bin/ - 243 sites, 0 hintless, down from 215 hintless when the check went in - and added self-verify check 22 (refusal-hints), which is what makes it a property of the tree rather than a number that drifts back. No reason token string changed.
Phase 2 made config.mjs set refuse a repo-scoped key at the user-global layer at write time, reading a new repo_only schema marker rather than a list of key names. It resolves the layer from the target file rather than the flag, and runs inside checkPairs ahead of every read and write, so a multi-pair set carrying one marked key leaves the target byte-identical. config.mjs check --global reports the same error the write face refuses on.
One accepted limitation ships with it, stated in the changelog under Known: the scope check resolves layer identity from a pathname and re-resolves that pathname for the read and the write, so a symlink swap in that window defeats the refusal. Not a regression - before this release set applied the pair with no layer check at all. Raised by the blocking risk-surface gate, confirmed by the phase verifier, and overridden deliberately rather than missed.
Nine entry blocks carry the same two-armed catch, and the e.seam arm is the argument contract's refusal reaching the user: {"reason":"missing-flag-value", "detail":"--root"} and nothing saying what to type. All nine now carry one hint, written once and used verbatim, telling the caller to give the flag the detail names a value of the kind that flag takes and re-run. It names no specific flag because the arm relays whichever one refused. The internal arm beside it is untouched - D-03 excludes it, since there is no user action there beyond filing a bug. self-verify.mjs is in this task rather than in plan 1 on purpose: it is the same idiom and must read identically, and the linter should not be an example of the defect it reports.