Skip to content

Promote the top-gate lock into main (cherry-pick, lock-only) - #31

Open
a777ance wants to merge 1 commit into
mainfrom
promote/promotion-lock
Open

a777ance wants to merge 1 commit into
mainfrom
promote/promotion-lock

Conversation

@a777ance

@a777ance a777ance commented Aug 9, 2026

Copy link
Copy Markdown
Owner

The first proper cherry-pick promotion into the Well of Mimir — replacing the closed #29 (which was a forbidden full-branch merge). Yggdrasil drinks from the well; the well is fed one deliberate selection at a time.

What this promotes (and only this)

Two self-contained files, cut onto a promote/* branch from main:

  • tools/check-promotion.py — refuses any PR into main that is a full-branch merge: fails if the head is a rail (Yggdrasil / main / doombox/* / …) or if the Yggdrasil tip is an ancestor of the head (a whole-branch merge in disguise). Only a promote/* branch cut from main and carrying a genuine cherry-pick selection passes. Stdlib only; locally dry-runnable.
  • .github/workflows/promotion-guard.yml — runs it as the promotion-guard check on every PR to main.

Nothing else changes, so main stays green. The doctrine prose (CLAUDE.md §3, the branch-policy block, the cap tool, norns) is deliberately not in this promotion — main's briefing is a whole doctrine-era behind, and catching it up is a separate, larger promotion for later.

Two things to know

  1. This is a bootstrap. pull_request workflows run from the base branch, so promotion-guard does not run on this PR (main doesn't have it yet) — it activates on the next PR into main, after this merges.
  2. To make it a hard lock, mark the promotion-guard check Required in main's branch protection (Settings → Branches). Until then it reports but does not block. That admin toggle is the one piece outside what a session can do.

Guard self-check

check-promotion.py --head promote/promotion-lock --base main → ok (a genuine selection; head does not contain the Yggdrasil tip). Rail heads and disguised whole-branch heads both FAIL as intended.

🤖 Generated with Claude Code


Generated by Claude Code

First cherry-pick promotion from Yggdrasil into the Well of Mimir. Brings
ONLY the two self-contained lock files, so main stays green and gains the
enforced "no full-branch merge" rule immediately:

- tools/check-promotion.py — refuses a PR into main whose head is a rail
  (Yggdrasil/main/doombox/*) or whose head already contains the Yggdrasil
  tip (a whole-branch merge in disguise). Passes only a promote/* branch
  cut from main. Stdlib only.
- .github/workflows/promotion-guard.yml — runs it as the promotion-guard
  check on every PR to main.

The doctrine prose (CLAUDE.md §3, branch-policy block) is deliberately NOT
in this promotion; it follows once main's briefing is caught up.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xp3DVVK5nBHC8nQhhmBC8g
@cloudflare-workers-and-pages

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
❌ Deployment failed
View logs
cloudflarelocaldns a182667 Aug 09 2026, 09:33 PM

a777ance pushed a commit that referenced this pull request Aug 11, 2026
The ten Yggdrasil -> main PRs opened under the previous doctrine cannot land:
check-promotion.py refuses a rail as head, verified directly (exit 1). The founder
had already closed localDNS #29 and opened #31 as a proper promote/* cherry-pick,
setting the precedent; the other nine were still open and making the queue lie.

Closed all nine WITH A STATED REASON, because a PR closed silently records
"closed" — indistinguishable from "rejected" six months later, which is exactly
the failure the retirement manifest §3b was written to prevent. Each comment says
superseded SHAPE, not rejected work; that nothing is lost because every commit
stays on Yggdrasil; and gives the replacement route (cut promote/* from main,
cherry-pick, PR that), pointing at #31 as the worked example.

Snapshot refreshed from a single org-wide query rather than ten per-repo calls:
3 open PRs portfolio-wide, all in localDNS. The board immediately reflected it —
decision 2 fell from 14 PRs to 1, and the "refresh the snapshot" decision the seat
had raised against ITSELF (71h stale) cleared. An instrument that flags its own
staleness and then watches that flag disappear is the whole design working.

Also confirmed, checking before acting: the claude/* PRs closed on 2026-08-08
were closed deliberately, BEFORE the retirement ran — so branch deletion did not
silently eat them. That was the predicted harm; it did not happen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DQFfkkSUPXDTgKizj6RfpF

This branch has not been deployed

No deployments
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.

2 participants