Skip to content

Branch protection is inconsistent fleet-wide, and no repo requires its own test suite #75

Description

@twistedmelonman

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 the
one after it to BEHIND. Four rebase cycles on amelia-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:

Configuration Count Repos
strict: true, requires claude-review only 27 most of the fleet
strict: true, requires nothing 5 networth-agent, smartwatermelon/.github, dumbify, huddle-transcribe, x-thread-reader
strict: true, requires validate + claude-review 1 personify
No protection at all 6 claude-code-workflows-agents, Instapaper-MCP, nightowlstudiollc/.github, pr-review, repo-template, scripts, superpowers

Three distinct problems fall out of that table.

Problem 1: strict: true with an empty required-checks list — 5 repos

strict governs when required checks must re-run. With zero required checks
it 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. dumbify has validate.yml,
huddle-transcribe has lint.yml, and every one has
claude-blocking-review.yml — none are in contexts.

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-review is the only required check anywhere except
personify:

Repo Has Required?
dotfiles bash-tests.yml (18 test files, 110 assertions) ❌ advisory
projectinsomnia build.yml (includes check-audit-baseline.sh) ❌ advisory
amelia-boone ci.yml (Code standards & build) ❌ advisory
kebab-tax-netlify test.yml (unit, HTML, functions, audit, icons) ❌ advisory
personify validate ✅ required

A red test suite does not block a merge in any repo but personify. Note
kebab-tax-netlify#252 deliberately removed continue-on-error: true from
three 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's PATH and whose contents run
against every repo, and repo-template, which is presumably the seed for new
repos — so the gap propagates.

The original question, in context

Should strict: true be 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: true is not buying that protection either.

Tentative shape (to be confirmed, not a decision):

  • Repos that deploy on merge (projectinsomnia, amelia-boone,
    kebab-tax-netlify, tnjcleaning, night-owl-studio, crazy-larry):
    keep strict: true and add the build/test job to contexts. That is
    when strict starts earning its keep.
  • Repos with no deploy step (dotfiles, claude-config, dev-env,
    github-workflows, scripts): add the test job to contexts; strict
    becomes optional and can probably go.
  • The 5 empty-context repos: decide whether they want protection at all, and
    configure it coherently either way.
  • The 6 unprotected repos: decide deliberately rather than by omission.

Open questions

  • Is there a fleet-standard protection profile anywhere, or has each repo been
    configured ad hoc? repo-template having no protection suggests the latter.
  • Should this be enforced as code (a script in dotfiles/scripts that
    asserts a profile per repo class) rather than clicked in the UI? The
    Dependabot auto-merge rollout used a propagation script for exactly this
    reason.
  • Does requiring a check interact badly with the auto-merge workflow, which
    enables auto-merge and lets GitHub land the PR once checks pass? Probably
    fine, possibly not for checks that skip.
  • personify is the only repo doing this right. Worth understanding whether
    that 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.

Activity

  1. twistedmelonman commented on Sep 11, 2026

    @twistedmelonman
    MemberAuthor

    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.contexts
    dev-env claude-review / run-review
    dotfiles claude-review / run-review
    claude-config claude-review / run-review
    github-workflows claude-review / run-review
    scripts claude-review / run-review

    dev-env has scripts/org-migration/tests/run-tests.sh and dotfiles runs 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-review
    nightowlstudiollc/.github ✅ claude-review / run-review
    pr-review ✅ claude-review / run-review
    repo-template ✅ claude-review / run-review
    scripts ✅ claude-review / run-review
    Instapaper-MCP Fork retired 2026-09-11 — out of fleet
    superpowers Archived 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: true is 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.

  2. twistedmelonman commented on Sep 26, 2026

    @twistedmelonman
    MemberAuthor

    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-review as required, 1 fork retired, 1 archived. The core finding is unchanged: no protected repo requires its own test/build job; dev-env and dotfiles enforce 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/protection across both orgs) to get a current baseline, then bring the tentative per-repo-class profile from the issue body to Andrew for a decision.
  3. twistedmelonman commented on Oct 2, 2026

    @twistedmelonman
    MemberAuthor

    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:

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debtTechnical debt to address

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions