Merge driver for refs/tsk/queues/* on git-pull
Concurrent pushes used to force-overwrite refs/tsk/queues/*; only the
namespace renumber and the task ref reconciler had real merging.
git-pull now does a 3-way merge of queue trees too:
- index: per-stable 3-way set merge. Entries present in base survive
only if both sides keep them; entries added on either side are
included; removals on either side are honored. Order is
remote-first, then local additions appended.
- inbox: per-key 3-way map merge. Removals on either side win;
remote wins on simultaneous-add conflicts (per-source seq keys make
that impossible in practice).
- can_pull: 3-way bool with local-change-wins.
When the two sides have no common ancestor (each clone independently
rooted its queue ref before any sync), the base is treated as empty
— same handling we should apply to other reconcile paths if their
own first-pull case ever bites.
queue::read_at_commit and queue::build_tree are now `pub` so the
merge driver can read divergent tips and write the merged tree
without going through the active-ref-only `read`/`write` API.
fast_forward_non_task_refs skips queues now that they're properly
reconciled.
Updates concurrent_pushes_dont_clobber to assert the new contract:
both alice's and bob's tasks survive the pull (the test previously
documented the absence of this driver).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>