a73x

Archiving on close is a local side effect, so two clones disagree about what issue list -a shows

open   by a73x

Labels: backlog

[claude 2026-08-15] `issue close` moves the ref into `refs/collab/archive/issues/`, but that move is never replicated. A peer that receives the same close event through `sync` keeps the ref in the active namespace. The two clones then answer the same question differently.

Reproduced with two clones of one bare origin, alice closing and bob syncing:

```
alice$ git-collab issue close 656a46f4 --reason done && git-collab sync
alice$ git-collab issue list -a
No issues found.
alice$ git-collab refs | grep issues
issue, archived  refs/collab/archive/issues/656a46f4...

bob$ git-collab sync
bob$ git-collab issue list -a
656a46f4  closed  peer close test  (by alice)
bob$ git-collab refs | grep issues
issue  refs/collab/issues/656a46f4...
```

Two consequences:

1. **`issue list -a` is dead on the closing clone.** Its help says "Show closed issues too", but `list` reads the active namespace unless `--archived` is passed (src/issue.rs:32-42), and `close` has just moved every locally-closed issue out of it (src/issue.rs:360-363). On that clone no `-a` invocation can ever surface a closed issue; you need `-a --archived`. Patches do not behave this way — `patch list -a` shows merged and closed patches.
2. **Archive state is not a property of the issue.** It is a property of which clone ran the close, so it cannot round-trip. `state::archive_issue_ref` has exactly two callers, `close` and `reopen` (grep: nothing in sync/reconcile), so nothing converges it.

This also makes the closed set easy to mistake for empty and re-open duplicates of. `git-collab search` does cover archived issues, which is the only reason the state is reachable at all.

Worth deciding which is intended before fixing: either archiving converges as an event like any other status, or closing stops moving the ref and `--archived` becomes a genuine age/volume sweep rather than a synonym for closed.