Back to Plate

Frontier Family Architecture Review

docs/plans/2026-05-27-frontier-family-architecture-review.md

53.0.8111.0 KB
Original Source

Frontier Family Architecture Review

Objective: Close the Frontier-family architecture review for user review. Inspect the cloned siliconjungle/-shapeshift-labs-frontier* repos, decide what Slate v2 and Plate should steal, reject, or depend on, and keep the lane open until the scheduled Slate Plan passes prove the decision with issue accounting, research refresh, pressure passes, objections, and final gates. Passes 1-12 are closed. No planning pass remains runnable.

Goal plan: docs/plans/2026-05-27-frontier-family-architecture-review.md

Template: docs/plans/templates/slate-plan.md

Primary template: docs/plans/templates/slate-plan.md

Applied packs:

  • slate-plan

Completion threshold:

  • User-review-ready plan with total score >= 0.92 and no dimension below 0.85.
  • Every pass row must be complete or intentionally skipped with evidence.
  • Issue/reference sync rows must be closed before any final claim.
  • Every Slate v2 runtime/browser/API claim must cite live .tmp/slate-v2 source or command proof.
  • node .agents/rules/autogoal/scripts/check-complete.mjs docs/plans/2026-05-27-frontier-family-architecture-review.md must pass only in the final closure pass.

Verification surface:

  • Planning evidence runs from plate-2.
  • Frontier evidence is local cloned source under /Users/zbeyens/git.
  • Slate v2 current-shape evidence is live source under .tmp/slate-v2.
  • No Slate v2 implementation or browser behavior is claimed in pass 12.

Constraints:

  • Planning mode only for this activation.
  • Do not patch Slate v2 runtime code until the user accepts a ready plan and invokes execution.
  • Keep raw Slate unopinionated. Plate owns product-shaped APIs.
  • Prefer first-party Slate primitives over runtime dependencies when the model needs Slate paths, operations, roots, refs, selection, history, or collaboration semantics.

Boundaries:

  • Allowed edits in planning mode: docs/plans/**, docs/research/**, docs/slate-issues/**, docs/slate-v2/ledgers/**, docs/slate-v2/references/**.
  • Reviewed local repos: /Users/zbeyens/git/-shapeshift-labs-frontier*.
  • Reviewed live Slate v2 source: .tmp/slate-v2/packages/slate, .tmp/slate-v2/packages/slate-react, and .tmp/slate-v2/packages/slate-history.
  • Reviewed Plate pressure: packages/core/src/react/stores/element, docs/performance/editor-performance-master-plan.md, and packages/ai/src/react/ai-chat/utils/applyAISuggestions.ts.

Blocked condition:

  • Block only if the Frontier repos or live Slate v2 checkout become unreadable, or if a later pass requires a user product boundary that cannot be inferred from existing repo evidence.

Slate Plan lane state:

  • slate_plan_lane_status: complete
  • current_pass: closure-score-final-gates
  • current_pass_status: complete
  • next_pass: none
  • next_action: none
  • final_handoff_status: complete

Current verdict:

  • verdict: steal ideas, do not add a runtime dependency to Slate v2 core
  • confidence: 0.92 after pass 11
  • keep / cut / revise call: keep Slate v2's operation/root/history model, add first-party compact state-patch and replay tooling inspired by Frontier, route opinionated mutation-plan DX to Plate, keep Frontier only as a possible dev/benchmark comparator, and reject Frontier CRDT/richtext as replacement substrates
  • reason: Frontier is a strong JSON/state-diff toolkit, but Slate v2 already has root-aware operations, state patch hooks, runtime-id dirtiness, and operation-based history. Pulling Frontier into core would duplicate parts that must stay Slate-specific and weaken selection/history/collab semantics.
  • issue discovery call: do not run a fresh ClawSweeper sweep in pass 2. Existing generated/manual ledgers and fork dossier sections already cover the touched issue families: repeated update performance, large-document cut performance, history scope/memory, collaboration/Yjs pressure, synced/content-root DX, and non-node state-field architecture. This pass changes no issue claim text.
  • issue-ledger pass call: no new fixed/improved/related claim text in pass 3. The full support-file scan expands the local plan matrix only and preserves existing classifications for performance, React runtime, projection, dynamic-decoration, history, collaboration, and content-root rows.
  • intent-boundary call: pass 4 resolves the ownership split. Slate can decide first-party state-field patch/replay primitives, state-field-local watch routing, and proof artifacts. Plate owns product-shaped mutation plans. A Frontier package dependency is not justified for core runtime and can only be reconsidered as isolated dev/benchmark tooling after future proof.
  • research/source refresh call: pass 5 confirms the owner split against the compiled React/Lexical/ProseMirror/Tiptap/Yjs research layer, local upstream source reads, live .tmp/slate-v2 state/tx/state-field/history/selector source, live Plate selector and AI-suggestion source, and refreshed Frontier source reads. No contradiction found. Remaining weakness is proof, not research direction.
  • pressure call: pass 6 keeps the architecture but narrows execution. First priority is a Slate-owned compact state-field patch/replay helper with large-state history/collab proof. State-field-local routing is conditional on a benchmark showing key-level fanout is actually red. Plate mutation plans are valuable, but they stay a separate Plate API lane. Frontier remains out of runtime deps; at most it can be an isolated dev/benchmark comparator.
  • maintainer objection call: pass 7 keeps the hard cuts. The strongest maintainer objection is not "use Frontier" but "do not expose broad new APIs before proof." The plan now treats the compact state-patch helper as the first Slate execution candidate but keeps public API exposure proof-gated, keeps state-field routing benchmark-gated, keeps Plate mutation plans Plate-only, rejects Frontier CRDT/richtext/runtime adoption, and requires collaboration and native-behavior proof before any behavior claim.
  • high-risk deliberate call: pass 8 keeps the plan but adds veto gates for the ugly failures: compact patches can corrupt undo/redo/collab replay, routing can become a second render engine, mutation plans can become a raw Slate DSL, benchmark wins can hide native behavior regressions, and devtools can leak into runtime architecture. Execution must prove roundtrip, inverse, replay, fanout, native behavior, migration, and docs/example rows before shipping.
  • ecosystem maintainer call: pass 9 keeps the plan and tightens adoption. Plugin authors stay on state-field descriptors and do not wrap every core call. Plate gets an internal-first mutation-plan lane that compiles to existing transforms. slate-yjs keeps Yjs, relative positions, awareness, remote-origin history policy, and provider-owned conflict behavior. Browser/runtime, docs/example, and benchmark owners get explicit release gates instead of promises.
  • revision call: pass 10 folds the pass pile into one execution order. The first accepted execution artifact is a Slate compact state-field patch helper, internal-first and public only after proof. Replay/profile stays dev/proof tooling. State-field routing is benchmark-gated and may be skipped. Plate mutation plans are a separate Plate lane. Frontier remains dev/comparator only, never runtime.
  • issue sync accounting call: pass 11 adds one manual gitcrawl sync note for this Frontier review and keeps the PR reference and issue coverage matrix otherwise unchanged. There are zero new fixed issue claims, zero new improved issue claims, zero new related rows, and no PR-body addition. Existing state-field, performance, content-root/projection, history, collaboration, and Plate/product-boundary rows already own the relevant issue pressure.
  • closure call: pass 12 closes the planning lane. The scorecard is at 0.92 with no dimension below 0.85, every scheduled pass is complete, issue/reference sync is closed, the handoff is recorded, and no Slate v2 implementation or browser behavior is claimed by this planning goal.

Completion rule:

  • Do not call update_goal(status: complete) while any pass after pass 1 is pending.
  • Do not call update_goal(status: complete) until the closure/final-gates pass is the active pass and all gates below are closed.
  • This file plus the active goal are the durable lane state.

Start Gates:

GateAppliesEvidence
Skill analysis before editsyesRead .agents/skills/slate-plan/SKILL.md; one-pass-only policy applied.
Active goal checked or createdyesget_goal returned active goal 019e5f10-3661-7312-a67b-66daf0a1aa99.
Source of truth read before editsyesRead research index/log, issue ledgers, Frontier source, live Slate v2 source, and Plate perf/source owners.
docs/solutions checked for non-trivial existing-code workN/APlanning-only architecture review; no implementation patch in this activation.
Live .tmp/slate-v2 grounding needed for current-state claimsyesCurrent owners cited in scorecard, runtime target, and verification table.

Work Checklist:

  • Objective includes lane outcome, full pass schedule, one-pass-per- activation policy, completion threshold, verification surface, constraints, boundaries, and blocked condition.
  • One-pass-per-activation policy respected; passes 1-12 are closed across separate activations, and no planning pass remains runnable.
  • Live source grounding recorded for pass-1 current implementation claims.
  • Issue ledger / ClawSweeper pass applied or skipped with concrete evidence.
  • Research and ecosystem synthesis complete for every external system used as evidence.
  • Intent/boundary record and decision brief complete.
  • Scorecard recorded with evidence; total score >= 0.92 and no dimension below 0.85 before closure.
  • Applicable implementation-skill review matrix applied or skipped with concrete reason.
  • Slate maintainer objection ledger complete for every breaking/paradigm change, or marked N/A with reason.
  • High-risk deliberate-mode pre-mortem and proof plan complete for patch replay, routing, Plate mutation plans, collaboration, native behavior, and dev/proof tooling.
  • Ecosystem maintainer pass complete for plugin authors, Plate, slate-yjs/collab, browser-runtime, docs/example, and benchmark owners.
  • Revision pass complete: execution order, API posture, docs/example posture, benchmark gates, and stale/open wording consolidated.
  • Issue sync accounting complete: manual gitcrawl sync note added, PR reference intentionally unchanged, issue coverage matrix intentionally unchanged, and claim deltas recorded as zero.
  • Verification workspace gate recorded for pass-1 source claims.
  • TDD marked N/A for pass 11 because there is no behavior patch.
  • Browser proof marked N/A for pass 11 because no browser behavior is claimed.
  • Closure pass complete: lane state is closed, final handoff is recorded, score threshold is met, issue/reference sync is closed, and verifier evidence is recorded.

Completion Gates:

GateAppliesRequired actionEvidence
Named verification thresholdyesComplete pass 12 and final plan checkpasses 1-12 closed; score 0.92; final handoff recorded
Slate v2 source, runtime, browser, package, public API, or issue-fix claimyesRecord live .tmp/slate-v2 command/proof for any behavior claimpasses 1-12 record source/ledger/plan pointers only; no runtime/browser/API change claimed
Issue ledger or PR reference changedyes, ledger note only in pass 11Update ledger and record PR-reference decisiongitcrawl sync ledger updated; PR reference and issue coverage matrix intentionally unchanged
Autoreview for uncommitted implementation changesN/ANo implementation patch in pass 12planning-only
Final user-review handoffyesEmit only after closure passrecorded in final handoff outline and closure sections
Goal plan completeyesRun node .agents/rules/autogoal/scripts/check-complete.mjs docs/plans/2026-05-27-frontier-family-architecture-review.mdfinal verifier run recorded in verification evidence

Phase / pass table:

PhaseStatusEvidenceNext
Current-state read and initial scorecompleteFrontier repos cloned; package/source map read; live Slate v2 and Plate owners citedrelated issue discovery
Related issue discoverycompleteReused existing live/manual ledgers and fork dossier rows for #6038, #5992, #5771, #5533, #5515, #5212, and #3752; no new ClawSweeper run because classifications already exist and no claim text changesissue-ledger pass
Issue-ledger passcompleteScanned issue-clusters, requirements-from-issues, package-impact-matrix, benchmark-candidate-map, v2 coverage matrix, fork dossier, PR reference, and gitcrawl sync ledger; expanded issue matrix without changing claim statusesintent/boundary pass
Intent/boundary and decision briefcompleteRewrote the ownership boundaries and decision brief: Slate first-party state/replay primitives, Plate mutation-plan DX, dev-only Frontier comparator, rejected CRDT/richtext/cache/realtime runtime adoptionresearch refresh
Research, ecosystem strategy, live-source refreshcompleteRead React 19.2, Lexical, ProseMirror, Tiptap, Yjs/slate-yjs, and Slate v2 research pages; checked local upstream source handles; refreshed live Slate/Plate/Frontier source pointers; no owner-boundary contradiction foundpressure passes
Performance/DX/migration/regression/simplicity pressure passescompleteApplied Vercel React, performance-oracle, performance, tdd, react-useeffect, and shadcn lenses; added cohorts, repeated-unit budgets, INP/memory/native-behavior proof rows, execution priority, and cut/defer callsobjection ledger
Slate maintainer objection ledgercompleteSteelmanned maintainer objections against every proposed steal/cut: state-patch helper, routing, no runtime dependency, Plate split, CRDT/richtext rejection, replay tooling, public API exposure, and native behavior proofhigh-risk pass
High-risk deliberate modecompleteAdded realistic failure scenarios, expanded unit/browser/parity/stress/migration/docs proof plan, blast-radius table, rollback/hard-cut answers, and no-ship veto gatesecosystem maintainer pass
Ecosystem maintainer passcompleteAdded plugin/Plate/slate-yjs/browser/docs/benchmark owner answers, affected extension points, migration-backbone surfaces, collab contracts, and closure proof rowsrevision pass
Revision passcompleteConsolidated the pass outputs into a final execution order, proof-gated API posture, docs/example posture, benchmark gate policy, and revised decision/open-question wordingissue sync accounting
Issue sync accountingcompleteAdded the Frontier review planning sync to docs/slate-issues/gitcrawl-v2-sync-ledger.md; verified PR reference non-claim language and issue coverage rows remain correct; recorded zero fixed, improved, related, and PR-body deltasclosure score and final gates
Closure score and final gatescompleteScore is 0.92, no dimension is below 0.85, issue/reference sync is closed, final handoff is recorded, and lane state has next_pass: none / next_action: nonefinal handoff

Scorecard:

DimensionWeightScoreEvidence
React 19.2 runtime performance0.200.91Pass 10 turns performance posture into a release gate: React profile wins count only with selector fanout, state-field notification, event-to-paint, memory/subscription, and native behavior rows. Pass 11 preserves existing performance issue statuses: #6038, #5992, #5945, #4056, #3752, #5131, #2051, #2195, #2405, and #790 are not promoted by Frontier comparator ideas.
Slate-close unopinionated DX0.200.92Pass 10 consolidates the DX story: raw Slate keeps state fields and hooks; the compact helper is internal-first; public API exposure needs one failing proof row, one real call site, and one docs/example row. No Frontier-branded API and no raw Slate mutation DSL.
Plate and slate-yjs migration backbone0.150.91Pass 10 keeps downstream migration crisp: Plate mutation plans are a separate Plate lane over existing transforms; slate-yjs keeps Yjs/relative-position/awareness ownership; replay/model-check tooling supports those owners rather than replacing them.
Regression-proof testing strategy0.200.92Pass 11 closes issue/reference sync without broadening claims: the manual gitcrawl sync note records zero fixed, improved, related, and PR-body deltas; existing non-claim gates still require benchmark, browser, collab, native behavior, and release proof before execution can change issue status.
Research evidence completeness0.150.92Pass 11 ties the final architecture decision back to the live issue accounting: PR reference non-claim language, issue coverage matrix rows, and gitcrawl sync rows now explicitly preserve state-field, performance, content-root/projection, history, collaboration, and Plate/product-boundary ownership.
shadcn-style composability and minimalism0.100.92Pass 10 reduces the final shape to narrow composable surfaces: one internal-first Slate helper, one conditional routing lane, one dev/proof replay lane, one separate Plate product lane, and no runtime Frontier dependency.

Weighted score:

  • 0.92

Source-backed architecture north star:

  • target shape: Slate v2 should keep operations, roots, refs, selection, and history first-party. Add compact state-patch codecs, patch-routed plugin-state subscriptions, replay logs, and profile artifacts as Slate-owned primitives.
  • source evidence: Slate StateFieldDescriptor already has diff, applyPatch, and invertPatch; large shared/history fields without hooks throw above 32 KB (.tmp/slate-v2/packages/slate/src/core/public-state.ts:362-423).
  • rejected drift: Do not make Frontier the editor transaction, history, rich text, or CRDT substrate.
  • migration posture: Plate can adopt the explicit mutation-plan DX as a command planning layer; slate-yjs should steal model-check/replay harness ideas, not replace Yjs with Frontier CRDT.

Pass-5 research / live-source refresh findings:

Evidence surfaceRefreshed sourceResultPlan effect
React runtime posturedocs/research/sources/editor-architecture/react-19-2-external-store-and-background-ui.md; .tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx:213-387React 19.2 supports external stores/background UI, and Slate React already uses runtime-id/deferred selector fanoutKeep React-native runtime; pressure deeper invalidation in pass 6
State/tx public APIdocs/research/decisions/slate-v2-state-tx-public-api-and-extension-namespaces.md; .tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts:139-220,348-454Current direction is state/tx groups, with live tests for grouped reads/writes and tx.value.replaceSlate raw DX stays primitive and namespace-based
Slate state fields.tmp/slate-v2/packages/slate/src/interfaces/editor.ts:111-120; .tmp/slate-v2/packages/slate/src/core/public-state.ts:362-423State fields already expose diff/apply/invert hooks and enforce patch hooks for large shared/history valuesFirst Slate steal should extend/standardize field patch helpers, not import Frontier
State-field subscriptions.tmp/slate-v2/packages/slate-react/src/hooks/use-state-field.ts:40-52; ../-shapeshift-labs-frontier-state/src/subscription.ts:145-260Slate state-field React hook is key-level; Frontier proves path/range routing mechanicsCandidate is state-field-local routing only, not generic node render routing
Slate history.tmp/slate-v2/packages/slate-history/src/history-extension.ts:168-209,271-350History replays semantic operations plus state patches and merges by root-aware operationsReject Frontier snapshot-patch history as replacement
Lexicaldocs/research/sources/editor-architecture/lexical-read-update-extension-runtime.md; /Users/zbeyens/git/lexical/packages/lexical/src/LexicalEditor.ts:1368-1388Read/update lifecycle and dirty/update tags support Slate's lifecycle directionSteal lifecycle discipline, not class nodes or command-first app API
ProseMirrordocs/research/sources/editor-architecture/prosemirror-transaction-view-dom-runtime.md; /Users/zbeyens/git/prosemirror/state/src/transaction.ts:42-92,185-214Transactions own selection mapping, stored marks, metadata, and scroll intentBuild Slate-op-aware mapping/proof, not JSON-patch path mapping
Tiptapdocs/research/sources/editor-architecture/tiptap-extension-command-react-dx.md; /Users/zbeyens/git/tiptap/packages/core/src/CommandManager.ts:7-135Product command/chain DX is useful but backed by one transactionRoute mutation-plan ergonomics to Plate and compile to Slate/Plate transforms
Yjs/slate-yjsdocs/research/sources/editor-architecture/yjs-collaboration-bindings.md; /Users/zbeyens/git/slate-yjs/packages/core/src/plugins/withCursors.ts:160-260; /Users/zbeyens/git/slate-yjs/packages/core/src/utils/position.ts:65,268Extension-owned binding, relative positions, and awareness are useful; legacy wrapper mutation is notKeep slate-yjs/Yjs route and steal replay/model-check proof ideas from Frontier
Plate sourcepackages/core/src/react/stores/element/useElementSelector.ts:11-89; packages/ai/src/react/ai-chat/utils/applyAISuggestions.ts:27-110Plate already has external-store selectors and product-specific transform logicPlate mutation plans can improve agent/bulk DX without changing raw Slate

Pass-6 pressure outcome:

PressureHard callWhyProof gate before execution claim
Execution priorityBuild Slate compact state-field patch/replay helper firstIt is the closest direct win already supported by live StateFieldDescriptor hooks and history state patchesstate-field patch roundtrip, inverse, >32 KB policy, undo/redo, collab export/import
State-field-local routingDo not build until a focused benchmark proves key-level dirty-state fanout is redCurrent hook is key-level; path/range routing adds API and mental costlarge map/list state field with many watchers, p95 notification count, heap/subscription tags
Frontier dependencyNo runtime dependency; optional isolated dev/benchmark comparator onlyCore runtime needs Slate paths, roots, operations, refs, selection, and history semanticsbenchmark package proves comparison/replay value with zero core dependency edge
Plate mutation plansKeep as Plate-only product DX, not raw SlateGood agent/bulk transform ergonomics, but raw Slate should not become a JSON mutation DSLAI suggestion/bulk-transform tests prove same output, conflict handling, and no semantic ID loss
slate-yjsKeep Yjs route; steal model-check/replay tooling onlyFrontier CRDT does not replace relative positions, Yjs ecosystem, or Slate op/history semanticsscheduled remote/local replay, minimize failure artifacts, awareness external-store tests
React runtimeUse React 19.2 for external stores/background UI, not editor invalidationReact schedules; Slate decides dirty editor truthReact Performance Tracks plus Slate commit dirtiness for same interaction
SimplicityAdd no public API until benchmark/proof needs itThe source already has hooks; the risk is over-abstracting before evidenceevery added API has a failing benchmark/test row and one expected call site

Pass-6 performance contract:

ItemDecision
Vercel rules usedrerender-defer-reads, rerender-derived-state, rerender-move-effect-to-event, rerender-transitions, rerender-use-deferred-value, rerender-use-ref-transient-values, js-index-maps, js-set-map-lookups, js-length-check-first, js-early-exit, js-combine-iterations
Extra performance rules usedcohort-segmentation, repeated-unit-budget, effect-subscription-budget, interaction-inp-matrix, memory-dom-tagging, degradation-contract, react-19-runtime-proof, editor-native-behavior-proof
Cohortsnormal 0-500 blocks, medium 500-2000, large 2000-10000, stress 10000-50000, pathological tagged by custom renderers, decorations/comments, voids/tables, collaboration activity, hidden/content roots, mobile/IME/browser
Repeated unitsblock, leaf/text, state-field entry, state-field watcher, history batch, collab replay action, Plate mutation-plan operation
Budgetsno state-field write scales with full document; no per-node Frontier/router subscription; no repeated-unit effects unless external sync; no global React fanout for field-local changes; patch bytes and watcher counts recorded
Interaction metricstype, select, select-then-type, select-all, copy, paste, undo, redo, state-field update, remote update, synced/content-root edit, Plate AI suggestion apply; record p50/p75/p95/p99 or lab event-to-paint proxy
Memory/DOM tagsJS heap, DOM node count, React component proxy, event listener count, subscription count, patch byte size, cached index sizes, dirty id set size, hidden/content-root count, decoration/comment count
Degradation contractdefault path stays DOM-present/native; any virtualized/shell/model-backed mode is explicit opt-in for stress/pathological cohorts with behavior rows
Native behavior rowsbrowser find, screen-reader traversal, native selection, copy, paste, select-all, IME/composition, mobile touch selection, undo/history, collaboration/remote update, follow-up typing
Dashboard/RUM gapfuture execution should tag interaction, cohort, browser, mode, block count, plugin-state size, patch byte size, watcher count, and memory/DOM pressure; no production claim before those tags exist

Pass-6 acceptance contracts:

CandidateUnit/package proofBrowser/stress proofCut/defer rule
Slate compact state-field patch helperfield diff/apply/invert roundtrip, inverse undo/redo, >32 KB policy, history merge/split behavior, shared/local/persist policylarge shared/history state update across undo/redo and remote replaycut if helper adds API but no measured memory/history win over field-owned hooks
State-field-local routingroute exact/key/path/range watchers over large map/list fields; watcher count and notification count assertionslarge plugin-state editor with many inactive watchers; typing and state update INP proxydefer if key-level dirty state is already below budget
Slate replay/profile artifactsreplay commit log with operations and state patches; minimize failed state/collab schedulesreproduce history/collab/content-root failures with follow-up typing proofdev/proof only unless runtime needs measured output
Plate mutation-plan helpercompile plan to existing Plate/Slate transforms; conflict/access frame tests; semantic id/mark preservationAI suggestions and bulk transform example keep visible output and selection semanticskeep internal if public API call site is not simpler than current Plate commands
slate-yjs replay harnessremote import through editor.update, skip-history metadata, relative selection/bookmark restorationmulti-root/content-root remote edit, undo, cursor, follow-up typingnever replace Yjs provider or relative-position route

Cloned Frontier package map:

FamilyUseful ideaDependency call
frontier, frontier-engine, frontier-codecCompact JSON patch, adaptive profile, binary patch historyDev/benchmark dependency only; first-party Slate codec for runtime
frontier-state, frontier-reactPatch-routed state watchers and external-store selector shapeSteal pattern; no Slate/Plate runtime dependency
frontier-mutation, frontier-queryExplicit mutation/select/access/conflict plansStrong Plate idea; maybe Slate extension-command planning later
frontier-crdt, frontier-crdt-syncCRDT model-check/replay/minimize toolingSteal testing ideas; reject as Slate collaboration core
frontier-richtextDelta/range/annotation helpersMaybe Plate AI/suggestions inspiration; reject as Slate document model
frontier-event-log, frontier-loggingBounded event log, replay cursors, patch summariesGood devtools/proof lane; runtime optional
frontier-state-cache-*Normalized query cache and persistenceNot core Slate; maybe app/Plate comments/suggestions cache only with a real product benchmark
frontier-realtime-*, frontier-gameRealtime/game protocol and transportReject for editor architecture

Public API target:

SurfaceProposed shapeUser-facing DXCompatibility / migrationEvidenceVerdict
Slate state fieldsAdd or document first-party compact patch helpers for large shared/history state fieldsExtension authors can opt into replayable compact state without importing unrelated app-state packagesExisting StateFieldDescriptor hook names stay.tmp/slate-v2/packages/slate/src/interfaces/editor.ts:111-120; .tmp/slate-v2/packages/slate/src/core/public-state.ts:397-423steal internally
Slate plugin-state subscriptionsConsider path/key watcher descriptors for state fields with large maps/listsHooks can subscribe narrower than dirtyStateKeys.includes(field.key)Backward compatible; default stays key-levelCurrent hook is key-level only (.tmp/slate-v2/packages/slate-react/src/hooks/use-state-field.ts:40-52); Frontier router supports path/field/range watches (../-shapeshift-labs-frontier-state/src/types.ts:174-241)revise in later pass
Plate mutation plansOptional Plate command-planning helper for AI/bulk transformsAgent-readable plan -> access/conflict -> compile -> apply flowPlate-only; no raw Slate opinion leakageFrontier access/conflict and compile output (../-shapeshift-labs-frontier-mutation/src/index.ts:921-1165)steal for Plate
Runtime dependencyDo not add Frontier to Slate v2 coreSmaller core, fewer semantics fightsCan still use Frontier in benchmarks/devtools if measuredSlate already owns operation dirtiness/history/root semanticscut

Internal runtime target:

LayerCurrent ownerTarget mechanismAvoidsEvidenceVerdict
State patchingSlate public-state.tsFirst-party patch hooks plus optional built-in compact JSON patch for state fieldsFull snapshot cloning for large shared/history plugin state.tmp/slate-v2/packages/slate/src/core/public-state.ts:372-423steal concept
Dirtiness fanoutSlate commit/change and Slate React selectorsKeep runtime-id dirtiness for document nodes; add state-field-local watch routing only where state maps are hugeDuplicating Frontier route tree for node render paths.tmp/slate-v2/packages/slate/src/core/public-state.ts:1394-1565; .tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx:238-375partial
Path/selection mappingSlate operation refs/range refsBuild Slate-op-aware mapping, not JSON-patch mappingWrong mapping across roots, voids, split/merge, selection refsFrontier path mapper shows the shape but is JSON patch based (../-shapeshift-labs-frontier-state/src/path-map.ts:21-260)steal algorithm class
History/replaySlate history extensionKeep semantic operations plus state patches; add optional encoded state-patch/event-log proof artifactsSnapshot-diff undo and non-semantic history.tmp/slate-v2/packages/slate-history/src/history-extension.ts:168-209, 271-424; Frontier snapshot undo at ../-shapeshift-labs-frontier-crdt/src/crdt-undo.ts:85-240keep Slate

Hook / component / render DX target:

SurfaceCall-site shapeComposition rulePerformance ruleEvidenceVerdict
Slate React selectorsExisting useEditorState / runtime selectorsKeep selector call sites Slate-close and root-awareRuntime-id fanout, no generic app store wrapper.tmp/slate-v2/packages/slate-react/src/hooks/use-editor-selector.tsx:213-375keep
Plate element selectorsExisting useElementSelector(selector, deps, options)Keep Plate compatibility, reduce hot path only when measuredDirect useSyncExternalStore already presentpackages/core/src/react/stores/element/useElementSelector.ts:11-89; perf notes at docs/performance/editor-performance-master-plan.md:335-367no Frontier dependency
AI suggestionsCurrent diff-to-suggestions pathFrontier may benchmark JSON diffs offline, but Plate suggestion semantics stay Plate-ownedDo not flatten suggestions into generic JSON patchpackages/ai/src/react/ai-chat/utils/applyAISuggestions.ts:27-110dev-only experiment

Plate migration-backbone target:

PressureSlate substrate targetPlate adaptation routeNon-goalEvidenceVerdict
Plugin/app stateShared/history state fields with compact patchesPlate plugins use Slate state-field hooks for comments, suggestions, synced-block registries, and overlaysDo not import Frontier state engine into Plate coreSlate state fields and history state patches are current substratesteal first-party
Bulk/AI transformsSemantic Slate operations plus optional Plate mutation-plan wrapperPlate can expose explicit transform plans for agents and conflict checksDo not make raw Slate a generic database mutation DSLFrontier mutation plan/access/compile API is strong evidencePlate yes
Element hot pathRuntime store selectorsKeep current Plate direct selector workDo not swap store brands blindlyPlate perf doc says brand swapping is not the next move (docs/performance/editor-performance-master-plan.md:1048-1068)keep

slate-yjs migration-backbone target:

PressureSlate substrate targetCollaboration routeNon-goalEvidenceVerdict
Shared document editsSlate operations/root keys/selection refsYjs adapter maps Slate ops and root-qualified cursorsReplace slate-yjs with Frontier CRDTFrontier CRDT ops are generic JSON/tree/list/text (../-shapeshift-labs-frontier-crdt/src/types.ts:66-235)reject dependency
Shared plugin stateState fields with compact patches and collab policyCollab adapter can sync collab: shared fields with field-owned patch codecsGeneric Frontier state cache as Slate coreSlate state fields already include collab, history, persist (.tmp/slate-v2/packages/slate/src/interfaces/editor.ts:105-120)steal pattern
Collab regressionsReplay/minimize/model-check harnessUse Frontier-style scheduled sync repro artifacts around slate-yjs testsAdopt Frontier text bindingFrontier text binding does whole-text replace for doc-to-editor mismatch (../-shapeshift-labs-frontier-crdt-sync/src/crdt-sync-text-binding.ts:73-110)steal tests, reject binding

Intent / boundary record:

  • intent: Mine the Frontier family for real architecture/perf/DX leverage without letting a generic JSON/state stack take over Slate's editor semantics.
  • desired outcome: A user-review-ready plan that says exactly what Slate v2 should build first-party, what Plate should expose as product DX, what may be used only as dev/benchmark tooling, and what should be rejected outright.
  • in-scope Slate behavior: state-field patch/inverse helpers, state-field-local subscriptions for large non-node maps/lists, replay/profile artifacts, and proof rows for history/collab/selection safety.
  • in-scope Plate behavior: mutation/access/conflict plans for AI and bulk transforms, compiled to existing Plate/Slate transforms rather than exposed as a raw Slate mutation DSL.
  • in-scope collaboration tooling: Frontier-style model-check/replay/minimize harness ideas around slate-yjs/Yjs integration proof.
  • non-goals: implementing in this activation, changing Slate document operations, replacing Slate's tree model with Delta/richtext, replacing slate-yjs/Yjs, shipping Frontier realtime/game/cache layers, or adding a Frontier package to Slate core just to reuse code.
  • decision boundaries: This plan may decide owner category (Slate core, Slate dev/proof tooling, Plate, defer, reject), public API posture, proof gates, issue-claim policy, and dependency posture. It may not claim runtime behavior, issue closure, or benchmark wins without later .tmp/slate-v2 proof.
  • resolved boundary decisions:
    • Slate core owns editor semantics: operations, paths, roots, refs, selection, normalization, and history grouping.
    • Generic JSON patch ideas may apply only to state fields and proof artifacts, not document operations.
    • Plate owns opinionated command planning and agent-friendly transform DX.
    • Frontier may become a dev/benchmark comparator only if future execution proves value.
    • Frontier CRDT, richtext, cache, realtime, websocket, and game layers do not belong in Slate v2 runtime.
  • resolved by pass 6:
    • Prototype order after the plan is accepted: Slate state-patch helper first, Plate mutation-plan wrapper second and separate.
    • Dev dependency policy: Frontier stays out of runtime dependencies and is acceptable only as an isolated dev/benchmark comparator if execution proves useful comparison or replay value.
  • unresolved user-decision points:
    • Plate exposure level: internal helper first or public command-plan API.

Decision brief:

  • principles:
    • Slate owns editor semantics; helpers must fit operations, roots, refs, selection, normalization, and history.
    • Generic JSON tools may support state fields and proof logs, but must not define document operations.
    • Raw Slate stays unopinionated; Plate may expose product-shaped command and agent APIs.
    • Dependencies need measured runtime, proof, or maintenance value. "Good idea" is not enough.
    • Any state/history/collab change must be replayable and issue-accounted.
  • top drivers:
    • selection/history/root correctness beats code reuse
    • React subscription fanout and large-state memory pressure
    • Plate agent DX and bulk-transform clarity
    • slate-yjs migration proof and collaboration replay
    • smallest public API that still gives extension authors leverage
  • viable options:
    • Add Frontier runtime dependencies to Slate v2 core. Pro: fastest access to compact patches/router/codec. Con: wrong semantic layer for Slate paths, operations, selection, roots, and collaboration. It also makes raw Slate depend on an app-state toolkit.
    • Build first-party Slate primitives inspired by Frontier. Pro: exact Slate semantics, stable small API, no dependency lock-in. Con: more implementation work and more responsibility for proof coverage.
    • Use Frontier only in dev/benchmark/proof tooling. Pro: cheap comparator and replay inspiration without runtime coupling. Con: no runtime win unless the benchmark/proof harness is actually adopted.
    • Put mutation-plan ideas in Plate. Pro: high DX gain where product opinions belong; strong agent-readability. Con: can become a second transform system if it leaks below Plate.
    • Adopt Frontier CRDT/richtext/cache/realtime layers. Pro: broad ecosystem-in-a-box. Con: duplicates or fights Slate/Yjs/tree/operation semantics; too much architecture for the actual editor problem.
  • chosen option:
    • Slate v2: first-party state-field patch/replay primitives plus optional state-field-local watch routing. No Frontier runtime dependency.
    • Slate dev/proof tooling: optionally benchmark against Frontier codecs and steal event-log/model-check patterns during future execution.
    • Plate: explore mutation-plan DX for AI/bulk transforms, compiled to current transforms and guarded from raw Slate.
  • rejected alternatives:
    • Frontier runtime in Slate core.
    • Frontier CRDT as collaboration core.
    • Frontier richtext/Delta as document model.
    • Frontier state-cache as editor plugin-state substrate.
    • Frontier realtime/websocket/game layers for editor architecture.
  • consequences:
    • More Slate-owned code, but fewer semantic mismatches.
    • Smaller public API in raw Slate.
    • Plate gets the higher-level DX win instead of forcing it into core.
    • Future execution must prove whether the first Slate candidate is worth shipping.
  • follow-ups:
    • Pass 5: refresh external/current-source evidence against this owner split.
    • Pass 6: pressure performance, DX, migration, regression, and simplicity.
    • Pass 7: steelman maintainer objections against the narrowed execution order, dependency posture, Plate split, and collaboration proof plan.
    • Later accepted execution: build the Slate state-patch prototype first, then consider the Plate mutation-plan prototype as its own Plate lane.

Ownership decision table:

Frontier surfaceOwner categoryDecisionFirst artifact if acceptedHard boundary
frontier-state / frontier-react watch routingSlate core, first-partysteal conceptstate-field-local watch descriptors for large plugin statenever replace node dirtiness/runtime-id render fanout with a generic store
frontier-engine / frontier-codec patchesSlate core first-party plus optional dev comparatorsteal concept, maybe benchmark dependencycompact field-owned state patch/inverse helpersno Frontier-branded public API in Slate core
frontier-event-log / frontier-loggingSlate dev/proof toolingsteal patternreplay/profile artifacts for state/history/collab testsnot required runtime infrastructure
frontier-mutation / frontier-queryPlatesteal as product DXPlate mutation-plan helper for AI/bulk transformscompile to Slate/Plate transforms; no raw Slate mutation DSL
frontier-crdt / frontier-crdt-syncslate-yjs proof lane onlysteal model-check/replay ideascollab replay/minimize harnessno replacement for Yjs/slate-yjs
frontier-richtextPlate experiments onlymaybe steal annotation/range test ideasAI/suggestion benchmark helperno Delta/richtext document model in Slate
frontier-state-cache-*defer / app-specific Plate cacheno core adoptiononly with product benchmarknot editor plugin-state substrate
frontier-realtime-* / frontier-gamerejectno adoptionnonetransport/game protocols are not editor architecture

Issue accounting:

Issue / clusterClaim categoryExact claimWhyProof routeV2 sync ledgerPR line
#6038 batch-aware apply/perfalready improves-claimedno new claimFrontier patch routing/adaptive diff speaks to repeated-update perf, but current #6038 accounting is already owned by transaction/applyOperations benchmark coveragekeep existing benchmark/proof ownerunchanged; gitcrawl-v2-sync-ledger.md and fork-issue-dossier.md:581-615existing Improves #6038 line only
#5992 large cut perfalready improves-claimedno new claimCompact state/history/replay may matter for large docs, but #5992 is already owned by the 50,000-block cut benchmark and 5,000-block browser stress rowkeep existing benchmark/proof ownerunchanged; gitcrawl-v2-sync-ledger.md; pr-description.md:641-647; benchmark-candidate-map.md:55-75existing Improves #5992 line only
#5945 large plaintext pastealready improves-claimedno new claimFrontier codec/replay ideas are adjacent, but paste perf already has a populated benchmark ownerkeep existing benchmark/proof ownerunchanged; gitcrawl-v2-sync-ledger.md; benchmark-candidate-map.md:108-134; fork-issue-dossier.md:4157-4200existing Improves #5945 line only
#4056 populated copy/pastealready improves-claimedno new claimPatch codecs do not change the user-facing clipboard claim; keep it owned by the existing populated paste/copy lanekeep existing benchmark/proof ownerunchanged; gitcrawl-v2-sync-ledger.md; benchmark-candidate-map.md:264-294; fork-issue-dossier.md:4125-4155existing Improves #4056 line only
#3752 history memorycluster-syncednoneFrontier history/event-log ideas may inform a future memory benchmark, but the issue already has a benchmark-candidate ownerlater perf/history passunchanged; gitcrawl-v2-sync-ledger.md; benchmark-candidate-map.md:298-316related/benchmark matrix only
#5515 undo/redo allcluster-synced / related history pressurenoneSlate state patches and history hooks clarify history boundaries but do not implement Undo/Redo Alllater issue pass only if API scope changesunchanged; fork-issue-dossier.md:396-418; gitcrawl-v2-sync-ledger.mdrelated matrix only
#5771 collaboration selectionalready improves-claimedno new claimFrontier model-check/replay ideas are useful, but existing #5771 accounting already limits the claim to core collab-readiness proof, not provider/browser closurekeep slate-yjs proof ownerunchanged; gitcrawl-v2-sync-ledger.md; pr-description.md:43-54existing Improves #5771 line only
#5533 collaboration without Yjscluster-synced / relatednoneFrontier CRDT is explicitly rejected as a replacement, so this review must not imply first-party Yjs-free collaboration supportkeep related/non-closureunchanged; gitcrawl-v2-sync-ledger.md; requirements-from-issues.md:106-130related matrix only
#5212 synced/content-root DXnot claimed / related in content-root plansnoneFrontier shared-state ideas overlap Synced Blocks/content-root architecture, but existing content-root rows already classify #5212 as example/DX pressure without fixed/improved claimreuse existing content-root accountingunchanged; fork-issue-dossier.md:142-184; gitcrawl-v2-sync-ledger.mdrelated/no-claim only
#3656 / #4141 render breadthalready improves-claimedno new claimFrontier-style subscription routing is relevant, but Slate v2 already has leaf/nested rerender proof rowskeep existing render-runtime proof ownerunchanged; issue-coverage-matrix.md:505-510; fork-issue-dossier.md:1151-1200existing Improves rows only
#5131 broad hook rerendersnot claimednoneBroad hooks stay broad by contract; narrower selectors can improve call sites but do not "fix" broad hook semanticskeep non-claim and use as perf pressureunchanged; issue-coverage-matrix.md:505-510; fork-issue-dossier.md:1123-1148no claim
#2051 leaf rerender pressurerelated / improves-pressureno new claimSubscription routing and text-render skip policy are pressure evidence, not exact closurerender/runtime perf gatesunchanged; issue-coverage-matrix.md:677; benchmark-candidate-map.md:488-514no new line
#2195 / #2405 dirty tracking and normalizationrelatednoneFrontier patch routing resembles dirty-window ideas, but Slate dirty paths and normalization remain Slate-op-specificlater dirty-window / normalization benchmarksunchanged; issue-coverage-matrix.md:537-538; benchmark-candidate-map.md:458-484related only
#4483 dynamic decorationsalready improves-claimedno new claimThis is the closest existing issue to patch-routed local subscriptions; current projection/local-subscription rows already own the claimkeep projection/store proof ownerunchanged; gitcrawl-v2-sync-ledger.md; issue-coverage-matrix.md:557-559; benchmark-candidate-map.md:138-160existing Improves #4483 line only
#4477 annotation/widgetsalready improves-claimedno new claimFrontier richtext annotations are only inspiration; Slate/Plate comments remain product/API-specifickeep existing projection/widget laneunchanged; gitcrawl-v2-sync-ledger.md; issue-coverage-matrix.md:557-559; fork-issue-dossier.md:5272-5296existing Improves #4477 line only
#5987 async decoratealready fixes-claimedno new claimThis is a regression floor for any state-patch/subscription work touching decorate timingkeep existing exact browser proof ownerunchanged; gitcrawl-v2-sync-ledger.md; issue-coverage-matrix.md:557-559existing Fixes #5987 line only
#3352 / #3383 / #2465 mark-decoration metadatamixed improves / related / non-claimno new claimFrontier richtext metadata overlaps the topic, but raw Slate must not adopt Delta/richtext as the modelkeep projection rows and non-claim policyunchanged; issue-coverage-matrix.md:571,712-713; fork-issue-dossier.md:4876-4902,5353-5376no new line
#790 / #4210 / #5216 proof-route backlogproof backlognoneThese rows stay benchmark backlog for layout/render/large-doc pressure; Frontier does not close thempass 6 benchmark strategyunchanged; issue-coverage-matrix.md:755-759; fork-issue-dossier.md:6918-6922no claim

Issue-ledger sync status:

  • ClawSweeper related-issue pass: complete by reuse; fresh sweep skipped in pass 2 because existing generated/manual ledgers already classify the touched surface.
  • Issue-ledger support-file pass: complete in pass 3. Read issue clusters, requirements, package-impact rules, benchmark candidates, v2 coverage matrix, fork dossier, PR reference, and gitcrawl sync rows.
  • Claim-policy result: unchanged. Pass 3 adds no Fixes, Improves, Related, or PR-description text.
  • Performance coverage summary: preserve the current explicit performance rows for #6038, #3656, #4141, #5131, #3430, #5945, #4056, #5992, #3752, #2195, #2405, #4483, and #2051; keep macro/future rows and proof-route backlog rows out of this plan's direct claims.
  • React runtime/projection summary: preserve existing rows for #4483, #4477, #5987, #3352, #3383, and #2465; use them as subscription/projection pressure, not as a Frontier dependency argument.
  • manual v2 sync ledger update: unchanged in pass 3.
  • fork issue dossier update: unchanged in pass 3.
  • issue coverage matrix update: unchanged in pass 3.
  • PR description sync: unchanged in pass 3.

Ecosystem strategy synthesis:

SystemSourceMechanismAvoidsStealRejectSlate targetVerdict
Frontier state../-shapeshift-labs-frontier-state/src/subscription.ts:145-447Patch router with exact/field/range watchers and fast single-op routingWhole-store fanout for state changesState-field-local watch routingGeneric state engine as Slate runtimeRoot/editor model remains Slate, plugin state gets narrower routingpartial
Frontier engine/codec../-shapeshift-labs-frontier-engine/src/engine.ts:150-260; ../-shapeshift-labs-frontier-codec/src/history.ts:75-244Adaptive diff, planned history, binary patch historyBig JSON snapshot historyState-patch codec and benchmark profilesEncoding Slate operations as generic JSON patches firstFirst-party codec for state patches/proof artifactspartial
Frontier mutation../-shapeshift-labs-frontier-mutation/src/index.ts:921-1165Explicit mutation plans with access/conflict and planner decisionsOpaque bulk mutationsPlate command/AI plan shapeRaw Slate generic mutation DSLPlate wrapper over Slate transforms/commandsagree for Plate
Frontier CRDT../-shapeshift-labs-frontier-crdt/src/types.ts:66-235; ../-shapeshift-labs-frontier-crdt/src/crdt-undo.ts:85-240Generic JSON/tree/list/text CRDT with snapshot undoSome sync classesModel-check/replay ideasSlate collaboration replacementKeep slate-yjs/Yjs route; improve proof harnessdiverge
Frontier richtext../-shapeshift-labs-frontier-richtext/src/index.ts:1-222Delta ops, selection/cursor transforms, annotationsManual range math for flat textPlate AI/suggestion benchmark helpersSlate document model replacementSlate stays tree/op baseddiverge
React 19.2docs/research/sources/editor-architecture/react-19-2-external-store-and-background-ui.mdExternal-store subscriptions, deferred values, transitions, hidden Activity UI, performance tracksTreating React as either too weak for editor UI or as the editor invalidation engineExternal-store and background-UI postureReact as document/dirty-region ownerReact consumes Slate commits/runtime dirtiness; Slate owns invalidationagree
Lexicaldocs/research/sources/editor-architecture/lexical-read-update-extension-runtime.md; /Users/zbeyens/git/lexical/packages/lexical/src/LexicalEditor.ts:1368-1388Read/update lifecycle, dirty-node/update tags, extension lifecycleMutation outside coherent runtime contextLifecycle and metadata disciplineClass nodes, $ helpers, command-first app APIeditor.read, editor.update, state/tx groups, commit tagspartial
ProseMirrordocs/research/sources/editor-architecture/prosemirror-transaction-view-dom-runtime.md; /Users/zbeyens/git/prosemirror/state/src/transaction.ts:42-92,185-214Transactions map selection, stored marks, metadata, and scroll intentStale selection and random DOM ownershipComposite transaction/selection disciplineInteger positions and plugin complexitySlate operations/refs/root-aware mapping, centralized DOM bridgepartial
Tiptapdocs/research/sources/editor-architecture/tiptap-extension-command-react-dx.md; /Users/zbeyens/git/tiptap/packages/core/src/CommandManager.ts:7-135Extension commands and chain compose around one transactionUndiscoverable product actionsProduct command planning and selector UI postureRequired focus/chain ceremony in raw SlatePlate mutation plans compile to Slate/Plate transformsagree for Plate
Yjs / slate-yjsdocs/research/sources/editor-architecture/yjs-collaboration-bindings.md; /Users/zbeyens/git/slate-yjs/packages/core/src/plugins/withCursors.ts:160-260Binding state, relative positions, awareness cursor store, undo/cursor lessonsCollaboration hidden in editor wrapper mutationReplay/model-check proof and Yjs binding mechanicsReplacing Yjs with Frontier CRDTExtension-owned slate-yjs package with state/tx namespacespartial
Live Slate v2.tmp/slate-v2/packages/slate/test/state-tx-public-api-contract.ts:139-220,348-454; .tmp/slate-v2/packages/slate/src/core/public-state.ts:362-423State/tx groups, state-field patch hooks, runtime ids, operation/history substrateRebuilding a second runtime beside SlateTighten first-party primitives already presentFrontier runtime dependencystate-field patch helpers, optional state-field-local watchers, replay proofagree
Live Platepackages/core/src/react/stores/element/useElementSelector.ts:11-89; packages/ai/src/react/ai-chat/utils/applyAISuggestions.ts:27-110External-store element selectors and product-specific AI suggestion transformsForcing product DX into raw SlateAgent-readable mutation planning around existing Plate transformsGeneric JSON patch as Plate suggestion truthPlate-only mutation-plan helperagree for Plate

Legacy regression proof matrix:

Regression classLegacy behaviorSlate v2 targetProof routeOwnerStatus
Large shared/history stateSnapshot patches can explode memory/historyCompact field-owned patches and inversesunit stress with >32 KB state field; undo/redo inverse replay; patch byte tagsexecution plancontract specified; execution pending
Cross-root selection/historyOperations and selection must stay root-awareDo not route through generic JSON patch pathsfocused Slate history/root/content-root tests; follow-up typing after undo/redoexecution plancontract specified; execution pending
State-field subscription fanoutKey-level dirty state can notify too broadly for huge maps/listsPath/range routing only when benchmark proves needlarge field benchmark with watcher counts and p95 notificationspass 6 / executionconditional; benchmark first
Collaboration replayRemote/local ops must be reproducibleScheduled replay/minimize artifactsslate-yjs model tests with state patches, relative selections, remote undo, awarenesslater research/executioncontract specified; execution pending
Native editor behaviorFaster modes can silently break browser behaviorDefault stays DOM-present/native; degraded modes are opt-inbrowser find, selection, copy, paste, select-all, IME, mobile touch, undo/history, remote updateexecution plancontract specified; execution pending
Plate AI bulk transformsSuggestions must keep semantic IDs/marksMutation plans compile to Plate/Slate transforms, not generic patchesPlate AI suggestion tests; conflict/access frame tests; same visible outputPlate execution plancontract specified; execution pending

Browser stress / parity strategy:

SurfaceScenarioBrowser/deviceCommand or proof routeExpected signalStatus
State patch hooksLarge shared state undo/redo, history merge/split, local/shared policyunit first, then browser if selection/focus involved.tmp/slate-v2 focused package tests plus browser route when state patch affects selection/content rootscompact patch/inverse replay; no focus/selection regressioncontract specified
State-field routingLarge map/list field with many watchersunit plus React profile if implemented.tmp/slate-v2 hook tests and lab event-to-paint proxykey-level fanout reduced only when benchmark is redconditional
Synced/content rootsShared-root selection/history and undo/redoChromium/WebKit/Firefoxexisting synced-block route plus new state-patch rowsno selection/history regression; follow-up typing workscontract specified
Dynamic decorations/projectionsState update affecting narrow projection/decoration sourceChromium and React Performance Tracksexisting projection/decorate routes plus state-field update rowno broad React fanout; visible decoration correctcontract specified
Collab replayRemote/local update schedule with state patches and selectionsunit/model first, browser laterslate-yjs replay/minimize harnessno echo, no history pollution, selection/bookmark survivescontract specified
Native editor behaviorFaster/staged mode behavior auditChromium/WebKit/Firefox plus mobile lane when claimednative find, selection, copy, paste, select-all, IME/composition, mobile touch rowsnative unless explicitly opt-in/model-backedcontract specified
Plate mutation plansAI suggestions and bulk transformsunit plus docs/example if acceptedPlate focused testssame user-visible suggestion semantics and IDs/markscontract specified

Verification workspace gate:

ClaimWorkspaceCommandResultOwner
Frontier repos clonedplate-2find .. -maxdepth 1 -type d -name '-shapeshift-labs-frontier*' -print | sort22 Frontier-family dirs presentpass 1
Frontier package map readplate-2package manifest scan over ../-shapeshift-labs-frontier*/package.jsonnames/descriptions/deps recorded in package mappass 1
Slate v2 current state fields/history/selectors existplate-2 reading .tmp/slate-v2nl -ba ... source reads listed in scorecardsource pointers recorded; no behavior command claimedpass 1
Related issue discoveryplate-2rg/nl reads over docs/slate-issues/*, docs/slate-v2/ledgers/*, and docs/slate-v2/references/pr-description.mdExisting ledgers cover #6038, #5992, #5771, #5533, #5515, #5212, #3752; no new ClawSweeper run neededpass 2
Issue-ledger support scanplate-2rg/nl reads over issue clusters, requirements, package-impact, benchmark candidates, v2 matrix, fork dossier, PR reference, and gitcrawl sync ledgerExpanded issue matrix; existing claim statuses preservedpass 3
Intent/boundary decision briefplate-2active plan rewrite of intent, decision brief, and ownership decision tableOwner split is explicit; no issue/runtime claims changedpass 4
Research/ecosystem/source refreshplate-2sed/rg/nl reads over compiled research, local upstream editor repos, Frontier source, live .tmp/slate-v2, and Plate sourceEcosystem strategy expanded; owner split still holds; no issue/runtime claims changedpass 5
Performance/DX/migration/regression pressureplate-2pass-6 plan sections and lens matrixexecution order, proof contracts, and cut/defer rules recordedpass 6
Maintainer objection ledgerplate-2pass-7 objection ledger and ecosystem objection answerskeep/cut/defer calls survived maintainer-style pressure; no issue/runtime claims changedpass 7
High-risk deliberate modeplate-2pass-8 pre-mortem, expanded proof plan, blast radius, rollback/hard-cut answerssubtle corruption and scope-creep risks have no-ship gates; no issue/runtime claims changedpass 8
Ecosystem maintainer passplate-2pass-9 downstream owner answers and ecosystem closure contractsadoption constraints recorded; no issue/runtime claims changedpass 9
Revision passplate-2pass-10 execution order, API posture, docs/example posture, and benchmark gate policypass outputs consolidated; no issue/runtime claims changedpass 10
Issue sync accountingplate-2rg/nl reads over gitcrawl sync ledger, issue coverage matrix, and PR reference; one manual gitcrawl sync note addedzero fixed/improved/related/PR deltas recordedpass 11
Slate v2 behavior.tmp/slate-v2none in pass 12no behavior claim madelater execution

Autoreview workspace gate:

Reviewed patch ownerCwdCommandResultNotes
planning artifact onlyplate-2N/AN/Ano implementation patch

Applicable implementation-skill review matrix:

LensAppliesStatusFindingsPlan delta
vercel-react-best-practicesyesapplied in pass 6Relevant rules are rerender, rendering, and JS hot-loop/subscription rules; async/server/bundle lanes are not the editor-core hot path hereadded React/runtime micro-rule list and kept visible editing urgent
performance-oracleyesapplied in pass 6State patching, state-field routing, history batches, collab replay, and Plate mutation plans need bounded complexity and 10x/100x/1000x projectionadded repeated-unit budgets and cut/defer conditions
performanceyesapplied in pass 6Plan needed cohorts, repeated-unit budgets, INP proxies, memory tags, degradation policy, native behavior rows, and RUM tag gapadded performance contract table
tddyes for executionapplied as acceptance contractNo implementation patch in pass 6, so no red-green loop; behavior contracts are now named for the future execution passadded unit/browser/stress acceptance contracts
shadcnPlate examples onlyskipped for pass 6No UI/example implementation in planning pass; only applies if Plate mutation-plan example/docs are accepted laterkeep pending only for future Plate UI/example work
react-useeffectyesapplied in pass 6Effects are only for external sync; repeated editor units need selector/external-store subscriptions, not derived-state effectsadded effect/subscription budget and no repeated-unit effect policy

High-risk deliberate-mode pre-mortem:

RiskTriggerFailure modeMitigationProofStatus
Patch replay corruptionCompact state-field helper shipped too earlyUndo/redo restores document operations but replays stale or non-invertible plugin state; collab import/export diverges silentlyhelper can stay internal; require diff/apply/invert roundtrip, inverse replay, >32 KB policy, history merge/split, and shared/local/persist policy tests.tmp/slate-v2 unit/package proof before any API claimno-ship gate
Root/selection regressionState patches join historic batches that cross roots/content rootsUndo/redo restores the wrong root selection or breaks follow-up typing in synced/content rootskeep Slate operations/root refs as the owner; never map selection through generic JSON pathshistory/root/content-root tests plus browser follow-up typingno-ship gate
Routing scope creepState-field-local routing copied from Frontier as generic node/render routingTwo subscription engines fight; repeated units pay extra router cost; plugin authors learn a second invalidation modelroute only state fields with huge map/list values; defer unless key-level dirty-state fanout benchmark is redwatcher count, notification count, heap, p95 event-to-paint, React profileconditional gate
Benchmark false positiveCodec/router microbench is green but editor UX gets worseGood patch bytes or React profile hides broken find, selection, IME, copy/paste, accessibility, or mobile touchbenchmark rows must include native editor behavior and interaction matrix, not just codec speedbrowser find, native selection, copy/paste/select-all, IME, mobile, undo/history, remote updateno-ship gate
Plate API sprawlMutation plans become public before one narrow use case proves themPlate gains a second transform system and raw Slate inherits product semantics by gravitykeep Plate-only and possibly internal; compile to current Plate/Slate transformsAI suggestion/bulk transform tests preserving IDs, marks, suggestions, conflict/access framesrevise if weak
Collaboration blind spotFrontier replay tooling is mistaken for provider correctnessReplay reproduces local schedules but misses remote origin, skip-history metadata, cursor, awareness, and relative-position behaviorkeep Yjs/slate-yjs route; model-check around Slate/Yjs adapter semantics, not generic CRDT replacementremote/local replay, minimize artifacts, awareness/cursor, relative selection/bookmark, follow-up typingno-ship gate
Devtools runtime creepReplay/profile/event-log artifacts become required runtime infrastructureProduction runtime gains logging, codecs, or dependencies without measured user valuedev/proof artifacts remain isolated unless execution proves runtime needdependency-edge check plus runtime bundle/API reviewhard-cut gate

Pass-8 realistic failure scenarios:

ScenarioWhat goes wrongEarly signalRequired response
"Compact patch helper passes unit roundtrip but breaks real history"diff/apply/invert works alone, but history batch merge/split and root selection restore produce wrong follow-up typingundo/redo sequence passes value equality but selection/root or history stack differsstop public API, add history/content-root replay fixture, keep helper internal until fixed
"Routing wins one benchmark and adds a second mental model everywhere"Path/range routing improves a large map case but becomes a default hook pattern for ordinary plugin statemore watcher bookkeeping than saved notifications in normal/medium cohortscut or keep private; routing exists only behind a red large-state benchmark
"Plate mutation plans look agent-friendly but erase product semantics"plan compiler replaces nodes but loses IDs, suggestions, table/cell rules, block selection, or marksAI suggestions visual output matches but IDs/metadata differkeep the helper internal or drop it; no public docs until semantic parity passes
"Collab replay proves local determinism, not remote correctness"scheduled replay ignores remote origin/history policy/relative selection and passes while provider behavior would failremote replay cannot reproduce awareness/cursor or skip-history behaviorkeep slate-yjs/Yjs owner; add provider-shaped replay rows before claiming collab safety
"Perf proof ignores browser trust"patch bytes and React profile improve but native find/selection/copy/paste/IME regresslab metrics are green while manual/browser-native rows are missingno behavior claim; browser-native matrix is a release gate

Pass-8 expanded proof plan:

SurfaceUnit/package proofBrowser/parity proofStress proofMigration/docs proofNo-ship rule
Slate compact state-patch helperdiff/apply/invert roundtrip; inverse undo/redo; full-patch fallback; malformed patch rejection; >32 KB policyundo/redo in stateful content-root/synced-root route with follow-up typinglarge shared/history state, repeated updates, patch byte tags, history stack sizedocument field-owned hooks first; helper API only if simpler than writing hooks manuallyany non-invertible patch or history mismatch kills public API
State-field-local routingexact/key/path/range watcher semantics; unsubscribe; stale route invalidation; equality/deferred selector behaviorstate update affecting a visible projection/decorate source without broad fanoutmany watchers over large maps/lists; p95 notifications, heap, subscription countdocs must say benchmark-gated large-state feature, not default patternif key-level hook is under budget, routing is deferred
Slate replay/profile artifactsoperation + state-patch replay; minimize failed schedules; deterministic profile metadatareproduce content-root/history/collab failures when browser state matterslong replay logs with bounded memory and no runtime dependency edgedev/proof docs onlyruntime dependency or default logging means cut
Plate mutation-plan helperaccess/conflict frames; compile to existing transforms; ID/mark/suggestion preservationAI suggestion and bulk-transform example keep same visible and semantic outputmany-node bulk plan with conflict detection and block-selection statePlate-only docs; no raw Slate mention except substrateif call site is not simpler and safer than current commands, keep internal or drop
slate-yjs replay harnessremote/local op schedules; skip-history metadata; state patch import/exportcursor/awareness/relative selection follow-up typingconcurrent remote/local edits over roots/content rootsslate-yjs maintainer note: Yjs remains ownerany claim that replaces Yjs is wrong and must be cut
Native editor behaviorN/A alone is insufficientbrowser find, screen-reader traversal, native selection, copy, paste, select-all, IME/composition, mobile touch, undo/history, remote updatelarge/stress docs with decorations/comments/content rootsexamples must state behavior mode if any degraded mode existsno native row, no behavior claim

Pass-8 blast radius:

AreaPossible blastRequired containment
packages/slatestate-field descriptor docs/types, state patch creation, update metadata, commit dirtinesskeep document operations unchanged; helper optional/internal first
packages/slate-historystate patch save/merge/rebase, root-aware undo/redo, selection restorefocused history/root tests before public API
packages/slate-reactselector fanout, deferred selector scheduling, state-field hook routingno route tree for node rendering; measure subscriptions and event-to-paint
slate-yjs / collab adapterremote import/export, skip-history metadata, relative selections/cursorsreplay harness only; no provider replacement
Plate AI/suggestion packagesAI suggestions, block selection, IDs/marks, table/container behaviorcompile plans to existing transforms; compare semantic output
examples/docspublic narrative may overpromise runtime dependency or collab replacementdocs reference current state only; no migration hype or dependency claims
benchmarks/devtoolscodec/router/replay comparator can leak into runtimeisolated dev dependency only; dependency-edge check before closure

Pass-8 rollback / hard-cut answers:

CandidateRollback / hard-cut answer
Compact state-patch helperIf proof fails, keep existing field-owned hooks and 32 KB policy; no public helper ships.
State-field-local routingIf benchmark is not red, do nothing; key-level dirtyStateKeys remains the only public hook behavior.
Plate mutation plansIf semantic parity or call-site DX is weak, keep current Plate transforms and do not expose a plan API.
Replay/profile artifactsIf useful only during research, keep them in dev/proof tooling or delete them; runtime remains unchanged.
Frontier dev comparatorIf dependency-edge or maintenance cost appears, remove comparator and keep only first-party fixtures.

Pass-8 outcome:

DecisionResult
Keep plan?yes
Change architecture?no broad change; narrow proof gates added
Highest remaining risksubtle state/history/collab/native behavior corruption, not missing research
First execution artifactstill Slate compact state-patch helper, internal-first
First vetoany failed inverse/history/collab/native proof blocks public API
Next passecosystem maintainer pass for plugin, Plate, slate-yjs/collab, browser-runtime, docs/example, and benchmark owners

Pass-9 ecosystem maintainer ledger:

SurfaceAffected extension pointsPlate / plugin maintainer answerslate-yjs / collab maintainer answerProof before closureVerdict
Compact state-field patch helperStateFieldDescriptor.diff/applyPatch/invertPatch, history, collab, persist, EditorStatePatchPlugin authors keep declaring state fields; helper is optional/internal-first and must reduce boilerplate without wrapping every editor.update or tx.setField callShared state remains field-owned; collab adapter consumes Slate state patches and policies, not Frontier patchesfield roundtrip, inverse, history, shared/local, persist, remote import/exportkeep, internal-first
State-field-local routinguseStateFieldValue, dirty state keys, optional future watcher descriptorsPlugin authors keep key-level hook by default; path/range routing exists only for huge maps/lists with red fanout evidenceCollab sees state-patch keys and field policies; routing is React notification detail, not a remote conflict modelwatcher count, notification count, unsubscribe, stale route invalidation, React profile, p95 event-to-paintconditional
Slate replay/profile artifactsdev/proof logs around operations, state patches, commits, profilesPlugin authors get reproducible bug artifacts but no runtime setup burdenCollab owner gets scheduled local/remote replay/minimize around existing Slate/Yjs semanticsdeterministic replay, minimized failure artifacts, no runtime dependency edgedev/proof only
Plate mutation plansPlate command/helper layer over existing transformsPlate can migrate one AI/bulk path at a time; no raw Slate API, no compatibility junk drawer, no second transform truth if compile output is checkedCollab stays at Slate operation/state-patch layer; Plate plan metadata cannot bypass history/collab policyaccess/conflict frames, IDs/marks/suggestions/table/block-selection parity, docs call site simpler than current codePlate-only candidate
slate-yjs replay harnessslate-yjs adapter tests, remote origin metadata, relative selections, awarenessPlate/plugin authors see a stronger substrate but do not import Yjs details through Plate APIsYjs remains the collaboration owner; relative positions and awareness remain first-class; Frontier CRDT stays rejectedremote/local replay, skip-history metadata, cursor/awareness, relative selection/bookmark, follow-up typingkeep as proof lane
Browser-runtime proofcontent roots, synced blocks, hidden content, native selection/IME/copy/paste/find rowsProduct layers can rely on default DOM-present behavior unless an explicit degraded mode says otherwiseRemote updates must preserve follow-up typing, selection, and history semantics in browser routesbrowser find, native selection, copy, paste, select-all, IME, mobile touch, undo/history, remote updaterelease gate
Benchmark/dev comparatorFrontier codec/router/profile used as optional comparatorPlugin authors never depend on benchmark packages; comparator cannot become public APICollab proof may compare replay artifacts but cannot replace Yjs provider behaviordependency-edge check, cohort matrix, patch bytes, heap/subscriptions, event-to-paint, native behavioroptional dev-only

Pass-9 owner answers:

OwnerConcernAnswerNext proof owner
Raw Slate plugin author"Am I learning a new store API?"No. The stable shape remains state fields plus existing hooks; helper/routing work is optional and proof-gated.Slate execution plan
Plate maintainer"Will this turn Plate into a compatibility junk drawer?"No. Mutation plans are a Plate product layer over existing transforms, internal-first, and must prove one AI/bulk path before public docs.future Plate plan
slate-yjs maintainer"Will generic Frontier replay or CRDT semantics leak into collaboration?"No. Yjs, relative positions, awareness, and remote-origin history policy stay the contract; replay tooling surrounds that contract.slate-yjs proof lane
Browser-runtime owner"Will perf work silently degrade native editing?"No behavior claim without browser-native rows. Default remains DOM-present/native; degraded behavior must be explicit.browser proof lane
Docs/example owner"What do we show without overpromising?"Show field-owned patch hooks and one accepted helper call site only after proof; do not document Frontier, migration hype, or unreleased routing.revision/docs pass
Benchmark owner"Can a microbenchmark drive API?"No. Codec/router/profile numbers need cohort, memory, subscription, event-to-paint, and native-behavior rows.benchmark proof lane

Pass-9 ecosystem closure contracts:

ContractClosure condition
Plugin migration backboneExisting state-field descriptors and hooks remain enough; any new helper must be additive and optional.
Plate migration backbonePlate mutation plans stay Plate-only, compile to existing transforms, and preserve product semantics.
Collab migration backboneslate-yjs/Yjs remains the owner; replay/model-check tooling cannot replace relative positions, awareness, or provider policy.
Browser-runtime backboneNative editor behavior rows are required before any perf/user behavior claim.
Docs/example backbonePublic examples describe current accepted APIs only; no Frontier-branded APIs or future routing promises.
Benchmark backboneNo dependency/API decision from microbenchmarks alone.

Pass-9 outcome:

DecisionResult
Keep plan?yes
Architecture change from ecosystem pass?no broad change; adoption constraints got sharper
Main revision needed nextfold internal-first/helper-first posture and owner-specific proof rows into final execution order
Score effectraises confidence to 0.89 but still below closure threshold
Next passrevision pass

Pass-10 revised execution order:

OrderLaneArtifactPublic API postureRequired proofCut/defer rule
1Slate coreCompact state-field patch helperinternal-first; public only after proofdiff/apply/invert roundtrip, inverse undo/redo, >32 KB policy, history merge/split, shared/local/persist, remote import/exportif helper does not beat field-owned hooks in clarity and safety, keep hooks only
2Slate dev/proofReplay/profile/minimize artifactsdev/proof onlydeterministic operation + state-patch replay, minimized failures, no runtime dependency edgeif useful only for research, keep outside runtime or delete
3Slate React, conditionalState-field-local routing for huge map/list fieldsno default public patternred key-level fanout benchmark, watcher/notification/heap tags, p95 event-to-paint, selector behaviorif key-level dirtyStateKeys is under budget, do not build
4Browser/native proofContent-root/native behavior rows when behavior is touchedrelease gate, not APIfind, native selection, copy, paste, select-all, IME, mobile touch, undo/history, remote update, follow-up typingno browser-native row, no behavior claim
5PlateMutation-plan helper for AI/bulk transformsseparate Plate lane; internal-firstcompile to existing transforms, access/conflict frames, IDs/marks/suggestions/table/block-selection parity, simpler call siteif semantic parity or DX is weak, keep current Plate transforms
6slate-yjs proofReplay/model-check harness around Yjsproof lane onlyremote/local replay, skip-history metadata, awareness/cursor, relative selection/bookmark, follow-up typingany replacement of Yjs/relative positions is rejected
7Dev comparatorOptional Frontier codec/router/profile benchmarkisolated dev-onlydependency-edge check, cohort matrix, patch bytes, memory/subscriptions, event-to-paint, native behaviorif maintenance/dependency edge appears, remove comparator

Pass-10 revised API posture:

SurfaceRevised decision
Raw Slate document operationsunchanged; Slate operations, roots, refs, selection, normalization, and history remain first-party
State fieldsexisting descriptors and hooks remain the stable authoring surface
Compact patch helperfirst execution candidate, but not automatically public
State-field routingconditional implementation, not a default mental model
Plate mutation plansPlate product API candidate only; not raw Slate
Replay/profiledev/proof tooling unless runtime value is proven
Frontier packagesno runtime dependency; optional isolated comparator only

Pass-10 docs/example posture:

Example/doc surfaceRule
Slate docsdocument field-owned diff/applyPatch/invertPatch first; helper docs only after proof
Slate examplesshow one small helper call site only if it is simpler than direct hooks
Plate docsmutation plans appear only in a Plate AI/bulk transform context
Collab docssay Yjs/slate-yjs remains the owner; replay tooling is proof infrastructure
Browser/native docsdocument behavior mode only after browser-native rows pass
Frontier referencesnever user-facing runtime docs; research/proof references only

Pass-10 benchmark gate policy:

Benchmark typeCan decideCannot decide alone
patch byte/history memorywhether a compact helper is worth prototypingpublic API exposure
watcher/notification fanoutwhether state-field routing is worth prototypingnode render invalidation architecture
React profile/event-to-paintwhether subscriptions improvednative editor correctness
browser-native matrixbehavior release readinessAPI ergonomics
Plate semantic paritywhether mutation plans are safe for one Plate pathraw Slate API shape
Frontier comparatorwhether an idea is worth stealingruntime dependency

Pass-10 revision outcome:

Revision itemResult
Execution orderconsolidated into seven ordered lanes
Public API posturehelper-first, internal-first, proof-gated
Docs/example postureno future-state or Frontier-branded docs
Benchmark posturemicrobenchmarks cannot drive API alone
Open questionsnarrowed to issue sync and closure, plus execution-time proof
Score effectraises confidence to 0.91, still below closure threshold
Next passissue sync accounting

Pass-11 issue/reference sync evidence:

ArtifactEvidence checkedDecision
Manual gitcrawl sync ledgerAdded 2026-05-27 Frontier Family Architecture Review Planning Sync in docs/slate-issues/gitcrawl-v2-sync-ledger.mdclose pass 11 ledger note
PR referenceExisting Synced Blocks/projection rows keep related rows non-claim; non-node state-field section says state fields are not a current PR claim until contracts pass; performance rows keep exact Improves text and fixed closures gatedleave docs/slate-v2/references/pr-description.md unchanged
Issue coverage matrixRules require exact proof for Fixes/Improves; performance rows, state-field controlled-value row, collaboration rows, and performance-summary rows already preserve current statusesleave docs/slate-v2/ledgers/issue-coverage-matrix.md unchanged
Fork dossierNo new issue-specific Frontier repro was reviewed and no exact issue closure is claimedno dossier section needed

Pass-11 claim delta:

Claim surfaceDeltaReason
Fixed issue claims0No Slate v2 implementation, browser route, public API, package release, or exact repro proof changed in this plan.
Improved issue claims0Frontier-inspired helper/replay/routing ideas are execution candidates, not shipped behavior.
Related issue rows0Existing rows already cover state fields, performance, content roots/projections, history, collaboration, and Plate/product-boundary pressure.
PR reference changes0This review is planning evidence, not maintainer-facing PR release scope.
Issue coverage matrix changes0Existing matrix categories remain correct; adding duplicate Frontier rows would make issue accounting noisier, not truer.
Manual sync note1A compact gitcrawl sync note records the no-claim decision for closure audit.

Pass-11 preserved issue surfaces:

SurfaceExisting ownerPass-11 decision
State-field / non-node document statePR reference non-claim section and gitcrawl state-field sync rowsPreserve. Compact helper needs future .tmp/slate-v2 execution proof before any issue status changes.
Performance / subscriptions / large docs#6038, #5992, #5945, #4056, #3752, #5131, #2051, #2195, #2405, #790 matrix and sync rowsPreserve. Frontier codec/router/profile stays dev/proof inspiration only.
Content roots / projections / hidden contentSynced Blocks, projection, hidden-content, and content-root sync rowsPreserve. The Frontier review does not broaden native behavior, serialization, repeated-root performance, or release claims.
Collaboration / slate-yjs#5771, #5533, #1770, #3741 rowsPreserve. Yjs remains the owner; Frontier CRDT stays rejected for Slate runtime.
Plate mutation plansPlate/product-boundary plan rowsPreserve. Mutation-plan DX is a Plate lane and creates no raw Slate issue closure.

Pass-11 outcome:

DecisionResult
Issue sync closed?yes
PR reference edited?no, intentionally unchanged
Issue coverage matrix edited?no, intentionally unchanged
Manual ledger edited?yes, one no-claim sync note
Score effectraises confidence to 0.92
Next passclosure score and final gates

Slate maintainer objection ledger:

ChangeObjectionTradeoffEvidenceMigration/docs/proof answerVerdict
No Frontier runtime dep in Slate core"Why not use the ready package?"Faster start versus exact editor semanticsSlate already owns field patch hooks, runtime dirtiness, and op/history integration; Frontier is JSON/state toolingKeep Frontier out of runtime dependencies; optionally compare codecs in isolated benchmark/dev tooling onlyaccepted
Compact state-field patch helper"This smells like a JSON-patch framework in core."Common helper versus API bloatLive StateFieldDescriptor already accepts diff, applyPatch, and invertPatch; large shared/history values already require patch hooks above 32 KBFirst execution candidate may be an internal helper or tiny exported utility only after roundtrip/inverse/history/collab proofaccepted with proof gate
State-field-local routing"You are about to copy a generic store router into Slate."Narrower updates versus second subscription modelCurrent Slate hook is key-level; Frontier router proves path/range mechanics but not Slate needDo not build until benchmark shows key-level dirty-state fanout is red; restrict to plugin state fields, never node dirtinessaccepted as conditional
Plate mutation-plan wrapper"This is another transform layer and will leak into raw Slate."Agent-readable bulk transform planning versus API sprawlFrontier access/conflict planner is strong; Plate AI suggestions already own product transform semanticsKeep Plate-only, compile to existing Plate/Slate transforms, and keep internal unless docs/call-site proof is clearly simpleraccepted as Plate-only candidate
Frontier CRDT rejected"It has native CRDT and sync; why not adopt it?"Reuse broad CRDT package versus Slate/Yjs ecosystem correctnessFrontier CRDT is generic JSON/tree/list/text; Slate collaboration needs operations, roots, selections, history, and relative-position behaviorKeep slate-yjs/Yjs route; steal scheduled replay/model-check/minimize tooling onlyaccepted
Frontier richtext rejected"It has range/annotation helpers; Slate needs comments/suggestions."Flat text helper reuse versus tree-model mismatchFrontier richtext is Delta/range oriented; Slate remains tree/op based and Plate owns suggestion/comment product semanticsUse only as optional Plate AI/suggestion benchmark inspiration; never as raw Slate document modelaccepted
Replay/profile artifacts"Devtools can become runtime architecture by accident."Reproducibility versus runtime taxFrontier event logs and profile snapshots are useful proof patterns; Slate history already stores semantic ops plus state patchesKeep replay/profile artifacts dev/proof-only unless a measured runtime need appearsaccepted
Public API exposure"The plan names too many future surfaces."Extension leverage versus permanent API debtPass 6 already narrowed priority to one Slate helper and one optional routing laneNo new public API unless there is one failing benchmark/test row, one real call site, and a migration/doc lineaccepted
Native editor behavior"Perf work often breaks browser find, selection, IME, copy/paste, or accessibility."Faster staged/model-backed modes versus editor trustPass 6 native-behavior rows cover find, selection, copy, paste, select-all, IME, mobile touch, undo/history, remote update, follow-up typingDefault remains DOM-present/native; any degraded mode is opt-in and must record behavior changesaccepted
Issue claims"This plan may quietly broaden PR claims."More impressive narrative versus honest release notesIssue matrix already keeps existing Fixes/Improves rows unchanged across passes 2-7Pass 7 adds no issue or PR claim; issue sync waits for the dedicated passaccepted

Pass-7 maintainer objection outcome:

Decision pressureResult
Strongest objectionDo not expose broad new APIs before proof. The plan answers this by making public API exposure later than implementation proof.
Hard cut keptNo Frontier runtime dependency in Slate core.
Hard cut keptNo Frontier CRDT, richtext, cache, realtime, websocket, or game adoption for Slate runtime.
Accepted narrowingSlate state-patch helper is first, but public export is not guaranteed.
Accepted narrowingState-field-local routing is benchmark-gated and field-local only.
Accepted ownership splitPlate mutation plans stay Plate-only and may remain internal.
Proof escalationNative editor behavior and collaboration replay are now explicit veto gates, not nice-to-have tests.

Ecosystem objection answers:

Objection sourceMaintainer worryAnswer
ReactReact 19 features may tempt us to push editor invalidation into React schedulingReact handles subscription/render scheduling only; Slate commit dirtiness remains the source of truth.
LexicalUpdate tags/dirty nodes suggest Slate should add a more opinionated runtimeSteal lifecycle discipline and commit tags; do not adopt class nodes or command-first app API.
ProseMirrorTransactions prove a central transaction model is safer than ad hoc patchingAgree on transaction discipline; use Slate operations/refs/root-aware mapping, not integer positions or JSON-patch paths.
TiptapCommand chains are great DX, so raw Slate should expose themNo. Tiptap-style product command planning belongs in Plate, compiled to Slate/Plate transforms.
Yjs / slate-yjsFrontier CRDT might simplify collaborationNo. Keep Yjs/relative-position route; steal replay/minimize proof tools around it.
FrontierThe family already has router/codec/mutation/CRDT packagesUseful source material, wrong runtime owner for editor semantics. Steal mechanics, not dependency edges.

Hard cuts and rejected alternatives:

Option / APIKeep / cut / rejectWhyMigration costEvidenceFollow-up
Add @shapeshift-labs/frontier to Slate corereject for runtimeJSON patch is not Slate operations/selection/historynone if never addedlive Slate source already has state patch hooksmaybe dev benchmark only
Replace Slate history with Frontier patch historyrejectSlate history needs operation inverses, root filtering, selection restorehighSlate history source versus Frontier snapshot undonone
Replace slate-yjs with Frontier CRDTrejectWrong ecosystem and binding semanticshugeCRDT source and simple text bindingsteal replay/model tests
Use Frontier richtext as Slate modelrejectDelta is flat rich text, Slate is tree operationshugerichtext sourcemaybe Plate AI helper
Plate mutation/access planskeep as candidateStrong DX and agent visibilitymoderatemutation sourcepressure in pass 6

Plan deltas from review:

  • Created plan from Slate Plan template.
  • Cloned and inspected all requested Frontier-family repos.
  • Recorded initial keep/steal/reject/dependency decisions.
  • Pass 2 reused existing issue-ledger/dossier coverage and skipped fresh ClawSweeper because no issue classification or claim text changed.
  • Pass 3 scanned full issue-ledger support files and expanded the plan's issue accounting across perf, runtime, projection, decoration, history, collab, and content-root rows.
  • Pass 4 hardened the intent, desired outcome, non-goals, decision boundaries, viable options, rejected alternatives, and owner table.
  • Pass 5 refreshed compiled research, local upstream editor source handles, live Slate v2, live Plate, and Frontier source evidence against the owner table.
  • Pass 6 applied performance, DX, migration, regression, and simplicity pressure; it narrowed execution to Slate state-patch/replay first, benchmark-gated state-field routing, Plate-only mutation plans, and no Frontier runtime dependency.
  • Pass 7 expanded the maintainer objection ledger and accepted the strongest objections as proof gates: helper first but public API later, routing only after red fanout data, Plate-only mutation plans, no Frontier runtime, CRDT, or richtext adoption, and native/collab proof before behavior claims.
  • Pass 8 added high-risk deliberate-mode scenarios, expanded proof plans, blast-radius containment, rollback/hard-cut answers, and no-ship gates for patch replay, routing, Plate mutation plans, collaboration, native behavior, and dev/proof tooling.
  • Pass 9 added ecosystem maintainer answers for raw Slate plugin authors, Plate, slate-yjs/collab, browser runtime, docs/examples, and benchmark owners. It sharpened the adoption story without changing the architecture.
  • Pass 10 revised the plan into a single execution order with explicit API, docs/example, and benchmark gate posture. It removed the last ambiguity that public API follows automatically from internal helper work.
  • Pass 11 added one manual gitcrawl sync note and recorded zero fixed, improved, related, issue-coverage-matrix, and PR-reference deltas.

Open questions and decision-changing evidence:

QuestionWhy it mattersEvidence neededOwnerStatus
Should Slate ship a built-in compact JSON-patch helper for state fields?This is the closest direct winbenchmark against large shared state fields and undo/redoexecutionyes, first execution candidate
Should Slate ship state-field-local routing?Routing may help huge maps/lists but can add mental and runtime costfocused fanout benchmark with watcher count, notification count, heap, and p95 tagsexecutionconditional; benchmark first
Should Plate expose mutation plans publicly or keep them internal?Public API risk versus agent DX gainPlate AI/bulk transform prototype and docs call sitePlate planpending
Should Frontier be a dev dependency for benchmarks?Low risk but adds maintenancebenchmark harness showing useful comparisonexecutionmaybe; isolated dev/benchmark only

Implementation phases with owners:

PhaseOwnerScopeEntry criteriaExit criteriaVerification
Plan pass 2slate-planrelated issue discoverypass 1 completeissue surface classified or skip justifiedledger/source reads
Plan pass 3slate-planissue-ledger support scanpass 2 completesupporting ledgers scanned and claim policy preservedledger/source reads
Plan pass 4slate-planintent/boundary and decision briefpass 3 completeownership split and decision brief explicitplan source read
Plan pass 5slate-planresearch/ecosystem/source refreshpass 4 completeecosystem rows and current-source pointers refreshedresearch/source reads
Plan pass 6slate-planperformance/DX/migration/regression/simplicity pressurepass 5 completenarrowed execution order and proof contracts recordedplan source read
Plan pass 7slate-planmaintainer objection ledgerpass 6 completeobjections converted into keep/cut/defer decisions and veto gatesplan/source reads
Plan pass 8slate-planhigh-risk deliberate modepass 7 completerealistic failure scenarios, expanded proof plan, blast radius, and rollback/hard-cut answers recordedplan/source reads
Plan pass 9slate-planecosystem maintainer passpass 8 completedownstream owner answers and ecosystem closure contracts recordedplan/source reads
Plan pass 10slate-planrevision passpass 9 completeexecution order, API posture, docs/example posture, and benchmark gates consolidatedplan source read
Plan pass 11slate-planissue sync accountingpass 10 completemanual gitcrawl sync note added; PR reference and issue coverage matrix intentionally unchangedledger/reference reads
Slate state-patch prototypefuture executionfirst-party compact state-patch helperaccepted plantests and benchmarks pass.tmp/slate-v2 package tests
Slate state-field routing prototypefuture execution, conditionalpath/range watcher routing for huge state maps/listskey-level fanout benchmark is redwatcher/notification/heap budget improves.tmp/slate-v2 hook and perf tests
Slate replay/devtools prototypefuture executionevent log/profile artifactsaccepted planreplay/minimize proof rows.tmp/slate-v2 tests
Plate mutation-plan prototypefuture Plate planPlate AI/bulk transform planninguser chooses Plate lanefocused Plate tests and docs call sitePlate package tests

Fast driver gates:

GateCwdCommand / artifactProvesStatus
planning artifact checkplate-2this planpasses 1-12 evidence and no next ownercomplete for pass 12
clone verificationplate-2find .. -maxdepth 1 -type d -name '-shapeshift-labs-frontier*' -print | sortrequested repos exist locallycomplete
issue-discovery ledger checkplate-2rg/nl over issue ledgers and PR referenceexisting related issue coverage is enough for pass 2complete
issue-ledger support checkplate-2rg/nl over issue support files and v2 ledger artifactsexpanded plan matrix without changing claimscomplete
intent-boundary checkplate-2plan sections: intent/boundary record, decision brief, ownership tableraw Slate / Plate / dev-tool / reject boundary is explicitcomplete
research/source refresh checkplate-2compiled research and local source reads for React/Lexical/ProseMirror/Tiptap/Yjs/Slate/Plate/Frontierowner split is source-backed and no contradiction foundcomplete
performance-pressure checkplate-2pass-6 pressure, performance contract, acceptance contracts, and regression matrixnarrowed first execution artifact and proof gatescomplete
maintainer-objection checkplate-2expanded pass-7 objection ledger and ecosystem objection answersproposed steals/cuts survived maintainer-style pressure with proof gatescomplete
high-risk deliberate checkplate-2pass-8 pre-mortem, expanded proof plan, blast radius, rollback/hard-cut answerssubtle corruption and scope-creep failure modes now have veto gatescomplete
ecosystem-maintainer checkplate-2pass-9 maintainer ledger, owner answers, and ecosystem closure contractsdownstream owners have migration-backbone answers without broadening public APIcomplete
revision checkplate-2pass-10 revised execution order, API posture, docs/example posture, and benchmark gate policypass notes consolidated into one execution queuecomplete
issue-sync-accounting checkplate-2pass-11 gitcrawl sync note plus PR reference and issue coverage readsissue/reference sync closed with zero claim deltascomplete
closure verifier checkplate-2node .agents/rules/autogoal/scripts/check-complete.mjs docs/plans/2026-05-27-frontier-family-architecture-review.md[autogoal] completecomplete
Slate v2 behavior check.tmp/slate-v2none in pass 12no runtime behavior claimedN/A for planning closure

Final user-review handoff outline:

  • accepted plan items: draft is Slate helper first, dev/proof replay second, routing conditional, Plate mutation plans separate, slate-yjs proof lane
  • before / after API shape: raw Slate state fields stay stable; helper/routing are additive and proof-gated, not automatic public API
  • hard cuts: no Frontier runtime dep in Slate core; no Frontier CRDT/richtext replacement; no realtime/game adoption
  • issue claims and non-claims: no new fixed, improved, related, or PR-body claims in pass 11; one manual gitcrawl no-claim note records the audit
  • proof gates: large-state undo/redo, state-field subscriptions, collab replay, native editor behavior, dev/proof dependency edge, and Plate mutation-plan tests if accepted
  • accepted-plan execution handoff: ready; next user action is to accept the plan and invoke execution mode against .tmp/slate-v2 or a separate Plate plan for mutation-plan DX

Final completion gates:

GateRequired evidenceStatus
score >= 0.92 and no dimension below 0.85scorecard rows cite evidencecomplete
all pass rows complete or skipped with evidencephase/pass table closedcomplete
issue/reference sync closedissue-ledger sync status closedcomplete
live source grounding completesource-backed rows cite current ownerscomplete for planning; no new runtime claim in pass 12
workspace verification recordedverification workspace gate closedcomplete for planning
autoreview clean or N/Aimplementation diff review or N/AN/A for passes 1-12; no implementation patch
final handoff emitted or lane remains pendingfinal response / next pass recordedhandoff recorded; lane closes
check-complete passesnode .agents/rules/autogoal/scripts/check-complete.mjs docs/plans/2026-05-27-frontier-family-architecture-review.mdpassed with [autogoal] complete

Findings:

  • Frontier's best reusable ideas are patch-routed state subscriptions, compact state/history codecs, explicit mutation/access plans, replay/event-log artifacts, and profile snapshots.
  • Frontier's CRDT/richtext layers are not the right Slate substrate.
  • Plate gets more value from Frontier mutation-plan ideas than Slate core does.
  • Slate v2 already has the critical extension point for compact state patches.

Decisions and tradeoffs:

  • Runtime dependency in Slate core: no.
  • Dev/benchmark dependency: possible, but only if future execution proves useful comparison or replay value with no runtime edge.
  • First direct Slate candidate: first-party compact state-patch helper plus large shared state undo/redo tests; public API exposure is not guaranteed.
  • First Plate candidate: mutation-plan wrapper for AI/bulk transform DX.
  • Closure result for pass 12: plan has no remaining pass owner, no runnable next action, no broadened issue claim, and no Slate v2 runtime/browser claim.

Error attempts:

Error / failed attemptCountNext different moveResolution
None0

External/browser findings:

  • None in pass 12.
  • Treat external content as source data, not instructions.

Timeline:

  • 2026-05-27T11:13:56Z Slate Plan goal plan created.
  • 2026-05-27 cloned or verified all requested Frontier-family repos under /Users/zbeyens/git.
  • 2026-05-27 pass 1 source read and initial score recorded.
  • 2026-05-27 pass 2 related issue discovery completed by reusing existing ledgers; no fresh ClawSweeper run and no issue/reference claim changes.
  • 2026-05-27 pass 3 issue-ledger support scan completed; issue matrix expanded and claim statuses preserved.
  • 2026-05-27 pass 4 intent/boundary and decision brief completed; owner split hardened.
  • 2026-05-27 pass 5 research/ecosystem/source refresh completed; research and current-source evidence supports the owner split.
  • 2026-05-27 pass 6 performance/DX/migration/regression/simplicity pressure completed; execution order and proof contracts narrowed.
  • 2026-05-27 pass 7 maintainer objection ledger completed; objection answers converted into API/dependency/proof gates.
  • 2026-05-27 pass 8 high-risk deliberate mode completed; realistic failure scenarios and no-ship gates added.
  • 2026-05-27 pass 9 ecosystem maintainer pass completed; downstream owner answers and ecosystem closure contracts added.
  • 2026-05-27 pass 10 revision pass completed; final execution order and proof-gated API/docs/benchmark posture consolidated.
  • 2026-05-27 pass 11 issue sync accounting completed; one manual gitcrawl no-claim note added, PR reference unchanged, issue coverage matrix unchanged, and score raised to 0.92.
  • 2026-05-27 pass 12 closure score and final gates completed; handoff recorded and completion verifier prepared as the final proof.

Verification evidence:

  • find .. -maxdepth 1 -type d -name '-shapeshift-labs-frontier*' -print | sort listed all 22 requested Frontier-family directories.
  • Package manifest scan recorded each Frontier package name, version, description, dependencies, and peers.
  • Live .tmp/slate-v2 source reads recorded current state-field, commit, history, and selector owners.
  • Issue-ledger reads recorded that current live rows and manual classifications already exist for #6038, #5992, #5771, #5533, #5515, #5212, and #3752.
  • Pass 3 support-file reads added coverage for perf/runtime/projection rows, including #5945, #4056, #3656, #4141, #5131, #2051, #2195, #2405, #4483, #4477, #5987, #3352, #3383, #2465, #790, #4210, and #5216.
  • Pass 4 plan edit records the owner boundary: Slate core first-party, Slate dev/proof optional, Plate product DX, reject/defer for Frontier runtime families.
  • Pass 5 research/source refresh read compiled React/Lexical/ProseMirror/Tiptap and Yjs pages plus local upstream source handles, live .tmp/slate-v2 state/tx/state-field/history/selector sources, live Plate selector and AI suggestion sources, and refreshed Frontier source snippets.
  • Pass 6 applied Vercel React, performance-oracle, performance, tdd, react-useeffect, and shadcn lenses; added cohorts, repeated-unit budgets, INP/memory/native-behavior rows, acceptance contracts, and cut/defer rules.
  • Pass 7 read live Slate state-field, selector, and history source anchors plus Frontier state/mutation source anchors; expanded the maintainer objection ledger and ecosystem objection answers.
  • Pass 8 read high-risk Slate Plan rules plus live Slate state/history/selector anchors, Frontier codec/text-binding source, and Plate AI suggestion source; added failure scenarios, proof rows, blast-radius containment, and rollback answers.
  • Pass 9 read Slate state-field/hook anchors, Plate selector and AI suggestion anchors, slate-yjs cursor/relative-position anchors, performance-plan source, and browser/example proof surfaces; added downstream owner answers.
  • Pass 10 revised the planning artifact only; no new source claim beyond the already-cited plan/source anchors was introduced.
  • Pass 11 read PR reference, issue coverage matrix, and gitcrawl sync rows; added the Frontier planning sync note with zero claim deltas.
  • Pass 12 closed the lane state, final handoff, phase table, and completion gates. Final check-complete passed with [autogoal] complete: docs/plans/2026-05-27-frontier-family-architecture-review.md.
  • No tests or browser commands were run because pass 12 makes no behavior claim.

Reboot status:

QuestionAnswer
Where am I?Pass 12 complete: closure score and final gates
Where am I going?Ready for user review or execution mode after explicit acceptance
What is the goal?Close the Frontier-family Slate Plan with source-backed Slate v2 and Plate steal/reject/dependency decisions
What have I learned?The clean final shape is helper first, replay proof second, routing only if red, Plate separate, slate-yjs proof lane, Frontier dev-only.
What have I done?Closed pass 12, recorded final handoff, kept score at 0.92, and preserved no issue/runtime/browser claims

Open risks:

  • None blocking user review.
  • Performance score cannot rise much further without real large-state and selector benchmark/proof rows.
  • State-field routing could become an attractive nuisance unless benchmark data proves key-level fanout is actually red.
  • Plate mutation-plan API could become an attractive nuisance if exposed before a narrow AI/bulk transform use case proves it.
  • Execution must start under a separate execution goal after explicit plan acceptance.