Repository navigation
Branch protection is inconsistent fleet-wide, and no repo requires its own test suite #75
Description
Activity
Inventory refresh 2026-09-11. The core finding still holds; the repo table does not.
Still true, and still the point
No repo requires its own test suite. Every protected repo requires exactly one check:
Repo required_status_checks.contextsdev-envclaude-review / run-reviewdotfilesclaude-review / run-reviewclaude-configclaude-review / run-reviewgithub-workflowsclaude-review / run-reviewscriptsclaude-review / run-reviewdev-envhasscripts/org-migration/tests/run-tests.shanddotfilesruns its full suite in.project-hooks/pre-push— both enforced locally only. A push that skips the local hook reaches main with no test gate. That is the finding, unchanged.The "no protection at all" table is out of date
Of the seven repos it listed, five now have protection:
Repo State now claude-code-workflows-agents✅ claude-review / run-reviewnightowlstudiollc/.github✅ claude-review / run-reviewpr-review✅ claude-review / run-reviewrepo-template✅ claude-review / run-reviewscripts✅ claude-review / run-reviewInstapaper-MCPFork retired 2026-09-11 — out of fleet superpowersArchived 2026-09-11 — read-only So the protection gap this issue opened on is closed. What remains is the harder half: protection exists everywhere it should, but it gates review rather than tests.
Adjacent measurement from today
Fleetwide, 8.6% of merged PRs (64/741 since 2026-06-01) needed a branch update before merging —
strict: trueis doing real work, not just adding friction. Detail and per-repo rates in #128. Relevant here because any move to require test suites inherits that same staleness cost, concentrated in the same repos.Fleet is now 42 repos (two archived, one deleted today), so future counts against this issue should use that denominator.
Resume note (parked 2026-09-30)
- What: branch protection was inconsistent fleet-wide, and no repo requires its own test suite (only
claude-review/AI-review checks are required almost everywhere; test/build jobs are advisory-only). - Where it stopped: a 2026-09-11 inventory comment says the "no protection at all" gap (7 repos) is closed — 5 gained
claude-reviewas required, 1 fork retired, 1 archived. The core finding is unchanged: no protected repo requires its own test/build job;dev-envanddotfilesenforce tests only via local hooks (.project-hooks/pre-push), which a push that skips the hook bypasses entirely. No later inventory in the issue confirms any specific test-check count as of 09-24. - First step: re-run the fleet protection survey (
gh api repos/OWNER/REPO/branches/main/protectionacross both orgs) to get a current baseline, then bring the tentative per-repo-class profile from the issue body to Andrew for a decision.
- What: branch protection was inconsistent fleet-wide, and no repo requires its own test suite (only
Closing, per the 2026-10-01 scope decision. The core finding (no repo requires its own test suite) no longer holds for the repos that have suites here:
- claude-config requires
tests(ci(tests): run the suite once, in CI, as a required check claude-config#664). - dotfiles requires
bash-tests(ci(tests): run the suite once, in CI, as a required check dotfiles#387). - claude-wrapper requires
shell-tests(protection edit 2026-10-01; backup in~/.w3-backups-2026-10-01/). - dev-env requires
tests(new workflow, ci(tests): run the test suites on PRs #171).
All four also require
standards-check / run-standards-check. W3 made that check required on 33 of 40 repos. The named exceptions are crazy-larry, networth-agent, kebab-tax and kebab-tax-netlify. Other fleet repos' own test or build jobs were not re-surveyed.- claude-config requires
Origin
Noticed while merging a queue of Dependabot PRs on 2026-08-29: landing one PR
pushed the next to
BEHIND, forcing@dependabot rebase, which pushed theone after it to
BEHIND. Four rebase cycles onamelia-boone(#63, #64, #66),none of which surfaced a real conflict.
The obvious question was "should we turn off require-branch-up-to-date?" A
fleet-wide survey says that is the wrong question — or at least not the first
one. The rebase cycles are a symptom; the protection configuration is
inconsistent and, in most repos, gating on almost nothing.
What the fleet actually looks like
Surveyed all 39 non-archived repos across both orgs
(
gh api repos/OWNER/REPO/branches/main/protection), 2026-08-29:strict: true, requiresclaude-reviewonlystrict: true, requires nothingnetworth-agent,smartwatermelon/.github,dumbify,huddle-transcribe,x-thread-readerstrict: true, requiresvalidate+claude-reviewpersonifyclaude-code-workflows-agents,Instapaper-MCP,nightowlstudiollc/.github,pr-review,repo-template,scripts,superpowersThree distinct problems fall out of that table.
Problem 1:
strict: truewith an empty required-checks list — 5 reposstrictgoverns when required checks must re-run. With zero required checksit enforces a rebase and then gates on nothing at all. This is pure cost with
no protection whatsoever.
All five have CI workflows that could be required.
dumbifyhasvalidate.yml,huddle-transcribehaslint.yml, and every one hasclaude-blocking-review.yml— none are incontexts.Problem 2: test suites are advisory-only, fleet-wide
This is the significant one. No repo requires its own test or build job.
claude-review / run-reviewis the only required check anywhere exceptpersonify:dotfilesbash-tests.yml(18 test files, 110 assertions)projectinsomniabuild.yml(includescheck-audit-baseline.sh)amelia-booneci.yml(Code standards & build)kebab-tax-netlifytest.yml(unit, HTML, functions, audit, icons)personifyvalidateA red test suite does not block a merge in any repo but
personify. Notekebab-tax-netlify#252deliberately removedcontinue-on-error: truefromthree of those jobs to make them blocking — but they were never added to
contexts, so the intent did not actually land.This also interacts with a known failure mode: a green check whose job skipped
without running still reads as green. Requiring a check that can silently skip
is not the same as requiring the work.
Problem 3: six repos have no protection at all
Including
scripts, which is on this machine'sPATHand whose contents runagainst every repo, and
repo-template, which is presumably the seed for newrepos — so the gap propagates.
The original question, in context
Should
strict: truebe turned off?Argument for: the only required check on 27 repos reviews the diff, not
the merged tree. Re-running it after a rebase re-reviews the same diff and
returns the same verdict. The rebase buys nothing the previous run did not
already establish.
Argument against: semantic conflicts — branch and main each merge cleanly
but combine into something broken. Real, but catching it requires test
coverage on the merged result, and per Problem 2 tests are not required
anywhere. So today
strict: trueis not buying that protection either.Tentative shape (to be confirmed, not a decision):
projectinsomnia,amelia-boone,kebab-tax-netlify,tnjcleaning,night-owl-studio,crazy-larry):keep
strict: trueand add the build/test job tocontexts. That iswhen
strictstarts earning its keep.dotfiles,claude-config,dev-env,github-workflows,scripts): add the test job tocontexts;strictbecomes optional and can probably go.
configure it coherently either way.
Open questions
configured ad hoc?
repo-templatehaving no protection suggests the latter.dotfiles/scriptsthatasserts a profile per repo class) rather than clicked in the UI? The
Dependabot auto-merge rollout used a propagation script for exactly this
reason.
enables auto-merge and lets GitHub land the PR once checks pass? Probably
fine, possibly not for checks that skip.
personifyis the only repo doing this right. Worth understanding whetherthat was deliberate.
Not urgent
Nothing is on fire. The cost today is rebase cycles and a weaker gate than
intended, not broken output. Worth a deliberate pass rather than a quick
sweep — changing protection rules across 39 repos is exactly the kind of
change that wants a plan and a dry run.