- page.service: lock concurrent re-parents by canonical row UUIDs
(`movedPage.id`, not the raw client `dto.pageId` which may be a slugId) so
two opposing moves passing slugIds can't sort into different FOR UPDATE
orders and deadlock (#159).
- CHANGELOG: add [Unreleased] entries — Fixed#159 (serialized concurrent
moves + in-tx cycle re-check), Added #190 (model-friendly tool-input errors).
- page.service.spec: hoist the duplicated `makeChain` trx-stub Proxy into one
module-level helper (was 3 copies); add a move-to-root test covering the
unlocked else-branch (no transaction opened, updatePage called without a trx).
- model-friendly-input.spec: cover the duplicate-path dedup branch in
formatIssues — a single param with two zod issues is named only once.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>