Complete the push action coverage (create/update/delete/move/rename/noop).
- push.ts classifyRenameMoves (pure): the file PATH is the source of truth for
tree position (§5) — new parent resolved from the enclosing folder's <dir>.md
page, not the stale meta.parentPageId. Emit move iff parent changed, rename iff
meta.title changed; a pure path-only rename is a NOOP (no Docmost call — the
path is local, identity is pageId)
- applyPushActions: move (move_page, reparent) THEN rename (rename_page); noop
records and calls nothing; per-page isolation + refs-only-on-success preserved
- resolveParentPageId reads <dir>.md meta via readFile (current) /
git.showFileAtRef(last-pushed) (prev), matching buildVaultLayout
- review fixes: prefetch wrapped in per-page try/catch so a tree-read throw
isolates one page (§12), not the batch; failures.kind attributes the op that
actually threw (rename-after-move -> "rename")
- tests (+13): classifier (move/rename/both/noop/to-root), apply (calls/no-calls,
ordering, isolation); 724 -> 737 green (x2 stable); corpus STABLE
Deferred (final increment): live main() daemon, FS-watcher/debounce (§7.1),
git-remote push (§7.2), pull-side bodyHash/updatedAt consumption, fractional-index
position, escalate-on-divergent-docmost.