Changes touching this path
- Spawn DevX (#232): loot lanes observability, --ticket lane spawn, wayfinder claim-to-lane
f0a885c2 · dbf3dbe6… - review refs carry the position, not the dock (#281)
Every lane's home dock is main, so dock-named review refs made N
concurrent lanes share one review/main branch: the second lane's
ferry --with-wip force-pushed over the first's in-flight PR head,
and either position's reap pass could misjudge (and retire) the
other's live entry, since liveness reads the positional working
pointer a foreign position cannot see.
The review lane is now keyed by its owner position end to end:
- ferry projects review/<lane-id> from a lane, review/<dock> on the
primary; the wip and pr-map ledgers gain an owner column (- =
primary; pre-#281 short rows parse as primary-owned) and the
review line carries owner=.
- Reap is owner-scoped: only the owner judges liveness; a foreign
pass reaps exactly the entries whose owner lane is gone from the
registry, so an abandoned lane's review ref dies with it instead
of leaking.
- land derives the collapse branch from the pr-map lane's owner and
refuses to run from any other position: it finalizes the current
position's working change, and the dock guard cannot catch that
mismatch when every lane's dock is main.
Docs: ADR 0033 amendment, concurrent.md (review projection is now
genuinely parallel-safe), workflow.md, CONTEXT.md review-lane entry.
aa68437a · dbf3dbe6…diff - Workspace accepts its clock; lane flag-gate goes pure so cmd_* tests never touch a real .loot (#322)
20ac82e1 · dbf3dbe6…diff - Lift the wip review-lane ledger out of ferry.rs into ledger.rs
WipState/WipEntry — the `wip` ledger of in-flight review-lane projections —
lived in ferry.rs (the git-bridge file) though they are a typed on-disk-format
owner with nothing to do with git mechanics, read cross-crate by the loot-first
orchestrator. Move them into ledger.rs, joining PrMap as the two typed owners of
the `.loot/git-mirror/` ledgers (both sharing the review_handle rule). The old
"it lives in ferry because ferry writes it" rationale never held — PrMap's writer
(the orchestrator) doesn't own it either; ledger.rs does, because loot lanes reads
it and the workspace dependency points this way.
Not a pure relocation: ferry reached straight into `WipState.entries` (a ~50-line
reap loop, an upsert, and a lookup), so the move designs a real interface. The
entries vector is now private, driven through:
- record(entry) — the upsert (replaces ferry's retain-then-push)
- retain(pred) — for ferry's reap loop, which stays in ferry because its
liveness predicate reads positional Workspace/git/report state
- entry_for(change, dock, owner) — the lookup, parallel to PrMap::lane_for
- reviewed_version — kept (loot-first's read), now delegating to entry_for
- parse / encode — the format, encode now pub (PrMap's caller-writes pattern)
WipEntry is a pub-field data carrier like the sibling PrLane. The wip unit tests
move with the type into ledger.rs's test module. loot-first imports WipState
from ledger now; ferry keeps only the projection that writes it.
ferry.rs: -140 lines. Full workspace suite green.
0579b5f4 · dbf3dbe6…diff
Renames are not followed. loot's tree maps a path to an address, so a rename is a delete and an add. This list is the history of the name, not of the bytes.