docs/plans/2026-05-08-slate-v2-clawsweeper-next-execution-plan.md
Do not create another broad slate-ralplan for this batch.
The architecture planning lanes and this full Ralph execution plan are closed:
Completed work:
Read first:
.tmp/completion-checks/slate-v2-performance-scalability-slate-issues-ralplan.mddocs/plans/2026-05-08-slate-v2-performance-scalability-slate-issues-ralplan.mddocs/plans/2026-05-07-slate-v2-mobile-ime-input-runtime-ralplan.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-live-open-ledger.mddocs/slate-issues/gitcrawl-clusters.md.tmp/slate-v2Current completion state:
doneFixes #... claim from headless benchmark output alone.Make the existing current benchmark runners use the current Slate v2 write API. The slice is infrastructure repair, not behavior work.
Stale patterns found in .tmp/slate-v2:
Editor.withTransaction(...)editor.insertText(...)editor.select(...)Primary files:
.tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjs.tmp/slate-v2/scripts/benchmarks/core/current/text-selection.mjs.tmp/slate-v2/scripts/benchmarks/core/current/normalization.mjs.tmp/slate-v2/scripts/benchmarks/core/current/refs-projection.mjs.tmp/slate-v2/scripts/benchmarks/core/current/query-ref-observation.mjs.tmp/slate-v2/scripts/benchmarks/core/current/node-transforms.mjsReference pattern:
.tmp/slate-v2/scripts/benchmarks/core/current/editor-store.mjsUse current transaction calls:
editor.update((tx) => {
tx.selection.set(target);
tx.text.insert(text, options);
});
Use current snapshot/assertion APIs:
Editor.replace(editor, snapshot);
Editor.getSnapshot(editor);
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjsWork:
Editor.withTransaction(...) with current editor.update(...) or
the current batch/apply API.applyOperations(...).Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:transaction:local
bun run bench:slate:6038:local
Claim rule:
#6038 as Improves unless accepted op-family thresholds and artifact
rows exist.Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/text-selection.mjsWork:
editor.select and editor.insertText helper bodies with
transaction-owned tx.selection.set(...) and tx.text.insert(...).Driver gate:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:text-selection:local
Claim rule:
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/refs-projection.mjs.tmp/slate-v2/scripts/benchmarks/core/current/query-ref-observation.mjsWork:
Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:refs-projection:local
bun run bench:core:query-ref-observation:local
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/normalization.mjsWork:
Driver gate:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:normalization:local
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/node-transforms.mjsWork:
editor.select(...) calls with current selection writes.Driver gate:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:node-transforms:local
Run:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:transaction:local
bun run bench:core:text-selection:local
bun run bench:core:refs-projection:local
bun run bench:core:query-ref-observation:local
bun run bench:core:normalization:local
bun run bench:core:node-transforms:local
bun check
Then in plate-2:
pnpm lint:fix
bun run completion-check -- --file .tmp/completion-checks/slate-v2-performance-scalability-slate-issues-ralplan.md
Completion rule:
These run only after Item 1 is green. Each slice gets its own ralph execution
entry and its own ClawSweeper sync decision.
Issue pressure:
#6038#3656, #4141, #3430, #2051Work:
Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:transaction:local
bun run bench:slate:6038:local
bun check
Claim rule:
#6038 as Improves until threshold repeatability is accepted.Fixes #6038 from one local benchmark run.Issue pressure:
#5131#5433, #5420, #5274, #4317, #3354Work:
useSlate becomes narrow.Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:react:rerender-breadth:local
bun test ./packages/slate-react/test/provider-hooks-contract.tsx ./packages/slate-react/test/projections-and-selection-contract.tsx
bun check
Claim rule:
#5131 stays Not claimed while useSlate / useEditor remain broad by
contract.Issue pressure:
Work:
0.Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:react:huge-document-overlays:local
bun test ./packages/slate-react/test/projections-and-selection-contract.tsx -t source
bun check
Claim rule:
Issue pressure:
Work:
Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:react:huge-document-overlays:local
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/integration/examples/dom-coverage-boundaries.test.ts --project=chromium
bun check
Claim rule:
Issue pressure:
#5945#5992#4056#2733, #2669, #790, #5216, #5592, #4202,
#4210, #3748, #5349, #4025Work:
Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:clipboard-large-payload:local
bun run bench:slate:5945:issue
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/stress/generated-editing.test.ts --project=chromium
bun check
Note:
bench:core:clipboard-large-payload:local is not currently listed in
package.json; if it stays absent, add a package script only if this becomes
a repeated driver gate. Otherwise run the benchmark file directly.Claim rule:
Fixes #5945, Fixes #5992, or Fixes #4056 from headless benchmark
proof alone.Issue pressure:
Work:
Driver gate:
cd /Users/zbeyens/git/slate-v2
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright <target-test> --project=webkit --grep "<backward selection row>"
Claim rule:
Issue pressure:
#3752Work:
Driver gate:
cd /Users/zbeyens/git/slate-v2
bun <new-or-existing-history-memory-benchmark>
bun check
Claim rule:
Fixes #3752 without retained-memory evidence.Work:
/Users/zbeyens/git/slate build related; do
not mix that failure with current Slate v2 correctness.Driver gates:
cd /Users/zbeyens/git/slate-v2
bun run bench:core:normalization:compare:local
bun run bench:core:huge-document:compare:local
Claim rule:
Run this loop after every Item 1 or Item 2 slice.
| Slice result | Required sync |
|---|---|
| No behavior, proof, or claim change | Update active plan/completion state only. |
| New benchmark artifact only | Update plan/completion; update matrix only if proof status changes. |
| New browser proof | Update plan/completion, matrix row, and fork dossier row for related issues. |
New Improves claim | Update matrix, fork dossier, PR reference, fixed/improved counts if needed. |
New Fixes claim | Update matrix, fork dossier, PR reference fixed claims/counts, and relevant ledger notes. |
| Explicit non-claim decision | Record in plan and matrix/dossier only when it prevents future overclaiming. |
docs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.mddocs/slate-issues/gitcrawl-live-open-ledger.mddocs/slate-issues/gitcrawl-clusters.mddocs/plans/.tmp/completion-checks/active goal stateFixes #... without exact repro proof.For docs-only sync in plate-2:
pnpm lint:fix
bun run completion-check
For any slice touching .tmp/slate-v2:
cd /Users/zbeyens/git/slate-v2
bun check
Then return to plate-2:
pnpm lint:fix
bun run completion-check
The Mobile/IME macro lane is done for autonomous desktop proof. The remaining rows are not "more harvesting." They need the right proof owner.
Issues:
#6051, #6022, #5983, #5989, #5883, #4400, #5680, #5493,
#5130, #5836, #5805, #5666, #5291, #5371, #5167, #4959,
#4861, #4602, #4354, #4372, #5183, #5391Plan:
bun test:mobile-device-proof:raw only on a real Android/iOS/Appium
lane that can produce raw device artifacts.Driver gate when device lane exists:
cd /Users/zbeyens/git/slate-v2
SLATE_BROWSER_RAW_MOBILE_REQUIRED=1 bun test:mobile-device-proof:raw
Claim rule:
Issues:
#4030, #3943, #4640, #4543, #4085Plan:
Driver gate:
cd /Users/zbeyens/git/slate-v2
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright <target-test> --project=webkit --grep "<exact Safari/WebKit row>"
Claim rule:
Related or Improves
row. Raw iOS closure still needs iOS proof.Issues:
#5078, #5034, #5026, #4994Plan:
onChange timing, readOnly transitions, and Android/input-manager routing.Candidate owners:
.tmp/slate-v2/packages/slate-react/test/model-input-strategy-contract.test.ts.tmp/slate-v2/packages/slate-react/test/selection-reconciler-contract.tsDriver gates:
cd /Users/zbeyens/git/slate-v2
bun --filter slate-react test:vitest -- model-input-strategy-contract.test.ts
bun test ./packages/slate-react/test/selection-reconciler-contract.ts
bun --filter slate-react typecheck
Claim rule:
Issues:
#5928, #4532, #4223, #3573, #4621, #3222, #3177Plan:
Claim rule:
Related or Not claimed.#6038 decision.#5131 and selector-path decision.#5945/#5992/#4056 decision.#3752 decision.This umbrella plan is complete when:
.tmp/slate-v2 bun check passes after any source/test/docs change there;plate-2 pnpm lint:fix and bun run completion-check pass after plan,
ledger, or completion-state edits here.blocked only when the remaining proof requires unavailable raw
Android/iOS/Safari/device infrastructure or a maintainer decision.pending and name the next runnable owner.Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjsWork completed:
Editor.withTransaction(...) with current
editor.update((tx) => tx.operations.replay(...)).editor.applyOperations(...) with the current comparison
shape: separate per-operation updates versus one batched transaction replay.withTransactionMeanMs and
applyBatchMeanMs as compatibility aliases while adding explicit
separateUpdateMeanMs, updateReplayMeanMs, and percentile lane summaries.writeBenchmarkArtifact(...) helper.Evidence:
.tmp/slate-v2, bun run bench:core:transaction:local passed..tmp/slate-v2, bun run bench:slate:6038:local passed..tmp/slate-v2/tmp/bench-slate-6038.json includes p75, p95, and
p99 for separateUpdateMs and updateReplayMs..tmp/slate-v2, bun lint:fix passed..tmp/slate-v2, bun check passed.Issue claims:
#6038 remains Improves, not Fixes.Reference docs:
Next owner:
.tmp/slate-v2/scripts/benchmarks/core/current/text-selection.mjs.Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/text-selection.mjsWork completed:
editor.insertText(...), editor.select(...),
editor.delete(...), editor.setSelection(...), editor.setPoint(...),
editor.move(...), and editor.collapse(...) benchmark calls with current
transaction APIs under tx.text.* and tx.selection.*.Evidence:
.tmp/slate-v2, bun run bench:core:text-selection:local passed..tmp/slate-v2/tmp/slate-text-selection-benchmark.json includes
p75, p95, and p99 in each lane through the shared summary helper.Issue claims:
Reference docs:
Next owner:
.tmp/slate-v2/scripts/benchmarks/core/current/refs-projection.mjs and
.tmp/slate-v2/scripts/benchmarks/core/current/query-ref-observation.mjs.Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/refs-projection.mjs.tmp/slate-v2/scripts/benchmarks/core/current/query-ref-observation.mjsWork completed:
editor.insertText(...) helpers with current
tx.text.insert(...).editor.moveNodes(...) benchmark calls with
tx.nodes.move(...).Editor.nodes(...) observation read with current
editor.read((state) => state.nodes.match(...)).Evidence:
.tmp/slate-v2, bun run bench:core:refs-projection:local passed..tmp/slate-v2, bun run bench:core:query-ref-observation:local passed..tmp/slate-v2/tmp/slate-refs-projection-benchmark.json and
.tmp/slate-v2/tmp/slate-query-ref-observation-benchmark.json include
percentile lane fields through the shared summary helper.Issue claims:
Reference docs:
Next owner:
.tmp/slate-v2/scripts/benchmarks/core/current/normalization.mjs.Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/normalization.mjsWork completed:
editor.insertText(...) helper usage with current
tx.text.insert(...).editor.extend({ elements: [{ type: 'inline', inline: true }] }).Evidence:
.tmp/slate-v2, bun run bench:core:normalization:local passed..tmp/slate-v2/tmp/slate-normalization-benchmark.json includes
percentile lane fields through the shared summary helper.Issue claims:
Reference docs:
Next owner:
.tmp/slate-v2/scripts/benchmarks/core/current/node-transforms.mjs.Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/node-transforms.mjsWork completed:
tx.selection.set(...), tx.fragment.insert(...), and tx.nodes.*.Evidence:
.tmp/slate-v2, bun run bench:core:node-transforms:local passed..tmp/slate-v2/tmp/slate-node-transform-benchmark.json includes
percentile lane fields through the shared summary helper.Issue claims:
Reference docs:
Next owner:
Status: complete.
Work completed:
Evidence:
.tmp/slate-v2, these passed:
bun run bench:core:transaction:localbun run bench:core:text-selection:localbun run bench:core:refs-projection:localbun run bench:core:query-ref-observation:localbun run bench:core:normalization:localbun run bench:core:node-transforms:localbun checkIssue claims:
#6038 remains Improves, not Fixes.Reference docs:
Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/transaction-execution.mjsWork completed:
#6038 transaction benchmark artifact with
op-family rows for mixed structural/text batches, text insert/remove,
node-property, node-insert, node-split, and node-move operations.withTransactionMeanMs, applyBatchMeanMs, separateUpdateMeanMs, and
updateReplayMeanMs.Evidence:
.tmp/slate-v2, bun run bench:core:transaction:local passed..tmp/slate-v2, bun run bench:slate:6038:local passed..tmp/slate-v2/tmp/bench-slate-6038.json has
opFamilyLanes.*.separateUpdateMs.p95/p99 and
opFamilyLanes.*.updateReplayMs.p95/p99.Issue claims:
#6038 stays Improves; no Fixes #6038 claim until thresholds are
accepted after repeat variance.Reference docs:
#6038
Improves decision already captures the non-promotion rule.Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/browser/react/rerender-breadth.tsxWork completed:
#5131.Evidence:
.tmp/slate-v2, bun run bench:react:rerender-breadth:local passed..tmp/slate-v2,
bun test ./packages/slate-react/test/provider-hooks-contract.tsx ./packages/slate-react/test/projections-and-selection-contract.tsx
passed..tmp/slate-v2/packages/slate-react/tmp/slate-react-rerender-breadth-benchmark.json
has percentile rows for sibling leaf breadth, deep ancestor breadth, broad
selection renders, and source-scoped invalidation.Issue claims:
#5131 stays Not claimed while useSlate / useEditor remain broad by
contract.Reference docs:
#5131 as not claimed and point at the rerender breadth benchmark.Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/browser/react/huge-document-overlays.tsx.tmp/slate-v2/packages/slate-react/test/projections-and-selection-contract.tsxWork completed:
0, while the overlay toggle lane recomputed exactly once.Evidence:
.tmp/slate-v2, bun run bench:react:huge-document-overlays:local
passed..tmp/slate-v2,
bun test ./packages/slate-react/test/projections-and-selection-contract.tsx -t source
passed..tmp/slate-v2/packages/slate-react/tmp/slate-react-huge-document-overlays-benchmark.json
has percentile rows and the expected projection recompute counts:
activeEditAfterOverlay.projectionRecomputeCount.mean = 0,
overlayToggle.projectionRecomputeCount.mean = 1, and
shellPromotion.projectionRecomputeCount.mean = 0.Issue claims:
Reference docs:
Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/browser/react/huge-document-overlays.tsx.tmp/slate-v2/playwright/integration/examples/dom-coverage-boundaries.test.tsWork completed:
Evidence:
.tmp/slate-v2, bun run bench:react:huge-document-overlays:local
passed..tmp/slate-v2,
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/integration/examples/dom-coverage-boundaries.test.ts --project=chromium
passed with 7 Chromium rows and 1 mobile-touch row skipped..tmp/slate-v2, bun check passed.Issue claims:
Reference docs:
Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/clipboard-large-payload.mjs.tmp/slate-v2/playwright/stress/generated-editing.test.ts.tmp/slate-v2/packages/slate-react/src/editable/mutation-controller.tsWork completed:
bench:core:clipboard-large-payload:local is not listed in package.json.#5945 issue benchmark wrapper.Evidence:
.tmp/slate-v2,
bun ./scripts/benchmarks/core/current/clipboard-large-payload.mjs passed..tmp/slate-v2, bun run bench:slate:5945:issue passed with issue
thresholds green: cutTwoBlocksEditMsP50 = 2.02ms, cutTwoBlocksMsP50 = 2.17ms, and operationCount = 1..tmp/slate-v2,
STRESS_FAMILIES=huge-document-cut PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/stress/generated-editing.test.ts --project=chromium
passed..tmp/slate-v2,
PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/stress/generated-editing.test.ts --project=chromium
passed with 24 Chromium rows..tmp/slate-v2, bun check passed..tmp/slate-v2/tmp/slate-clipboard-large-payload-benchmark.json.Issue claims:
Fixes #5945, Fixes #5992, or Fixes #4056 claim promoted from this
slice.Reference docs:
docs/solutions/logic-errors/2026-05-09-slate-v2-full-block-delete-fast-path-must-stop-at-selection-boundaries.md.Next owner:
Status: complete.
Owner:
.tmp/slate-v2/playwright/stress/generated-editing.test.tsWork completed:
Shift+ArrowLeft, and asserts both DOM and model selection direction:
anchor remains at offset 4, focus moves to offset 3, and selected
text is s.Evidence:
.tmp/slate-v2,
STRESS_FAMILIES=webkit-backward-selection PLAYWRIGHT_RETRIES=0 PLAYWRIGHT_WORKERS=1 bun run playwright playwright/stress/generated-editing.test.ts --project=webkit
passed..tmp/slate-v2, bun check passed.Issue claims:
Reference docs:
Next owner:
Status: complete.
Owner:
.tmp/slate-v2/scripts/benchmarks/core/current/history-retained-memory.mjs.tmp/slate-v2/package.json.tmp/slate-v2/scripts/benchmarks/README.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mdWork completed:
bun run bench:core:history-retained-memory:local.process.memoryUsage().heapUsed samples
when available.#3752 from Related to Improves in the matrix/dossier while
keeping exact memory-leak closure out of scope.Evidence:
.tmp/slate-v2, bun run bench:core:history-retained-memory:local
passed..tmp/slate-v2/tmp/slate-history-retained-memory.json.fullDocumentReplaceChildren: one history entry, one retained
replace_children operation, historyJsonBytes = 1585394.rangeDeleteReplaceChildren: one history entry, one retained
replace_children operation, historyJsonBytes = 775230.process.memoryUsage().heapUsed; local GC was
unavailable, so heap samples remain calibration evidence, not thresholds..tmp/slate-v2, bun check passed after bun lint:fix formatted the new
benchmark file.Issue claims:
#3752 is now Improves, not Fixes.Reference docs:
docs/slate-v2/ledgers/issue-coverage-matrix.md.docs/slate-v2/ledgers/fork-issue-dossier.md.Next owner:
Action:
Editor runtime APIs,
while legacy Slate keeps package imports.tx.text.insert, tx.selection.set, and tx.fragment.insert./Users/zbeyens/git/slate setup/build separate from current
Slate v2 correctness.Files changed:
.tmp/slate-v2/scripts/benchmarks/core/compare/normalization.mjs.tmp/slate-v2/scripts/benchmarks/core/compare/huge-document.mjsCommands:
cd /Users/zbeyens/git/slate-v2 && bun run bench:core:normalization:compare:localcd /Users/zbeyens/git/slate-v2 && bun run bench:core:huge-document:compare:localcd /Users/zbeyens/git/slate-v2 && bun lint:fixcd /Users/zbeyens/git/slate-v2 && bun checkArtifacts:
.tmp/slate-v2/tmp/slate-normalization-compare-benchmark.json.tmp/slate-v2/tmp/slate-core-huge-document-benchmark.jsonCompare evidence:
Issue claims:
Fixes or Improves claim.Reference docs:
Next owner: