name: spf-implement-use-case
description: >-
Implement a use-case composition documented in the SPF use-case-composition
registry. Consumes a use-case doc at internal/design/spf/use-cases/.md
and produces the engine-side code: a variant engine factory, a parallel
adapter, composition wiring, use-case-specific behaviors (if any), and
tests. The implementation analog of /spf-document-use-case (which produces
the doc; this consumes it). Walks through disambiguation + routing (verify
the request is actually a use case, check constituent-feature implementation
status), resolves the doc's open questions with the user, maps phases to
chunks, routes to downstream skills (/spf-implement-feature for
unimplemented constituents, /spf-create-behavior, /spf-update-behavior,
/refactor-behavior), and updates both the use-case doc and constituent
feature docs as code lands. Treats the use-case doc as a starting point for
planning, not a hardened specification. Triggers: "implement use case",
"implement SPF use case", "implement use-case composition", "build use
case", "implement audio-only-mode-override", "implement ".
Implement an SPF Use-Case Composition
Take a use-case composition documented at
internal/design/spf/use-cases/<name>.md and produce the engine-side code
that satisfies its Phase 1 (and optionally Phase 2 / Phase 3) scope —
typically a variant engine factory + parallel adapter, composition wiring
that subtracts/adds/swaps behaviors per the four-mechanism taxonomy, and any
use-case-specific behaviors that don't promote to standalone features.
The canonical failure modes without this discipline are:
- Skipping disambiguation — proceeding with an interpretation of "implement X" when X could be a feature, a use case, or undocumented entirely.
- Treating the use-case doc as a hardened spec — refusing to revise the doc when implementation reveals new questions or drift; or the inverse, silently overriding the doc with implementation choices.
- Assuming constituent features are implemented — building a use case on top of feature capabilities that don't actually exist in code yet.
Steps 1–2 are the load-bearing setup. Step 1 (disambiguation + routing) is
the most novel discipline — Steps 2–9 mostly parallel /spf-implement-feature
with use-case-specific content.
Usage
/spf-implement-use-case [<use-case-name-or-description>]
The arg is optional. The skill can be invoked with a use-case-doc name (e.g.,
audio-only-mode-override) or a description of what the user wants. Step 1
routes appropriately.
Reference docs
Primary:
internal/design/spf/use-cases/<name>.md— starting point for planning (not a hardened spec; see Doc-as-starting-point principle below). Read end-to-end before scoping.internal/design/spf/use-cases/README.md— doc-type spec; the four- mechanism composition taxonomy + decomposition rubric + cross-link discipline + Implementation note (Path-A vs Path-B for behavior customization).internal/design/spf/conventions/*.md— when to reach for which primitive.internal/design/spf/evaluation-axes.md— axes the implementation is scored against.packages/spf/docs/hls-engine.md— current HLS engine composition; the baseline the variant subtracts from / adds to.packages/spf/src/CLAUDE.md— source layout + dependency rules.- Constituent feature docs (the use case's Constituent features section enumerates them).
Secondary:
- Existing engine factory + adapter as templates (
createSimpleHlsEngineandSimpleHlsMediaElement— the canonical pair the variant parallels). internal/decisions/*.md— past tactical decisions.
Downstream skills routed-to:
.claude/skills/spf-implement-feature/SKILL.md— new: when a constituent feature is not yet implemented and the use case needs it..claude/skills/spf-create-behavior/SKILL.md— use-case-specific behaviors that don't promote to features (per use-cases/README cross-link discipline)..claude/skills/spf-update-behavior/SKILL.md— existing behaviors whose purpose changes for the variant..claude/skills/refactor-behavior/SKILL.md— existing behaviors with preserved purpose, improved implementation..claude/skills/spf-document-use-case/SKILL.md— invoked when Step 1 routing concludes the candidate isn't yet documented as a use case..claude/skills/spf-document-feature/SKILL.md— invoked when Step 1 routing concludes the candidate is a feature, not a use case (and isn't yet documented as such).- (future) media-layer / network-layer skills.
Doc-as-starting-point principle
The use-case doc is the starting point for planning, not a hardened specification. This principle is load-bearing throughout the skill — explicit because both directions of failure are real:
- Silent override (covered by
Use-case-doc-grounding driftfailure mode) — implementation diverges from the doc without surfacing the divergence; the doc becomes stale silently. - Rigid following (covered by
Treating use-case doc as hardened specfailure mode) — implementation refuses to revise the doc when new questions surface or drift is discovered; the doc becomes a misleading constraint.
Acknowledge the doc's definition depth explicitly when planning:
coarse— variant shape sketched, many open questions. Implementation will fill in significant detail; revisions to the doc are expected throughout. Planning is substantial.technical— scope and constraints articulated; specifics still open. Implementation maps to constraints; moderate planning + revision.sketched— implementation surface populated. Implementation primarily verifies; revisions for drift only.
Discipline:
- Every doc revision is explicit and surfaced to the user during the implementation pass. Never silent.
- Step 8 consolidates the cumulative doc update reflecting all revisions made during implementation — it's not the only revision point, just the cumulative one.
- Open questions are markers, not absent specs — the implementation resolves them through experience or explicitly defers them.
Failure-mode catalog (seeded; grows with use)
Skipping disambiguation — invoking with a name or description that ambiguously maps to (i) an existing use case, (ii) a different use case, (iii) a feature, (iv) something not yet documented. Step 1's disambiguation must resolve before gathering sources or planning. Proceeding-with-assumption is the canonical failure shape. Worked examples: invocation "implement resolution capping" — routes to
/spf-implement-featureonrendition-selection-caps(cluster-E policy), not here. Invocation "implement audio-only" maps to theaudio-only-mode-overrideuse case (which absorbed what was previously framed as a separateaudio-only-compositionfeature); the disambiguation between feature and use-case framings is resolved by the consolidated doc.Routing-out failure — Step 1's disambiguation should route confidently. The failure mode is "ambiguity discovered but not resolved" — silently picking one interpretation when the user could have meant another. Always surface and confirm.
Treating use-case doc as hardened spec — refusing to revise the doc when implementation reveals new questions, refines framing, or surfaces drift. Inverse failure of silent-override. The right discipline is explicit, user-surfaced revision.
Use-case-doc-grounding drift (silent override direction) — implementation diverges from the doc without surfacing the divergence. Either the doc is wrong (revise it) or the implementation is wrong (fix it). Don't silently diverge.
Constituent-feature implementation status unchecked — assuming feature X is implemented when it isn't; the use case ships against assumed capabilities that don't exist. Step 1's gathering must verify each constituent feature's implementation status (frontmatter
status, code-grounding via the feature doc'sImplementation surfacesection).Shared-factory-with-Case-1-sibling miscoordination — when a use case has a Case-1 feature sibling and both want the engine variant factory, building it twice or building it without coordinating produces drift. Resolved pattern (since 2026-05-21): when both cases ship the same engine factory, the Case-1 feature doc consolidates into the use-case doc with a Variant-decision signal source section covering both paths (
audio-only-mode-overrideis the canonical example). The skill must surface this when a Case-1 sibling exists in the source material — recommend consolidation when the factory is shared, separate docs only when the factories differ.Adapter shape proliferation un-flagged — each use-case adapter multiplies the surface. The use-cases/README cross-cutting note flags this as a registry-level concern; implementations should track it explicitly per pass.
Phase scope creep — use-case docs have 3 phases (Basic / Features-relevant / Optimizations). The implementation must scope to one phase or a subset, not "implement the whole use case."
Composing variant-specific behaviors into default factory — variant-specific behaviors go in the variant factory, not the default
createSimpleHlsEngine. Same failure mode as/spf-implement-feature's catalog, but more pointed here: the whole point of a use-case implementation is the variant assembly, so misrouting at the factory level is the canonical first-pass bug.Multi-writer slot mishandling — adding a writer to a slot another behavior writes requires multi-writer characterization per
conventions/signals.md. Same as/spf-implement-feature.Conventions catalog under-application — SPF conventions (behaviors, signals, reactors, actors, config) all apply during implementation. Failing to consult them produces code that "works" but doesn't match patterns.
Use-case-specific behavior promoted to feature unnecessarily — a variant-decision-glue behavior, composition-wiring behavior, or single-scenario tuning gets a feature doc when it should live in the use-case doc's Composition specifics → Behaviors added section. Apply the "earns its place" rubric per use-cases/README cross-link discipline.
Test-after-the-fact implementation — TDD discipline per chunk: test → implement → verify. Implementation-first produces tests that pass by construction.
Status update skipped — both doc-types — use-case doc and constituent feature docs need status updates as code lands. The constituent feature docs' "Use cases that compose this feature" entries may gain implementation-status notes (e.g., "Phase 1 constituent — implementation in progress as part of audio-only-mode-override"). Step 8 enforces.
Downstream skill missing — silent inline implementation — when a chunk hits a downstream-skill gap (especially:
/spf-implement-featurefor an unimplemented constituent), the failure mode is to silently apply discipline ad-hoc. Step 6 explicitly surfaces this: branch on (i) defer chunk pending downstream skill, (ii) implement the constituent feature first via the downstream skill, (iii) bundle the constituent implementation into this use-case pass with explicit user confirmation.SPF adapter stranded at engine layer — the implementation pass lands the engine variant + SPF adapter and stops there. The variant is reachable via
@videojs/spf/hlsbut not consumable through the existing player surface (thepackages/htmlcustom elementspackages/reactcomponents + sandbox demos that real consumers actually use). The canonical failure shape: ship a "Phase 1 complete" SPF adapter that customers can't actually instantiate via their normal<simple-x-video>/<SimpleXVideo>flow. Step 2's implementation-scope extensions question makes the player- package layers explicit opt-ins; the failure is forgetting to ask or defaulting to "engine + adapter only" without surfacing the gap. Step 8's Out of scope / deferred sub-list must record every non-landed extension so the surface gap stays visible. Worked example:audio-only-mode-overridePhase 1 (2026-05-21) landed only the SPF layer — the discovery of this failure mode was the feedback that drove this entry.
Steps (do these in order; do not skip)
Step 1 — Identify the use case + disambiguate the request
The load-bearing setup step. Disambiguation comes first — before gathering sources or planning, confirm what the user actually wants.
1a. Identify the candidate.
- If the user passed a name → verify
internal/design/spf/use-cases/<name>.mdexists. - If the user passed a description (no name) → parse for candidates, match against existing use-case docs.
- If multiple candidates match → surface options to the user.
1b. Verify the candidate is actually a use case.
Apply the use-cases/README discriminator + 4-criterion rubric:
- Composition mechanisms? If everything works as runtime config on
always-on behaviors (no behaviors subtracted/added/swapped/defaulted
at composition time) → it's a cluster-E policy feature → route
to
/spf-implement-featureon the relevant feature doc. - Delivery scenario? If the concern is source-shape correctness
(engine handles a kind of source) rather than delivery-mode choice
(compose differently for a consumer scenario) → it's a Case-1
feature → route to
/spf-implement-featureon the relevant feature doc. - Constituent features? If the candidate has no real composition
assembly — it's a single capability the engine gains — → it's
likely a feature, route to
/spf-implement-feature. - Customer/consumer scenario? If the request is "tune the engine
differently for X" without a delivery scenario → likely cluster-E
policy →
/spf-implement-feature.
1c. Route the request appropriately.
- Stays here — confirmed use case, doc exists. Proceed to 1d.
- No doc exists for the candidate → route to
/spf-document-use-caseto produce the doc; return here once doc lands. - It's actually a feature, no doc exists → route to
/spf-document-featurefirst, then/spf-implement-feature. - It's actually a feature, doc exists → route directly to
/spf-implement-feature. - Ambiguous between options → surface to user; do not pick silently.
1d. Gather sources. (Once routing is confirmed and we're staying here.)
- The use-case doc itself — read end-to-end. Note
definitiondepth andstatus(see Doc-as-starting-point principle above). - Constituent features (load-bearing). For each one listed in the
use-case doc's Constituent features section, check
implementation status by reading the feature doc's frontmatter
statusand itsImplementation surfacesection. Categorize each:- Implemented — variant assembly can compose it as-is.
- Partially implemented — variant may need to compose what exists and defer the rest.
- Documented but unimplemented — branches in Step 2 (defer use case / implement constituent first / bundle into this pass).
- Not documented — route to
/spf-document-featurefirst.
- Direct Case-1 sibling feature doc (if applicable) — check whether shared engine factory work is in scope.
- Related use cases (the doc's Related use cases section) — note shared constituent features for adapter-shape-proliferation awareness.
- Conventions catalog skim for relevance signals.
- Existing engine factory + adapter as templates.
- Recent ADRs (
internal/decisions/).
Stop and report back to the user with:
- The use-case name and the doc's current
status+definitiondepth. - Sources consulted (with links).
- Constituent-feature implementation status — categorized per the four states above.
- Recommended scope for this implementation pass — including whether to defer due to unimplemented constituents, implement constituents first, or bundle into this pass.
- Open questions blocking implementation (going into Step 2's discussion).
Step 2 — Discuss to resolve open questions + confirm scope strategy
An explicit conversational stage — not optional, not implicit. After Step 1's report:
Walk through the use-case doc's Open questions section. Classify each: must-resolve-before-code vs can-stay-open.
Confirm phase scope. Phase 1? Phase 1 + 2 subset? Specific phase rows?
Confirm composition mechanism per chunk — per the use-case doc's Composition specifics breakdown: subtractive / additive / alternative-impl / alternative-default-config. Often more than one in combination.
Confirm constituent-feature readiness strategy. Per Step 1's categorization, decide for each unimplemented constituent:
- Defer the use case until constituent lands separately.
- Implement the constituent first via
/spf-implement-featurein a separate pass (this skill pauses, downstream skill runs, this skill resumes). - Bundle constituent implementation into this use-case pass (the implementation work covers both the constituent feature chunks and the variant assembly chunks; the doc updates cover both docs).
Confirm shared-factory-with-Case-1-sibling coordination if applicable. Pattern: if the source material distinguishes a Case-1 source-shape concern from the Case-2 delivery-mode concern but both ship the same engine factory, recommend consolidating into one use-case doc with a Variant-decision signal source section covering both paths (
audio-only-mode-overrideis the canonical example — that consolidation landed 2026-05-21 absorbing what was previously a separateaudio-only-compositionfeature doc).Confirm implementation-scope extensions. The engine variant + adapter pair in
packages/spfis the minimum implementation surface — but a variant adapter that stops at the SPF layer is effectively unconsumable through the existing player surface. Ask the user (multi-selectAskUserQuestion) which downstream layers to bundle into this pass:- Core media wrapper —
packages/core/src/dom/media/<key>/(~5 LOC; applies the SPF mixin toHTMLVideoElementHost). The minimum bridge between the SPF adapter and the player packages. Worked example:simple-hls/index.ts→class SimpleHlsMedia extends SimpleHlsMediaMixin(HTMLVideoElementHost) {}. - HTML custom element —
packages/html/src/media/<key>-video/(~5 LOC; wraps the core media inCustomMediaElement+MediaAttachMixin) +packages/html/src/define/media/<key>-video.tspackages/html/src/cdn/media/<key>-video.tsfor the CDN entry. Worked example:simple-hls-video/index.ts→class SimpleHlsVideo extends MediaAttachMixin(CustomMediaElement('video', SimpleHlsMedia)) {}.
- React component —
packages/react/src/media/<key>-video/(~37 LOC; React adapter exposing props matching the HTML surface). Pairs with the HTML custom element. - Sandbox demo(s) —
apps/sandbox/templates/html-<key>-video/and/orapps/sandbox/templates/react-<key>-video/(~50–80 LOC each). Write totemplates/, notsrc/. Per the sandbox README,apps/sandbox/src/*is gitignored —pnpm dev:sandboxmirrorstemplates/intosrc/on startup, leaving local edits insrc/untouched. Useful for manual verification + developer onboarding. Required prereqs: HTML or React component, depending on which sandbox is included. - E2E tests —
apps/e2e/apps/vite/src/pages/html-<key>-video-*.{html,ts}fixture pages +apps/e2e/tests/...Playwright spec. Lean: defer by default. Use E2E for behaviors that have documented reliability concerns ([[project-e2e-renderer-reliability]]) or that exercise cross-browser invariants the unit tests can't reach. For most Phase 1 use-case lands, the engine-level integration tests + sandbox manual verification suffice; E2E coverage follows once behavior stabilizes.
Defaults: none. The user explicitly opts in to each layer per pass. Each opt-in becomes its own chunk in Step 3.
- Core media wrapper —
Surface expected doc revisions. Walking through the Open questions + phase scope often reveals "we'll need to update the doc to reflect X" — flag these explicitly so they're not silent.
Resolve the open questions the implementation needs. Per the pre-deciding-things failure mode, only resolve what the implementation forces; leave the rest as open questions in the doc.
Use AskUserQuestion for clear-cut choices (phase scope,
constituent-readiness strategy, composition mechanism per chunk,
implementation-scope extensions).
Step 3 — Map phases to implementation chunks
Per the agreed scope, decompose into discrete chunks. Chunk shapes typical for use-case implementations:
Core SPF layer (always present):
- Engine variant factory creation (new) — typically the first chunk;
parallels
createSimpleHlsEngineshape with the composition mechanism applied (subtract / add / swap / configure). - Adapter creation (new) — parallels
SimpleHlsMediaElement/SimpleHlsMediaMixin; usesshareSignalsunchanged. - Constituent feature implementation chunks (if bundling per Step
- — route to
/spf-implement-feature.
- — route to
- Use-case-specific behavior creation (if any) — route to
/spf-create-behavior. - Existing behavior updates (if any) — route to
/spf-update-behavioror/refactor-behavior. - Engine-level test scaffolding — engine integration tests for the variant; per-behavior tests for any new use-case-specific behaviors.
- Composition wiring — ties the variant factory into the adapter
and exposes via
packages/spf/src/playback/engines/hls/index.ts.
Implementation-scope-extension layers (opt-in per Step 2):
- Core media wrapper —
packages/core/src/dom/media/<key>/index.tsapplying the SPF mixin toHTMLVideoElementHost(or audio host for audio-only variants). Inline implementation; ~5 LOC. - HTML custom element + define entry + CDN entry —
packages/html/src/media/<key>-video/index.ts,packages/html/src/define/media/<key>-video.ts,packages/html/src/cdn/media/<key>-video.ts. Inline implementation; ~5 LOC + boilerplate. - React component —
packages/react/src/media/<key>-video/index.tsxexposing the props surface; ~37 LOC. Inline implementation. - Sandbox demo(s) —
apps/sandbox/templates/{html,react}-<key>-video/(each ~50–80 LOC). Write totemplates/, notsrc/(which is gitignored — see sandbox README). Inline implementation; one chunk per surface (html / react / both). - E2E coverage — fixture pages under
apps/e2e/apps/vite/src/pages/+ Playwright spec underapps/e2e/tests/. Inline implementation. Often the largest opt-in chunk; defer by default per the Step 2 lean.
Output of this step. A chunk list with mechanism + downstream-skill
routing per chunk + which layer it lands in. Same table shape as
/spf-implement-feature, with a Layer column added when opt-in
extensions are in scope.
Step 4 — Apply cross-cutting concern checks
Run the failure-mode catalog and the use-case doc's Likely cross-cutting impact section against the chunk list. Specific to use-case work:
- Shared-factory-with-Case-1-sibling coordination. If a Case-1 sibling exists, the engine variant factory work likely belongs to both — confirm ownership and avoid double-implementation.
- Adapter shape proliferation. Flag per the use-cases/README cross- cutting concern; track adapter-surface growth at the registry level.
- Composition-mechanism mix verification. Per the doc's Composition specifics, ensure all four mechanism buckets are considered (even if empty for this use case).
- Constituent feature cluster patterns. Cluster patterns apply transitively through constituents — a constituent feature's cluster patterns (gating, multi-writer, per-type, etc.) transfer to the use case that composes it.
- MSE invariants. Specific Firefox
mozHasAudioand similar cross-type invariants flagged inmse-mms-pipeline— variant implementations may exercise these in new ways (e.g., subtractive-audio composition under Firefox).
Step 5 — TDD plan
For each chunk, name:
- The test — file path, test name, what it asserts.
- The implementation target — file path, factory/behavior/adapter name.
- The composition wiring change — if any.
- Acceptance criterion — what does "done" look like?
For use-case implementations, integration tests at the engine level are
typically more load-bearing than for feature implementations — the
variant assembly is the primary product, not just the individual
behaviors. Plan for engine.test.ts-style coverage that exercises the
variant end-to-end against a representative source.
The TDD plan is the seed of the use-case doc's Verification section. Step 8 persists each chunk's test (file path + test name + assertion summary) into the use-case doc — the TDD plan does not live only in chat. Name tests with assertion summaries suitable for the doc from the start, so Step 8 is a transcription pass rather than a re-articulation.
Step 6 — Implement (test-first per chunk; route to downstream skills)
Iterate per chunk:
- Write the test first. Run it failing.
- Branch by mechanism:
- Subtractive composition / wiring — handle inline.
- Config-driven — handle inline.
- Engine variant factory creation — handle inline (typically; the
factory shape parallels
createSimpleHlsEngine). - Adapter creation — handle inline (typically; the adapter shape
parallels
SimpleHlsMediaElement+SimpleHlsMediaMixin). - New use-case-specific behavior → route to
/spf-create-behavior. - Behavior update (purpose changing) → route to
/spf-update-behavior. - Behavior refactor (purpose preserved) → route to
/refactor-behavior. - Unimplemented constituent feature → route to
/spf-implement-feature(per Step 2's readiness strategy). - Structural (split/merge) → route via
/refactor-behavior. - Media-layer / network-layer — handle inline for now; future skills will own these.
- Run the test passing.
- Run composition tests (
engine.test.tsfor the variant) to verify no regression. - Surface any doc revisions discovered during the chunk — propose to user, get confirmation, update doc.
Downstream skill missing — explicit handling. Same as
/spf-implement-feature: defer / build downstream skill inline /
apply ad-hoc with extract-later flag. User makes the call.
Step 7 — Final-shape audit (per chunk + cumulative)
Per chunk: test passes? Conventions adherence? No scope creep?
Cumulative audit after all chunks:
- Use-case-doc grounding — does the implementation match what the doc said? Surface any final drift; resolve via explicit doc update in Step 8.
- Cross-cutting impacts honored?
- Constituent feature docs status reflects reality? — if constituent features were partially implemented as part of this pass, their docs need updates too (Step 8).
- Variant assembly verified end-to-end? — integration test exercises the variant against a representative source.
Step 8 — Update use-case doc + cascade to constituent feature docs
Doc updates for both the use-case doc and its constituent feature docs (cascade):
Use-case doc updates:
- Frontmatter
status—implementedonce all phases land;partialif any phase landed but others haven't;draftonly if nothing has shipped. Updatedefinitionper the rule below. - Status block — reflect implementation state, naming the factory(ies) and adapter(s) that shipped and what remains.
- Phases of complexity — phase rows that landed get an (implemented) marker; rows partially-implemented note partial state with a pointer to which sub-row landed.
- Composition specifics — populated with actual factory/adapter
names, behavior subtraction/addition lists, configuration
changes (e.g.,
initialStateseed dropped). Subtract / add lists must match the actual composed behavior list, not the pre-implementation prediction — fix any drift from Step 1's report here. - Constituent features — per-feature relationship notes get concretized with actual file paths if relevant.
- Customer-policy surface — populated with actual adapter API.
- Variant-decision signal source — populated with actual composition (typically: adapter-upfront, confirmed).
- Open questions — resolved entries moved to a new Resolved during Phase N implementation sub-section (kept for traceability); new entries surfaced by implementation added.
- NEW section once any phase implementation lands:
Implementation surface — required when implementation
surface is populated. Mirror feature-doc shape (see
audio-playback.mdfor the canonical example) and extend per opt-in extensions landed in this pass:- Engine factory table (Export / File / Purpose) — always present.
- Adapter table (Export / File / Purpose) — always present.
- Composed behaviors paragraph — always present.
- Core media wrapper table — if the core wrapper layer
landed (
packages/core/...). - HTML custom element table — if the HTML element layer
landed (
packages/html/...). - React component table — if the React layer landed
(
packages/react/...). - Public re-export entry points for each layer that landed.
- Each opt-in extension that did not land in this pass is noted in the Out of scope / deferred section so the surface gap is visible.
- NEW section once any phase implementation lands:
Verification — required when implementation surface is
populated. This is the persisted TDD artifact — the Step 5
TDD plan lives here in the doc, not just in chat. Mirror
feature-doc shape (see
audio-playback.mdfor the canonical example), with structure per opt-in extensions landed:- Unit tests bullet list (one entry per test file → test name → assertion summary) — engine + adapter coverage, always present.
- Component tests sub-list — if HTML / React component tests landed.
- Sandbox entry naming the sandbox app directory(ies) — if sandbox demo(s) landed.
- E2E tests entry naming fixture pages + Playwright spec paths — if E2E coverage landed.
- Out of scope / deferred sub-list for verification gaps (sandbox follow-up, E2E coverage deferred elsewhere, etc.). Each non-landed opt-in extension from Step 2 appears here explicitly — the deferral is the artifact.
- See also — add test paths, sandbox demo paths if applicable.
definition advancement rule. The depth scale per the
use-cases/README is coarse → technical → sketched. Advance per
the highest implementation depth across all phases:
- Any phase's Implementation surface + Verification sections
populated with concrete exports/file paths/test names →
sketched. - Phases all still scope-and-constraints-only, no implementation
→ leave at
technical. - Phases still broadly sketched, many open questions → leave at
coarse.
A use case with Phase 1 implemented but Phases 2 and 3 still
broadly sketched is sketched at the doc level — the populated
surface trumps the unimplemented phases (which surface in
Phases of complexity as not-yet-landed rows, not in the doc's
overall depth).
Constituent feature doc cascade:
- Use cases that compose this feature entries — update to reflect
implementation status. Worked example shape:
"audio-only-mode- override (partial — Phase 1 landed)"rather than the pre-implementation"audio-only-mode-override (coarse)". - If a constituent feature was partially implemented as part of this
pass (per Step 2's bundling strategy), the feature doc gets its
own update too — same shape as if
/spf-implement-featurehad run.
Doc revisions are explicit. Per the doc-as-starting-point principle, every revision is proposed to the user before applying.
Step 9 — Commit (with user confirmation)
After Step 7 audit is clean and Step 8 doc updates land:
- Audit working-tree state.
git status -s. Surface any pre-existing uncommitted work outside the implementation scope. - Propose commit structure. Common shapes for use-case
implementations:
- Per-chunk commits + doc-update commit + cascade commit — highest atomicity; clearest review trail.
- **Variant-factory commit + adapter commit + doc-update commit
- cascade commit** — natural boundaries for a Phase 1 pass.
- Bundled: feature-implementation commit + use-case- implementation commit + cascade commit — when this pass also implemented constituent features per Step 2's bundling.
- Single feature-implementation commit + doc-update commit — for small Phase 1 use cases.
- Ask the user to confirm via
AskUserQuestion. - On confirmation, run the commits. Use
feat(spf)for variant-factory + adapter creation;refactor(spf)for behavior refactors;docs(spf)for the doc updates; conventional-commit scopes per thegitskill. - On decline or skip, stop. The user owns the commit boundary.
Output format
Propose Steps 1–5 outputs as a structured report before writing any code:
- Use-case identification + disambiguation report (Step 1 — use case name, doc status/definition, sources, constituent-feature readiness, routing decision)
- Ambiguities + open questions to resolve (Step 2)
- Chunk decomposition (Step 3 — chunk list with mechanism + downstream skill routing)
- Cross-cutting concerns (Step 4)
- TDD plan (Step 5 — per-chunk test + implementation targets)
After user confirmation, proceed to Step 6 per-chunk loop. Surface Steps 7–9 outputs after implementation.
Why this order
Step 1 (disambiguation + routing) is the novel discipline compared to
/spf-implement-feature. Implementation work on a use case can route
to a feature implementation, a doc creation, or stay here — getting
that routing right at the start prevents wrong-skill work.
Step 2 (constituent-feature readiness strategy) is also novel — use cases compose features, and the readiness state of constituent features determines whether the use-case implementation can proceed straightforwardly or needs to bundle constituent work.
Steps 3–7 mostly parallel /spf-implement-feature's chunk-decomposition
- TDD + audit shape, with use-case-specific details.
Step 8 (doc update + constituent cascade) is heavier than
/spf-implement-feature's Step 8 because of the bidirectional
cross-link discipline: both the use-case doc and the constituent
feature docs need updates.
Why a discussion stage (not implicit)
The open-questions + constituent-readiness + shared-factory-coordination mix is the canonical decision space for use-case implementations. The explicit conversational stage forces the right resolutions in the open, with the user making the calls. Implicit decisions in this space produce the worst failure modes (assuming constituent X is implemented when it isn't; building a factory twice; silent doc drift).
When this is the wrong skill
- You want to implement a feature →
/spf-implement-feature. Use cases compose features; if your invocation is really about a single capability the engine gains, the feature implementation skill is the right tool. - You want to document a use case (not yet documented) →
/spf-document-use-case. Implementation requires a starting-point doc. - You want to refactor an existing behavior without feature/use-case
scope →
/refactor-behavior. - You want to split or merge behaviors →
/refactor-behavior's decomposition check. - You want to write an architectural design doc →
designskill. - You want to write an RFC →
rfcskill.
How the failure-mode catalog grows
Same pattern as other SPF skills: when a new failure mode surfaces during use (most likely during Step 6 per-chunk implementation, Step 7 audit, or Step 8 cascade), add an entry with a worked-example citation.
This skill is new; the seeded entries capture patterns identified at skill-creation time from cross-skill failure-mode analysis. Expect the catalog to grow significantly as the first real use-case implementations exercise it — particularly around the constituent-feature readiness strategy and the shared-factory coordination cases.