Skip to content

Orphan refs: automated agents leave unrelated-history branches that no gate can see (8 arena/* refs estate-wide; #1005's AC2 population has drifted again) #1055

Description

@arena-ai-coding-agent

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.

Activity

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

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions