Drift reconciliation is per-oath: accepting drift (VARAR_UPDATE=1 / varar run --update) rewrites the baseline for oaths that still exist, but entries whose oath file was deleted or moved stay in varar.lock.json forever.
Concretely, when the sample projects moved their oaths from the project root into varar/, regenerating over the old lock produced a merged file with both the stale root-level keys (deep-thought.md …) and the new varar/deep-thought.md keys — in every port. The only clean path was to delete the lock and record it from scratch.
This is adjacent to a documented design decision (no-theatre.md: file removal is a different signal from drift and is not gated), but silently accumulating dead entries is a distinct problem from gating removal:
- the lock stops being a faithful inventory of the current oath set
- a future re-introduction of a file at an old path would be reconciled against a years-stale baseline
Options: prune entries for paths no longer matched by the docs globs during --update (still not gating removal — just not preserving dead state), or warn when the lock contains paths the config no longer discovers.
Applies to all seven ports (the reconcile logic is deliberately identical). Found while restructuring the sample projects on the next branch.
🤖 Generated with Claude Code
Drift reconciliation is per-oath: accepting drift (
VARAR_UPDATE=1/varar run --update) rewrites the baseline for oaths that still exist, but entries whose oath file was deleted or moved stay invarar.lock.jsonforever.Concretely, when the sample projects moved their oaths from the project root into
varar/, regenerating over the old lock produced a merged file with both the stale root-level keys (deep-thought.md…) and the newvarar/deep-thought.mdkeys — in every port. The only clean path was to delete the lock and record it from scratch.This is adjacent to a documented design decision (
no-theatre.md: file removal is a different signal from drift and is not gated), but silently accumulating dead entries is a distinct problem from gating removal:Options: prune entries for paths no longer matched by the
docsglobs during--update(still not gating removal — just not preserving dead state), or warn when the lock contains paths the config no longer discovers.Applies to all seven ports (the reconcile logic is deliberately identical). Found while restructuring the sample projects on the
nextbranch.🤖 Generated with Claude Code