Skip to content

feat: release promotion model with channels and designation-commit promotion - #143

Draft
levifig wants to merge 1 commit into
mainfrom
release-promotion-model
Draft

feat: release promotion model with channels and designation-commit promotion#143
levifig wants to merge 1 commit into
mainfrom
release-promotion-model

Conversation

@levifig

@levifig levifig commented Jul 29, 2026

Copy link
Copy Markdown
Owner

Change

docs/changes/20260728-release-promotion-model/ — target_release: 2.0.0

What & Why

Shapes the release promotion model: channels alpha→beta→rc→stable-as-promoted-rc, with stable as a designation event. The CLI surface is --bump iterates in place, --promote moves forward (bare = next rung; release explicit and rc-only), --channel asserts the outcome; the cohort gate moves to rc cut (alpha/beta stay the valve); promotion is one designation commit restricted to release metadata, with the stable changelog re-derived as a rollup that collapses the cycle's rung-labeled sections. Release notes go changeset-pattern: each change authors release-notes.md in its own folder, CHANGELOG.md becomes a cut-time projection, and the [Unreleased] buffer retires. Distribution routes by channel (loaf formula stable-only, loaf-dev tracks prereleases). Today the codebase has a single prerelease predicate — no label transitions, no cycle entry, a gate that fires only at stable, channel-blind CI that would hand brew users an alpha after 2.0.0, and a release skill predating the gate entirely.

Review focus

Decision 1 (designation commit over tag-only/artifact promotion), Decision 3 (per-channel changelog policy + the exact no-impact token), Decision 11 (CI-green-at-HEAD before tagging), the collapse-set definition (rung-labeled sections of the candidate core; legacy dev.*/pre.* history survives), and the imported releaseMetadataAllowlist boundary shared with the receipt-tree-binding predecessor.

Verification

loaf change check docs/changes/20260728-release-promotion-model: zero violations, derives executable. Four shaping review rounds are boarded under reports/ (R1–R4; R4 attested convergence: 0 blockers, 0 major, 1 minor fixed in-round). V1–V7 declare the executable criteria implementation must satisfy; open items are the two fog entries in shape.md's Open Questions, each with a named owner.

Migration / breaking changes

--bump release retires with an error pointing at --promote release; the [Unreleased] buffer is removed from CHANGELOG.md, its scaffolds, and the pre-PR hook (re-pointed to per-change note presence). Both land inside this Change's implementation, gated by its own criteria.

Deferred

Receipt content binding — predecessor Change docs/changes/20260728-receipt-tree-binding/ (its own PR); capability-evidence decoupling (Intent); concurrent maintenance branches/multi-cycle (revisit on real need); npm dist-tag routing (no npm distribution today).

levifig added a commit that referenced this pull request Jul 30, 2026
…bility (#144)

Receipt validity now binds to a masked root-tree content digest instead of commit reachability: same HEAD, same verdict, on any clone, under squash, rebase, or merge commits.

- Scope digest: SHA-256 over git ls-tree entries minus a declared exclusion set (receipts, report boards, release-metadata allowlist), byte-sorted, mode included, domain-separated; per-top-level-directory sections name drift machine-independently.
- Schema v2 receipts: scope digest and sections, exclusions verbatim, digest spec, toolchain, and worktree_clean execution integrity; verified_commit demoted to provenance; cwd dropped; criteria digest covers criterion text.
- Freshness is a pure typed predicate; every state is a reasoned block with folder, cause, and remedy. The commit walk and the "cannot inspect receipt" crash are gone.
- Verify hardening: refuses dirty tracked worktrees with receipt/report masks exempt so cohort re-verify sweeps compose; voids receipts when criteria mutate the tree or HEAD moves mid-run; config-independent submodule policy; NUL porcelain parsing; bash -c instead of bash -lc.
- commandOutput surfaces stderr in returned errors repo-wide.
- Fixtures prove the council's defect reproductions: post-squash protocol clone stays verified, N>=2 cohort receipts coexist, byte-identical restore un-stales by design.
- ADR-024 pins the serialization and evidence boundary; ADR-023 annotated as superseded where contradicted; the exported boundary is ready for the promotion model's designation check (PR #143).
- Five review rounds (internal and external) recorded as boards in the change's reports directory.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant