TODO.md:51-52 already carries this as a Future Step.
The catch — do not use --merged
git branch -r --merged origin/main reports zero merged branches, because
PRs in this repo are squash-merged: the branch tip is never an ancestor of main. A naive --merged sweep would delete nothing, and a naive
"delete everything that isn't main" would risk destroying unlanded work.
Several of these names also look like superseded duplicates of one another
(three variants for issue 99, two for issue 87, three for issue 82), which
suggests abandoned attempts alongside the one that actually landed. Those still
need checking rather than assuming.
Implementation requirements
For each branch, determine whether its content actually landed on main.
Squash-merges mean you must compare content, not ancestry. Workable
approaches: git cherry -v origin/main <branch>, or diffing the branch
against its merge-base with main
(git diff $(git merge-base main <branch>) <branch>) and checking whether
that diff is already present in main, or matching the branch to its closed
PR via the tracker.
Cross-reference the tracker: most of these map to a numbered issue/PR that is
closed and merged. A branch whose PR was closed without merging is not
safe to delete on that basis alone.
Produce a written classification of all 24 before deleting anything: landed
(safe), superseded duplicate (safe, name the branch that won), or unlanded (do not delete).
Anything unlanded or ambiguous stays, and gets listed in the PR/issue comment
so it can be triaged separately. Do not guess.
Delete only on origin, and only after the classification is posted here.
Local branches in the shared clone are already down to main alone.
Do not touch main, and do not force-push anything.
Definition of done
A comment on this issue classifies all 24 branches as landed, superseded,
or unlanded, with the evidence used for each.
Every branch classified landed or superseded is deleted from origin.
Every branch classified unlanded still exists and is listed for triage.
git ls-remote --heads origin afterwards shows only main plus any
deliberately retained branches.
TODO.md Future Step for branch pruning is removed in the same commit as
whatever documentation change accompanies this.
## Problem
`origin` carries 26 branches. Excluding `main`, 24 are stale feature branches
from already-landed work:
```
chore/token-list-enrichment
feat/issue-131-transaction-view-layout
feat/message-signing
feature/82-warn-new-address
feature/82-zero-history-warning
feature/copy-flash-feedback
feature/expanded-warnings
feature/issue-82-new-address-warning
feature/show-private-key
fix/116-timestamps-include-timezone
fix/55-swap-show-own-address
fix/59-transaction-view-ui-policies
fix/70-confirm-tx-contract-display
fix/77-confirm-tx-persist
fix/87-consistent-error-display
fix/87-consistent-error-display-v2
fix/99-block-number-clickable
fix/consistent-error-display
fix/cross-wallet-duplicate-detection
fix/issue-58-receive-address-consistency
fix/issue-72-address-token-tx-history
fix/issue-99-block-number-link-copy
issue-99-block-number-external-link
issue-99-block-number-styling
```
`TODO.md:51-52` already carries this as a Future Step.
## The catch — do not use `--merged`
`git branch -r --merged origin/main` reports **zero** merged branches, because
PRs in this repo are squash-merged: the branch tip is never an ancestor of
`main`. A naive `--merged` sweep would delete nothing, and a naive
"delete everything that isn't main" would risk destroying unlanded work.
Several of these names also look like superseded duplicates of one another
(three variants for issue 99, two for issue 87, three for issue 82), which
suggests abandoned attempts alongside the one that actually landed. Those still
need checking rather than assuming.
## Implementation requirements
- For **each** branch, determine whether its content actually landed on `main`.
Squash-merges mean you must compare content, not ancestry. Workable
approaches: `git cherry -v origin/main <branch>`, or diffing the branch
against its merge-base with `main`
(`git diff $(git merge-base main <branch>) <branch>`) and checking whether
that diff is already present in `main`, or matching the branch to its closed
PR via the tracker.
- Cross-reference the tracker: most of these map to a numbered issue/PR that is
closed and merged. A branch whose PR was closed **without** merging is not
safe to delete on that basis alone.
- Produce a written classification of all 24 before deleting anything: landed
(safe), superseded duplicate (safe, name the branch that won), or
**unlanded** (do not delete).
- Anything unlanded or ambiguous stays, and gets listed in the PR/issue comment
so it can be triaged separately. Do not guess.
- Delete only on `origin`, and only after the classification is posted here.
Local branches in the shared clone are already down to `main` alone.
- Do not touch `main`, and do not force-push anything.
## Definition of done
- [ ] A comment on this issue classifies all 24 branches as landed, superseded,
or unlanded, with the evidence used for each.
- [ ] Every branch classified landed or superseded is deleted from `origin`.
- [ ] Every branch classified unlanded still exists and is listed for triage.
- [ ] `git ls-remote --heads origin` afterwards shows only `main` plus any
deliberately retained branches.
- [ ] `TODO.md` Future Step for branch pruning is removed in the same commit as
whatever documentation change accompanies this.
Plan: classify every remote branch except main, next, prod and open-PR branches (the 24 above plus the head branches of squash-merged PRs since), from the tracker and from content where there is no merged PR; post the classification here first; delete only landed or superseded ones; list anything unlanded for triage. A small PR then updates TODO.md.
Model: opus-5-5
Plan: classify every remote branch except `main`, `next`, `prod` and open-PR branches (the 24 above plus the head branches of squash-merged PRs since), from the tracker and from content where there is no merged PR; post the classification here first; delete only landed or superseded ones; list anything unlanded for triage. A small PR then updates `TODO.md`.
Model: opus-5-5
Classification of every branch on origin except main, next and issue-487-firefox-allowed-error (head of the open #490). There is no prod. Every pull request from these branches is marked closed without merging, so each branch was checked by content against origin/next. Three branches on the issue's list, chore/token-list-enrichment, feat/message-signing and fix/59-transaction-view-ui-policies, were already gone from origin.
viewing the key landed through #31, but this branch's README clipboard policy section, which the owner asked for on #19, is not in next
fix/consistent-error-display
unlanded, kept
#88 was closed because #87 was said to be covered by #92, which changed only the approve-tx and approve-sign errors; next still uses export-privkey-flash, delete-wallet-flash and showFlash() for these validation errors
Deleting the 17 landed and superseded branches from origin now.
For triage: #87 is closed, but its change never landed; the three error-display branches are versions of that one change, written against February's code. The clipboard policy section is the only part of feature/show-private-key missing from next.
Model: opus-5-5
Classification of every branch on `origin` except `main`, `next` and `issue-487-firefox-allowed-error` (head of the open https://git.eeqj.de/sneak/AutistMask/pulls/490). There is no `prod`. Every pull request from these branches is marked closed without merging, so each branch was checked by content against `origin/next`. Three branches on the issue's list, `chore/token-list-enrichment`, `feat/message-signing` and `fix/59-transaction-view-ui-policies`, were already gone from `origin`.
| Branch | Class | Evidence |
| --- | --- | --- |
| `fix/99-block-number-clickable` | landed | same patch as `5565e76`, merged by https://git.eeqj.de/sneak/AutistMask/pulls/102 |
| `issue-99-block-number-external-link` | landed | same patch as `5565e76`, merged by https://git.eeqj.de/sneak/AutistMask/pulls/102 |
| `fix/issue-99-block-number-link-copy` | superseded by `issue-99-block-number-link` | https://git.eeqj.de/sneak/AutistMask/pulls/104 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/102 |
| `issue-99-block-number-styling` | superseded by `issue-99-block-number-link` | https://git.eeqj.de/sneak/AutistMask/pulls/106 closed as duplicate of https://git.eeqj.de/sneak/AutistMask/pulls/102 |
| `feature/82-warn-new-address` | superseded by `issue-82-zero-tx-warning` | https://git.eeqj.de/sneak/AutistMask/pulls/108 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/98 |
| `feature/82-zero-history-warning` | superseded by `issue-82-zero-tx-warning` | https://git.eeqj.de/sneak/AutistMask/pulls/105 closed as duplicate of https://git.eeqj.de/sneak/AutistMask/pulls/98 |
| `feature/issue-82-new-address-warning` | superseded by `issue-82-zero-tx-warning` | https://git.eeqj.de/sneak/AutistMask/pulls/109 closed as duplicate of https://git.eeqj.de/sneak/AutistMask/pulls/98 |
| `feature/copy-flash-feedback` | superseded by `fix/issue-100-copy-flash-feedback` | https://git.eeqj.de/sneak/AutistMask/pulls/112 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/113 |
| `feature/expanded-warnings` | superseded by `fix/issue-114-expanded-warnings` | https://git.eeqj.de/sneak/AutistMask/pulls/119 closed; https://git.eeqj.de/sneak/AutistMask/pulls/118 merged for the same issue, and its scam, burn and contract warnings are in `next` |
| `fix/116-timestamps-include-timezone` | superseded by `fix/issue-116-timestamp-timezone` | https://git.eeqj.de/sneak/AutistMask/pulls/122 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/120 |
| `fix/55-swap-show-own-address` | superseded by `fix/55-swap-tx-address` | https://git.eeqj.de/sneak/AutistMask/pulls/56 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/57 |
| `fix/70-confirm-tx-contract-display` | superseded by `fix/confirm-tx-contract-display` | https://git.eeqj.de/sneak/AutistMask/pulls/74 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/73 |
| `fix/77-confirm-tx-persist` | superseded by `fix/issue-77-confirm-tx-persist` | https://git.eeqj.de/sneak/AutistMask/pulls/81 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/79 |
| `fix/cross-wallet-duplicate-detection` | superseded by `fix/issue-111-cross-wallet-dedup` | https://git.eeqj.de/sneak/AutistMask/pulls/117 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/115 |
| `fix/issue-72-address-token-tx-history` | superseded by `fix/72-address-token-tx-history` | https://git.eeqj.de/sneak/AutistMask/pulls/75 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/76 |
| `fix/issue-58-receive-address-consistency` | superseded by its own earlier commit | that commit merged as https://git.eeqj.de/sneak/AutistMask/pulls/69; the tip is the rival layout from https://git.eeqj.de/sneak/AutistMask/pulls/71, closed as duplicate |
| `feat/issue-131-transaction-view-layout` | superseded by `fix/issue-131-transaction-view-reorder` | https://git.eeqj.de/sneak/AutistMask/pulls/132 closed as duplicate of the merged https://git.eeqj.de/sneak/AutistMask/pulls/133 |
| `feature/show-private-key` | unlanded, kept | viewing the key landed through https://git.eeqj.de/sneak/AutistMask/pulls/31, but this branch's README clipboard policy section, which the owner asked for on https://git.eeqj.de/sneak/AutistMask/issues/19, is not in `next` |
| `fix/consistent-error-display` | unlanded, kept | https://git.eeqj.de/sneak/AutistMask/pulls/88 was closed because https://git.eeqj.de/sneak/AutistMask/issues/87 was said to be covered by https://git.eeqj.de/sneak/AutistMask/pulls/92, which changed only the approve-tx and approve-sign errors; `next` still uses `export-privkey-flash`, `delete-wallet-flash` and `showFlash()` for these validation errors |
| `fix/87-consistent-error-display` | unlanded, kept | https://git.eeqj.de/sneak/AutistMask/pulls/90, nearly the same change as https://git.eeqj.de/sneak/AutistMask/pulls/88 |
| `fix/87-consistent-error-display-v2` | unlanded, kept | https://git.eeqj.de/sneak/AutistMask/pulls/96, the same change without the approve-tx part |
Deleting the 17 landed and superseded branches from `origin` now.
For triage: https://git.eeqj.de/sneak/AutistMask/issues/87 is closed, but its change never landed; the three error-display branches are versions of that one change, written against February's code. The clipboard policy section is the only part of `feature/show-private-key` missing from `next`.
Model: opus-5-5
The 17 landed and superseded branches above are deleted from origin. The four unlanded ones stay for triage, along with main, next, the head of the open #490, and issue-167-prune-branches for #491, which adds the TODO.md Completed Steps entry.
Model: opus-5-5
The 17 landed and superseded branches above are deleted from `origin`. The four unlanded ones stay for triage, along with `main`, `next`, the head of the open https://git.eeqj.de/sneak/AutistMask/pulls/490, and `issue-167-prune-branches` for https://git.eeqj.de/sneak/AutistMask/pulls/491, which adds the `TODO.md` Completed Steps entry.
Model: opus-5-5
Classification of the three branches on this issue's list that were deleted from origin on 2026-09-09, from their last commits, fetched by hash:
Branch
Class
Evidence
feat/message-signing (71f1d11)
landed
9e45c75 in next is a later version of this commit (same author, author date, message and parent) and has every line 71f1d11 adds, except that next keeps transaction approvals, not only sign approvals, pending when the popup closes
fix/59-transaction-view-ui-policies (1df770d)
landed
#62 merged its first commit, 607d234; the tip 1df770d, not part of that merge, adds a plain-number rawValue to the swap Amount line and takes the token from the Token In line, the same fix 2fbed34 landed through #94
chore/token-list-enrichment (f7a2437)
unlanded
the owner's commit adding scripts/apply-enrichment.mjs, scripts/enrich-tokens.mjs and scripts/token-enrichment.json; none of the three is in next, only the token names and URLs they produced are in src/shared/tokenList.js (since aca8c4b); no pull request was opened from it
Restored: chore/token-list-enrichment is re-created on origin at f7a2437, so its work is kept. The two landed branches stay deleted.
For triage: chore/token-list-enrichment; whether to bring its tooling into the repo is the open question #495.
Model: opus-5-5
Classification of the three branches on this issue's list that were deleted from `origin` on 2026-09-09, from their last commits, fetched by hash:
| Branch | Class | Evidence |
| --- | --- | --- |
| `feat/message-signing` (`71f1d11`) | landed | `9e45c75` in `next` is a later version of this commit (same author, author date, message and parent) and has every line `71f1d11` adds, except that `next` keeps transaction approvals, not only sign approvals, pending when the popup closes |
| `fix/59-transaction-view-ui-policies` (`1df770d`) | landed | https://git.eeqj.de/sneak/AutistMask/pulls/62 merged its first commit, `607d234`; the tip `1df770d`, not part of that merge, adds a plain-number `rawValue` to the swap Amount line and takes the token from the Token In line, the same fix `2fbed34` landed through https://git.eeqj.de/sneak/AutistMask/pulls/94 |
| `chore/token-list-enrichment` (`f7a2437`) | unlanded | the owner's commit adding `scripts/apply-enrichment.mjs`, `scripts/enrich-tokens.mjs` and `scripts/token-enrichment.json`; none of the three is in `next`, only the token names and URLs they produced are in `src/shared/tokenList.js` (since `aca8c4b`); no pull request was opened from it |
Restored: `chore/token-list-enrichment` is re-created on `origin` at `f7a2437`, so its work is kept. The two landed branches stay deleted.
For triage: `chore/token-list-enrichment`; whether to bring its tooling into the repo is the open question https://git.eeqj.de/sneak/AutistMask/issues/495.
Model: opus-5-5
feature/show-private-key (78c050e) is now superseded, not unlanded: viewing the key landed through #31 (the ExportPrivKey screen), and its README clipboard policy section, the only part missing, landed through #494 (the Clipboard paragraph under ExportPrivKey). Deleting it from origin now.
Model: opus-5-5
`feature/show-private-key` (`78c050e`) is now superseded, not unlanded: viewing the key landed through https://git.eeqj.de/sneak/AutistMask/pulls/31 (the ExportPrivKey screen), and its README clipboard policy section, the only part missing, landed through https://git.eeqj.de/sneak/AutistMask/pulls/494 (the Clipboard paragraph under ExportPrivKey). Deleting it from `origin` now.
Model: opus-5-5
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
origincarries 26 branches. Excludingmain, 24 are stale feature branchesfrom already-landed work:
TODO.md:51-52already carries this as a Future Step.The catch — do not use
--mergedgit branch -r --merged origin/mainreports zero merged branches, becausePRs in this repo are squash-merged: the branch tip is never an ancestor of
main. A naive--mergedsweep would delete nothing, and a naive"delete everything that isn't main" would risk destroying unlanded work.
Several of these names also look like superseded duplicates of one another
(three variants for issue 99, two for issue 87, three for issue 82), which
suggests abandoned attempts alongside the one that actually landed. Those still
need checking rather than assuming.
Implementation requirements
main.Squash-merges mean you must compare content, not ancestry. Workable
approaches:
git cherry -v origin/main <branch>, or diffing the branchagainst its merge-base with
main(
git diff $(git merge-base main <branch>) <branch>) and checking whetherthat diff is already present in
main, or matching the branch to its closedPR via the tracker.
closed and merged. A branch whose PR was closed without merging is not
safe to delete on that basis alone.
(safe), superseded duplicate (safe, name the branch that won), or
unlanded (do not delete).
so it can be triaged separately. Do not guess.
origin, and only after the classification is posted here.Local branches in the shared clone are already down to
mainalone.main, and do not force-push anything.Definition of done
or unlanded, with the evidence used for each.
origin.git ls-remote --heads originafterwards shows onlymainplus anydeliberately retained branches.
TODO.mdFuture Step for branch pruning is removed in the same commit aswhatever documentation change accompanies this.
Plan: classify every remote branch except
main,next,prodand open-PR branches (the 24 above plus the head branches of squash-merged PRs since), from the tracker and from content where there is no merged PR; post the classification here first; delete only landed or superseded ones; list anything unlanded for triage. A small PR then updatesTODO.md.Model: opus-5-5
Classification of every branch on
originexceptmain,nextandissue-487-firefox-allowed-error(head of the open #490). There is noprod. Every pull request from these branches is marked closed without merging, so each branch was checked by content againstorigin/next. Three branches on the issue's list,chore/token-list-enrichment,feat/message-signingandfix/59-transaction-view-ui-policies, were already gone fromorigin.fix/99-block-number-clickable5565e76, merged by #102issue-99-block-number-external-link5565e76, merged by #102fix/issue-99-block-number-link-copyissue-99-block-number-linkissue-99-block-number-stylingissue-99-block-number-linkfeature/82-warn-new-addressissue-82-zero-tx-warningfeature/82-zero-history-warningissue-82-zero-tx-warningfeature/issue-82-new-address-warningissue-82-zero-tx-warningfeature/copy-flash-feedbackfix/issue-100-copy-flash-feedbackfeature/expanded-warningsfix/issue-114-expanded-warningsnextfix/116-timestamps-include-timezonefix/issue-116-timestamp-timezonefix/55-swap-show-own-addressfix/55-swap-tx-addressfix/70-confirm-tx-contract-displayfix/confirm-tx-contract-displayfix/77-confirm-tx-persistfix/issue-77-confirm-tx-persistfix/cross-wallet-duplicate-detectionfix/issue-111-cross-wallet-dedupfix/issue-72-address-token-tx-historyfix/72-address-token-tx-historyfix/issue-58-receive-address-consistencyfeat/issue-131-transaction-view-layoutfix/issue-131-transaction-view-reorderfeature/show-private-keynextfix/consistent-error-displaynextstill usesexport-privkey-flash,delete-wallet-flashandshowFlash()for these validation errorsfix/87-consistent-error-displayfix/87-consistent-error-display-v2Deleting the 17 landed and superseded branches from
originnow.For triage: #87 is closed, but its change never landed; the three error-display branches are versions of that one change, written against February's code. The clipboard policy section is the only part of
feature/show-private-keymissing fromnext.Model: opus-5-5
The 17 landed and superseded branches above are deleted from
origin. The four unlanded ones stay for triage, along withmain,next, the head of the open #490, andissue-167-prune-branchesfor #491, which adds theTODO.mdCompleted Steps entry.Model: opus-5-5
Classification of the three branches on this issue's list that were deleted from
originon 2026-09-09, from their last commits, fetched by hash:feat/message-signing(71f1d11)9e45c75innextis a later version of this commit (same author, author date, message and parent) and has every line71f1d11adds, except thatnextkeeps transaction approvals, not only sign approvals, pending when the popup closesfix/59-transaction-view-ui-policies(1df770d)607d234; the tip1df770d, not part of that merge, adds a plain-numberrawValueto the swap Amount line and takes the token from the Token In line, the same fix2fbed34landed through #94chore/token-list-enrichment(f7a2437)scripts/apply-enrichment.mjs,scripts/enrich-tokens.mjsandscripts/token-enrichment.json; none of the three is innext, only the token names and URLs they produced are insrc/shared/tokenList.js(sinceaca8c4b); no pull request was opened from itRestored:
chore/token-list-enrichmentis re-created onoriginatf7a2437, so its work is kept. The two landed branches stay deleted.For triage:
chore/token-list-enrichment; whether to bring its tooling into the repo is the open question #495.Model: opus-5-5
feature/show-private-key(78c050e) is now superseded, not unlanded: viewing the key landed through #31 (the ExportPrivKey screen), and its README clipboard policy section, the only part missing, landed through #494 (the Clipboard paragraph under ExportPrivKey). Deleting it fromoriginnow.Model: opus-5-5