Turnfile coordinates autonomous agents over shared files, so a release touches an agent-facing, security-relevant surface. Run this checklist before tagging.
node tools/turnfile-lint.mjs --turnfile working-session/TURNFILE.yaml \
--schema schemas/turnfile/turnfile-v0.schema.json # schema + lint PASS
node tools/validate-mailbox-invariants.mjs --mailbox working-session/MAILBOX.md # PASS
node tools/validate-prd-promotion.mjs # exit 0
node tools/validate-public-surface-snapshot.mjs # public-surface snapshot gate (exit 0)
node tools/validate-closeout.mjs --turnfile working-session/TURNFILE.yaml \
--mailbox working-session/MAILBOX.md # clean or recorded deferral
npm run -s validate:skills # PREFLIGHT PASS
npm test # PRD eval suites greenA failing gate blocks the tag unless the Maintainer records an explicit deferral with reason and next owner.
Per the cross-portfolio versioning rule, bump the version and propagate it to every surface that displays a version or date:
CHANGELOG.md— new entry (version, ISO date, summary), prior entries preserved.README.md— version/status references and the PRD status index.docs/index.html— version block, byline date, JSON-LDdateModified,article:modified_time, last-revision stamp.docs/llms.txtandassistant-guide.txt(+.well-known/copy) —Updated:date; ifassistant-guide.txtcontent changed, recompute SHA-256 and update both the manifest sidecars (verify byte-identical).- Affected
skills/<agent>/MANIFEST.yaml— bundle version + recomputed hashes.
- Confirm no secrets or
.envare tracked. - Confirm
robots.txtstill permits the intended AI/LLM crawlers. - Confirm the ownership guard (PRD-033, once implemented) is configured and
core.hooksPathpoints at the Maintainer-owned shared hook (drift = decision-required). - Confirm the assistant-guide trust-anchored pair is byte-identical.
git tag -a vX.Y.Z -m "Brief release title"
git push origin vX.Y.Z
gh release create vX.Y.Z --title "vX.Y.Z — title" --notes-file <(...)
gh release list --limit 5A commit without a tag is not a release; a tag without gh release create is not
a release. Both are required.
grep -rnE "<old-version>" . \
--include="*.md" --include="*.txt" --include="*.html" \
--include="*.json" --include="*.yaml" --include="*.yml" \
| grep -v ".git/" | grep -v "node_modules/" | grep -v "CHANGELOG"Result must be empty except for CHANGELOG history and intentional pedagogical examples.