docs/plans/2026-04-07-slate-v2-full-release-regression-audit-plan.md
Supporting plan. For current queue and roadmap truth, see master-roadmap.md.
Get /Users/zbeyens/git/slate-v2 to an honest production-release posture for
replacing legacy Slate.
Maintainer-facing short read:
Bluntly:
battle-tested is not true while large chunks of the old proof surface were
deleted without explicit replacement0 regression risk is fantasyTarget B: Go is not honest today.
Why:
Closed since the earlier audit draft:
android-testscheck-listscode-highlightingcustom-placeholderinlinessearch-highlightingslate-hyperscriptslate-browser root proof commandstsconfig.json no longer points at deleted *-v2 package pathsStatus:
Current read:
Target B: No-GoFiles:
/Users/zbeyens/git/plate-2/docs/slate-v2/overview.md/Users/zbeyens/git/plate-2/docs/slate-v2/release-readiness-decision.md/Users/zbeyens/git/plate-2/docs/slate-v2/replacement-gates-scoreboard.md/Users/zbeyens/git/plate-2/docs/slate-v2/archive/full-replacement-blockers.md/Users/zbeyens/git/slate-v2/docs/general/replacement-candidate.md/Users/zbeyens/git/slate-v2/Readme.md/Users/zbeyens/git/slate-v2/packages/*/README.mdExit condition:
Status:
Current read:
This workstream no longer blocks on the first tranche. It stays as a rule for later deletions, not as an active missing-slot queue.
This matrix is the spine of the recovery. Every deleted contributor-facing
concept must land in a closest current conceptual slot before Target B can
turn green.
| Legacy concept | Current status | Closest current conceptual slot | Proof owner | Docs owner | Notes |
|---|---|---|---|---|---|
android-tests | restored | android-tests current hub pointing to IME/mobile-input lanes | android-tests.test.ts | docs/general/contributing.md, live docs | restored as a contributor-facing IME test hub |
check-lists | restored | check-lists current interactive checklist slot | check-lists.test.ts | example docs + replacement docs | restored on the current EditableBlocks seam |
code-highlighting | restored | code-highlighting current editable token-highlighting slot | code-highlighting.test.ts | example docs + replacement docs | restored on the current projection seam |
custom-placeholder | restored | custom-placeholder current slot on the placeholder seam | placeholder.test.ts | example docs + replacement docs | current seam uses placeholder prop instead of old renderPlaceholder seam |
inlines | restored | inlines current slot backed by links and related inline-family surfaces | inlines.test.ts | root/examples docs + replacement docs | current slot is narrower than the old monolithic example |
search-highlighting | restored | search-highlighting current slot backed by current highlight projections | search-highlighting.test.ts | example docs + replacement docs | current slot uses projection-driven highlighting |
slate-hyperscript | restored | slate-hyperscript package slot with current smoke proof | root mocha lane + package smoke | docs + package claim | old fixture corpus stays out of the release bar |
This is the required local proof stack for the current replacement claim while recovery is in flight.
Canonical command:
yarn test:replacement:gate:localManifest members:
yarn testyarn test:replacement:compat:localandroid-testscheck-listscode-highlightinginlinescustom-placeholdersearch-highlightingrichtextmarkdown-shortcutsmarkdown-previewforced-layoutstylinghovering-toolbareditable-voidsimagesembedstablesscroll-into-viewOpen gap:
The release path must run the proof that the release claim depends on.
Status:
Current state:
/Users/zbeyens/git/slate-v2/package.json
test:replacement:compat:localtest:replacement:gate:localtest:slate-browser:*bench:replacement:*prerelease now routes through:
yarn build:rollupyarn test:replacement:gate:localyarn lint:releaseWhat remains:
lint:release is the release
lint floor instead of the noisy repo-wide yarn lintRequired gated release stack:
yarn test:mochayarn workspace slate-react run testyarn workspace slate-dom testyarn test:replacement:compat:local or a CI-safe equivalentExit condition:
The deleted historical package tests must be triaged family by family.
Status:
Current read:
snapshot-contract.ts mirrors 77 legacy oracle rows across:
moveEditor.beforeEditor.afterselectsetPointdeselectwrapNodesunwrapNodesliftNodesdeleteFor each deleted package-test bucket below:
Exit condition:
replacement-compatibility.test.ts is useful, but it is not a full substitute
for direct current-family browser proof.
Status:
Current read:
iframe, plaintext, read-only, shadow-dom,
and select are now mapped explicitly instead of silently disappearingDeleted browser lanes need one of:
Exit condition:
Package removals and public-surface deletions are release-scope decisions, not internal cleanup.
Status:
Closed decisions already made:
slate-hyperscript
tsconfig.json
*-v2 package references removedslate-browser commands restoredreact/jsx-runtime named export handling restored for build outputslate-browser package integration
Must still audit:
packages/slate/src/**packages/slate-react/src/**packages/slate-dom/src/**Exit condition:
The one measured richtext regression is not the main blocker right now.
Keep perf wording narrow until behavior and proof debt is closed.
Measured lanes to keep as-is:
1000-blockx5Exit condition:
All counts below come from:
cd /Users/zbeyens/git/slate-v2 && git diff --diff-filter=D --name-onlyProcessed disposition buckets:
blocked-restore-or-cut
closed-by-note
internal-rewrite-audit
release-doc-noise
Exact grouped partition of all current deletions:
packages/slate/test/interfaces/** — 576 — blocked-restore-or-cutpackages/slate/test/transforms/** — 408 — blocked-restore-or-cutpackages/slate/test/operations/** — 31 — blocked-restore-or-cutpackages/slate/test/normalization/** — 20 — blocked-restore-or-cutpackages/slate/test/utils/** — 11 — blocked-restore-or-cutpackages/slate/test/index.js — 1 — blocked-restore-or-cutpackages/slate/test/jsx.d.ts — 1 — blocked-restore-or-cutpackages/slate-react/test/** — 8 — blocked-restore-or-cutpackages/slate-history/test/** — 17 — closed-by-noteplaywright/integration/examples/** — 2 — closed-by-notesite/examples/ts/** — 1 — closed-by-notepackages/slate-dom/src/** — 13 — internal-rewrite-auditpackages/slate-react/src/** — 30 — internal-rewrite-auditpackages/slate/src/** — 116 — internal-rewrite-auditpackages/slate-dom/CHANGELOG.md — 1 — release-doc-noisepackages/slate-history/CHANGELOG.md — 1 — release-doc-noisepackages/slate-react/CHANGELOG.md — 1 — release-doc-noisepackages/slate/CHANGELOG.md — 1 — release-doc-noiseGrouped total:
1239 deleted paths0 unmatched pathspackages/slate/test deletions: 1048Exact deleted buckets:
packages/slate/test/interfaces/** — 576 deleted filespackages/slate/test/transforms/** — 408 deleted filespackages/slate/test/operations/** — 31 deleted filespackages/slate/test/normalization/** — 20 deleted filespackages/slate/test/utils/** — 11 deleted filespackages/slate/test/index.jspackages/slate/test/jsx.d.tsRelease action:
packages/slate-react/test deletions: 8Exact deleted files:
packages/slate-react/test/chunking.spec.tspackages/slate-react/test/decorations.spec.tsxpackages/slate-react/test/editable.spec.tsxpackages/slate-react/test/react-editor.spec.tsxpackages/slate-react/test/tsconfig.jsonpackages/slate-react/test/use-selected.spec.tsxpackages/slate-react/test/use-slate-selector.spec.tsxpackages/slate-react/test/use-slate.spec.tsxRelease action:
packages/slate-history/test deletions: 17Current status:
history-contract.ts proof surfaceExact deleted files:
packages/slate-history/test/index.jspackages/slate-history/test/isHistory/after-edit.jspackages/slate-history/test/isHistory/after-redo.jspackages/slate-history/test/isHistory/after-undo.jspackages/slate-history/test/isHistory/before-edit.jspackages/slate-history/test/jsx.d.tspackages/slate-history/test/undo/cursor/keep_after_focus_and_remove_text_undo.jspackages/slate-history/test/undo/delete_backward/block-join-reverse.tsxpackages/slate-history/test/undo/delete_backward/block-nested-reverse.tsxpackages/slate-history/test/undo/delete_backward/block-text.tsxpackages/slate-history/test/undo/delete_backward/custom-prop.tsxpackages/slate-history/test/undo/delete_backward/inline-across.tsxpackages/slate-history/test/undo/insert_break/basic.tsxpackages/slate-history/test/undo/insert_fragment/basic.tsxpackages/slate-history/test/undo/insert_text/basic.tsxpackages/slate-history/test/undo/insert_text/contiguous.tsxpackages/slate-history/test/undo/insert_text/non-contiguous.tsxRelease action:
slate-history package deletion work is now fully closed by:
2Current status:
Exact deleted files:
playwright/integration/examples/huge-document.test.tsplaywright/integration/examples/select.test.tsRelease action:
select is recovered on the direct current richtext browser seamhuge-document is an explicit better-cut owned by the frozen benchmark
lane1Current status:
Exact deleted files:
site/examples/ts/custom-types.d.ts0Current status:
site/examples/js/**Release action:
site/examples/ts/custom-types.d.ts is explicit skip under the current
structural typing contractExact drift already found:
/Users/zbeyens/git/slate-v2/docs/general/contributing.md
playwright/integration/examples/check-lists.test.ts/examples/android-tests/Users/zbeyens/git/slate-v2/site/examples/Readme.md
replacement-candidateRich Inline as the replacement-candidate anchorRelease action:
packages/slate-hyperscript/** — 39 deleted pathsExact deleted package paths:
packages/slate-hyperscript/CHANGELOG.mdpackages/slate-hyperscript/Readme.mdpackages/slate-hyperscript/package.jsonpackages/slate-hyperscript/src/creators.tspackages/slate-hyperscript/src/hyperscript.tspackages/slate-hyperscript/src/index.tspackages/slate-hyperscript/src/tokens.tspackages/slate-hyperscript/test/fixtures/cursor-across-element.tsxpackages/slate-hyperscript/test/fixtures/cursor-across-elements-empty.tsxpackages/slate-hyperscript/test/fixtures/cursor-across-elements-end.tsxpackages/slate-hyperscript/test/fixtures/cursor-across-elements-middle.tsxpackages/slate-hyperscript/test/fixtures/cursor-across-elements-start.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-empty.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-end.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-middle.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-nested-end.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-nested-middle.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-nested-start.tsxpackages/slate-hyperscript/test/fixtures/cursor-element-start.tsxpackages/slate-hyperscript/test/fixtures/cursor-text-empty.tsxpackages/slate-hyperscript/test/fixtures/element-custom.tsxpackages/slate-hyperscript/test/fixtures/element-empty.tsxpackages/slate-hyperscript/test/fixtures/element-nested-empty.tsxpackages/slate-hyperscript/test/fixtures/element-nested-string.tsxpackages/slate-hyperscript/test/fixtures/element-string.tsxpackages/slate-hyperscript/test/fixtures/element-text-empty.tsxpackages/slate-hyperscript/test/fixtures/element-text-string.tsxpackages/slate-hyperscript/test/fixtures/fragment-element.tsxpackages/slate-hyperscript/test/fixtures/fragment-empty.tsxpackages/slate-hyperscript/test/fixtures/fragment-string.tsxpackages/slate-hyperscript/test/fixtures/selection-offset-start.tsxpackages/slate-hyperscript/test/fixtures/selection.tsxpackages/slate-hyperscript/test/fixtures/text-empty.tsxpackages/slate-hyperscript/test/fixtures/text-full.tsxpackages/slate-hyperscript/test/fixtures/text-nested.tsxpackages/slate-hyperscript/test/fixtures/value-empty.tsxpackages/slate-hyperscript/test/index.jspackages/slate-hyperscript/test/jsx.d.tspackages/slate-hyperscript/tsconfig.jsonRelease action:
slate-hyperscript is restored as a live package slotExact deleted source buckets:
packages/slate/src/editor/** — 56 deleted filespackages/slate/src/interfaces/** — 19 deleted filespackages/slate/src/transforms-node/** — 11 deleted filespackages/slate/src/utils/** — 9 deleted filespackages/slate/src/core/** — 8 deleted filespackages/slate/src/transforms-selection/** — 7 deleted filespackages/slate/src/types/** — 3 deleted filespackages/slate/src/transforms-text/** — 3 deleted filespackages/slate-react/src/hooks/** — 16 deleted filespackages/slate-react/src/components/** — 7 deleted filespackages/slate-react/src/chunking/** — 6 deleted filespackages/slate-react/src/plugin/** — 2 deleted filespackages/slate-react/src/utils/environment.tspackages/slate-react/src/custom-types.tspackages/slate-react/src/@types/direction.d.tspackages/slate-dom/src/utils/** — 10 deleted filespackages/slate-dom/src/plugin/** — 2 deleted filespackages/slate-dom/src/custom-types.tsRelease action:
Exact deleted files:
packages/slate/CHANGELOG.mdpackages/slate-dom/CHANGELOG.mdpackages/slate-history/CHANGELOG.mdpackages/slate-hyperscript/CHANGELOG.mdpackages/slate-react/CHANGELOG.mdRelease action:
Target B Can Flip Back To GoUse these exact commands when refreshing this plan:
cd /Users/zbeyens/git/slate-v2
git diff --diff-filter=D --name-only
git diff --diff-filter=D --name-only | rg '^packages/slate/test/'
git diff --diff-filter=D --name-only | rg '^packages/slate-react/test/'
git diff --diff-filter=D --name-only | rg '^packages/slate-history/test/'
git diff --diff-filter=D --name-only | rg '^playwright/integration/examples/'
git diff --diff-filter=D --name-only | rg '^site/examples/ts/'
git diff --diff-filter=D --name-only | rg '^site/examples/js/'
git diff --diff-filter=D --name-only | rg '^packages/slate-hyperscript/'