Point an accepted thread at what it produced
The prose a thread was about is usually the prose it asked to have rewritten, so after the agent acts the subject is gone by design. The client only ever read the subject, so a decision went dark the moment the agent did its job — and the result anchor that says where it went was used for nothing but a boolean. data/main shows exactly this: subject drifted, two live result anchors, nothing painted. Resolution is now result, then subject, then nothing, and a thread is drifted only when there is nowhere left to point. Block-wide rather than a phrase, because after a rewrite there is no phrase — only a passage of new prose. Painted and hit-tested through the same range construction as everything else, so element points and text points behave alike. The result still depends on the agent calling anchor_plan, which nothing enforces. So a turn now knows which thread it was started by, edit_plan reports which blocks a batch authored — object identity, the same property reconciliation already relies on — and those blocks stand in as the result when nothing trustworthy is there. The agent's own answer is better and always wins; this only stops a decision pointing nowhere for good. Two things the tests found: order() reached for the DOM unguarded, so an editor without one turned a placeable thread into a drifted one; and the thread id is a string, so unlike the spent predicate it survived JSON.stringify onto the wire. Six mutations checked, each fails the test that covers it.
Parent5075cf4
10 files changed+629-64
StackedSplit