Summary
Branch hygiene in this estate detects staleness, not unmergeability. A ref can be left behind that is not stale, not diverged in any meaningful sense, and not reachable by any automated cleanup policy — because it has no merge base with the default branch.
Measured on metadatastician/ziz, 2026-09-28:
arena/01a0d3a4-rsr-template-repo @ 121ebaeeb9b2543c119babae3fdc086bfd99f5e8
git log -1 --format=%P # (empty) -> root commit
gh api compare main...branch # HTTP 404 "No common ancestor"
the shared compare URL # 404
git ls-tree -r | wc -l # 479 files, 478 byte-identical to main
No PR existed, and none was possible. It was the initialisation commit of an agent session whose name says rsr-template-repo while the push landed in ziz — the branch name recorded the intended repo, not the actual one.
The general failure
A pin's comment is an assertion, never a measurement. The same is true of a branch name.
arena/01a0d3a4-rsr-template-repo looked like a session working on the template. It was working on ziz, and nothing in the estate measures the difference. This is the same shape as #1005 (a pin spelled v4.38.0 that dereferences to v4.38.1) and #968 (an actions.lock entry that disagrees with its workflow): the artefact's description disagrees with the artefact.
The consequence is worse than a stray ref. Because there is no merge base, every divergence metric returns a number and none of them mean anything. A reviewer sees a branch, a commit count, and a diff of the entire repository, and must work out from first principles that it is unmergeable — and that the reason is structural, not a conflict to resolve.
Measured footprint
8 arena/* refs across 420 repos in both orgs, classified by disposition:
| disposition |
count |
where |
| merged, content-identical to default → prunable |
5 |
MetaManifold-WebUI ×4, ziz ×1 |
| open PR → live, do not touch |
3 |
metadatastician-governance#45, occupancy-types#2, CoprocessorRuntime.jl#2 |
The ziz orphan was deleted on 2026-09-28 (recoverable at 121ebae). Its diff was correct — it carried the fix for a live defect on main — and was re-landed from a branch with real history in metadatastician/ziz#2. Dead as a branch, right as a patch. That combination is what no current gate can express.
The 4 MetaManifold-WebUI refs are content-identical to main (compare → files: 0) and are safe to prune. The agent token had no write access to hyperpolymath/*; run:
for br in 01a0db23 01a0de46 01a0df2a 01a0df7c; do
gh api -X DELETE "repos/hyperpolymath/MetaManifold-WebUI/git/refs/heads/arena/${br}-metamanifold-webui"
done
Addendum — #1005's AC2 population has drifted again
Re-measured 2026-09-28 across both orgs by reading each file rather than trusting a code search:
| state |
files |
pin 1c5b6756 (blocked v4.38.1) while carrying the # v4.38.0 comment |
28 |
pin b96794f0 (genuine v4.38.0) |
21 |
pin 2892aa5e (v4.38.2) behind a stale v4.38.0 comment |
15 |
Affected repos include Causals.jl, CoprocessorRuntime.jl, EpistemicTypes.jl, my-lang, nexia-list, pons-asinorum, scripts, verisimdb, vexometer, knot-knot, marid, and ziz.
AC2 was executed over the population that existed at the time, not over repos that drifted afterwards. The estate remains split against itself, and the smaller half is on the version policy forbids — which is where it was before AC1.
Also new since AC1: v4.38.2 exists (commit 2892aa5e, 2026-09-24) and 15 files already pin it. That is exactly the "revisit deliberately" trigger recorded in the dependabot.yml HOLD. It is an AC1-class owner decision, so it was not applied per-repo.
Acceptance criteria
AC1 — A gate asserts that every non-default ref shares a merge base with the default branch. It must fail, not warn: a ::warning:: cannot fail a job. Hypatia rule proposed as GS009 in hyperpolymath/hypatia#868.
AC2 — The estate profile names what automated agents may push: which identity, which ref namespace, and what must be true of the first commit — in particular that an initialisation commit must not be pushed as an orphan into a repository that already has history.
AC3 — Branch hygiene classifies by disposition (merged/identical → prune; open PR → leave; unmerged → decide; no PR + no merge base → orphan) rather than by staleness or age. Name prefixes are not evidence.
AC4 — No muting. No exemption list keyed on branch-name prefix, and no allowlisting of a name pattern: the observed instance is an arena/* ref, so a prefix-based mute would hide the entire class.
AC5 — For #1005 specifically: re-measure before declaring AC2 complete, and state the population as a date-stamped measurement rather than a list, since the list decays.
Provenance
Found while triaging the orphan ref on metadatastician/ziz. Related but not covered by: #1005, #1037, #968, #669, #323, #324.
Summary
Branch hygiene in this estate detects staleness, not unmergeability. A ref can be left behind that is not stale, not diverged in any meaningful sense, and not reachable by any automated cleanup policy — because it has no merge base with the default branch.
Measured on
metadatastician/ziz, 2026-09-28:No PR existed, and none was possible. It was the initialisation commit of an agent session whose name says
rsr-template-repowhile the push landed inziz— the branch name recorded the intended repo, not the actual one.The general failure
A pin's comment is an assertion, never a measurement. The same is true of a branch name.
arena/01a0d3a4-rsr-template-repolooked like a session working on the template. It was working onziz, and nothing in the estate measures the difference. This is the same shape as #1005 (a pin spelledv4.38.0that dereferences tov4.38.1) and #968 (anactions.lockentry that disagrees with its workflow): the artefact's description disagrees with the artefact.The consequence is worse than a stray ref. Because there is no merge base, every divergence metric returns a number and none of them mean anything. A reviewer sees a branch, a commit count, and a diff of the entire repository, and must work out from first principles that it is unmergeable — and that the reason is structural, not a conflict to resolve.
Measured footprint
8
arena/*refs across 420 repos in both orgs, classified by disposition:MetaManifold-WebUI×4,ziz×1metadatastician-governance#45,occupancy-types#2,CoprocessorRuntime.jl#2The
zizorphan was deleted on 2026-09-28 (recoverable at121ebae). Its diff was correct — it carried the fix for a live defect onmain— and was re-landed from a branch with real history inmetadatastician/ziz#2. Dead as a branch, right as a patch. That combination is what no current gate can express.The 4
MetaManifold-WebUIrefs are content-identical tomain(compare→files: 0) and are safe to prune. The agent token had no write access tohyperpolymath/*; run:Addendum — #1005's AC2 population has drifted again
Re-measured 2026-09-28 across both orgs by reading each file rather than trusting a code search:
1c5b6756(blockedv4.38.1) while carrying the# v4.38.0commentb96794f0(genuinev4.38.0)2892aa5e(v4.38.2) behind a stale v4.38.0 commentAffected repos include
Causals.jl,CoprocessorRuntime.jl,EpistemicTypes.jl,my-lang,nexia-list,pons-asinorum,scripts,verisimdb,vexometer,knot-knot,marid, andziz.AC2 was executed over the population that existed at the time, not over repos that drifted afterwards. The estate remains split against itself, and the smaller half is on the version policy forbids — which is where it was before AC1.
Also new since AC1:
v4.38.2exists (commit2892aa5e, 2026-09-24) and 15 files already pin it. That is exactly the "revisit deliberately" trigger recorded in thedependabot.ymlHOLD. It is an AC1-class owner decision, so it was not applied per-repo.Acceptance criteria
AC1 — A gate asserts that every non-default ref shares a merge base with the default branch. It must fail, not warn: a
::warning::cannot fail a job. Hypatia rule proposed as GS009 inhyperpolymath/hypatia#868.AC2 — The estate profile names what automated agents may push: which identity, which ref namespace, and what must be true of the first commit — in particular that an initialisation commit must not be pushed as an orphan into a repository that already has history.
AC3 — Branch hygiene classifies by disposition (merged/identical → prune; open PR → leave; unmerged → decide; no PR + no merge base → orphan) rather than by staleness or age. Name prefixes are not evidence.
AC4 — No muting. No exemption list keyed on branch-name prefix, and no allowlisting of a name pattern: the observed instance is an
arena/*ref, so a prefix-based mute would hide the entire class.AC5 — For #1005 specifically: re-measure before declaring AC2 complete, and state the population as a date-stamped measurement rather than a list, since the list decays.
Provenance
Found while triaging the orphan ref on
metadatastician/ziz. Related but not covered by: #1005, #1037, #968, #669, #323, #324.