release-bump writes the primary manifest before reading the sibling #139
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 project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: crenshawdev/cadence-archived#139
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
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?
Source: deep dive F9
Verdict: AGREE - low
Claim as reviewed
The primary plugin manifest is written before the sibling manifest is read and validated, so a malformed sibling leaves a partially bumped release tree inside an
ok:trueenvelope.At HEAD
f354864(v3.3.0)cadence-core/bin/release-bump.mjs:138-141writes.claude-plugin/plugin.json. The sibling read (readManifest(siblingPath)) does not happen until:146, and the changelog is handled later still at:172-193.The implementation accepts this explicitly at
:149-166: "The primary write already landed, so this records rather than aborts (D-08)". A sibling refusal surfaces assiblings[].action='refuse'inside a top-levelok:true.Note
cadence-core/workflows/milestone.mdhalts the close on asiblings[]refusal, so this does not silently ship. It is still a partial mutation reported as success.Fix shape is a reorder, not a transaction: read and validate every participating file, compute all outputs in memory, then write. A refusal should be able to mean "wrote nothing".
Shipped in v3.5.8 as JRN-03, merged via #229.
release-bumpnow reads and decides its whole write set before the first write. The firstatomicWrite(sits at line 361 against the lastreadManifest(at 280 and the changelog read at 329, so the ordering is structural rather than conventional. A malformed sibling leaves the primary manifest at the OLD version under anok:falseenvelope, proven by a test inrelease-bump.test.mjs.Two new refusal codes with their own identities:
unreadable-sibling-manifestandunreadable-changelog. The existingsiblings[]refusal arm still works for a sibling that is readable but not upgradeable, so the two outcomes are not collapsed.Note: #231 files six further defects in this same seam, found by triaging the capture archive. They are separate from this issue's ordering defect and remain open.