A new repository should arrive already governed — a template repo, and the question is whether it carries the tree or just the button #552
Replies: 4 comments
🔗 The sibling thread — #555, and it shares this one's first milestone@danmt raised the recurring half separately from the template question: how an existing consumer moves between ceremony versions, where this thread asks how a new repository arrives governed. They converge on one command. Bootstrap and upgrade are the same operation, one of them starting from empty — a consumer at Neither thread blocks the other, and neither should be built without the other's ask in view.
|
Ruled B, and it is minted as one epic with #555 rather than as its own build — #560@danmt Those are two rulings on one build, so they get one epic. Bootstrap and upgrade are the same operation with one of them starting from empty: a consumer at What is on the board now
Your B is delivered by three of the six rows, not by one, and the template repository is the last of them for a reason given below.
|
📎 Correction — this thread's close condition names #560, which closed as absorbed, not as delivered@danmt No new question, and nothing about your My #560 closed What actually happened. You ruled on The trigger is re-pointed: this thread closes when #568's rows are done, not when #560 closed. Your B — a thin template carrying one Where the arc stands, so the pointer resolves to a state rather than just a number: row 1 shipped — #561 closed (The same repair is owed on discussion 555, whose answer says "#560 is where the ruled half lives"; it is posted there in this same tick.) This thread stays open, on its re-pointed trigger. Corrected by |
Uh oh!
There was an error while loading. Please reload this page.
🧭 needs-ruling — how does a new repository acquire the ceremony? @danmt's idea is a template repository; the question is what goes in it, because the obvious answer freezes the pin.
Options: A — a fat template repo carrying the whole governed tree (callers,
labels.conf,labeler.yml,VERSION,CHANGELOG.md,changelog.d/,drills/,.ceremony/) · B — a thin template repo carrying oneinitworkflow, which calls a newbootstrapin ceremony at a resolved tag and opens the setup PR · C — no new repository: abootstrapcommand in ceremony, run by a builder from the ordinary issue → PR flowRecommend: B. It gives the operator what they asked for — a new repo that arrives already governed — without putting a second copy of the caller stubs anywhere, which is the one thing this fleet has measured going wrong.
Blocked: nothing. No board waits on this, and nothing is minted anywhere for it — this is the door, not a build.
Default: none. Which repositories exist and how they are created is org shape, and that is @danmt's. But no rung falls here: a discussion carries no
needs-rulinglabel and nolabeledevent (#526), so silence has no timer.Analysis — the measurement, the constraint GitHub actually imposes, and what each option costs
@danmt's words,
2026-08-29:Filed here rather than as an issue, per
TRIAGE.md: ideas go through the discussion door, and the adoption shape for a class of repositories is org policy. Measured2026-08-29against0.7.7and the live org.1. The volume is real, and it is not a theory
heavy-dutyhas created 13 repositories since 2026-06-11, four of them in August. The current state of the 17 that could plausibly carry a board:0.7.7la-familia-infra,la-familia-incubator,landing-site,lafamilia-site,rig,box,incubator,rig-templates0.7.6crew0.3.0martin-reyes-barbershop0.1.0castinfra,ledger-cli,handbook,situation-room,la-familia-project-tracker,heavyduty-siteEleven governed boards across four different tags, and six repositories with no board. Four of those six were created in the last eleven weeks. Whatever the onboarding path is, it is not keeping up.
2. What onboarding one repository actually costs — measured this week, not estimated
heavy-duty/la-familia-infrawas onboarded today. The receipt:bootstrap=yespress, both requiringpush, which no fleet identity holds;la-familia-incubatorlib/version.sh — one version abstraction, two backends #3 → actions/drill-recorded — a release carries its evidence #7,la-familia-infraactions/changelog-monotonic — shipped release headings are append-only #6 → actions/drill-recorded — a release carries its evidence #7).The genuinely per-repo content in all of that is small: the
scope:*set, the panel roster, what a drill means, the version backend, and whether the repository publishes an artifact. Everything else is transcription — which is exactly the shape a template is for.3. The constraint GitHub imposes, which decides most of this
Two mechanisms exist and neither does what the gut feeling asks for on its own:
initworkflow that runs once on the new repo, rewrites placeholders from${{ github.repository }}and its own inputs, commits, and removes itself..githubrepository supplies community-health defaults and workflow templates (entries in the Actions "New workflow" menu). It cannot ship an arbitrary tree into a new repository.So the
initworkflow is not a design flourish; it is the only place per-repo values can be resolved. That is also what makes @danmt's "could be done post-creation via issue → PR flow" free rather than a fallback: the same entry point serves both, because the init step is aworkflow_dispatcheither way.4. Why the obvious version is the wrong one
castsits at0.1.0andmartin-reyes-barbershopat0.3.0— 8 and 4 releases behind — with no mechanism that noticed. A template carryinguses: …@0.7.7becomes a twelfth consumer to bump, and the one nobody remembers, because it has no board, no CI, and no PRs. Every repository created after it drifts starts life stale, and the drift is invisible until somebody reads two trees side by side.It is also a second source of truth for the caller stubs, which
docs/CONSUMERS.mdcurrently owns. That is precisely the drift shape ceremony exists to prevent: "documents have no runtime… anyone tempted to simplify.ceremony/back to a pointer is reinventing the sometimes-unread doc." The same argument applies to workflow stubs kept in two places, and the mirror invariant does not cover a template repository.A thin template has no version to be stale. One
init.ymlthat resolves ceremony's latest release at run time and calls into it carries no pin worth drifting.5. What ceremony would have to grow, and what it already has
There is no bootstrap command today.
bin/holdschangelog-assembleandchangelog-sectiononly;docs/CONSUMERS.md§ Bootstrap a new repo and § On-board a fleet-worked repo are the procedure, written as prose for a human or an agent to execute by hand. And there is no template repository anywhere in the org — all 30 repositories haveis_template: false.The precedent is
actions/docs-sync --fix, which already does the hard half of this: ceremony writing files into a consumer's tree, machine-verified afterwards by--check. Abootstrapwould be that pattern widened from six doctrine files to the whole scaffold, and it would makeCONSUMERS.md's two bootstrap sections executable rather than transcribed — which is the actual defect the measurement in §2 describes.The per-repo inputs it needs are small and known:
📌 That last line is why this thread and #542 are coupled: a bootstrapper has to know which shape it is writing, and #542 is the thread deciding whether "board-only" is a class at all. It is an input to this, not a blocker on it — every option here works under all three of #542's, and only the generated file set differs.
6. What each option costs
bootstrapin ceremony. The template holds one workflow and aREADMEexplaining the button. Everything substantive is fetched at run time from a tag, so nothing drifts andCONSUMERS.mdstays the single source. Costs: a real build in ceremony (actions/bootstraporbin/bootstrap, tests, docs, a tag), plus one new repository to create and keep tidy. The init workflow is fiddly to get right once — resolving the latest tag, opening a PR from a workflow, deleting itself — and easy forever after.bootstrap, review the diff, decide the five inputs" rather than 1,870 hand-written lines. Strictly less convenient than B and strictly cheaper; it is also B's own first milestone, since B cannot exist until the command does.B is the recommendation, and C is its first half. If the init workflow turns out to be more trouble than the button is worth, stopping at C loses the click and keeps every other benefit — which is a good property for a thing to have before it is built.
7. What is not being proposed
heavy-duty/infrain particular is already mid-flight under infra#48.0.7.8is not gated by anything here.All reactions