docs/plans/2026-04-13-slate-v2-full-no-regression-story-plan.md
Define the full remaining work required to make the “no regression vs legacy Slate” story honest.
This remains a supporting scope map, not the live batch order owner.
Current batch order is owned by 2026-04-18-slate-v2-lossless-remaining-work-replan.md, which puts claim-width audit and residue classification ahead of any broad rewrite-first package work.
This is broader than the browser/input external-evidence tranche alone.
It includes:
Current state is stronger than before, but still not good enough to claim full no-regression truth.
What is already real:
What is still false if stated too strongly:
Primary owners:
Supporting exact ledgers:
Gap audit:
Browser/input execution plan:
Example parity execution plan:
Exact-ledger state:
packages/slate/test/**
1069needs-triagepackages/slate-react/test/**
88needs-triagepackages/slate-history/test/**
20needs-triageplaywright/integration/examples/**
2321 same-path current files1 recovered1 explicit skipneeds-triageLocal exact-ledger closure work that is now banked:
packages/slate/test/transaction-contract.ts recovers the live replacement
surface for legacy batch rows that still matterpackages/slate/test/normalization-contract.ts now carries the missing
invalid-insert_node oracle rowpackages/slate/src/core/draft-helpers.ts now rejects out-of-range
insert_node indexes instead of silently appendingpackages/slate/src/create-editor.ts now routes getChildren() through the
live current tree so direct replacement followed by later transaction writes
stays observableBrowser/input state:
API/public-surface state:
mapped-mirrored API families were classified from helper presence plus
broad proof ownership instead of exact accepted-argument / option-bag parityEditor.before(...) /
Editor.after(...) voids: true rows and nonSelectable traversal rows,
is now recovered in code and proofbefore, after, next,
previous, levels, unhangRange, and positions in
query-contract.tsEditor.nodes/** in
legacy-editor-nodes-fixtures.tsinterfaces/**
namespaces in
legacy-interfaces-fixtures.tsexplicit-skip rowsExample state:
In scope:
needs-triage rows from the exact ledgersmapped-mirroredmapped-recoveredmapped-mixedsame-path-currentexplicit-skipOut of scope:
explicit-skip is allowed only with a concrete rationale.needs-triage rows may remain before the no-regression story is called
complete.mapped-mirrored API row is false if the current helper exists but the
legacy contract was wider.mapped-mixed means one legacy file splits into mirrored, recovered,
and/or explicit-skip subclaims. It is not limited to mirrored plus
recovered only.Goal:
Files:
Current state:
needs-triageExit:
needs-triageGoal:
Owners:
Scope:
Required checks per API row:
Exit:
mapped-mirrored API row hides a narrower option bag or accepted
argumentsGoal:
Owners:
Exit:
Goal:
Owners:
Exit:
Goal:
Files:
Exit:
needs-triagepackages/slate/test/**packages/slate-react/test/**packages/slate-history/test/**playwright/integration/examples/**
has an exact ledger rowneeds-triageRight now the repo has:
The remaining work is no longer local file accounting. That part is banked.
The remaining work is now four different problems:
If you mash those together, you get another giant vague ledger and learn nothing.