Changes touching this path
- the adopt catch-up decides in the shared reconcile table, and keeps its own hands for the fold (#866)
`adopt_harbor` is now the same three steps as the ferry reconcile: prologue
(the two "cannot name the target" refusals, the #829 shared-graph ingest, the
ADR 0047 hold refresh) then `adopt_view`, then `reconcile::decide`, then
adopt's own executor. Ferry and adopt can no longer drift on WHAT to do.
A sibling of `apply_plan`, not a mode flag on it: the same `Plan::Merge` means
carry for the bridge (ADR 0039) and fold for adopt (ADR 0034), so that
distinction stays a named seam rather than a runtime argument. Adopt's hands
are `fast_forward_to` and `fold_line_in`, with `fold_line_in`'s internal
short-circuits intact (`lane merge` is a live caller of them).
The #418 seal-WIP override stays executor-side in both verbs as the typed
`RepoError::SealWip`, deduped into one `seal_wip_gate` helper carrying the
verb name. Routing it through `Plan::Refuse` would demote a matchable
guard+override refusal to a stringly error, and it reads live state at the
signing seam beside the mis-seal gate.
The View is unchanged at six fields. Adopt becomes the first production caller
that passes `covered: true` (its stale doc note is updated), and the first
that captures BEFORE computing `covered`, which is legitimate because the
table is order-indifferent: `covered` outranks every other field. The capture
normalization stays verb-owned and is skipped once `covered` holds, so an
already-current catch-up still leaves the operator's capture exactly where it
was.
One behavior change falls out of the routing: a catch-up with no local line at
all (`pinned: None`) now takes the plan's Adopt arm and fast-forwards onto
landed main, where it used to fall through to `fold_line_in` and refuse with
"nothing to merge into yet, record a change first". Catching up is what the
verb is for, and it is what `reconcile_onto` has always done in that state;
`fast_forward_to` takes `Option<&Oid>` for the missing `from`.
`loot adopt <version>` is untouched: taking a target wholesale makes no
reconcile decision.
Tests: the choices are the table's, so adopt's repo-materializing tests keep
only what is still adopt's own, the prologue, the capture normalization, and
each executor hand's effect. Added the second prologue refusal (a landed main
the shared graph lost) and two executor smoke tests: the `pinned: None` adopt
arm, and the no-op leaving a capture untouched. One duplicate
drop-the-redundant-capture test folded into its twin.
46b3f587 · dbf3dbe6…
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.