Problem
The cross-parent move detection (pagesByKey + movePage) only runs inside diffChildren recursions over existing scopes. When a cached <ChildPage> is relocated under a brand-new parent (new page, toggle, or column), the new subtree is built by emitAppendsForNew / inlinePackChildren, which tail a fresh createPage for every page-kind candidate without consulting the cache. The old location then emits archivePage (the move is also not pre-claimed, since collectPreClaimedMoves does not descend into unretained candidates).
Net effect: the page identity churns (archive + recreate), server-side content is duplicated transiently, and any checkpointed pending state from #1100 is adopted but then discarded.
Repro sketch
- Warm sync
<Page><A/><ChildPage k="c"/></Page>.
- Re-sync with
<Page><A/><Toggle><ChildPage k="c"/></Toggle></Page> (toggle is new).
- Observe
createPage(c) + archivePage(c-old) instead of movePage(c → toggle).
Suggested direction
- Teach
emitAppendsForNew and the inlinePackChildren tail path to emit movePage (parent = tmp id, resolved at apply time) when a page-kind candidate's key exists in pagesByKey.
- Extend
collectPreClaimedMoves to recurse into unretained candidate subtrees so the outgoing parent skips the archive.
- Recurse content reconciliation into
moveSource.children vs the candidate subtree after the move.
Related: #1100 (pending page-create checkpoints) — its adoption now runs before cross-parent matching, so this gap is the remaining convergence hole for relocated pages.
Posted on behalf of @schickling
| field |
value |
agent_identity |
unknown |
agent_persona |
generalist |
agent_supervisor |
unavailable |
agent_tool |
OMP |
agent_tool_version |
18.0.3 |
agent_runtime |
OMP 18.0.3 |
tooling_profile |
dotfiles@f33cd9c-dirty |
Problem
The cross-parent move detection (
pagesByKey+movePage) only runs insidediffChildrenrecursions over existing scopes. When a cached<ChildPage>is relocated under a brand-new parent (new page, toggle, or column), the new subtree is built byemitAppendsForNew/inlinePackChildren, which tail a freshcreatePagefor every page-kind candidate without consulting the cache. The old location then emitsarchivePage(the move is also not pre-claimed, sincecollectPreClaimedMovesdoes not descend into unretained candidates).Net effect: the page identity churns (archive + recreate), server-side content is duplicated transiently, and any checkpointed pending state from #1100 is adopted but then discarded.
Repro sketch
<Page><A/><ChildPage k="c"/></Page>.<Page><A/><Toggle><ChildPage k="c"/></Toggle></Page>(toggle is new).createPage(c)+archivePage(c-old)instead ofmovePage(c → toggle).Suggested direction
emitAppendsForNewand theinlinePackChildrentail path to emitmovePage(parent = tmp id, resolved at apply time) when a page-kind candidate's key exists inpagesByKey.collectPreClaimedMovesto recurse into unretained candidate subtrees so the outgoing parent skips the archive.moveSource.childrenvs the candidate subtree after the move.Related: #1100 (pending page-create checkpoints) — its adoption now runs before cross-parent matching, so this gap is the remaining convergence hole for relocated pages.
Posted on behalf of @schickling
agent_identityagent_personaagent_supervisoragent_toolagent_tool_versionagent_runtimetooling_profile