docs/slate-issues/issue-intelligence-master-plan.md
Read every open Slate issue into a structured research ledger, cluster the real pain patterns, score them, and turn that into a package-by-package v2 architecture plan.
This is explicitly a multi-pass program. The whole point is to avoid a lazy one-shot synthesis where the loudest issues or our favorite ideas dominate the result.
The output must also be valuable for future maintainer triage:
The output must also be directly useful for later TDD:
The output must also be directly useful for later benchmark work:
Do not start by designing Slate v2 from taste.
Do not start by reading issue comments at random.
Do not start by clustering from labels alone.
Start with a frozen snapshot of every open issue, classify them under a strict rubric, then derive architecture requirements from the ranked clusters.
The output is not:
The output is:
slate-v2, slate-react-v2, and supporting packagesPrimary source:
ianstormtaylor/slateSecondary source, only after the open-issue pass is done:
docs/solutions/Out of scope for the first pass:
These are mandatory.
Create and maintain these in order:
docs/slate-issues/open-issues-ledger.mddocs/slate-issues/open-issues-dossiers.mddocs/slate-issues/test-candidate-map.mddocs/slate-issues/benchmark-candidate-map.mddocs/slate-issues/issue-clusters.mddocs/slate-issues/package-impact-matrix.mddocs/slate-issues/requirements-from-issues.mddocs/slate-issues/roadmap-from-issues.mdThis file is the control plan for the whole program.
The original research corpus is the frozen 2026-04-02 682-issue snapshot.
Keep it as historical evidence, not current open-issue accounting.
Gitcrawl rebuild update (2026-05-04):
630 issues and 29 PRs, 659 open threads total1856659617 total, 28 multi-member, 589 singleton54, all closed on GitHub#6051, #6053Use gitcrawl-live-open-ledger.md for current open issue accounting and gitcrawl-rebuild-report.md for gaps. Keep open-issues-ledger.md as the frozen historical corpus until it is fully archived or replaced.
The first 3-issue pilot exposed a few things worth locking in before the full pass:
#6022 became materially more precise only after reading the added repro wrapper and apply logsknown-duplicate-target field, not just a duplicate-risk scoreChanged:
reply usefulness becomes reply postureknown duplicate targetWhy:
Backfill:
No new schema change yet, but one real pressure point showed up:
Open question for later batches:
TDD readiness alone is enoughNo schema change yet, but two more pressure points are real now:
Changed:
Why:
Backfill:
Changed:
Why:
Backfill:
No schema change yet.
What got validated:
Open pressure for later:
No schema change yet.
What got validated:
Open pressure for later:
invalid, stale, and out-of-scope more cleanlyNo schema change yet.
What got validated:
Open pressure for later:
site/examples, docs-only, and real package runtime ownershipNo schema change yet.
What got validated:
100+ issues without collapsing into nonsenseOpen pressure for later:
ecosystem demand, out-of-scope, and v2-interesting but not core-ownedNo schema change yet.
What got validated:
slate-react rerender pressureOpen pressure for later:
resolved-in-thread field instead of overloading stale-candidateNo schema change yet.
What got validated:
createEditor, PropsMerge, useSlate, and controlled-value ergonomics keep surfacing in different formsOpen pressure for later:
resolved-in-thread field instead of continuing to overload stale-candidateNo schema change yet.
What got validated:
insertText suppression, beforeInsertText, scrollSelectionIntoView, and Android readOnly lifecycle bugs all point at weak runtime boundariesOpen pressure for later:
slate, slate-react, and slate-domNo schema change yet.
What got validated:
Open pressure for later:
slate, slate-react, slate-dom, examples, and docscore bug, runtime adapter bug, example/docs debt, and ecosystem/support noiseNo schema change yet.
What got validated:
201 issues are enough to produce a stable macro-theme map instead of just per-issue notesslate-react runtime identity and subscription behaviorOpen pressure for later:
No schema change yet.
What got clarified:
slate-react-v2 and slate-dom-v2 should carry most runtime-boundary work by defaultslate-v2 still owns the highest-leverage architectural work, but mostly as engine semantics: transactions, operations, normalization, identity, and history-friendly commit boundariesslate-dom issue counts are misleading because many DOM and selection bugs were correctly triaged as cross-packageOpen pressure for later:
slate-v2 engine workslate-react-v2 runtime workslate-dom-v2 bridge workNo schema change yet.
What got locked in:
Open pressure for later:
slate-v2 before slate-react-v2 can become real instead of listing all packages symmetricallyNo schema change yet.
What got locked in:
2026-04-02 snapshot:
6826826826820628What got clarified:
Open pressure for later:
No schema change yet.
What got locked in:
682-issue rescore did not change the center of gravityMobile, IME, And Input Semantics: 21.37Performance And Scalability: 19.58React Runtime, Identity, And Subscription Model: 17.41Selection, Focus, And DOM Bridge: 17.04What got clarified:
No schema change yet.
What got locked in:
407113162cross-package: 267slate-react: 136slate: 100What got clarified:
slate-react-v2 and slate-dom-v2 should carry most runtime-boundary workslate-v2 owns the engine semantics that make that runtime saneslate-dom counts are still misleading because the DOM bridge mostly shows up as cross-packageNo schema change yet.
What got locked in:
682-issue corpus instead of the old pilot passWhat got clarified:
slate-v2No schema change yet.
What got locked in:
slate-v2slate-dom-v2slate-react-v2What got clarified:
slate-react-v2 would just recreate cleanup-crew architectureslate-v2 transaction coreslate-dom-v2 selection bridge foundationslate-react-v2 snapshot subscriptionsNo schema change yet.
What got locked in:
What got clarified:
slate-v2 should start alone as a prototype packageslate-dom-v2 and slate-react-v2 should not be scaffolded yetDo not let the first schema become a prison.
The point of the pilot and early batches is to improve the research format while the pain is still visible. If the ledger, dossier, cluster file, or package matrix format turns out to be too weak, too vague, or too annoying to use, change it.
Format evolution is allowed. Silent drift is not.
Every schema change must be written down here before the run continues at scale.
The research owner is the main thread.
Do not delegate final synthesis, cluster naming, score weighting, or v2 architecture recommendations. Those are the highest-context decisions and should not be split across weaker or partial contexts.
Subagents are allowed only for bounded extraction work:
Subagents are not allowed for:
If subagents are used, they must run on the same frontier-capable model tier as the main thread, not on a cheaper weaker fallback.
If that is not available, stay single-threaded.
This research is exactly the kind of work where a weaker model quietly produces fake certainty and poisons the later synthesis.
The canonical source of truth is always the on-disk artifact, not subagent memory.
That means:
Subagents may propose rows. The main thread accepts or rewrites them.
If delegation is used at all, keep it to this shape:
Everything else stays in the main thread.
The cache is not model memory. The cache is the research artifacts.
That means we should never need to fully reread all 600+ issues for a later pass unless the tracker itself changed dramatically.
open-issues-ledger.md stores one compact canonical row per issue:
This is the navigation layer.
open-issues-dossiers.md stores the maintainer-grade summary for each fully reviewed issue:
This is the reusable triage layer.
test-candidate-map.md stores the implementation-facing TDD extraction for issues that are valid enough to reproduce:
This is the reusable implementation layer.
benchmark-candidate-map.md stores the implementation-facing benchmark extraction for performance issues:
This is the reusable performance-implementation layer.
issue-clusters.md stores theme-level synthesis so later passes can work from groups instead of reopening individual issues by default.
An issue should only be reopened in a later pass if one of these is true:
updatedAt changed since last reviewOtherwise, use the dossier and ledger as the source of truth.
If the goal includes future maintainer triage, comments are not optional.
Issue bodies alone miss:
That means:
Goal:
Tasks:
Deliverable:
Exit criteria:
Goal:
Tasks:
Fetch fields:
Deliverable:
docs/slate-issues/open-issues-ledger.md with one row per open issueExit criteria:
Goal:
Per-issue fields:
Allowed issue validity values:
Allowed maintainer action suggestion values:
Allowed reply posture values:
Allowed TDD readiness values:
Allowed benchmark readiness values:
Allowed subsystem values:
Allowed issue type values:
Allowed user pain values:
Allowed recurrence values:
Allowed workaround values:
Allowed v2 relevance values:
Allowed scope class values:
Allowed root-cause layer values:
Allowed package impact values:
slateslate-reactslate-domslate-historyslate-hyperscriptExit criteria:
Goal:
Tasks:
Rules:
Deliverable:
docs/slate-issues/test-candidate-map.mdExit criteria:
ready-now issue and start the red test without reopening GitHubGoal:
Tasks:
Rules:
Deliverable:
docs/slate-issues/benchmark-candidate-map.mdExit criteria:
ready-now performance issue and start a benchmark lane without reopening GitHubGoal:
Read full issue bodies/comments only for:
This pass is no longer the first time comments are read.
It is the pass where ambiguous threads are reread carefully and dossier summaries are tightened.
Tasks:
Exit criteria:
Goal:
Cluster rules:
Example cluster shapes:
Deliverable:
docs/slate-issues/issue-clusters.mdExit criteria:
Goal:
Score each cluster 1 to 5 on:
Weighted formula:
priority = (pain * recurrence) + architectural_depth + breadth + v2_leverage
Interpretation:
Deliverable:
docs/slate-issues/issue-clusters.mdExit criteria:
Goal:
Packages to evaluate:
slate-v2slate-react-v2slate-dom-v2slate-history-v2slate-hyperscript-v2Per package:
Deliverable:
docs/slate-issues/package-impact-matrix.mdExit criteria:
Goal:
Requirement format:
Example:
Deliverable:
docs/slate-issues/requirements-from-issues.mdExit criteria:
Goal:
Stages:
Each stage needs:
Deliverable:
docs/slate-issues/roadmap-from-issues.mdExit criteria:
No schema change yet.
What got reinforced:
#4716 and #4542 are clearly architecture debates, not ordinary bugsslate-react pressure remains one of the strongest package-level signals because of #4612No schema change yet.
What got reinforced:
slate-react runtime ownership keeps showing up through focus transfer, render callback churn, shared object identity, and blur-selection behavior#4483Before moving from one pass to the next:
slate-v2slate-react-v2slate-dom-v2slate-history-v2slate-hyperscript-v2Start with Pass 0 through Pass 2 only.
Do not try to read, cluster, score, and roadmap in one marathon. That is how the whole thing turns into “I kind of remember some issues about selection.”
The first milestone is simple:
That is the first point where the research becomes trustworthy.
Do not jump straight to all 600+ issues.
First run a pilot batch of 25 to 50 open issues and use it to validate:
Only after that pilot should the schema be locked for the full run.
No schema change yet.
What got reinforced:
Cmd+A/delete, Safari autocorrect, and multibyte input casesslate-react rerender breadth is now clearly benchmark-worthy from #4210, with nested-block depth in #4141 as the same family rather than a new familyNo schema change yet.
What got validated:
Open pressure for later:
slate-react runtime debt and slate-dom bridge debtNo schema change yet.
What got validated:
slate-react-v2 plus slate-dom-v2Open pressure for later:
No schema change yet.
What got validated:
slate-react-v2 plus slate-dom-v2 splitmove_node undo, and grouped state restoreslate-react perf lane from #3656, but it mostly reinforced already-known runtime and input clusters instead of creating a new architecture frontOpen pressure for later:
No schema change yet.
What got validated:
renderElement, plugin events, and editor hook surfaces are older and more principled than recent noise made them lookslate-react perf lane from #3430, but most of the signal still points at runtime semantics and extension-surface pressure rather than raw throughput aloneOpen pressure for later:
No schema change yet.
What got validated:
Open pressure for later:
The issue-intelligence program is complete enough to hand off into real v2 planning.
Stable outputs now exist for:
That means the next lane is no longer “read more issues.”
It is:
packages/slate-v2 only after the Phase 0 proof gates are accepted