원클릭으로
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