Plate Plan
Handle $ARGUMENTS.
This is the Plate editor-behavior planning and law workflow. It turns behavior
ideas, review findings, or spec drift into:
- a pass-gated plan under
docs/plans/
- updated editor-behavior law under
docs/editor-behavior/
- research updates under
docs/research/ when evidence is stale or thin
- a goal-backed plan ledger that stays active until the plan is genuinely ready
Use this when the failure mode is "we keep finding more Plate planning gaps later."
Use When
- Adding or changing editor behavior law.
- Reviewing current Plate editor-behavior architecture or DX.
- Revising authority/winner maps.
- Adding or splitting interaction families.
- Updating protocol rows, parity gates, roadmap lanes, or reference audits.
- Deciding permanent home for a behavior contract: core, shared package,
feature package, app/render layer, docs-only, or tests-only.
- Formalizing browser/regression proof for editor behavior.
- The user wants a plan before implementation.
Do Not Use When
- The user asks for a narrow bug fix without spec work.
- The user asks for a normal code review of a diff.
- The user asks to execute an already accepted Plate Plan.
- The plan already has a passing Plate Plan score, completed pass schedule,
closed final gates, and the user says to build.
Hard Policy
- This is a planning/review/spec-law lane first. Do not patch product code unless
the user explicitly asks for implementation.
- Do not route to external interview or consensus-planning skills. This skill
owns the plan gate.
- Evidence first. Vibes are not authority.
- Treat silence as a gap, not fake agreement.
- Lock node model and affinity before UX chrome.
- Keep Plate core unopinionated enough for framework use. Opinionated product
behavior belongs in packages, kits, examples, or docs.
- Prefer the best permanent architecture for performance and DX over the
nearest current file location.
- If the best answer is a new authority lane, family split, or ownership move,
say that and plan it.
- A behavior, API, or gate change needs an adoption story. "Cleaner" alone is
not a justification.
- Intent, outcome, scope, non-goals, and decision boundaries must be explicit
before the plan can score as ready.
- Major decisions need a decision brief: principles, top drivers, viable
options, rejected alternatives, and why the chosen option wins.
- Do not let a polished plan self-certify. Scores, verdicts, and keep/drop
decisions need cited evidence.
- Score is not completion. A passing score with any pending pass, spec-law
output, verification gate, named next owner, or runnable next action stays
pending.
- The top-level completion status is the lane status, not the current pass
status. Close a pass with
current_pass_status: complete; do not use
top-level done unless the whole lane is closed.
- Top-level
done is legal only in the closure/final-gates pass, after the
active plan proves every earlier pass-state row is complete or explicitly
skipped with evidence.
- For current Plate features, parity and protocol matter. For deferred features,
do not inflate the release gate.
- Run applicable implementation-review lenses instead of trusting generic editor
intuition:
build-web-apps:shadcn for UI/editor chrome,
vercel-react-best-practices for React/Next/runtime performance, and
react-useeffect for effects, derived state, subscriptions, and external
synchronization. Use performance-oracle for hot paths, algorithms, memory,
network, query, bundle, and scalability concerns. Use tdd for behavior
additions, bug fixes, and regression classes that need test-first proof. If a
lens is skipped, record why.
Required Artifacts
- Plan file under
docs/plans/.
- Editor-behavior outputs under
docs/editor-behavior/ when law changes.
- Research updates under
docs/research/ when the evidence lane is stale,
contradictory, or incomplete.
- Objection ledger in the active plan. If it grows too large, split it to
docs/plans/<same-slug>-objection-ledger.md and link it from the plan.
- Plan deltas from review in the active plan: what changed, what was dropped,
what was strengthened, and what stayed unchanged with reasons.
- Intent/boundary record in the active plan: intent, outcome, in-scope,
non-goals, decision boundaries, and unresolved user-decision points.
- Decision brief in the active plan: principles, decision drivers, viable
options, invalidated alternatives, consequences, and follow-ups.
- Applicable implementation-skill review notes in the active plan: shadcn,
Vercel React, react-useeffect, performance-oracle, and tdd, each marked
applied or skipped with a concrete reason.
Goal Setup
Before creating or resuming a Plate Plan:
- If a goal tool is available, call
get_goal first. Call create_goal() only
when no goal exists; repeated create_goal() calls fail while a thread goal
exists.
- Continue under a matching active goal, or resolve a mismatched active goal
before creating a new one.
- Create the goal around the desired end state, not the execution plan.
- Include constraints, scope, or verification details only when they materially
change what
done means.
- Use the goal or user-input tool to ask when the goal would otherwise be
unclear.
- If no goal tool is available, ask the user to set the goal instead of
silently skipping goal setup.
- Do not start the planning pass until the goal is set, verified as already
matching, or the user explicitly resolves the missing-goal path.
Good goal:
Plate Plan proves the editor-behavior authority, node model, protocol rows,
and proof gates are ready for user review. Execution starts only when the user
accepts the plan and invokes Plate Plan again for that accepted plan.
Bad goal:
Run Plate Plan passes 1 through 9.
Default plan path:
docs/plans/YYYY-MM-DD-plate-plan-review-plan.md
Reuse an active plan when the prompt names one, or when the active goal and plan
both point at the same surface and the latest user request is clearly resuming
that lane.
Read First
Always read only what is relevant, but start from these sources:
- Latest user request.
- Current goal state, if a goal tool exists.
- Active plan under
docs/plans/ if present.
- docs/editor-behavior/README.md.
- docs/editor-behavior/markdown-standards.md.
- docs/editor-behavior/markdown-editing-spec.md.
- docs/editor-behavior/editor-protocol-matrix.md.
- docs/editor-behavior/markdown-parity-matrix.md.
- docs/editor-behavior/master-roadmap.md.
- docs/editor-behavior/markdown-editing-reference-audit.md.
- docs/research/README.md,
docs/research/index.md,
and docs/research/log.md when present.
- docs/solutions/best-practices/markdown-editor-reference-audits-must-treat-silence-as-a-gap.md.
- docs/solutions/best-practices/editor-behavior-specs-must-lock-node-model-and-affinity-before-ux.md.
Read when relevant:
- Intent/boundary pressure when intent, scope, non-goals, or decision
boundaries are unclear. Record the answer directly in this Plate Plan.
- Steelman pressure when major decisions need maintainer/user objection rows.
Record the strongest fair objection, tradeoff tension, and adoption answer in
this Plate Plan.
- High-risk deliberate pressure when a proposal changes public API, data model,
collaboration, runtime, browser behavior, migration, release gates, or package
boundaries. Record the pre-mortem and expanded proof plan in this Plate Plan.
- docs/editor-behavior/commands/README.md
when resuming or reconsolidating the lane.
- docs/research/systems/editor-behavior-architecture.md
for cross-family architecture questions.
- docs/analysis/editor-architecture-candidates.md
for framework-facing architecture/runtime questions.
../raw when compiled research is missing, thin, stale, or contradictory.
build-web-apps:shadcn when UI, editor chrome, shadcn components, registry
components, overlays, command menus, inputs, forms, or styling are in scope.
- vercel-react-best-practices
when React/Next components, rendering, subscriptions, external stores,
client/server boundaries, bundle size, data fetching, or runtime performance
are in scope.
- react-useeffect when effects,
derived state, reset-on-prop, subscriptions, browser APIs, data fetching, or
state synchronization are in scope.
- performance-oracle when hot
paths, algorithms, memory, network, query, bundle, browser/editor runtime, or
scalability concerns are in scope.
- tdd when behavior changes, bug fixes, public
interface changes, or regression classes need test-first acceptance criteria.
Use research-wiki when the compiled layer is stale, contradictory, or missing
coverage. For framework evidence, inspect local official clones under .. or
normalized ../raw before external docs.
If the review depends on current Plate behavior, cite live source files, docs,
examples, or tests. If it depends on external editor behavior, cite the compiled
research page or local source read used for the claim.
Current-State Grounding
Current Plate source, docs, tests, generated artifacts, and editor-behavior law
win over old plans, stale research notes, generated handoffs, and memory.
Before any pass, score, protocol/parity row, authority-map decision, ledger row,
migration/adoption answer, docs/example answer, proof row, implementation
phase, final handoff, or user-facing explanation that relies on what currently
exists:
- Re-read the live source, docs, examples, tests, generated artifact,
editor-behavior file, browser contract, or external reference that owns the
shape.
- State the exact current owner: file, docs section, test, route, generated
artifact, behavior-law row, research source, or explicit gap.
- Quote or summarize the current shape only if it exists in that source.
- Attach a file/line, docs section, test name, route, artifact path, behavior
row, benchmark, or source URL.
- If the current source already matches the proposed target, write
already done in live source and move the decision to docs/tests/spec
cleanup.
- If no source-backed current shape exists, write
decision: ...,
target shape: ..., or gap: ... instead of inventing a current state.
Stale docs, old plans, audit history, and compiled research can explain why a
decision exists, but they cannot prove current Plate behavior when live evidence
is available.
For code/API/UI examples, grep the exact symbols first. For behavior-law claims,
read the relevant docs/editor-behavior/** files and any linked tests or
browser contracts first.
This applies to every related step, not only final before/after summaries. A
protocol row, parity row, objection, proof matrix row, migration answer,
implementation phase, or final chat answer can be wrong in the same way if it
uses a stale current state.
Goal And Plan State
The active goal is the durable lane state. The plan is the durable evidence and
pass-state ledger. Do not create hook state for Plate Plan work.
Use the active plan for lightweight current-pass state:
current_pass: current-state-read
current_pass_status: in_progress
next_pass: intent-boundary-and-decision-brief
next_action: finish current pass and update the plan
goal_status: active
Complete the goal only when all completion gates pass. Use blocked only when
no autonomous progress is possible because evidence, tooling, access, or a user
decision is missing.
Allowed current_pass_status values:
pending
in_progress
complete
revise
blocked
skipped
Single-pass completion is invalid by default:
- one activation may complete at most one scheduled review/spec pass
- a newly created or newly activated plan must stay
pending
- only the closure pass may set
done
- the closure pass is valid only after earlier pass-state rows are already
recorded as complete in the active plan
- if the current activation creates, rewrites, or materially rescopes the plan,
record the next pass and keep status
pending
- ignore this only when the user explicitly asks for a single-pass review
Before completing the goal, prove in the plan:
- every scheduled pass row is
complete or intentionally skipped with a
concrete reason and evidence
- no pass row is
pending, in_progress, revise, or blocked with a
runnable next move
current_pass is the closure/final-gates pass
current_pass_status is complete
next_pass is none
next_action is none
- every completion threshold row below passes
If any assertion fails, keep the goal active and name the earliest runnable
next_pass.
Confidence Score
Score every review pass from 0.00 to 1.00.
Weights:
| Dimension |
Weight |
| Evidence and authority strength |
0.18 |
| Plate editor-behavior DX and product fit |
0.16 |
| Node model, affinity, and permanent-home coherence |
0.16 |
| Protocol, parity, and regression-proof testing |
0.20 |
| Research freshness and completeness |
0.15 |
| React/shadcn/effect implementation-review discipline |
0.10 |
| Roadmap and implementation-handoff clarity |
0.05 |
Score evidence rules:
- Every dimension score must cite concrete evidence: plan section, source file,
docs section, protocol/parity row, test/browser contract, research page, or
ledger row.
- A dimension without cited evidence cannot score above
0.80.
- Research freshness cannot score above
0.85 without current citations for
external systems or local repos the review relies on.
- Protocol/parity/regression cannot score above
0.80 without named
replayable browser/unit/stress/protocol contracts.
- Permanent-home coherence cannot score above
0.85 if package ownership,
performance cost, DX, and future consumer impact are not answered.
- Implementation-review discipline cannot score above
0.80 when an applicable
shadcn, Vercel React, react-useeffect, performance-oracle, or tdd lens is
missing.
- Implementation-review discipline cannot score above
0.85 when a lens is
marked applied or skipped without findings, plan deltas, or a concrete
skip reason.
- Any dimension affected by an unresolved intent, scope, non-goal, or decision
boundary gap cannot score above
0.85.
- A major decision with no viable-options comparison cannot score above
0.85.
- A major decision with only one surviving option cannot score above
0.85
unless the invalidated alternatives are named and fairly rejected.
Completion threshold:
All rows are conjunctive. Passing score is necessary but never sufficient.
- total score
>= 0.92
- no dimension below
0.85
- no unplanned P0/P1 issue
- every dimension score has cited evidence
- no unresolved contradiction in the research layer
- no missing acceptance criteria for implementation
- no public behavior/API surface left in "maybe" language
- intent, outcome, in-scope, non-goals, and decision boundaries are explicit
- every major decision has principles, top drivers, viable options, rejected
alternatives, consequences, and follow-ups
- high-risk deliberate mode is complete when triggered
- every major behavior/paradigm change has an accepted objection-ledger row
- extension/plugin/package/data-model changes have ecosystem answers when
applicable
- every applicable shadcn, Vercel React, react-useeffect, performance-oracle,
and tdd review is applied or explicitly skipped with a reason
- no objection-ledger row is
unresolved, revise, or drop without a
corresponding plan response
- pass schedule is complete
- pass-state ledger proves earlier passes completed before closure
- plan deltas from review are recorded
- final user-review handoff lists every accepted plan item/decision, with
before/after shape when applicable
If any gate fails, status stays pending.
Plan Shape
The plan must include:
- Current verdict.
- Intent/boundary record.
- Decision brief.
- Confidence scorecard with evidence references.
- Source-backed behavior north star.
- Request classification and feature family.
- Current law/readiness state.
- Research freshness decision.
- Node model and affinity target.
- Permanent-home target.
- Standards/spec/protocol/parity/audit/roadmap change map.
- Applicable implementation-skill review matrix: shadcn, Vercel React,
react-useeffect, performance-oracle, and tdd.
- Browser stress / parity / regression strategy.
- High-risk deliberate-mode pre-mortem and proof plan when triggered.
- Hard cuts and rejected alternatives.
- Objection ledger with ecosystem answers when triggered.
- Pass schedule and pass-state ledger.
- Plan deltas from review.
- Open questions and what would change the decision.
- Implementation phases with owners.
- Fast driver gates.
- Final user-review handoff outline.
- Final completion gates.
Pass Schedule
Run the review as passes, not one giant essay:
- Current-state read and initial score.
- Intent/boundary and decision-brief pass; write the boundary record directly
when it is not already explicit.
- Research and live-source refresh.
- Authority, node-model, affinity, permanent-home, protocol, parity, roadmap,
shadcn, React performance, useEffect, performance-oracle, tdd, and
regression pressure passes.
- Plate maintainer objection ledger with steelman pressure for major decisions.
- High-risk deliberate-mode pass when triggered.
- Ecosystem maintainer pass when triggered.
- Revision pass that answers objections and updates the plan/spec stack.
- Closure score and final gates.
The closure score and final gates are their own pass. Do not fold closure into
the previous pass. The closure pass may start only when every earlier
pass-state row is already complete or intentionally skipped with evidence.
After each pass, update the active plan with pass status, evidence, changes,
and next owner. Keep the active goal open while any pass or revision remains
runnable.
Pass-state ledger rows must include:
- pass name
- status:
pending, in_progress, or complete
- evidence added
- plan delta
- editor-behavior output delta
- open issues
- next owner
Do not mark multiple major passes complete in one activation. Finish the current
pass, refresh the active continuation prompt, keep status pending, and let the
next activation run the next pass.
Editor-Behavior Outputs
This workflow answers four questions:
- What is the authority?
- What is the readable law?
- What are the exhaustive scenarios?
- What is the current gate status?
That maps to:
- authority -> markdown-standards.md
- readable law -> markdown-editing-spec.md
- exhaustive scenarios -> editor-protocol-matrix.md
- gate status -> markdown-parity-matrix.md
- evidence history -> markdown-editing-reference-audit.md
- implementation queue -> master-roadmap.md
For each output file, either patch it or state why it stayed unchanged. Do not
leave a layer implicit.
Intake Classification
Classify the request before editing:
- Update to existing current feature behavior.
- New interaction class for an existing current feature.
- New current feature family or newly formalized current surface.
- Deferred or future feature.
- New authority / winner shift.
- Architecture-only spec question.
- Regression-proofing / parity gate question.
Classify the feature family:
- markdown-native syntax
- markdown mode architecture and note-linked navigation
- block-editor-native elements
- tables and linear document editing
- collaboration / editor-only
- styling / layout / editor chrome
- cross-surface interaction
Classify the evidence state:
- evidence already sufficient
- research update needed
- architecture lane change
- pure law/protocol update
- parity/proof update
Intent Boundary Gate
Before treating a plan as ready, record:
- intent: why the user wants this change
- desired outcome: what state should exist after implementation
- in-scope behavior
- non-goals
- decision boundaries: what the plan may decide without asking the user again
- unresolved user-decision points
Gather repo facts before asking the user about internals. If one user answer is
needed, ask exactly one high-leverage boundary question, not a questionnaire.
Pressure-test weak answers with one of:
- concrete example, counterexample, or evidence signal
- hidden assumption or dependency
- explicit tradeoff, rejected boundary, or deferred scope
- root-cause reframing when the request describes only symptoms
Do not score ready while non-goals or decision boundaries are vague.
Decision Brief
For every major behavior, authority, package-boundary, API, protocol, or proof
decision, record:
- principles: three to five rules the decision must satisfy
- top drivers: the three forces that most affect the decision
- viable options: at least two, with bounded pros and cons
- chosen option
- rejected alternatives
- consequences
- follow-ups
If only one option is viable, say which alternatives were considered and why
they are invalid. "No alternative" is not a reason; it is usually a missed pass.
Research Decision
Use the research layer before inventing new law.
Use research-wiki for choosing and running the right research mode when:
- the topic already exists in
docs/research but needs refresh
- compiled synthesis is contradictory or thin
- raw evidence is missing or stale
- the authority question spans multiple likely corpora
- the surface is authority-sensitive and silence would be dangerous
Do not skip the research layer and jump from a raw source into law unless the
request is tiny and the evidence is already obvious.
Do not call research "full" if one likely corpus stayed silent. Silence is a
gap, not agreement.
Evidence Ladder
Use:
- explicit reference docs or executable tests
- compatible but indirect evidence
- honest gap
When recording evidence, use:
agree
partial
gap
tension
diverge
Never mark behavior locked because it feels standard.
Live source/docs/tests/generated artifacts and behavior-law files outrank
compiled research and previous plans when describing the current state. If they
disagree, record stale research, stale plan, or stale audit history and
update the active plan from live evidence.
Node Model First
Before writing UX law, lock:
- node model
- affinity class when relevant
Node model classes:
block non-void
block void atom
inline non-void span
inline void atom
leaf mark
text token
overlay / no node
Affinity classes:
directional
hard
outward
none / n-a
Do not spec hover, click, backlink, toolbar, or popover behavior until the model
is explicit.
Permanent-Home Test
For any new shared contract or cross-surface rule, answer:
- What is the best permanent home if designed cleanly today?
- Which home minimizes repeated feature-local reimplementation?
- Which home keeps package ownership coherent?
- Which home gives the best performance characteristics?
- Which home gives the best DX and API discoverability?
- Which future consumers would reuse it?
Candidate homes:
@platejs/core
- existing shared package
- new shared package
- feature package
- app/render layer only
- docs/test contract only
If the answer differs from current file placement, the spec should say so.
Required Edit Order
Use this order unless the task is small enough that a subset is obviously
enough. If a file stays unchanged, record why.
1. Standards
Patch markdown-standards.md when:
- the winner map changes
- a new authority lane appears
- a family split is needed
- a stronger external reference replaces an older one
- routing guidance changes
2. Readable Law
Patch markdown-editing-spec.md
to define:
- family-level behavior
- node model
- affinity
- ownership rules
- locked notes / exceptions
- current vs deferred status
If behavior includes editor chrome or navigation UI, define it in a way that is
compatible with shadcn composition: popovers, commands, menus, triggers,
truncation, keyboard composition, semantic styling, and no one-off overlay
markup when a standard pattern exists.
If behavior includes React rendering, subscriptions, overlays, server/client
boundaries, data fetching, or editor runtime projections, define the performance
shape explicitly: what subscribes, what stays static, what work is deferred, and
which Vercel React rule family applies.
If behavior includes effects, derived state, reset-on-prop behavior,
subscriptions, browser APIs, external stores, or data synchronization, define why
an effect is needed. Prefer render-time calculation, event handlers, keyed
resets, useMemo, or useSyncExternalStore when they express the behavior.
3. Protocol Rows
Patch editor-protocol-matrix.md
to enumerate:
- concrete scenarios
- authority per row
- spec IDs
- status
If a surface has different winners by scenario, split the rows. Do not keep one
coarse row that lies.
4. Parity Gate
Patch markdown-parity-matrix.md
when:
- an existing current feature family changed
- the family authority map changed
- gate status changed
- node model / affinity summary changed
- browser/protocol proof changed
Do not inflate the parity matrix for speculative future product ideas that are
not current Plate features.
5. Roadmap
Patch master-roadmap.md when:
- a new implementation lane appears
- deferred implementation work should enter the queue
- order of real remaining implementation lanes changes
- a lane is narrowed, closed, re-cut, or split
Do not strand implementation debt only in parity wording or a plan doc.
6. Audit
Patch markdown-editing-reference-audit.md
only when:
- a new external reference disagreement matters
- the evidence history needs a new entrypoint
- a winner shift needs explicit audit history
Do not treat the audit as current law.
Current Feature Vs Deferred Feature
For current feature/current surface, update all affected layers:
- standards
- readable law
- protocol rows
- parity when the gate changed
- roadmap when implementation work remains
- audit when evidence history changed
For deferred or future surfaces, usually update:
- standards if a new lane is needed
- readable law if the contract must exist now
- protocol rows as
deferred or specified
Do not pretend deferred behavior is release-gated current behavior.
Applicable Implementation Reviews
Before scoring above threshold, decide whether each review lens applies. Record
the decision in the active plan even when skipped.
Use this matrix:
| Lens |
Applies when |
Must answer |
build-web-apps:shadcn |
UI/editor chrome, components, registry components, menus, popovers, command palettes, inputs, forms, overlays, styling, or component composition are in scope |
Are existing components used first? Are variants, semantic tokens, gap-*, size-*, truncate, cn(), accessible titles, grouped menu/select items, full Card composition, Button loading, and icon data-icon rules respected? |
vercel-react-best-practices |
React/Next components, rendering, external-store subscriptions, data fetching, server/client boundaries, bundle size, or runtime performance are in scope |
Are waterfalls avoided, bundles split sanely, server/client serialization minimized, global listeners deduped, subscriptions derived and narrow, expensive renders deferred, transient values kept in refs, and inline components avoided? |
react-useeffect |
useEffect, useState for derived values, reset-on-prop, state synchronization, subscriptions, browser APIs, external systems, data fetching, or parent notifications are in scope |
Is the effect actually synchronizing with an external system? Can the behavior be render calculation, useMemo, keyed reset, event handler, framework fetch, or useSyncExternalStore instead? |
performance-oracle |
Hot paths, algorithms, large collections, memory lifetime, network/database I/O, bundle cost, editor runtime loops, browser event paths, or scalability are in scope |
Is complexity bounded? Are allocations, subscriptions, listeners, network calls, and cache lifetimes controlled? What happens at 10x, 100x, and 1000x scale? |
tdd |
Behavior additions, bug fixes, public interface changes, regression classes, or executable acceptance criteria are in scope |
Is there a red-green-refactor slice through a public interface? Does the test verify behavior rather than implementation details? |
For each applicable lens, record:
- applicability:
applied or skipped
- reason
- findings
- plan delta or explicit no-change defense
- proof pointer: plan section, source file, rule family, protocol row, or test
family
Do not turn these lenses into generic busywork. If the plan is pure law with no
UI, React, or effect surface, skip them with one sentence and keep moving.
High-Risk Deliberate Mode
Trigger this mode when a proposal changes:
- public API
- package boundary
- data model
- extension/plugin behavior
- collaboration or operation semantics
- normalization
- selection, focus, IME, or browser-runtime behavior
- release gate or generated regression contract
When triggered, add to the active plan:
- pre-mortem: three realistic failure scenarios
- expanded proof plan: unit, browser, parity, stress, migration, and docs/example
proof as applicable
- blast-radius note: packages, examples, docs, tests, and downstream consumers
- rollback or hard-cut answer: why the plan is still worth doing
High-risk mode is not a separate workflow. It is one stricter pass inside this
skill.
Objection Ledger
Simulate a skeptical Plate maintainer and serious downstream Plate user.
The goal is to prevent "they changed things for no reason."
For every major behavior, authority, API, package-boundary, protocol, or parity
change, record:
- Change: exact behavior/API/spec/test contract being changed.
- Who feels pain: Plate user, plugin author, app author, docs maintainer,
test maintainer, package owner, design-system owner, or release owner.
- Likely objection: strongest fair complaint in user language.
- Steelman antithesis: the best argument for not making the change.
- Tradeoff tension: what the chosen option makes worse or more expensive.
- Why this is not change for change's sake: concrete payoff.
- Evidence: repo fact, research fact, protocol row, parity row, browser
regression class, or reference limitation.
- Rejected alternative: closest compatible option and why it is weaker.
- Adoption answer: how a user or maintainer moves from old shape to new shape.
- Docs/example answer: what public explanation or example proves the change.
- Regression proof: unit, browser, protocol, parity, stress, or manual proof row.
- Ecosystem answers, when triggered.
- Verdict:
keep, revise, drop, or unresolved.
Ledger rows are mandatory for changes like:
- new authority lane or winner shift
- family split
- node model or affinity change
- permanent-home decision
- core vs package vs app/render ownership change
- shadcn/editor-chrome behavior contract
- React runtime/rendering/subscription behavior contract
- effect, derived-state, or external-synchronization contract
- protocol/parity gate change
- roadmap order change
- hard cut of old docs/API behavior
- generated browser or stress-test gate
Rules:
- No major behavior/paradigm change may score above
0.85 in DX, authority, or
parity unless it has a ledger row with a convincing answer.
- A ledger row is accepted only when its verdict is
keep and every required
field is concrete: evidence, steelman antithesis, tradeoff tension, rejected
alternative, adoption answer, docs/example answer, regression proof, and
ecosystem answers when triggered.
- A row is not accepted if a required field is missing, says
TBD, says only
"cleaner", or lacks proof that a real user problem is solved.
- If the best answer is only "cleaner", the verdict is
revise or drop.
unresolved, revise, or drop rows must feed back into the plan before
completion can be done.
- Reuse prior ledger rows when rerunning this skill, but revalidate them against
the latest plan.
Ecosystem Maintainer Pass
Do not create separate full ledgers by default. Trigger this pass only when the
proposal changes extension, plugin, package, rendering, collaboration,
operation, identity, normalization, snapshot, or data-model behavior.
For each triggered ledger row, add short answers:
- Plugin maintainer: can packages expose this without wrapping every core call
or creating a compatibility junk drawer?
- App author: can app code customize or opt out without bespoke wiring?
- Docs/test maintainer: can docs, examples, protocol rows, and proof gates stay
coherent?
- Collab/data maintainer, when relevant: do operations, identity, snapshots,
normalization, remote apply, and conflict behavior stay deterministic?
For core API/data-model changes, also name:
- exact affected extension points
- package/plugin migration surface
- data/collab contract affected
- proof required before closure
The pass catches ecosystem breakage. It does not veto every cleanup.
Plan Deltas From Review
Every review pass must either change the plan or explicitly defend no change.
Record:
- added decisions
- revised decisions
- dropped decisions
- strengthened acceptance criteria
- new tests/proof rows
- editor-behavior output file deltas
- unresolved items moved to the next pass
- no-change decisions with evidence
If pressure passes produce no plan delta and no explicit no-change defense, the
review is a rubber stamp and completion stays pending.
Pressure Passes
Before raising the score above threshold, run these passes and record the result
in the plan:
- Authority pass: prove the winner map and family split are justified.
- Intent/boundary pass: prove intent, outcome, scope, non-goals, and decision
boundaries are explicit.
- Decision-brief pass: prove principles, drivers, options, rejected
alternatives, consequences, and follow-ups are recorded.
- Node-model pass: prove model and affinity are locked before UX law.
- Permanent-home pass: prove ownership belongs where the plan says it belongs.
- DX pass: prove the shape is discoverable for Plate users and future agents.
- Unopinionated-core pass: prove core does not absorb product-only opinion.
- Regression pass: prove behavior is caught by protocol/parity/browser/stress
contracts, not example-by-example patching.
- Research pass: prove compiled research was used as evidence, not decoration.
- shadcn/UI pass: when applicable, prove editor chrome follows composable
shadcn patterns and record the applied/skipped result.
- Vercel React pass: when applicable, prove React runtime/performance choices
follow the relevant Vercel rule families and record the applied/skipped result.
- useEffect pass: when applicable, prove effects are external-system
synchronization, not derived-state or event-handler work in disguise.
- Performance-oracle pass: when applicable, prove hot-path, complexity, memory,
network, bundle, and scalability claims are bounded or intentionally deferred.
- TDD pass: when applicable, prove behavior changes and regression classes have
public-interface red-green-refactor acceptance criteria.
- Simplicity pass: remove overbuilt props, aliases, shims, and speculative API
layers.
- Plate maintainer pass: challenge every major behavior/paradigm change as if
reviewing a Plate PR; record objections and answers in the ledger.
- Steelman pass: record the best antithesis and real tradeoff tension for each
major decision.
- High-risk deliberate pass: when triggered, add the pre-mortem and expanded
proof plan before closure.
- Ecosystem pass: only when triggered, add plugin/app/docs/test/data answers to
the same ledger row.
User Review And Execution Mode
When the score is below threshold, any required pass remains open, or any
completion gate has a runnable next move:
- Update the plan with the current score, evidence, rejected tactics, and next
owner.
- Keep the active goal open.
- Continue the next review/refinement slice.
When final gates pass, complete the planning goal and stop for user review.
Implementation starts only after a later explicit execution request that invokes
Plate Plan again against the accepted plan. That execution invocation must use a
new execution-shaped goal, read the accepted plan, run the next implementation
owner, record verification, and keep the goal active while any accepted owner
remains runnable.
Done Handoff
When setting completion to done, the final chat response must include a
concise but exhaustive bullet list of every accepted plan item and decision so
the user can review without opening the full plan.
Group bullets by surface when useful:
- authority / winner map
- intent / decision brief
- node model / affinity
- permanent home / package ownership
- editor-behavior outputs
- protocol / parity / roadmap / audit
- UI/editor chrome and applicable shadcn review
- React runtime/performance and applicable Vercel React review
- effects/external synchronization and applicable react-useeffect review
- hot-path/scalability and applicable performance-oracle review
- behavior/regression proof and applicable tdd review
- high-risk deliberate-mode pre-mortem when triggered
- regression proof
- hard cuts and rejected alternatives
- implementation phases and gates
Each bullet should include:
- decision name or surface
- before -> after shape when the plan changes an existing shape, with a source
pointer for the before
- status:
add, keep, cut, rename, revise, or gate
- proof pointer when short enough: evidence row, ledger row, test/proof family,
spec section, or plan section
Current-state / before-after rules:
- Any claim about the current implementation, behavior law, docs state, example,
protocol row, parity row, or generated artifact must have a live evidence
pointer or be marked
gap.
before must be copied from live source, docs, examples, tests, generated
artifacts, behavior-law rows, or authoritative reference material.
after must be an accepted target shape or already done.
- If a previous plan, audit, or compiled research claims an old shape but live
evidence does not, do not use it in any step; record
stale claim.
- If a decis
…(truncated)
1---2name: plate-plan3description: Define or update Plate editor-behavior specs with a pass-gated, evidence-scored plan. Use for behavior law, authority maps, protocol rows, parity gates, research-backed winner shifts, editor chrome contracts, and implementation-roadmap changes.4---56# Plate Plan78Handle $ARGUMENTS.910This is the Plate editor-behavior planning and law workflow. It turns behavior11ideas, review findings, or spec drift into:1213- a pass-gated plan under `docs/plans/`14- updated editor-behavior law under `docs/editor-behavior/`15- research updates under `docs/research/` when evidence is stale or thin16- a goal-backed plan ledger that stays active until the plan is genuinely ready1718Use this when the failure mode is "we keep finding more Plate planning gaps later."1920## Use When2122- Adding or changing editor behavior law.23- Reviewing current Plate editor-behavior architecture or DX.24- Revising authority/winner maps.25- Adding or splitting interaction families.26- Updating protocol rows, parity gates, roadmap lanes, or reference audits.27- Deciding permanent home for a behavior contract: core, shared package,28 feature package, app/render layer, docs-only, or tests-only.29- Formalizing browser/regression proof for editor behavior.30- The user wants a plan before implementation.3132## Do Not Use When3334- The user asks for a narrow bug fix without spec work.35- The user asks for a normal code review of a diff.36- The user asks to execute an already accepted Plate Plan.37- The plan already has a passing Plate Plan score, completed pass schedule,38 closed final gates, and the user says to build.3940## Hard Policy4142- This is a planning/review/spec-law lane first. Do not patch product code unless43 the user explicitly asks for implementation.44- Do not route to external interview or consensus-planning skills. This skill45 owns the plan gate.46- Evidence first. Vibes are not authority.47- Treat silence as a gap, not fake agreement.48- Lock node model and affinity before UX chrome.49- Keep Plate core unopinionated enough for framework use. Opinionated product50 behavior belongs in packages, kits, examples, or docs.51- Prefer the best permanent architecture for performance and DX over the52 nearest current file location.53- If the best answer is a new authority lane, family split, or ownership move,54 say that and plan it.55- A behavior, API, or gate change needs an adoption story. "Cleaner" alone is56 not a justification.57- Intent, outcome, scope, non-goals, and decision boundaries must be explicit58 before the plan can score as ready.59- Major decisions need a decision brief: principles, top drivers, viable60 options, rejected alternatives, and why the chosen option wins.61- Do not let a polished plan self-certify. Scores, verdicts, and keep/drop62 decisions need cited evidence.63- Score is not completion. A passing score with any pending pass, spec-law64 output, verification gate, named next owner, or runnable next action stays65 `pending`.66- The top-level completion status is the lane status, not the current pass67 status. Close a pass with `current_pass_status: complete`; do not use68 top-level `done` unless the whole lane is closed.69- Top-level `done` is legal only in the closure/final-gates pass, after the70 active plan proves every earlier pass-state row is complete or explicitly71 skipped with evidence.72- For current Plate features, parity and protocol matter. For deferred features,73 do not inflate the release gate.74- Run applicable implementation-review lenses instead of trusting generic editor75 intuition: `build-web-apps:shadcn` for UI/editor chrome,76 `vercel-react-best-practices` for React/Next/runtime performance, and77 `react-useeffect` for effects, derived state, subscriptions, and external78 synchronization. Use `performance-oracle` for hot paths, algorithms, memory,79 network, query, bundle, and scalability concerns. Use `tdd` for behavior80 additions, bug fixes, and regression classes that need test-first proof. If a81 lens is skipped, record why.8283## Required Artifacts8485- Plan file under `docs/plans/`.86- Editor-behavior outputs under `docs/editor-behavior/` when law changes.87- Research updates under `docs/research/` when the evidence lane is stale,88 contradictory, or incomplete.89- Objection ledger in the active plan. If it grows too large, split it to90 `docs/plans/<same-slug>-objection-ledger.md` and link it from the plan.91- Plan deltas from review in the active plan: what changed, what was dropped,92 what was strengthened, and what stayed unchanged with reasons.93- Intent/boundary record in the active plan: intent, outcome, in-scope,94 non-goals, decision boundaries, and unresolved user-decision points.95- Decision brief in the active plan: principles, decision drivers, viable96 options, invalidated alternatives, consequences, and follow-ups.97- Applicable implementation-skill review notes in the active plan: shadcn,98 Vercel React, react-useeffect, performance-oracle, and tdd, each marked99 `applied` or `skipped` with a concrete reason.100101## Goal Setup102103Before creating or resuming a Plate Plan:104105- If a goal tool is available, call `get_goal` first. Call `create_goal()` only106 when no goal exists; repeated `create_goal()` calls fail while a thread goal107 exists.108- Continue under a matching active goal, or resolve a mismatched active goal109 before creating a new one.110- Create the goal around the desired end state, not the execution plan.111- Include constraints, scope, or verification details only when they materially112 change what `done` means.113- Use the goal or user-input tool to ask when the goal would otherwise be114 unclear.115- If no goal tool is available, ask the user to set the goal instead of116 silently skipping goal setup.117- Do not start the planning pass until the goal is set, verified as already118 matching, or the user explicitly resolves the missing-goal path.119120Good goal:121122```txt123Plate Plan proves the editor-behavior authority, node model, protocol rows,124and proof gates are ready for user review. Execution starts only when the user125accepts the plan and invokes Plate Plan again for that accepted plan.126```127128Bad goal:129130```txt131Run Plate Plan passes 1 through 9.132```133134Default plan path:135136```txt137docs/plans/YYYY-MM-DD-plate-plan-review-plan.md138```139140Reuse an active plan when the prompt names one, or when the active goal and plan141both point at the same surface and the latest user request is clearly resuming142that lane.143144## Read First145146Always read only what is relevant, but start from these sources:1471481. Latest user request.1492. Current goal state, if a goal tool exists.1503. Active plan under `docs/plans/` if present.1514. [docs/editor-behavior/README.md](docs/editor-behavior/README.md).1525. [docs/editor-behavior/markdown-standards.md](docs/editor-behavior/markdown-standards.md).1536. [docs/editor-behavior/markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md).1547. [docs/editor-behavior/editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md).1558. [docs/editor-behavior/markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md).1569. [docs/editor-behavior/master-roadmap.md](docs/editor-behavior/master-roadmap.md).15710. [docs/editor-behavior/markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md).15811. [docs/research/README.md](docs/research/README.md), `docs/research/index.md`,159 and `docs/research/log.md` when present.16012. [docs/solutions/best-practices/markdown-editor-reference-audits-must-treat-silence-as-a-gap.md](docs/solutions/best-practices/markdown-editor-reference-audits-must-treat-silence-as-a-gap.md).16113. [docs/solutions/best-practices/editor-behavior-specs-must-lock-node-model-and-affinity-before-ux.md](docs/solutions/best-practices/editor-behavior-specs-must-lock-node-model-and-affinity-before-ux.md).162163Read when relevant:164165- Intent/boundary pressure when intent, scope, non-goals, or decision166 boundaries are unclear. Record the answer directly in this Plate Plan.167- Steelman pressure when major decisions need maintainer/user objection rows.168 Record the strongest fair objection, tradeoff tension, and adoption answer in169 this Plate Plan.170- High-risk deliberate pressure when a proposal changes public API, data model,171 collaboration, runtime, browser behavior, migration, release gates, or package172 boundaries. Record the pre-mortem and expanded proof plan in this Plate Plan.173- [docs/editor-behavior/commands/README.md](docs/editor-behavior/commands/README.md)174 when resuming or reconsolidating the lane.175- [docs/research/systems/editor-behavior-architecture.md](docs/research/systems/editor-behavior-architecture.md)176 for cross-family architecture questions.177- [docs/analysis/editor-architecture-candidates.md](docs/analysis/editor-architecture-candidates.md)178 for framework-facing architecture/runtime questions.179- `../raw` when compiled research is missing, thin, stale, or contradictory.180- `build-web-apps:shadcn` when UI, editor chrome, shadcn components, registry181 components, overlays, command menus, inputs, forms, or styling are in scope.182- [vercel-react-best-practices](.agents/skills/vercel-react-best-practices/SKILL.md)183 when React/Next components, rendering, subscriptions, external stores,184 client/server boundaries, bundle size, data fetching, or runtime performance185 are in scope.186- [react-useeffect](.agents/skills/react-useeffect/SKILL.md) when effects,187 derived state, reset-on-prop, subscriptions, browser APIs, data fetching, or188 state synchronization are in scope.189- [performance-oracle](.agents/skills/performance-oracle/SKILL.md) when hot190 paths, algorithms, memory, network, query, bundle, browser/editor runtime, or191 scalability concerns are in scope.192- [tdd](.agents/skills/tdd/SKILL.md) when behavior changes, bug fixes, public193 interface changes, or regression classes need test-first acceptance criteria.194195Use `research-wiki` when the compiled layer is stale, contradictory, or missing196coverage. For framework evidence, inspect local official clones under `..` or197normalized `../raw` before external docs.198199If the review depends on current Plate behavior, cite live source files, docs,200examples, or tests. If it depends on external editor behavior, cite the compiled201research page or local source read used for the claim.202203## Current-State Grounding204205Current Plate source, docs, tests, generated artifacts, and editor-behavior law206win over old plans, stale research notes, generated handoffs, and memory.207208Before any pass, score, protocol/parity row, authority-map decision, ledger row,209migration/adoption answer, docs/example answer, proof row, implementation210phase, final handoff, or user-facing explanation that relies on what currently211exists:2122131. Re-read the live source, docs, examples, tests, generated artifact,214 editor-behavior file, browser contract, or external reference that owns the215 shape.2162. State the exact current owner: file, docs section, test, route, generated217 artifact, behavior-law row, research source, or explicit gap.2183. Quote or summarize the current shape only if it exists in that source.2194. Attach a file/line, docs section, test name, route, artifact path, behavior220 row, benchmark, or source URL.2215. If the current source already matches the proposed target, write222 `already done in live source` and move the decision to docs/tests/spec223 cleanup.2246. If no source-backed current shape exists, write `decision: ...`,225 `target shape: ...`, or `gap: ...` instead of inventing a current state.226227Stale docs, old plans, audit history, and compiled research can explain why a228decision exists, but they cannot prove current Plate behavior when live evidence229is available.230231For code/API/UI examples, grep the exact symbols first. For behavior-law claims,232read the relevant `docs/editor-behavior/**` files and any linked tests or233browser contracts first.234235This applies to every related step, not only final before/after summaries. A236protocol row, parity row, objection, proof matrix row, migration answer,237implementation phase, or final chat answer can be wrong in the same way if it238uses a stale current state.239240## Goal And Plan State241242The active goal is the durable lane state. The plan is the durable evidence and243pass-state ledger. Do not create hook state for Plate Plan work.244245Use the active plan for lightweight current-pass state:246247```md248current_pass: current-state-read249current_pass_status: in_progress250next_pass: intent-boundary-and-decision-brief251next_action: finish current pass and update the plan252goal_status: active253```254255Complete the goal only when all completion gates pass. Use `blocked` only when256no autonomous progress is possible because evidence, tooling, access, or a user257decision is missing.258259Allowed `current_pass_status` values:260261- `pending`262- `in_progress`263- `complete`264- `revise`265- `blocked`266- `skipped`267268Single-pass completion is invalid by default:269270- one activation may complete at most one scheduled review/spec pass271- a newly created or newly activated plan must stay `pending`272- only the closure pass may set `done`273- the closure pass is valid only after earlier pass-state rows are already274 recorded as complete in the active plan275- if the current activation creates, rewrites, or materially rescopes the plan,276 record the next pass and keep status `pending`277- ignore this only when the user explicitly asks for a single-pass review278279Before completing the goal, prove in the plan:280281- every scheduled pass row is `complete` or intentionally `skipped` with a282 concrete reason and evidence283- no pass row is `pending`, `in_progress`, `revise`, or `blocked` with a284 runnable next move285- `current_pass` is the closure/final-gates pass286- `current_pass_status` is `complete`287- `next_pass` is `none`288- `next_action` is `none`289- every completion threshold row below passes290291If any assertion fails, keep the goal active and name the earliest runnable292`next_pass`.293294## Confidence Score295296Score every review pass from `0.00` to `1.00`.297298Weights:299300| Dimension | Weight |301| --- | ---: |302| Evidence and authority strength | 0.18 |303| Plate editor-behavior DX and product fit | 0.16 |304| Node model, affinity, and permanent-home coherence | 0.16 |305| Protocol, parity, and regression-proof testing | 0.20 |306| Research freshness and completeness | 0.15 |307| React/shadcn/effect implementation-review discipline | 0.10 |308| Roadmap and implementation-handoff clarity | 0.05 |309310Score evidence rules:311312- Every dimension score must cite concrete evidence: plan section, source file,313 docs section, protocol/parity row, test/browser contract, research page, or314 ledger row.315- A dimension without cited evidence cannot score above `0.80`.316- Research freshness cannot score above `0.85` without current citations for317 external systems or local repos the review relies on.318- Protocol/parity/regression cannot score above `0.80` without named319 replayable browser/unit/stress/protocol contracts.320- Permanent-home coherence cannot score above `0.85` if package ownership,321 performance cost, DX, and future consumer impact are not answered.322- Implementation-review discipline cannot score above `0.80` when an applicable323 shadcn, Vercel React, react-useeffect, performance-oracle, or tdd lens is324 missing.325- Implementation-review discipline cannot score above `0.85` when a lens is326 marked `applied` or `skipped` without findings, plan deltas, or a concrete327 skip reason.328- Any dimension affected by an unresolved intent, scope, non-goal, or decision329 boundary gap cannot score above `0.85`.330- A major decision with no viable-options comparison cannot score above `0.85`.331- A major decision with only one surviving option cannot score above `0.85`332 unless the invalidated alternatives are named and fairly rejected.333334Completion threshold:335336All rows are conjunctive. Passing score is necessary but never sufficient.337338- total score `>= 0.92`339- no dimension below `0.85`340- no unplanned P0/P1 issue341- every dimension score has cited evidence342- no unresolved contradiction in the research layer343- no missing acceptance criteria for implementation344- no public behavior/API surface left in "maybe" language345- intent, outcome, in-scope, non-goals, and decision boundaries are explicit346- every major decision has principles, top drivers, viable options, rejected347 alternatives, consequences, and follow-ups348- high-risk deliberate mode is complete when triggered349- every major behavior/paradigm change has an accepted objection-ledger row350- extension/plugin/package/data-model changes have ecosystem answers when351 applicable352- every applicable shadcn, Vercel React, react-useeffect, performance-oracle,353 and tdd review is applied or explicitly skipped with a reason354- no objection-ledger row is `unresolved`, `revise`, or `drop` without a355 corresponding plan response356- pass schedule is complete357- pass-state ledger proves earlier passes completed before closure358- plan deltas from review are recorded359- final user-review handoff lists every accepted plan item/decision, with360 before/after shape when applicable361362If any gate fails, status stays `pending`.363364## Plan Shape365366The plan must include:3673681. Current verdict.3692. Intent/boundary record.3703. Decision brief.3714. Confidence scorecard with evidence references.3725. Source-backed behavior north star.3736. Request classification and feature family.3747. Current law/readiness state.3758. Research freshness decision.3769. Node model and affinity target.37710. Permanent-home target.37811. Standards/spec/protocol/parity/audit/roadmap change map.37912. Applicable implementation-skill review matrix: shadcn, Vercel React,380 react-useeffect, performance-oracle, and tdd.38113. Browser stress / parity / regression strategy.38214. High-risk deliberate-mode pre-mortem and proof plan when triggered.38315. Hard cuts and rejected alternatives.38416. Objection ledger with ecosystem answers when triggered.38517. Pass schedule and pass-state ledger.38618. Plan deltas from review.38719. Open questions and what would change the decision.38820. Implementation phases with owners.38921. Fast driver gates.39022. Final user-review handoff outline.39123. Final completion gates.392393## Pass Schedule394395Run the review as passes, not one giant essay:3963971. Current-state read and initial score.3982. Intent/boundary and decision-brief pass; write the boundary record directly399 when it is not already explicit.4003. Research and live-source refresh.4014. Authority, node-model, affinity, permanent-home, protocol, parity, roadmap,402 shadcn, React performance, useEffect, performance-oracle, tdd, and403 regression pressure passes.4045. Plate maintainer objection ledger with steelman pressure for major decisions.4056. High-risk deliberate-mode pass when triggered.4067. Ecosystem maintainer pass when triggered.4078. Revision pass that answers objections and updates the plan/spec stack.4089. Closure score and final gates.409410The closure score and final gates are their own pass. Do not fold closure into411the previous pass. The closure pass may start only when every earlier412pass-state row is already `complete` or intentionally `skipped` with evidence.413414After each pass, update the active plan with pass status, evidence, changes,415and next owner. Keep the active goal open while any pass or revision remains416runnable.417418Pass-state ledger rows must include:419420- pass name421- status: `pending`, `in_progress`, or `complete`422- evidence added423- plan delta424- editor-behavior output delta425- open issues426- next owner427428Do not mark multiple major passes complete in one activation. Finish the current429pass, refresh the active continuation prompt, keep status `pending`, and let the430next activation run the next pass.431432## Editor-Behavior Outputs433434This workflow answers four questions:4354361. What is the authority?4372. What is the readable law?4383. What are the exhaustive scenarios?4394. What is the current gate status?440441That maps to:442443- authority -> [markdown-standards.md](docs/editor-behavior/markdown-standards.md)444- readable law -> [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)445- exhaustive scenarios -> [editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md)446- gate status -> [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)447- evidence history -> [markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md)448- implementation queue -> [master-roadmap.md](docs/editor-behavior/master-roadmap.md)449450For each output file, either patch it or state why it stayed unchanged. Do not451leave a layer implicit.452453## Intake Classification454455Classify the request before editing:4564571. Update to existing current feature behavior.4582. New interaction class for an existing current feature.4593. New current feature family or newly formalized current surface.4604. Deferred or future feature.4615. New authority / winner shift.4626. Architecture-only spec question.4637. Regression-proofing / parity gate question.464465Classify the feature family:466467- markdown-native syntax468- markdown mode architecture and note-linked navigation469- block-editor-native elements470- tables and linear document editing471- collaboration / editor-only472- styling / layout / editor chrome473- cross-surface interaction474475Classify the evidence state:476477- evidence already sufficient478- research update needed479- architecture lane change480- pure law/protocol update481- parity/proof update482483## Intent Boundary Gate484485Before treating a plan as ready, record:486487- intent: why the user wants this change488- desired outcome: what state should exist after implementation489- in-scope behavior490- non-goals491- decision boundaries: what the plan may decide without asking the user again492- unresolved user-decision points493494Gather repo facts before asking the user about internals. If one user answer is495needed, ask exactly one high-leverage boundary question, not a questionnaire.496497Pressure-test weak answers with one of:4984991. concrete example, counterexample, or evidence signal5002. hidden assumption or dependency5013. explicit tradeoff, rejected boundary, or deferred scope5024. root-cause reframing when the request describes only symptoms503504Do not score ready while non-goals or decision boundaries are vague.505506## Decision Brief507508For every major behavior, authority, package-boundary, API, protocol, or proof509decision, record:510511- principles: three to five rules the decision must satisfy512- top drivers: the three forces that most affect the decision513- viable options: at least two, with bounded pros and cons514- chosen option515- rejected alternatives516- consequences517- follow-ups518519If only one option is viable, say which alternatives were considered and why520they are invalid. "No alternative" is not a reason; it is usually a missed pass.521522## Research Decision523524Use the research layer before inventing new law.525526Use `research-wiki` for choosing and running the right research mode when:527528- the topic already exists in `docs/research` but needs refresh529- compiled synthesis is contradictory or thin530- raw evidence is missing or stale531- the authority question spans multiple likely corpora532- the surface is authority-sensitive and silence would be dangerous533534Do not skip the research layer and jump from a raw source into law unless the535request is tiny and the evidence is already obvious.536537Do not call research "full" if one likely corpus stayed silent. Silence is a538gap, not agreement.539540## Evidence Ladder541542Use:5435441. explicit reference docs or executable tests5452. compatible but indirect evidence5463. honest gap547548When recording evidence, use:549550- `agree`551- `partial`552- `gap`553- `tension`554- `diverge`555556Never mark behavior `locked` because it feels standard.557558Live source/docs/tests/generated artifacts and behavior-law files outrank559compiled research and previous plans when describing the current state. If they560disagree, record `stale research`, `stale plan`, or `stale audit history` and561update the active plan from live evidence.562563## Node Model First564565Before writing UX law, lock:5665671. node model5682. affinity class when relevant569570Node model classes:571572- `block non-void`573- `block void atom`574- `inline non-void span`575- `inline void atom`576- `leaf mark`577- `text token`578- `overlay / no node`579580Affinity classes:581582- `directional`583- `hard`584- `outward`585- `none / n-a`586587Do not spec hover, click, backlink, toolbar, or popover behavior until the model588is explicit.589590## Permanent-Home Test591592For any new shared contract or cross-surface rule, answer:5935941. What is the best permanent home if designed cleanly today?5952. Which home minimizes repeated feature-local reimplementation?5963. Which home keeps package ownership coherent?5974. Which home gives the best performance characteristics?5985. Which home gives the best DX and API discoverability?5996. Which future consumers would reuse it?600601Candidate homes:602603- `@platejs/core`604- existing shared package605- new shared package606- feature package607- app/render layer only608- docs/test contract only609610If the answer differs from current file placement, the spec should say so.611612## Required Edit Order613614Use this order unless the task is small enough that a subset is obviously615enough. If a file stays unchanged, record why.616617### 1. Standards618619Patch [markdown-standards.md](docs/editor-behavior/markdown-standards.md) when:620621- the winner map changes622- a new authority lane appears623- a family split is needed624- a stronger external reference replaces an older one625- routing guidance changes626627### 2. Readable Law628629Patch [markdown-editing-spec.md](docs/editor-behavior/markdown-editing-spec.md)630to define:631632- family-level behavior633- node model634- affinity635- ownership rules636- locked notes / exceptions637- current vs deferred status638639If behavior includes editor chrome or navigation UI, define it in a way that is640compatible with shadcn composition: popovers, commands, menus, triggers,641truncation, keyboard composition, semantic styling, and no one-off overlay642markup when a standard pattern exists.643644If behavior includes React rendering, subscriptions, overlays, server/client645boundaries, data fetching, or editor runtime projections, define the performance646shape explicitly: what subscribes, what stays static, what work is deferred, and647which Vercel React rule family applies.648649If behavior includes effects, derived state, reset-on-prop behavior,650subscriptions, browser APIs, external stores, or data synchronization, define why651an effect is needed. Prefer render-time calculation, event handlers, keyed652resets, `useMemo`, or `useSyncExternalStore` when they express the behavior.653654### 3. Protocol Rows655656Patch [editor-protocol-matrix.md](docs/editor-behavior/editor-protocol-matrix.md)657to enumerate:658659- concrete scenarios660- authority per row661- spec IDs662- status663664If a surface has different winners by scenario, split the rows. Do not keep one665coarse row that lies.666667### 4. Parity Gate668669Patch [markdown-parity-matrix.md](docs/editor-behavior/markdown-parity-matrix.md)670when:671672- an existing current feature family changed673- the family authority map changed674- gate status changed675- node model / affinity summary changed676- browser/protocol proof changed677678Do not inflate the parity matrix for speculative future product ideas that are679not current Plate features.680681### 5. Roadmap682683Patch [master-roadmap.md](docs/editor-behavior/master-roadmap.md) when:684685- a new implementation lane appears686- deferred implementation work should enter the queue687- order of real remaining implementation lanes changes688- a lane is narrowed, closed, re-cut, or split689690Do not strand implementation debt only in parity wording or a plan doc.691692### 6. Audit693694Patch [markdown-editing-reference-audit.md](docs/editor-behavior/markdown-editing-reference-audit.md)695only when:696697- a new external reference disagreement matters698- the evidence history needs a new entrypoint699- a winner shift needs explicit audit history700701Do not treat the audit as current law.702703## Current Feature Vs Deferred Feature704705For current feature/current surface, update all affected layers:706707- standards708- readable law709- protocol rows710- parity when the gate changed711- roadmap when implementation work remains712- audit when evidence history changed713714For deferred or future surfaces, usually update:715716- standards if a new lane is needed717- readable law if the contract must exist now718- protocol rows as `deferred` or `specified`719720Do not pretend deferred behavior is release-gated current behavior.721722## Applicable Implementation Reviews723724Before scoring above threshold, decide whether each review lens applies. Record725the decision in the active plan even when skipped.726727Use this matrix:728729| Lens | Applies when | Must answer |730| --- | --- | --- |731| `build-web-apps:shadcn` | UI/editor chrome, components, registry components, menus, popovers, command palettes, inputs, forms, overlays, styling, or component composition are in scope | Are existing components used first? Are variants, semantic tokens, `gap-*`, `size-*`, `truncate`, `cn()`, accessible titles, grouped menu/select items, full Card composition, Button loading, and icon `data-icon` rules respected? |732| `vercel-react-best-practices` | React/Next components, rendering, external-store subscriptions, data fetching, server/client boundaries, bundle size, or runtime performance are in scope | Are waterfalls avoided, bundles split sanely, server/client serialization minimized, global listeners deduped, subscriptions derived and narrow, expensive renders deferred, transient values kept in refs, and inline components avoided? |733| `react-useeffect` | `useEffect`, `useState` for derived values, reset-on-prop, state synchronization, subscriptions, browser APIs, external systems, data fetching, or parent notifications are in scope | Is the effect actually synchronizing with an external system? Can the behavior be render calculation, `useMemo`, keyed reset, event handler, framework fetch, or `useSyncExternalStore` instead? |734| `performance-oracle` | Hot paths, algorithms, large collections, memory lifetime, network/database I/O, bundle cost, editor runtime loops, browser event paths, or scalability are in scope | Is complexity bounded? Are allocations, subscriptions, listeners, network calls, and cache lifetimes controlled? What happens at 10x, 100x, and 1000x scale? |735| `tdd` | Behavior additions, bug fixes, public interface changes, regression classes, or executable acceptance criteria are in scope | Is there a red-green-refactor slice through a public interface? Does the test verify behavior rather than implementation details? |736737For each applicable lens, record:738739- applicability: `applied` or `skipped`740- reason741- findings742- plan delta or explicit no-change defense743- proof pointer: plan section, source file, rule family, protocol row, or test744 family745746Do not turn these lenses into generic busywork. If the plan is pure law with no747UI, React, or effect surface, skip them with one sentence and keep moving.748749## High-Risk Deliberate Mode750751Trigger this mode when a proposal changes:752753- public API754- package boundary755- data model756- extension/plugin behavior757- collaboration or operation semantics758- normalization759- selection, focus, IME, or browser-runtime behavior760- release gate or generated regression contract761762When triggered, add to the active plan:763764- pre-mortem: three realistic failure scenarios765- expanded proof plan: unit, browser, parity, stress, migration, and docs/example766 proof as applicable767- blast-radius note: packages, examples, docs, tests, and downstream consumers768- rollback or hard-cut answer: why the plan is still worth doing769770High-risk mode is not a separate workflow. It is one stricter pass inside this771skill.772773## Objection Ledger774775Simulate a skeptical Plate maintainer and serious downstream Plate user.776The goal is to prevent "they changed things for no reason."777778For every major behavior, authority, API, package-boundary, protocol, or parity779change, record:780781- Change: exact behavior/API/spec/test contract being changed.782- Who feels pain: Plate user, plugin author, app author, docs maintainer,783 test maintainer, package owner, design-system owner, or release owner.784- Likely objection: strongest fair complaint in user language.785- Steelman antithesis: the best argument for not making the change.786- Tradeoff tension: what the chosen option makes worse or more expensive.787- Why this is not change for change's sake: concrete payoff.788- Evidence: repo fact, research fact, protocol row, parity row, browser789 regression class, or reference limitation.790- Rejected alternative: closest compatible option and why it is weaker.791- Adoption answer: how a user or maintainer moves from old shape to new shape.792- Docs/example answer: what public explanation or example proves the change.793- Regression proof: unit, browser, protocol, parity, stress, or manual proof row.794- Ecosystem answers, when triggered.795- Verdict: `keep`, `revise`, `drop`, or `unresolved`.796797Ledger rows are mandatory for changes like:798799- new authority lane or winner shift800- family split801- node model or affinity change802- permanent-home decision803- core vs package vs app/render ownership change804- shadcn/editor-chrome behavior contract805- React runtime/rendering/subscription behavior contract806- effect, derived-state, or external-synchronization contract807- protocol/parity gate change808- roadmap order change809- hard cut of old docs/API behavior810- generated browser or stress-test gate811812Rules:813814- No major behavior/paradigm change may score above `0.85` in DX, authority, or815 parity unless it has a ledger row with a convincing answer.816- A ledger row is accepted only when its verdict is `keep` and every required817 field is concrete: evidence, steelman antithesis, tradeoff tension, rejected818 alternative, adoption answer, docs/example answer, regression proof, and819 ecosystem answers when triggered.820- A row is not accepted if a required field is missing, says `TBD`, says only821 "cleaner", or lacks proof that a real user problem is solved.822- If the best answer is only "cleaner", the verdict is `revise` or `drop`.823- `unresolved`, `revise`, or `drop` rows must feed back into the plan before824 completion can be `done`.825- Reuse prior ledger rows when rerunning this skill, but revalidate them against826 the latest plan.827828## Ecosystem Maintainer Pass829830Do not create separate full ledgers by default. Trigger this pass only when the831proposal changes extension, plugin, package, rendering, collaboration,832operation, identity, normalization, snapshot, or data-model behavior.833834For each triggered ledger row, add short answers:835836- Plugin maintainer: can packages expose this without wrapping every core call837 or creating a compatibility junk drawer?838- App author: can app code customize or opt out without bespoke wiring?839- Docs/test maintainer: can docs, examples, protocol rows, and proof gates stay840 coherent?841- Collab/data maintainer, when relevant: do operations, identity, snapshots,842 normalization, remote apply, and conflict behavior stay deterministic?843844For core API/data-model changes, also name:845846- exact affected extension points847- package/plugin migration surface848- data/collab contract affected849- proof required before closure850851The pass catches ecosystem breakage. It does not veto every cleanup.852853## Plan Deltas From Review854855Every review pass must either change the plan or explicitly defend no change.856857Record:858859- added decisions860- revised decisions861- dropped decisions862- strengthened acceptance criteria863- new tests/proof rows864- editor-behavior output file deltas865- unresolved items moved to the next pass866- no-change decisions with evidence867868If pressure passes produce no plan delta and no explicit no-change defense, the869review is a rubber stamp and completion stays `pending`.870871## Pressure Passes872873Before raising the score above threshold, run these passes and record the result874in the plan:875876- Authority pass: prove the winner map and family split are justified.877- Intent/boundary pass: prove intent, outcome, scope, non-goals, and decision878 boundaries are explicit.879- Decision-brief pass: prove principles, drivers, options, rejected880 alternatives, consequences, and follow-ups are recorded.881- Node-model pass: prove model and affinity are locked before UX law.882- Permanent-home pass: prove ownership belongs where the plan says it belongs.883- DX pass: prove the shape is discoverable for Plate users and future agents.884- Unopinionated-core pass: prove core does not absorb product-only opinion.885- Regression pass: prove behavior is caught by protocol/parity/browser/stress886 contracts, not example-by-example patching.887- Research pass: prove compiled research was used as evidence, not decoration.888- shadcn/UI pass: when applicable, prove editor chrome follows composable889 shadcn patterns and record the applied/skipped result.890- Vercel React pass: when applicable, prove React runtime/performance choices891 follow the relevant Vercel rule families and record the applied/skipped result.892- useEffect pass: when applicable, prove effects are external-system893 synchronization, not derived-state or event-handler work in disguise.894- Performance-oracle pass: when applicable, prove hot-path, complexity, memory,895 network, bundle, and scalability claims are bounded or intentionally deferred.896- TDD pass: when applicable, prove behavior changes and regression classes have897 public-interface red-green-refactor acceptance criteria.898- Simplicity pass: remove overbuilt props, aliases, shims, and speculative API899 layers.900- Plate maintainer pass: challenge every major behavior/paradigm change as if901 reviewing a Plate PR; record objections and answers in the ledger.902- Steelman pass: record the best antithesis and real tradeoff tension for each903 major decision.904- High-risk deliberate pass: when triggered, add the pre-mortem and expanded905 proof plan before closure.906- Ecosystem pass: only when triggered, add plugin/app/docs/test/data answers to907 the same ledger row.908909## User Review And Execution Mode910911When the score is below threshold, any required pass remains open, or any912completion gate has a runnable next move:9139141. Update the plan with the current score, evidence, rejected tactics, and next915 owner.9162. Keep the active goal open.9173. Continue the next review/refinement slice.918919When final gates pass, complete the planning goal and stop for user review.920Implementation starts only after a later explicit execution request that invokes921Plate Plan again against the accepted plan. That execution invocation must use a922new execution-shaped goal, read the accepted plan, run the next implementation923owner, record verification, and keep the goal active while any accepted owner924remains runnable.925926## Done Handoff927928When setting completion to `done`, the final chat response must include a929concise but exhaustive bullet list of every accepted plan item and decision so930the user can review without opening the full plan.931932Group bullets by surface when useful:933934- authority / winner map935- intent / decision brief936- node model / affinity937- permanent home / package ownership938- editor-behavior outputs939- protocol / parity / roadmap / audit940- UI/editor chrome and applicable shadcn review941- React runtime/performance and applicable Vercel React review942- effects/external synchronization and applicable react-useeffect review943- hot-path/scalability and applicable performance-oracle review944- behavior/regression proof and applicable tdd review945- high-risk deliberate-mode pre-mortem when triggered946- regression proof947- hard cuts and rejected alternatives948- implementation phases and gates949950Each bullet should include:951952- decision name or surface953- before -> after shape when the plan changes an existing shape, with a source954 pointer for the before955- status: `add`, `keep`, `cut`, `rename`, `revise`, or `gate`956- proof pointer when short enough: evidence row, ledger row, test/proof family,957 spec section, or plan section958959Current-state / before-after rules:960961- Any claim about the current implementation, behavior law, docs state, example,962 protocol row, parity row, or generated artifact must have a live evidence963 pointer or be marked `gap`.964- `before` must be copied from live source, docs, examples, tests, generated965 artifacts, behavior-law rows, or authoritative reference material.966- `after` must be an accepted target shape or `already done`.967- If a previous plan, audit, or compiled research claims an old shape but live968 evidence does not, do not use it in any step; record `stale claim`.969- If a decis970971…(truncated)