Filed unassigned by the domain:ui execution seat (PM session session_01CRJge11jso9TpXRWFt1Z49). Recording a platform fact, not proposing a policy. domain:*, type and grading are triage's to produce.
Dedup before filing: repo-scoped semantic search for the branch-deletion/proxy-403 shape returned zero. ⛔ A zero is not a reading on its own, so it was reverse-checked with a query the engine can answer — a git/process query returns #3430 (shared refs/stash), #5239 (the force-push ban), #3243 (gh pr merge 405 vs the merge queue). None is this. The zero stands.
The fact
An agent seat can push a branch and open a PR, but cannot delete a remote branch. Every ref-deletion push is refused by the agent proxy:
error: RPC failed; HTTP 403 curl 22 The requested URL returned error: 403
send-pack: unexpected disconnect while reading sideband packet
fatal: the remote end hung up unexpectedly
Everything up-to-date
Observed independently by two agents in one session, same signature: a dev seat tried 4 times on its own branch, and this PM seat tried once on the same ref. There is also no MCP path — the GitHub tool surface exposes create_branch with no delete counterpart, and no gh CLI is present in the container.
⚠️ Note the last line: after the failure git prints Everything up-to-date. A caller that checks only the tail of the output, or that treats a non-empty final line as success, reads a refused deletion as a completed one. That is the same "success receipt on a silent failure" shape this repo has spent several cards removing elsewhere.
Why it costs something
Branch creation is cheap and routine for agents — write-permission probes, throwaway comparison trees, abandoned attempts. With no deletion path, every one of them is permanent. The cost is not any single ref; it is that the branch list is monotonically increasing and no seat can garbage-collect its own leavings. git ls-remote --heads origin 'refs/heads/claude/issue-*' already returns a long list of branches whose PRs merged.
Concrete leftover from this session
claude/probe-6716a-writecheck, pointing at faac0d93554cd67d92c92e621094154ce13dfc5e (an old main tip). It was created as a first-minute write probe during objectui#6716 and has no PR and no content of its own. It needs deleting by someone with a working delete path — this seat cannot.
What is NOT measured
- Whether the 403 is the proxy's policy, a token-scope limit, or a branch-protection rule. The error is returned before any GitHub-level message reaches us, so the layer is not identified from here.
- Whether deletion works from other seats or environments — only this container's path was tested.
- Whether the same restriction applies to tags.
- How many stale
claude/* branches currently exist repo-wide. Deliberately not counted here: a census invites a bulk-cleanup proposal, and the disposition of merged-PR branches is a policy question, not this card's.
What this card is not asking for
⛔ Not proposing auto-deletion of merged branches, and ⛔ not proposing a cleanup sweep. Either would be a policy decision about the repo's branch lifecycle. This records the capability gap and the one concrete leftover, so the next agent that cannot delete its probe branch does not spend four attempts rediscovering it.
Filed unassigned by the
domain:uiexecution seat (PM sessionsession_01CRJge11jso9TpXRWFt1Z49). Recording a platform fact, not proposing a policy.domain:*,typeand grading are triage's to produce.Dedup before filing: repo-scoped semantic search for the branch-deletion/proxy-403 shape returned zero. ⛔ A zero is not a reading on its own, so it was reverse-checked with a query the engine can answer — a git/process query returns #3430 (shared
refs/stash), #5239 (the force-push ban), #3243 (gh pr merge405 vs the merge queue). None is this. The zero stands.The fact
An agent seat can push a branch and open a PR, but cannot delete a remote branch. Every ref-deletion push is refused by the agent proxy:
Observed independently by two agents in one session, same signature: a dev seat tried 4 times on its own branch, and this PM seat tried once on the same ref. There is also no MCP path — the GitHub tool surface exposes
create_branchwith no delete counterpart, and noghCLI is present in the container.Everything up-to-date. A caller that checks only the tail of the output, or that treats a non-empty final line as success, reads a refused deletion as a completed one. That is the same "success receipt on a silent failure" shape this repo has spent several cards removing elsewhere.Why it costs something
Branch creation is cheap and routine for agents — write-permission probes, throwaway comparison trees, abandoned attempts. With no deletion path, every one of them is permanent. The cost is not any single ref; it is that the branch list is monotonically increasing and no seat can garbage-collect its own leavings.
git ls-remote --heads origin 'refs/heads/claude/issue-*'already returns a long list of branches whose PRs merged.Concrete leftover from this session
claude/probe-6716a-writecheck, pointing atfaac0d93554cd67d92c92e621094154ce13dfc5e(an oldmaintip). It was created as a first-minute write probe during objectui#6716 and has no PR and no content of its own. It needs deleting by someone with a working delete path — this seat cannot.What is NOT measured
claude/*branches currently exist repo-wide. Deliberately not counted here: a census invites a bulk-cleanup proposal, and the disposition of merged-PR branches is a policy question, not this card's.What this card is not asking for
⛔ Not proposing auto-deletion of merged branches, and ⛔ not proposing a cleanup sweep. Either would be a policy decision about the repo's branch lifecycle. This records the capability gap and the one concrete leftover, so the next agent that cannot delete its probe branch does not spend four attempts rediscovering it.