.agents/skills/slate-plan/SKILL.md
Handle $ARGUMENTS.
Use this for repeated "harsh honest, absolute best Slate v2 architecture/DX" review prompts where the failure mode is death by incremental suggestions.
This is a two-phase lane skill.
Planning mode is the default. It creates or updates the execution-grade plan, scores it, and uses the active goal as the durable lane contract until every required pass, issue/reference sync gate, verification gate, and closure score gate is complete. Score is only one input. A high score never permits goal completion by itself; planning completion means the full pass schedule is closed and the plan is ready for user review.
Execution mode starts only after the user explicitly accepts a ready plan and
invokes slate-plan again for that plan. Execution mode creates or continues a
new goal for the accepted plan's implementation target and then executes the
next plan owner with fresh verification evidence. Do not use the planning goal
as the execution goal. The user-review boundary is real.
.tmp/slate-v2
workspace after a second explicit invocation names the accepted plan.task
or the issue-specific skill instead..tmp/slate-v2 implementation, tests,
examples, package files, build config, and related reference docs only when
the latest user message explicitly accepts the ready plan or asks this skill
to execute that named plan.slate_plan_lane_status: pending, final_handoff_status: pending, a non-none
next_pass, or a runnable next_action, the goal must remain active.blocked when another research, review, or plan-hardening move is
runnable, unless the user explicitly stops execution or tells you to mark the
lane blocked.isAtStartOfX, getActiveX, or applyX just to make a plan
look tidy. Extract a helper only when the same logic is reused, the inline
block is genuinely distracting, or the helper is the proposed public/internal
API being reviewed.editor.api / editor.tf compatibility, or current slate-yjs integration
fixtures from raw Slate.state / tx extension namespaces,
schema/spec policy, deterministic operations/snapshots/commits, commit
metadata, and local-only target semantics.plate-2 commands prove only
planning, ledgers, and completion-state artifacts. Any Slate v2 source,
runtime, browser, package, public API, or issue-fix claim must be verified
from the live .tmp/slate-v2 workspace with the relevant .tmp/slate-v2 command.bun run test, typecheck, lint, Playwright, or package filters
run in plate-2 as Slate v2 verification. They may be recorded only as
plan-artifact checks..tmp/slate-v2, Slate Plan closure must require the
applicable .tmp/slate-v2 verification command set.
A failing relevant .tmp/slate-v2 command keeps the plan or execution review
pending unless the failure is proven unrelated with a cited command,
failing scope, and owner.Plan file under docs/plans/.
Create the plan from the Slate Plan goal template:
node .agents/rules/autogoal/scripts/create-goal-scratchpad.mjs \
--template slate-plan \
--title "<short Slate Plan title>"
The reusable project template is docs/plans/templates/slate-plan.md.
Runtime plans still go directly under docs/plans/; do not use docs/goals.
After creating the static plan, edit the generated file and fill the lane
objective, pass schedule details, closure threshold, verification surface,
constraints, boundaries, and blocked condition there.
Active goal for planning mode: one Slate Plan planning lane uses one
create_goal objective. The goal content must name the desired closed plan
state, the full pass schedule, the one-pass-per-activation policy, required
proof gates, user-review-ready closeout, and blocked condition. Do not split
the planning lane into multiple goals.
Active goal for execution mode: after explicit user acceptance, start a new
goal for the accepted plan path and implementation target. It must name the
exact plan, execution queue, .tmp/slate-v2 verification gates,
issue/reference sync, loading .agents/skills/autoreview/SKILL.md when
implementation changes are non-trivial and uncommitted, and closeout
conditions. For dirty local work, the autoreview skill's target is
--mode local; do not use --uncommitted.
Research updates under docs/research/ when the evidence lane is stale or
incomplete.
Issue-ledger accounting in the active plan: fixed issue claims, related issue
classifications, cluster coverage, and explicit non-claim decisions grounded
in docs/slate-issues.
ClawSweeper related-issue pass in the active plan whenever the plan changes Slate v2 public API, runtime behavior, browser behavior, examples, issue claims, or PR narrative. Run it once per related surface, not after every v2 edit. Re-run only when the touched issue surface changes materially.
Issue discovery is ledger/cache-first. Reuse existing ClawSweeper output in
docs/slate-v2/ledgers/fork-issue-dossier.md,
docs/slate-v2/ledgers/issue-coverage-matrix.md,
docs/slate-issues/gitcrawl-v2-sync-ledger.md, and generated live rows
before any live GitHub read. Do not run broad gh issue list,
gh search issues, or unscoped live GitHub discovery from Slate Plan just
to refresh known corpus counts or already-classified surfaces.
Live issue corpus input:
docs/slate-issues/gitcrawl-live-open-ledger.md is generated live gitcrawl
data only. Read it for current open rows and gitcrawl cluster IDs; do not add
manual classifications there.
Current manual issue sync updates in
docs/slate-issues/gitcrawl-v2-sync-ledger.md: update current issue
classifications whenever a plan or implementation slice claims, improves,
reviews, or intentionally excludes an issue or cluster. If the file does not
exist yet, create it before recording current live sync state.
Frozen corpus context in docs/slate-issues/open-issues-ledger.md: use it as
the 682-issue historical classification seed, not as current live sync
truth.
Fork issue dossier updates in
docs/slate-v2/ledgers/fork-issue-dossier.md: append one self-contained
section per reviewed related issue, using ClawSweeper's Fork Issue Dossier
Mode. This replaces upstream GitHub issue comments for the fork.
Issue coverage ledger updates in
docs/slate-v2/ledgers/issue-coverage-matrix.md: every fixed issue must
appear as Fixes #....: <description>, and every related but not-fixed issue
must be categorized in the related issue matrix.
PR reference sync in docs/slate-v2/references/pr-description.md: keep exact
fixed issue claims and counts, accepted current API shape, proof references,
not-claimed release gates, and a link to the full issue coverage ledger.
Slate maintainer objection ledger in the active plan, with ecosystem answers
when triggered. 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.
Ecosystem strategy synthesis in the active plan whenever Lexical, ProseMirror, Tiptap, React, Plate, slate-yjs, or another reference system is used as evidence. This is not a citations list; it must state the mechanism Slate should steal, reject, or deliberately diverge from.
Applicable implementation-skill review notes in the active plan: Vercel
React, performance-oracle, and tdd, plus shadcn/react-useeffect when relevant,
each marked applied or skipped with a concrete reason.
Allowed edit scope in planning mode: docs/plans/**, docs/research/**,
docs/slate-issues/**, docs/slate-v2/ledgers/**, and
docs/slate-v2/references/**.
Allowed edit scope in execution mode: the accepted plan's named .tmp/slate-v2
implementation, test, example, package, build, config, and reference-doc
owners, plus the active plan ledger.
Before creating or resuming a Slate Plan:
get_goal first. If no matching goal exists, call create_goal once for
the whole Slate Plan lane.create_goal when get_goal returns any active goal. Repeated
goal creation fails in a thread. Continue under a matching goal, or resolve a
mismatched active goal before creating a new one.--template slate-plan so the goal plan starts
with Slate Plan's required plan-shape sections, pass table, scorecard,
issue accounting, workspace gate, objection ledger, and final handoff rows.Good goal:
Slate Plan closes the callback-memoization API plan for user review:
complete the scheduled passes one activation at a time, record evidence-backed
score deltas, issue/reference sync, objection handling, verification gates, and
the final user-review handoff; keep the goal active until closure/final gates
prove no planning pass remains runnable.
Good execution goal:
Slate Plan executes docs/plans/<accepted-plan>.md against `.tmp/slate-v2`,
complete only when every accepted execution queue row is implemented or
explicitly deferred with evidence, focused and broad `.tmp/slate-v2` gates pass
or have recorded owners, issue/reference sync is current, the autoreview skill
has been loaded and its dirty-local target has no accepted/actionable findings
for non-trivial uncommitted implementation changes or is marked N/A for
planning-only work, and the plan's final execution closeout rows are closed.
Bad goal:
Run Slate Plan passes 1 through 12.
Default plan path:
docs/plans/YYYY-MM-DD-slate-v2-absolute-architecture-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.
docs/plans/ if present.docs/research/README.md, docs/research/index.md, and
docs/research/log.md.docs/slate-issues/gitcrawl-live-open-ledger.md,
docs/slate-issues/gitcrawl-v2-sync-ledger.md when it exists,
docs/slate-issues/open-issues-ledger.md,
docs/slate-issues/gitcrawl-clusters.md,
docs/slate-issues/issue-clusters.md,
docs/slate-issues/test-candidate-map/,
docs/slate-issues/benchmark-candidate-map.md,
docs/slate-issues/package-impact-matrix.md, and
docs/slate-issues/requirements-from-issues.md.docs/slate-v2/ledgers/issue-coverage-matrix.md,
docs/slate-v2/ledgers/fork-issue-dossier.md, and
docs/slate-v2/references/pr-description.md..tmp/slate-v2 API surfaces touched by the review.Read when relevant:
Use research-wiki when the compiled layer is stale, contradictory, or missing
coverage for the current question. For framework evidence, inspect local
official clones under .. or normalized ../raw before external docs.
If the review depends on current .tmp/slate-v2 behavior, cite live source files
or tests. If it depends on React 19.2, Lexical, ProseMirror, Tiptap, or Slate
legacy behavior, cite the compiled research page or local source read used for
that claim.
Current Slate v2 source wins over every plan, research note, legacy Slate memory, and previously generated handoff.
Before any pass, score, ledger row, migration answer, docs/example answer, proof row, implementation phase, final handoff, or user-facing explanation that relies on what currently exists:
.tmp/slate-v2 source, example, test, or generated contract
that owns the shape.already done in live source and move the decision to docs/tests/cleanup
only.decision: ..., target shape: ...,
or gap: ... instead of inventing a current state.Stale docs and closed plans are not current API evidence. They can explain why
a decision exists, but they cannot prove what .tmp/slate-v2 exposes today.
For render/API examples, grep the exact symbols first. Examples:
rg -n "RenderVoidProps|renderVoid|renderElement" .tmp/slate-v2/packages/slate-react .tmp/slate-v2/siterg -n "EditorExtension|commands\\?|setup\\(|extend\\(" .tmp/slate-v2/packages/slate/srcrg -n "useElementSelected|useNodeSelector|useEditorState" .tmp/slate-v2/packages/slate-react/srcDo not translate from old Slate by memory. If the current code says void
renderers already receive content-only props, do not describe a migration from
attributes / children void renderers. If the current code exposes
commands?: EditorExtensionCommand[], do not describe a fake command-object
map.
This applies to every related step, not only final before/after summaries. A maintainer objection, proof matrix row, migration answer, docs answer, implementation phase, or final chat answer can be wrong in the same way if it uses a stale "before". Re-ground those steps before writing them.
Slate v2 verification runs in .tmp/slate-v2, not in this planning repo.
Rules:
.tmp/slate-v2 behavior, run the relevant command .tmp/slate-v2 dir..tmp/slate-v2 gate for the touched surface. If bun run test is
the project-level release gate and it fails, closure stays pending until
the failure is fixed, isolated as unrelated, or explicitly moved to a
recorded owner..tmp/slate-v2 gate before calling the implementation
release-ready..tmp/slate-v2 gate, record verification gap: <command> and keep status
pending or blocked according to whether more autonomous work remains.Common command ownership examples:
bun --filter slate ... test/typecheck
from .tmp/slate-v2, then the broader .tmp/slate-v2 gate named by the package.slate-react tests and matching
Playwright rows from .tmp/slate-v2; do not use plate-2 tests as proof..tmp/slate-v2..tmp/slate-v2 and keep issue
claims conservative until it passes.plate-2: run the relevant source sync
and targeted text checks; no Slate v2 test claim may be made from that alone.The active goal is the durable lane state. The plan is the durable evidence state.
At activation:
get_goal.create_goal with the lane objective, full
pass schedule, one-pass-per-activation rule, verification constraints, and
closure condition.Allowed current_pass_status values:
pendingin_progresscompletereviseblockedskippedSingle-pass completion is invalid by default:
next_pass is nonefull, all passes,
continue until done, or give me the Done Handoff do not permit completing
the goal in the same activation that created, rewrote, or rescoped the planBefore calling update_goal(status: complete), prove in the plan:
complete or intentionally skipped with a
concrete reason and evidencepending, in_progress, revise, or blocked with a
runnable next movecurrent_pass is the closure/final-gates passcurrent_pass_status is completenext_pass is nonenext_action is noneslate_plan_lane_status, if present, is complete, done, or closedfinal_handoff_status, if present, is complete, done, or closedfinal_handoff_status is completeIf any assertion fails, keep the goal active and name the earliest runnable
next_pass.
Score every review pass from 0.00 to 1.00.
Weights:
| Dimension | Weight |
|---|---|
| React 19.2 runtime performance | 0.20 |
| Slate-close unopinionated DX | 0.20 |
| Plate and slate-yjs migration-backbone shape | 0.15 |
| Regression-proof testing strategy | 0.20 |
| Research evidence completeness | 0.15 |
| shadcn-style composability and hook/component minimalism | 0.10 |
Score evidence rules:
0.80.0.85 without current citations for the
external systems or local repos the review relies on.0.80 without named replayable
browser/unit/stress contracts.0.85 if applicable plugin or
collab substrate answers are missing. Do not lower the score because raw
Slate lacks current-version Plate/slate-yjs adapters; that is not the target.0.85.0.85.0.85
unless the invalidated alternatives are named and fairly rejected.Completion threshold:
All rows are conjunctive. Passing score is necessary but never sufficient.
>= 0.920.85pendingdocs-only typo, pure internal refactor with no issue-facing behavior, or already covered by completed pass <name/date>docs/slate-issues/gitcrawl-live-open-ledger.md, and touched
issue classifications are updated in
docs/slate-issues/gitcrawl-v2-sync-ledger.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-v2/references/pr-description.md updated when the plan changes
issue claims, accepted API shape, proof status, release gates, examples, or
maintainer-facing narrativeunresolved, revise, or drop without a
corresponding plan response.tmp/slate-v2 command and
result, and no relevant failing .tmp/slate-v2 command is left without a fix,
unrelated-failure proof, or explicit owner.agents/skills/autoreview/SKILL.md and follow
its dirty-local target selection until no accepted/actionable findings remain,
or the plan records why the lane is planning-only or otherwise has no local
implementation patch to reviewIf any gate fails, status stays pending.
The plan must include:
agree, partial, tension, diverge, or gap verdict.Fixes #....: <description> wording;Fast driver gates must include the cwd. For any gate that proves Slate v2
behavior, the cwd is .tmp/slate-v2. For planning-only gates, the cwd is
plate-2.
The docs/plans/templates/slate-plan.md template should seed these as
concrete headings, tables, and placeholders. Fill the generated plan sections;
do not leave the required shape implicit in this rule.
Run the review as passes, not one giant essay:
Before starting any pass, set or verify the lane goal. The goal should contain the full pass schedule and say that each activation completes the next incomplete pass only. Do not create separate per-pass goals.
docs/slate-v2/ledgers/fork-issue-dossier.md only when the pass changes
issue classifications or claim text. Do not rerun ClawSweeper on later v2
edits unless the issue-facing surface changes.docs/slate-issues ledger, cluster map,
test candidate map, benchmark candidate map, package impact matrix, and
requirements file for issues the plan can fix, partially cover, or must
classify as related/non-fix. Reuse the ClawSweeper pass output instead of
re-triaging the same issues.docs/slate-issues/gitcrawl-live-open-ledger.md; write current manual
classifications to docs/slate-issues/gitcrawl-v2-sync-ledger.md; then
update
docs/slate-issues/gitcrawl-clusters.md,
docs/slate-v2/ledgers/fork-issue-dossier.md,
docs/slate-v2/ledgers/issue-coverage-matrix.md, and
docs/slate-v2/references/pr-description.md for every fixed, improved,
related, and non-fix classification produced by the plan.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 was already complete or intentionally skipped with evidence
before this activation began. Rows completed in the same assistant turn are
current-pass work, not prior closure eligibility.
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:
pending, in_progress, or completeDo not mark multiple major passes complete in one activation. Finish the current pass, record the next pass, keep the goal active, and let the next activation run the next pass.
If the user explicitly asks for the Done Handoff before the closure pass is
eligible, do not invent one. Record the current pass result, write a pending
handoff that names the next pass, and leave the goal active.
Before treating a plan as ready, record:
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:
Do not score ready while non-goals or decision boundaries are vague.
For every major public API, runtime, render contract, hook, event, migration, operation, data-model, or browser-proof decision, record:
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.
The goal of Slate v2 is to resolve or materially improve the most relevant
issues from the full docs/slate-issues ledger. Every Slate Plan must prove
how the proposed change relates to that ledger.
Run ClawSweeper as the related-issue discovery owner for this pass when the plan touches issue-facing Slate v2 behavior. This is a bounded pass, not a tax on every implementation edit. Its job is to find and classify the related issue set once, append fork-local issue sections, and define the issue accounting that later implementation slices reuse.
Ledger/cache discipline:
docs/slate-issues/gitcrawl-live-open-ledger.md,
docs/slate-issues/gitcrawl-v2-sync-ledger.md,
docs/slate-v2/ledgers/fork-issue-dossier.md,
docs/slate-v2/ledgers/issue-coverage-matrix.md, and
docs/slate-v2/references/pr-description.md.already covered by completed pass <name/date> instead of rediscovering the same issues.gh issue list, gh search issues, or unscoped live GitHub
discovery in Slate Plan. Broad corpus state belongs to generated gitcrawl
ledgers and ClawSweeper refreshes.Skip ClawSweeper only when the plan is provably unrelated to issue-facing behavior, for example a typo, local wording cleanup, generated skill sync, or a pure internal refactor with no public API/runtime/browser/example claim. Record the skip reason in the active plan.
Read these files before scoring the plan ready:
docs/slate-issues/gitcrawl-live-open-ledger.mddocs/slate-issues/gitcrawl-v2-sync-ledger.md when it existsdocs/slate-issues/open-issues-ledger.mddocs/slate-issues/gitcrawl-clusters.mddocs/slate-issues/issue-clusters.mddocs/slate-issues/test-candidate-map/docs/slate-issues/benchmark-candidate-map.mddocs/slate-issues/package-impact-matrix.mddocs/slate-issues/requirements-from-issues.mddocs/slate-v2/ledgers/issue-coverage-matrix.mddocs/slate-v2/ledgers/fork-issue-dossier.mddocs/slate-issues/open-issues-dossiers/ when a
candidate issue needs exact thread contextFor each plan, record:
applied or skipped, trigger, related issue search
terms/clusters, reviewed issue refs, and dossier sections written;Fixes #....: <description>;docs/slate-issues/gitcrawl-live-open-ledger.md, and which manual sync rows
changed in docs/slate-issues/gitcrawl-v2-sync-ledger.md;docs/slate-v2/ledgers/fork-issue-dossier.md;Classification rules:
Fixes #.... only when the current implementation and proof would justify
GitHub auto-closing the issue.Improves #.... only when the user-visible behavior is materially better
but some stated issue requirement remains out of scope.Related #.... when the issue shares the same cluster but this plan does
not prove the exact reproduction.Not claimed #.... when the issue looked tempting by keyword but the
plan does not address it.The active plan must include an issue matrix with at least:
| Issue | Cluster | Claim | Why | Proof route | V2 sync ledger | PR line |
|---|
V2 sync ledger is the exact status change for the issue row in
docs/slate-issues/gitcrawl-v2-sync-ledger.md, using
docs/slate-issues/gitcrawl-live-open-ledger.md as generated live input.
PR line is the exact line to add to
docs/slate-v2/ledgers/issue-coverage-matrix.md, or related matrix only when
the issue must not be auto-closed. The PR description receives exact fixed issue
lines, count summaries, and any current API/proof/release-gate rows touched by
the plan.
The fork issue dossier receives the long form. Do not duplicate the full issue section in the PR description.
Read docs/slate-issues/gitcrawl-live-open-ledger.md first whenever a plan or
implementation slice touches a current issue or cluster. Then update
docs/slate-issues/gitcrawl-v2-sync-ledger.md for current manual sync state and
docs/slate-v2/ledgers/issue-coverage-matrix.md for PR-slice claims. Update
docs/slate-v2/references/pr-description.md whenever the slice changes exact
fixed issue claims, accepted public API shape, proof references, release gates,
examples, or maintainer-facing PR narrative.
This accounting is a durable-ledger read/update pass. Do not use broad live GitHub commands to rebuild what the generated live ledger, manual sync ledger, coverage matrix, and fork dossier already record. Live GitHub belongs only to narrow issue-ref verification when the claim would otherwise be stale or unsafe.
Rules:
docs/slate-issues/gitcrawl-live-open-ledger.md; manual v2 sync status lives
in docs/slate-issues/gitcrawl-v2-sync-ledger.md.
Every touched current issue row must move from not-started to the right v2
sync status in the manual sync ledger.Fixes #....: <description>.Improves,
not in the fixed issue list unless the issue's original repro is fully
satisfied.Related.Not claimed.pr-description updated: <sections> or
pr-description unchanged: <reason>. Missing this record keeps completion
pending.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 |
|---|---|---|
vercel-react-best-practices | React rendering, external-store subscriptions, event listeners, bundle shape, browser runtime, or React 19.2 performance are in scope | Are subscriptions narrow, global listeners deduped, transient values kept out of render, expensive work deferred, and React used as projection rather than engine? |
performance-oracle | Hot paths, algorithms, large documents, memory lifetime, browser/editor runtime loops, operation replay, or scalability are in scope | Is complexity bounded? Are allocations, dirty-id sets, DOM repair, selection import/export, and replay paths controlled at 10x, 100x, and 1000x scale? |
performance | Large repeated editor surfaces, interaction latency, production perf claims, virtualization/shell/staging choices, p95/p99 risk, or memory/DOM/component-count pressure are in scope | Are cohorts segmented, repeated-unit budgets named, interaction-level INP/p95/p99 rows tracked, memory tags defined, degradation contracts explicit, and Datadog/RUM dashboard gaps recorded? |
tdd | Behavior changes, bug fixes, public interface changes, regression classes, or executable acceptance criteria are in scope | Is there a public-interface red-green-refactor slice or generated browser contract that proves behavior rather than implementation details? |
build-web-apps:shadcn | UI/editor chrome, examples, menus, popovers, command palettes, inputs, forms, overlays, styling, or component composition are in scope | Are UI surfaces composable, minimal-prop, accessible, and not product-opinion leakage into Slate core? |
react-useeffect | Effects, derived state, reset-on-prop, subscriptions, browser APIs, external systems, or parent notifications are in scope | Is the effect external synchronization? Can it be render calculation, event handler, keyed reset, useMemo, or useSyncExternalStore instead? |
For each applicable lens, record:
applied or skippedDo not turn these lenses into generic busywork. If the plan is pure API law with no UI, React, effect, or performance-sensitive surface, skip the irrelevant lenses with one sentence and keep moving.
Use the research layer before inventing new architecture or API law.
Use research-wiki when:
Do not skip research and jump from intuition into plan law unless the request is tiny and the evidence is already explicit in live source or tests.
Do not call research "full" if one likely corpus stayed silent. Silence is a gap, not agreement.
External editor research must end in a Slate decision, not a bibliography.
When Lexical, ProseMirror, Tiptap, React, Plate, slate-yjs, or another reference
system is relevant, record this table in the active plan before scoring the
research dimension above 0.85:
| System | Source | Mechanism | Avoids | Steal | Reject | Slate target | Verdict |
|---|
Rules:
Source must be a local source file, test, official doc, or compiled research
page. A system name alone is not evidence.Mechanism must describe how the system works, not what it calls the API.Avoids must name the failure mode the mechanism prevents.Steal must be a concrete Slate mechanism or proof tactic.Reject must name the part that does not fit Slate's model.Slate target must become a plan decision, target shape, proof row, or hard
cut. If no target follows, the research pass failed.Verdict is one of agree, partial, tension, diverge, or gap.For normalization, paste, large insert, operation replay, or hot runtime paths, this gate must explicitly compare:
Default conclusion to challenge, not blindly accept:
Slate v2 should use Lexical-style dirty runtime buckets for normal editing and
ProseMirror-style bulk replace/fitting for large paste or fragment insert, with
Tiptap-style extension hooks for app paste rules.
If the plan rejects that hybrid, it must explain why the current Slate v2 source or benchmark evidence makes another architecture better. "Keep researching" is not a sufficient answer when local source evidence is available.
Use:
When recording evidence, use:
agreepartialgaptensiondivergeNever mark an architecture or API decision locked because it feels standard.
Live source/test evidence outranks compiled research when describing the current
state. If source and research disagree, record stale research and update the
plan from source.
Trigger this mode when a proposal changes:
When triggered, add to the active plan:
High-risk mode is not a separate workflow. It is one stricter pass inside this skill.
Simulate a skeptical Slate maintainer and a serious downstream Slate user reviewing the plan. The goal is to prevent "they changed things for no reason."
For every major breaking or paradigm change, record:
keep, revise, drop, or unresolved.Ledger rows are mandatory for changes like:
editor.* mutation surfaces with scoped state/tx accesseditor.state, editor.tx, or equivalent namespacesactionschildren/spacer responsibility from app void renderersonChange/commit callback naming and semanticsonKeyDown command contract and removal or renaming of onKeyCommanduseSlateStaticisInline, isVoid, markableVoid,
and selectable checksRules:
0.85 in DX or migration unless
it has a ledger row with a convincing answer.keep and every required
field is concrete: evidence, steelman antithesis, tradeoff tension, rejected
alternative, migration answer, docs/example answer, regression proof, and
ecosystem answers when triggered.TBD, says only
"cleaner architecture", or lacks proof that a real user problem is solved.revise or
drop.revise or unresolved.unresolved, revise, or drop rows must feed back into the plan before
completion can be done.Do not create separate full ledgers by default. Trigger this pass only when the proposal changes extension, plugin, collaboration, operation, identity, normalization, snapshot, or data-model behavior.
For each triggered ledger row, add two short answers:
For core API/data-model changes, also name:
The pass exists to catch ecosystem breakage, not to veto every core cleanup. If the change is raw-Slate-only, say why this pass does not apply and move on.
Every review pass must either change the plan or explicitly defend no change.
Record:
.tmp/slate-v2 focused or broad
gate used to support a claimIf pressure passes produce no plan delta and no explicit no-change defense, the
review is a rubber stamp and completion stays pending.
Before raising the score above threshold, run these passes and record the result in the plan:
docs/slate-issues for fixed, improved, related, and
not-claimed issues; update the plan's issue matrix, issue coverage ledger,
open issue ledger, and PR reference. Do not score regression-proof testing
above 0.85 if the plan has no issue mapping for a behavior change.vercel-react-best-practices for React/runtime projection
decisions and performance-oracle for hot-path, algorithmic, memory, browser
runtime, or scalability claims when applicable. Use
performance when the plan needs cohort segmentation,
repeated-unit budgets, interaction-level INP/p95/p99 rows, memory tagging,
degradation contracts, or Datadog/RUM dashboard proof.tdd expectations for behavior slices that
should be introduced or fixed test-first..tmp/slate-v2, not plate-2. If a relevant .tmp/slate-v2
command fails, keep status pending and record the failing command, scope,
and next owner.When the planning score is below threshold, any required planning pass remains open, or any planning completion gate has a runnable next move:
When the planning lane reaches the final gates, close the planning goal and stop
for user review. The final planning response must tell the user to review the
plan and invoke slate-plan again with the accepted plan path to start
execution.
Do not execute Slate v2 changes in the same activation that creates, rewrites, or closes the planning pass. Execution mode is a separate activation after user acceptance. On that second invocation:
get_goal; create or continue an execution-shaped goal, not the old
planning goal..agents/skills/autoreview/SKILL.md and follow its dirty-local target
selection. Verify any accepted/actionable findings against source, fix valid
findings, rerun focused proof, and rerun autoreview until clean.This is a mandatory closeout gate, not an optional summary. If the final answer
would omit this handoff, keep completion pending.
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:
Each bullet should use concise grammar and include:
add, keep, cut, rename, revise, or gateFixes #...., Improves #....,
Related #...., or Not claimed #....Current-state / before-after rules:
gap.before must be copied from live source/tests/docs in the current checkout.after must be either an accepted target shape or already done.stale claim.decision: ...
or target shape: ... instead of inventing one.Do not list only highlights. If the plan accepts twenty decisions, the handoff lists twenty bullets. Keep each bullet short; group them instead of omitting items.
Before calling update_goal(status: complete), update the plan with:
final_handoff_status: complete
final_handoff: emitted in final chat response
When the plan is still pending, say what score remains and what the next owner is.
When planning reaches done, use this shape:
Slate Plan is ready for user review: [docs/plans/...](docs/plans/...)
Decisions:
- Public API: ...
- React/runtime: ...
- Hooks/render: ...
- Events/callbacks: ...
- Tests/proof: ...
Those bullets are examples of grouping, not a five-item limit. Do not paste the whole plan into chat. Do paste the exhaustive decision bullets.
After the bullets, add:
Review the plan. To execute it, invoke `slate-plan` again with the accepted
plan path.
When execution reaches done, say what was implemented, what proof ran, what
issue/reference sync changed, and whether autoreview is clean.