Skip to content

Gate releases on base-manifest freshness (#75) - #76

Merged
AntoineToussaint merged 2 commits into
mainfrom
issue-75-v0-0-32-ships-a-stale-base-manifest
Jul 31, 2026
Merged

Gate releases on base-manifest freshness (#75)#76
AntoineToussaint merged 2 commits into
mainfrom
issue-75-v0-0-32-ships-a-stale-base-manifest

Conversation

@AntoineToussaint

Copy link
Copy Markdown
Contributor

Closes #75.

Summary

  • base-integrity.mjs check trusts the committed base-manifest.json as its source of truth, so it re-hashes only the paths already recorded. A base file edited without re-running gen ships a stale digest that check structurally cannot catch — this is why the v0.0.32 release passed while shipping stale hashes for deployment_topology.go and network-policy.golden.yaml, blocking every consumer sync.
  • Adds a verify command that re-derives the manifest from the canonical tree and fails on any changed, unrecorded, or removed base file, and runs it (plus the guard's unit tests) in a dedicated provider-CI job so the canonical artifact can never ship out of sync again.
  • The manifest on main was already fresh; the only manifest-hash changes here are for the two tools/ files this PR edits.

Notes

  • The v0.0.32 tag itself is a diverged release branch, not an ancestor of main, so it cannot be retro-fixed from here — this PR fixes the recurrence gap (issue suggested-fix accounts+frontend: user/team/session CRUD, RLS-scope fixes, settings #2) so the next release is gated. RELEASE_GATES.md documents why this one gate lives in provider YAML.
  • Confirmed against the tag: the manifest recorded 69c4cb10… for deployment_topology.go while the file at v0.0.32 hashes to bcc36469…; a fresh regeneration diverges there, so verify would have failed that release.

Test plan

  • node module/tools/base-integrity.mjs verify → passes on a fresh tree, exits non-zero listing the drift when a base file changes without regeneration.
  • node --test module/tools/base-integrity.test.mjs → 19 pass, including a canonical-manifest-matches-tree assertion and a fixture covering stale/unrecorded/removed entries.
  • node module/tools/base-integrity.mjs check still green (0 modified, 0 missing, 0 side-additions).
  • node module/tools/base-integrity.mjs gen is a no-op on the committed manifest.

AntoineToussaint and others added 2 commits July 31, 2026 07:18
The base-integrity `check` command trusts the committed manifest as its
source of truth, so a base file edited without re-running `gen` ships a
stale digest that `check` cannot detect — v0.0.32 shipped stale hashes for
deployment_topology.go and network-policy.golden.yaml, aborting every
consumer sync with an unreconcilable source-path mismatch.

Add a `verify` command that re-derives the manifest from the canonical tree
and fails on any changed, unrecorded, or removed base file, and run it in
provider CI so the canonical artifact can never ship out of sync again.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
baseManifestFreshnessErrors compared only the files map, but the artifact
gen writes is {note, fileCount, files}. A manifest with a drifted fileCount
or note passed verify while gen would still rewrite it, breaking the "gen is
a no-op" guarantee the gate exists to prove. Compare every field gen emits.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@AntoineToussaint
AntoineToussaint merged commit c8fd4d6 into main Jul 31, 2026
4 checks passed
@AntoineToussaint
AntoineToussaint deleted the issue-75-v0-0-32-ships-a-stale-base-manifest branch July 31, 2026 06:03
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.

v0.0.32 ships a stale base-manifest.json — blocks all consumer module syncs

1 participant