speckit-tasks
Break down implementation plans into actionable task lists.
- License 许可
- MIT
- 最近更新
- 2026-06-16
- Stars
- ★ 2
- Forks
- 0
01 前言 Front Matter
- name
- speckit-tasks
- metadata
- { "author": "github-spec-kit", "source": "preset:fsharp-opinionated" }
- description
- Break down implementation plans into actionable task lists.
- compatibility
- Requires spec-kit project structure with .specify/ directory
03 SKILL.md 正文
Speckit Tasks Skill
/speckit.tasks
Pre-Execution Checks
Check for extension hooks (before tasks):
- Discover hooks across all extension files (multi-file discovery), not just the central file:
- Read
.specify/extensions.ymlfrom the project root (if present) and collect entries under thehooks.before_taskskey. - Then enumerate every
.specify/extensions/*/*.ymlfile in sorted order, parse each, and collect itshooks.before_tasksentries too — so a hook registered only in a per-extension file (e.g. thefeedbackextension at.specify/extensions/feedback/feedback.yml) is still discovered and runs. - Merge all collected entries and dedupe by
(extension, command)(first occurrence wins, so a hook declared in both files runs once). - If a file is absent or its YAML cannot be parsed/is invalid, skip that file silently and continue.
- Read
- For every
optional: truehook 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). - Filter out hooks where
enabledis explicitlyfalse. Treat hooks without anenabledfield as enabled. - For each remaining hook, do not interpret or evaluate hook
conditionexpressions:- If the hook has no
conditionfield, or it is null/empty, treat the hook as executable - If the hook defines a non-empty
condition, skip it and leave condition evaluation to the HookExecutor implementation
- If the hook has no
- For each executable hook, output the following based on its
optionalflag:- Optional hook (
optional: true):## Extension Hooks **Optional Pre-Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` - Mandatory hook (
optional: false):## Extension Hooks **Automatic Pre-Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command} Wait for the result of the hook command before proceeding to task generation.
- Optional hook (
- If no hooks are registered or
.specify/extensions.ymldoes not exist, skip silently
Generate the feature's task breakdown from its spec and plan. This preset
requires TWO files, both in specs/[FEATURE_ID]/:
-
tasks.md— the human checklist. Status legend:[ ]pending /[X]done (real evidence) /[S]synthetic-only /[F]failed /[-]skipped.- Never write
[S*]yourself. That marker is computed by the evidence audit from the DAG; writing it by hand will confuse the script. [SEH]is an annotation, not a completion status. Use it only for design-approved synthetic error-handling tasks that will remain[S]when completed with malformed-input or explicit error-path synthetic evidence.
-
tasks.deps.yml— the dependency topology and task skill metadata. Sibling totasks.md. It MUST begin with aschema_versionscalar and a top-leveltasks:mapping (the wrapper). Every Tnnn id intasks.mdMUST appear as a key undertasks:withdepsandskillistfields, and MAY carry an optionalowns:field.skillistis an ordered list of applicable capability skill identifiers, or[]when no capability skill applies.schema_version: "1.0" tasks: T001: deps: [] skillist: [] owns: [] # owns nothing — most tasks T002: deps: [T001] skillist: ["fs-skia-layout-readability"] owns: [] T033: deps: [T032] skillist: ["speckit-evidence-audit"] owns: ["evidence-audit"] # this task owns the audit evidenceThe single structural fact that gates validation is the
tasks:wrapper. If you write bareTnnn:keys at the top level (no wrapper), validation stops with one directive error naming the missingtasks:mapping — fix that first.
Start from the preset's templates at the exact paths
.specify/presets/fsharp-opinionated/templates/tasks-template.md and
.specify/presets/fsharp-opinionated/templates/tasks-deps-template.yml,
replacing the example task bodies with real work items from the spec and plan.
Do not start from the generic .specify/templates/tasks-template.md — that
copy is the non-preset Spec Kit fallback and points back here; for a
fsharp-opinionated project the preset copy above is authoritative.
Discipline
-
Lockstep emission. You MUST write both files in the same turn. Never emit
tasks.mdwithouttasks.deps.yml, and vice versa. If you only have partial information, write placeholder object metadata (deps: [],skillist: []) and note which ones need review in your summary. -
Compulsory skill evaluation. Immediately after drafting tasks, evaluate every task against available capability skills:
.agents/skills/*/SKILL.md,src/*/skill/SKILL.md, template capability skill paths, and active generated product skill destinations when applicable. Choose the minimal ordered set that would materially help implementation. Capability skills are preferred over generic guidance when both match. -
What the assessment actually checks (be honest). The validator does not re-derive skills from your task titles. It trusts each declared
skillistas-written, and only adds a structured requirement where a task declares gated evidence via itsowns:field: eachowns:value implies a required skill that MUST appear in that task'sskillist. Everything else is reported as trusted-as-declared. Task titles are fully free-form and are never scanned for capability phrases. -
Visible skill mirror. Every task line in
tasks.mdMUST mirror the structuredskillistvalue as[skillist: ...]. Use[skillist: []]for an empty list. Non-empty mirrors preserve the exact structured order, for example[skillist: speckit-tasks, speckit-evidence-graph]. -
Task graph pitfall guidance. Task titles are free-form — write them in plain language.
tasks.deps.ymlMUST use one key per task id under the top-leveltasks:wrapper; the required object shape is one entry per task id with indenteddeps,skillist, and optionalownsfields. Inline maps such asT001: { deps: [], skillist: [] }, duplicate keys, bare task lists (notasks:wrapper), malformed indentation, dangling dependency ids, and mismatched visibleskillistmirrors are invalid. -
Structured evidence ownership (
owns:). Whether a task owns gated graph/audit (or other) evidence is declared only by itsowns:field, never inferred from the title. The closed vocabulary and the skill each value implies:owns:valueTask owns… Required skill in skillistgraph-validationtask-graph / readiness validation speckit-evidence-graphevidence-auditsynthetic-propagation / diff-scan speckit-evidence-audittask-generation/speckit.taskstask-generationspeckit-tasksimplementation-loading/speckit.implementskill-loadingspeckit-implementconstitutionconstitution authoring speckit-constitutionMost tasks own nothing — omit
owns:or useowns: []. When a task declares anowns:value, itsskillistMUST include the implied skill or validation fails with a directive error; an unknownowns:value is also a directive error naming the allowed set. -
Migration (from the removed title-trigger matcher). Earlier task files relied on a title-trigger matcher that scanned titles for capability phrases; that matcher is removed. Re-express any ownership by adding
owns: [<value>]to the owning task, and drop any awkward title rewording (or theComplete readiness notesprefix) that only existed to satisfy or dodge the old matcher. Notasks.mdtitle change is required for correctness anymore. -
Declared skill ids resolve from skill names. The authoritative registry is
.agents/skills/*/SKILL.md,src/*/skill/SKILL.md, andtemplate/fragments/*/skill/SKILL.md. Declare each skill file'sname:value inskillist; do not assume the directory name is accepted when it differs. -
Advisory FS.Skia.UI capability hints. These hints are non-blocking, and every id resolves to a skill a generated consumer registers: rendering/scene ->
fs-skia-scene; viewer/window host ->fs-skia-skiaviewer; Elmish workflow ->fs-skia-elmish; keyboard/input ->fs-skia-keyboard-input; layout readability ->fs-skia-layout-readability; controls/forms/charts/graphs/DataGrid ->fs-skia-ui-widgets; generated game HUD readability and public-scene host update ->fs-skia-layout-readability; deterministic evidence mode and host-warning classification ->fs-skia-evidence-mode. -
Phase-checkpoint edges are implicit. The graph compute script auto-injects an edge from every task in Phase N+1 to the last foundation task of Phase N. You do NOT repeat those edges in the yml — write only non-phase cross-edges (e.g.,
T015: [T011, T013]says US1 impl depends on US1 tests and US1 fixtures). -
Story grouping. Tasks belong to a phase (Phase 1..N) and optionally a user story (
[US1],[US2], ...). Keep phases sequential; stories within a phase may run in parallel. -
Tier annotation. Mark each task
[T1]or[T2]if the phase classification differs from the spec's overall tier. Omit when it matches. -
Parallel-safe marker.
[P]means "no deps inside this phase" — the script can verify it; you SHOULD emit it as a hint. -
Elmish/MVU applicability. For any stateful or I/O-bearing story, emit explicit tasks for the
.fsicontract (Model,Msg,EffectorCmd<Msg>,init,update, interpreter boundary), pure transition tests, emitted-effect assertions, and real interpreter evidence where safe. For a simple pure feature, state that Principle IV is not applicable in the evidence-obligations task. -
Synthetic-evidence inventory. Include the empty Synthetic-Evidence Inventory table from the template. It will grow as
/speckit.implementadds[S]tasks. -
Synthetic error-handling classification. Assign
[SEH]plussynthetic-error-handling-approvedonly during design, planning, clarification, or task generation. Each approved row must include the design source, rationale, synthetic input class, expected error behavior, and acceptance status. Eligible examples: malformed parser input, corrupt file content, invalid command arguments, protocol violations, missing required data, hostile payloads, and forced error-result fixtures. Non-eligible examples: convenience mocks, incomplete integrations, unavailable product capability, missing host support, placeholder outputs, speed-only fixtures, and ordinary in-memory substitutes. implementation-time relabeling is forbidden; newly discovered cases return to design/task work. -
Risk-level evidence. Generated tasks should name small, medium, and broad governance risk levels, focused validation for the chosen level, when broad validation is required, and how non-authoritative aggregate results are recorded.
-
Visual demo skill assignment. Assign scene rendering -> fs-skia-scene, screenshot capture -> fs-skia-skiaviewer, layout readability -> fs-skia-layout-readability, persistent viewer launch -> fs-skia-skiaviewer, deterministic evidence mode -> fs-skia-evidence-mode, generated-package validation -> fs-skia-template-update, graph validation -> speckit-evidence-graph, audit validation -> speckit-evidence-audit. Preserve implementation-before-evidence, graph-before-audit, and debug-before-broad-rerun ordering; the visible mirror
[skillist: speckit-tasks, fs-skia-layout-readability]illustrates exact structured order. -
Visual demo readiness scaffolds. Enumerate
readiness/visual-evidence-honesty.md,readiness/window-visibility.md,readiness/governance-risk-levels.md,readiness/aggregate-hang-diagnostics.md,readiness/runtime-limitations.md,readiness/generated-guidance-validation.md, andreadiness/real-image-evidence.mdbefore audit. Each readiness file names the authoritative command, artifact path, failure class, and next action.
Validation
Immediately after writing both files, validate the task graph with the canonical
in-process target (this is the same entry point the speckit-evidence-graph
skill documents — the two skills do not contradict each other, and there is
no run-audit.sh or other shell/python runner):
./fake.sh build -t EvidenceGraph
The target resolves the feature to validate from .specify/feature.json. To
validate a different feature, override with the SPECKIT_FEATURE_DIR
environment variable:
SPECKIT_FEATURE_DIR="specs/<FEATURE_ID>" ./fake.sh build -t EvidenceGraph
Confirm the echoed feature-directory=… and tasks=<n> match your feature
before trusting the verdict. If neither .specify/feature.json nor an override
resolves a feature, the target fails loudly — it never falls back to a sample.
This validates:
- Every Tnnn in
tasks.mdhas a matching key intasks.deps.yml, and vice versa. - Every dep reference resolves to a known Tnnn; the graph is acyclic.
- Every task has structured
skillistmetadata and a matchingtasks.mdmirror. - Declared skill ids resolve to exactly one readable skill file.
- Each declared
owns:value is in the closed vocabulary and carries its implied skill in theskillist.
Report any failures to the user immediately; refuse to declare the tasks
phase complete until the DAG is clean. For the full merge-gate audit
(synthetic-propagation + diff-scan), run ./fake.sh build -t EvidenceAudit.
Post-Execution Checks
Check for extension hooks (after tasks): After the task breakdown is generated, discover hooks across all extension files (multi-file discovery), not just the central file:
- Read
.specify/extensions.ymlfrom the project root (if present) and collect entries under thehooks.after_taskskey. - Then enumerate every
.specify/extensions/*/*.ymlfile in sorted order, parse each, and collect itshooks.after_tasksentries too — so a hook registered only in a per-extension file (e.g. thefeedbackextension at.specify/extensions/feedback/feedback.yml) is still discovered and runs on phase completion. - Merge all collected entries and dedupe by
(extension, command)(first occurrence wins, so a hook declared in both files runs once). - Hook execution precedence (D1): when
settings.auto_execute_hooks: truein.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 byauto_execute_hooks; a hook with a non-emptyconditionis never evaluated by this skill — evaluation is left to the executor and the notice reports the resolved decision. Whenauto_execute_hooks: false, even mandatory hooks are surfaced for confirmation. - Effective-hooks notice (D2): after the merge + dedup by
(extension, command), emit one consolidated notice for the phase so the operator never hand-reconciles files — a promoted feedback hook (optional: false) appears asauto-run, never as a surfaced optional:## Effective hooks for tasks - {extension}:{command} — auto-run (mandatory; auto_execute_hooks=true) - {extension}:{command} — surfaced (optional) - {extension}:{command} — skipped (enabled: false) - {extension}:{command} — condition-deferred - If a file is absent or its YAML cannot be parsed/is invalid, skip that file silently and continue.
- For every
optional: truehook 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). - Filter out hooks where
enabledis explicitlyfalse. Treat hooks without anenabledfield as enabled. - For each remaining hook, do not interpret or evaluate hook
conditionexpressions:- If the hook has no
conditionfield, or it is null/empty, treat the hook as executable - If the hook defines a non-empty
condition, skip it and leave condition evaluation to the HookExecutor implementation
- If the hook has no
- For each executable hook, output the following based on its
optionalflag:- Optional hook (
optional: true):## Extension Hooks **Optional Hook**: {extension} Command: `/{command}` Description: {description} Prompt: {prompt} To execute: `/{command}` - Mandatory hook (
optional: false):## Extension Hooks **Automatic Hook**: {extension} Executing: `/{command}` EXECUTE_COMMAND: {command}
- Optional hook (
- If no hooks are registered or
.specify/extensions.ymldoes not exist, skip silently
04 同仓库更多 Skills
fs-skia-ui-widgets
Generated product guidance for Skia-rendered FS.Skia.UI Controls, rich text, chart controls, graph controls, DataGrid, and custom wrappers.
fs-skia-testing
Assert generated-product expectations and evidence in a governed FS.Skia.UI product.
fs-skia-skiaviewer
Wire a generated FS.Skia.UI product to the desktop viewer host.
fs-skia-scene
Build pure scene descriptions in a generated FS.Skia.UI product.
fs-skia-keyboard-input
Map keyboard input to product commands in a generated FS.Skia.UI product.
fs-skia-elmish
Drive a generated FS.Skia.UI product through the pure Elmish adapter.