ワンクリックで
speckit-implement
Execute all tasks from the task breakdown to build the feature.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
Execute all tasks from the task breakdown to build the feature.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Consumer-facing guide to hosting an interactive FS.Skia.UI app — the keyboard/pointer input surface, the preview-vs-tree render distinction, and the windowed-fullscreen blur caveat.
Build Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, custom wrappers, and generated product examples.
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
Wire a generated FS.Skia.UI product to the desktop viewer host.
Understand and work with the internal keyed VDOM diff over the lowered Control<'msg> IR (feature 067) — its key-first-then-positional matching, the NodePatch/ChildOp operation set, the totality/determinism/identity-at-rest/round-trip invariants, and the module's disposition (internal, property-tested, wired onto the live render path via RetainedRender in feature 091 and current through feature 103 — layout/bounds cache, injected-delta animation clock, visual-state cross-fade). Use when reading the diff invariants, extending the property tests, or working on the wired retained render path.
Maintainer-facing guide to the FS.Skia.UI.Controls.Elmish interactive-host seam — how runInteractiveApp drives the retained render structure each frame (RetainedRender.step over the keyed diff), advances per-identity animation clocks from an injected Tick delta, stamps runtime visual state pre-reconcile, routes keys focus-first through routeFocusedKey, and resolves pointer hits to a stable identity via retainedHitTest. Use when reading or extending the live controls host loop, the per-frame retained-state/clock/visual-state wiring, or the key/pointer routing seam.
| name | speckit-implement |
| description | Execute all tasks from the task breakdown to build the feature. |
| compatibility | Requires spec-kit project structure with .specify/ directory |
| metadata | {"author":"github-spec-kit","source":"preset:fsharp-opinionated"} |
Execute the feature's tasks against the plan. Update tasks.md as you go.
Check for extension hooks (before implement):
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.before_implement key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.before_implement entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs.(extension, command) (first occurrence wins, so a hook declared in both files runs once).optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip it and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the implementation workflow.
.specify/extensions.yml does not exist, skip silentlyUse the status legend from the template exactly:
[ ] — not started.[X] — done with real evidence. The production code paths were
exercised against real dependencies (real DB, filesystem, network) or a
previously-approved synthetic fixture already listed as acceptable in the
Synthetic-Evidence Inventory.[S] — done with synthetic evidence only. Use this whenever the
task's "pass" depends on ANY of:
NotImplementedException, failwith "TODO", raise (), or
equivalent placeholder[S] task whose synthetic nature propagates
(you do not need to detect this manually — the evidence audit
computes [S*] propagation — but BE HONEST about the direct cases).[F] — failed. Implementation attempted and did not pass. Leave the
diagnostics in place; do not quietly retry.[-] — skipped. Requires written rationale either in the task line
or in the Synthetic-Evidence Inventory / Deferral Notes section.Never mark a task [X] if any of the [S] conditions apply. The
evidence audit catches many such cases via diff-scan, but be honest about
direct declarations — dishonesty undermines the whole synthetic-evidence
regime (Principle V).
A [US*] task may only be marked [X] when the user-facing surface was
actually exercised end-to-end. "Exercised" means one of:
readiness/ that drives the new
behavior through its public entry point — not through internal helpers.readiness/.A diff that touches only Domain/, Core/, Models/, or equivalent
internal layers is never sufficient evidence for [X] on a [US*]
task. The story is done when the user can reach it, not when the model
compiles. If wire-up to the UI / CLI / API surface is missing, the honest
status is [ ] (continue working) or [S] (disclose the gap and create a
tracking issue for the real wire-up).
This rule is in addition to the synthetic-evidence checks above: a task can fail the vertical-slice rule without any mocks — domain code that nothing calls is its own failure mode.
For any task whose spec, plan, or task line identifies stateful workflow or I/O, implement through the Elmish/MVU boundary:
Model captures owned workflow state.Msg captures user actions, external responses, and internal transitions.Effect or Cmd<Msg> captures requested I/O.init returns initial state plus startup effects.update is pure: it may inspect Msg and Model, but it MUST NOT touch
filesystem, network, database, process state, wall clock, random source, or
mutable global state.Msg.Before marking an MVU-bearing [US*] task [X], verify all of the following:
init / update paths.Model and emitted effects for representative
messages.[S] and disclose it.Simple pure functions do not need an MVU shell. If a task does not involve stateful workflow or I/O, note that Principle IV is not applicable and use the ordinary spec → FSI → semantic tests → implementation path.
[SEH] is a design/task-generation classification, never an
implementation-time relabeling step. The EvidenceAudit gate rejects late
[SEH] classification, so do not add [SEH] or
synthetic-error-handling-approved during readiness cleanup or after an audit
failure — send any newly-discovered synthetic error-handling need back to the
design phase. [SEH] tasks still complete as [S], and the inventory row keeps
the approval label, design source, synthetic input class, expected error
behavior, and accepted-seh status.
When you emit an [S] task, you MUST also:
// SYNTHETIC: comment at the use
site, naming the reason and (if known) the real-evidence path. Example:
let userRepo = InMemoryUserRepo() // SYNTHETIC: staging DB not provisioned; real repo in US-17
Synthetic. Example:
[<Test>] let ``Signup.createUser_Synthetic_persists in-memory`` () = ...
For whole test files that are synthetic-only, open with a banner:
(* SYNTHETIC FIXTURE: all tests in this file use canned SMTP responses. *)
tasks.md:
Before you author any readiness/evidence file, read the generated
docs/evidence-formats.md (it ships into every generated project). It is the
single source for the exact shape each readiness/evidence artifact must take —
read it first so you author against the contract instead of reverse-engineering
the format from a gate failure.
in_progress in your own head (not in tasks.md — the
file uses the five-state legend only).skillist from tasks.deps.yml.
Existing bare-list task metadata is invalid; stop and require migration or
regeneration before implementation.SKILL.md from
.agents/skills/*/SKILL.md, src/*/skill/SKILL.md, template capability
skill paths, or active generated product skill destinations. Load those
skills in declared order before code changes for the task begin. Record
the loaded paths in skill-loading-evidence.md — read and written from the
feature readiness dir specs/<feature>/readiness/skill-loading-evidence.md
(NOT a repo-root readiness/) — or in a task-specific verification log before
marking the task complete. Write one row per (task, declared-skill) pair;
each record must include task id, skill id, resolved path (the
.agents/skills/<id>/SKILL.md or src/*/skill/SKILL.md home), load result,
loaded_at, work_started_at (with loaded_at strictly before
work_started_at), evidence path, and reviewer exception fields. The
skill-loading contract is enforced only once a task flips to [X], so it
surfaces late — author the rows as you load skills, not retroactively at audit
time. If a declared skill is missing, unreadable,
ambiguous, late-loaded, or missing evidence, block the task and report the task
id plus unresolved skill id.
implementation batch records must preserve the red-green evidence log,
graph before/after paths before and after every status change, and the
skill-loading evidence used for the batch.[X] or [S]. If any dep is [ ], [F], or
[-], stop and raise it.[US*] tasks MUST include a user-reachable exercise
(see the Vertical-slice rule); MVU-bearing tasks MUST include
transition/effect assertions and interpreter evidence. A green unit test
on the domain layer is not enough.[US*] task whose story
delivers an interactive user-facing surface (a host app the user
drives with pointer/keyboard — a GUI, TUI, or windowed app), before you
may write [X]:
run/verify skill discipline. Capture
the artifact (screenshot, interaction log, response) under
readiness/. Tests, governance gates, and bespoke offscreen captures
alone are not sufficient for an interactive story.controlsExampleView → Control.renderTree; cite that only as an
illustration — the rule is "the surface the user actually reaches in
this feature", whatever it is.)[X] on an interactive [US*]: an
interactive story is not done until it was launched, driven, and the
evidence is on the production render path.tasks.md. Before writing [X] on a [US*]
task, confirm the vertical-slice rule is satisfied (and, for an
interactive story, the run-and-use gate above); if not, the
honest status is [ ] or [S]. If [S], add the code-level,
test-level, and inventory disclosures before moving on.speckit.evidence.graph after every status change. This
refreshes readiness/task-graph.json and recomputes [S*]
propagation. It's cheap (milliseconds).private, internal, or public on a top-level F#
binding. Visibility lives in the .fsi signature file..fsi update is part
of the same task — not a follow-up.Before reaching for a "clever" F# feature (custom operators, SRTP, reflection, non-trivial computation expressions, type providers, non- obvious active patterns), confirm it is justified in the spec or plan. If not, either simplify or stop and raise the justification gap.
Stop and ask the user when:
[<Skip>] to pass. Never weaken; surface the failure.tasks.deps.yml points to a task that doesn't exist.
Fix the yml before proceeding.FAKE-backed commands (./fake.sh, fake.cmd, or dotnet fake) share
repository .fake state and are not safe to run concurrently. You may
parallelize safe non-FAKE reads and checks, but run multiple FAKE-backed tests
or targets sequentially:
./fake.sh build -t Dev./fake.sh build -t GeneratedGuidanceCheck./fake.sh build -t TemplateCheck./fake.sh build -t GeneratedProductCheck./fake.sh build -t EvidenceGraph./fake.sh build -t EvidenceAuditIf a FAKE-backed failure looks race-like or concurrent context is unknown, rerun the affected FAKE-backed commands sequentially before product debugging.
Check for extension hooks (after implement): After implementation completes, discover hooks across all extension files (multi-file discovery), not just the central file:
.specify/extensions.yml from the project root (if present) and collect entries under the hooks.after_implement key..specify/extensions/*/*.yml file in sorted order, parse each, and collect its hooks.after_implement entries too — so a hook registered only in a per-extension file (e.g. the feedback extension at .specify/extensions/feedback/feedback.yml) is still discovered and runs on phase completion.(extension, command) (first occurrence wins, so a hook declared in both files runs once).settings.auto_execute_hooks: true in .specify/extensions.yml, a mandatory hook (optional: false) auto-runs with no confirmation; an optional hook (optional: true) is always surfaced ("To execute: /{command}") and is never force-run by auto_execute_hooks; a hook with a non-empty condition is never evaluated by this skill — evaluation is left to the executor and the notice reports the resolved decision. When auto_execute_hooks: false, even mandatory hooks are surfaced for confirmation.(extension, command), emit one consolidated notice for the phase so the operator never hand-reconciles files — a promoted feedback hook (optional: false) appears as auto-run, never as a surfaced optional:
## Effective hooks for implement
- {extension}:{command} — auto-run (mandatory; auto_execute_hooks=true)
- {extension}:{command} — surfaced (optional)
- {extension}:{command} — skipped (enabled: false)
- {extension}:{command} — condition-deferred
optional: true hook that is discovered but not executed this phase, emit one line so the skip is a visible decision: Note: optional hook {extension}:{command} is registered but was not run (skipped).enabled is explicitly false. Treat hooks without an enabled field as enabled.condition expressions:
condition field, or it is null/empty, treat the hook as executablecondition, skip it and leave condition evaluation to the HookExecutor implementationoptional flag:
optional: true):
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
optional: false):
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
.specify/extensions.yml does not exist, skip silently