snap-forge · diff

git:20260531.d67ebdd to git:20260916.b45a17a

29 added, 110 removed. Audit A to A.

---
name: snap-forge
description: >
- Implement ready tasks with strict test-driven development. Use when the user
- wants to build features or fix bugs using TDD cycles, mentions
- "red-green-refactor", wants integration tests, or asks for test-first
- development with committed TDD progress.
+ Use when meaningful feature, bug-fix, or refactor work must be implemented in
+ a repository with established tests, even when TDD is not requested; also use
+ for explicit TDD, red-green-refactor, or test-first work.
---
## Invocation
- Syntax: `/skill:snap-forge [branch[=name]] [worktree[=path]]`
+ Syntax: `/skill:snap-forge [help] [branch[=name]] [worktree[=path]]`
+ Bare keys mean `true`. `help` prints usage and stops. Unsafe unknown arguments stop with usage.
+
## Args
- | Key | Values | Default | Notes |
+ | Key | Values | Default | Effect |
| --- | --- | --- | --- |
- | `help` | bool | false | show usage |
- | `branch` | bool/text | false | `branch` derives a branch name; `branch=name` uses `name` |
- | `worktree` | bool/text | false | `worktree` derives a worktree path/branch; `worktree=path` uses `path` |
-
- # Test-Driven Development
-
- ## Philosophy
-
- **Core principle**: Tests should verify meaningful behavior through public interfaces, not implementation details. Code can change entirely; tests shouldn't.
-
- **Good tests** are integration-style: they exercise real code paths through public APIs. They describe _what_ the system does, not _how_ it does it. A good test reads like a specification - "user can checkout with valid cart" tells you exactly what capability exists. These tests survive refactors because they don't care about internal structure. Write tests because the behavior is important, risky, or complex; do not add low-value tests just to raise coverage.
-
- **Bad tests** are coupled to implementation. They mock internal collaborators, test private methods, or verify through external means (like querying a database directly instead of using the interface). The warning sign: your test breaks when you refactor, but behavior hasn't changed. If you rename an internal function and tests fail, those tests were testing implementation, not behavior.
-
- See [tests.md](references/tests.md) for examples and [mocking.md](references/mocking.md) for mocking guidelines.
-
- ## Anti-Pattern: Horizontal Slices
-
- **DO NOT write all tests first, then all implementation.** This is "horizontal slicing" - treating RED as "write all tests" and GREEN as "write all code."
-
- This produces **crap tests**:
-
- - Tests written in bulk test _imagined_ behavior, not _actual_ behavior
- - You end up testing the _shape_ of things (data structures, function signatures) rather than user-facing behavior
- - Tests become insensitive to real changes - they pass when behavior breaks, fail when behavior is fine
- - You outrun your headlights, committing to test structure before understanding the implementation
+ | `help` | bool | false | print usage; do not execute |
+ | `branch` | bool/text | false | derive a branch or use the supplied name |
+ | `worktree` | bool/text | false | derive a worktree path or use the supplied path |
- **Correct approach**: Vertical slices via tracer bullets. One test → one implementation → repeat. Each test responds to what you learned from the previous cycle. Because you just wrote the code, you know exactly what behavior matters and how to verify it.
+ ## Routes
- ```
- WRONG (horizontal):
- RED: test1, test2, test3, test4, test5
- GREEN: impl1, impl2, impl3, impl4, impl5
+ | Selector | Workspace |
+ | --- | --- |
+ | default | current checkout and branch |
+ | `branch` | requested or derived branch in the current checkout |
+ | `worktree` | isolated worktree with a derived branch |
+ | `branch` + `worktree` | requested branch in the requested or derived worktree |
- RIGHT (vertical):
- RED→GREEN: test1→impl1
- RED→GREEN: test2→impl2
- RED→GREEN: test3→impl3
- ...
- ```
+ A direct implementation request or manual invocation authorizes relevant edits, tests, and commits. Otherwise ask before mutation. Branch and worktree creation require the corresponding explicit selector.
## Workflow
- ### 1. Planning
-
- When exploring the codebase, use the project's domain glossary so that test names and interface vocabulary match the project's language, and respect ADRs in the area you're touching. If the user passes an issue reference, PRD, spec, URL, or path, fetch it recursively and read the relevant body, comments, and linked context.
-
- If `branch` or `worktree` is provided, prepare it before editing. Bare `branch` or `worktree` means derive a sensible name; `branch=name` or `worktree=path` means use the provided value.
-
- Before writing any code:
-
- - [ ] Confirm with user what interface changes are needed
- - [ ] Confirm with user which behaviors to test (prioritize)
- - [ ] Identify opportunities for [deep modules](references/deep-modules.md) (small interface, deep implementation)
- - [ ] Design interfaces for [testability](references/interface-design.md)
- - [ ] List the behaviors to test (not implementation steps)
- - [ ] Get user approval on the plan
-
- Ask: "What should the public interface look like? Which behaviors are most important to test?"
-
- **You can't test everything.** Confirm with the user exactly which behaviors matter most. Focus testing effort on critical paths and complex logic, not every possible edge case. Do not write unnecessary coverage-only tests.
-
- ### 2. Tracer Bullet
-
- Write ONE test that confirms ONE thing about the system:
-
- ```
- RED: Write test for first behavior → test fails
- GREEN: Write minimal code to pass → test passes
- ```
-
- This is your tracer bullet - proves the path works end-to-end. When it is green, verify the relevant checks and commit the completed behavior with a small, atomic Conventional Commits v1.0.0 message.
-
- ### 3. Incremental Loop
-
- For each remaining behavior:
-
- ```
- RED: Write next test → fails
- GREEN: Minimal code to pass → passes
- ```
-
- Rules:
-
- - One test at a time
- - Only enough code to pass current test
- - Don't anticipate future tests
- - Keep tests focused on observable behavior
- - When the behavior is green, verify the relevant checks and commit it with a small, atomic Conventional Commits v1.0.0 message
- - Keep commits small and atomic: one completed behavior per commit
-
- ### 4. Refactor
+ 1. **Scope.** Reuse current context and fetch cited sources only when needed. Inspect relevant code, tests, interfaces, ADRs, and domain language. Turn acceptance into an ordered behavior list.
+ Apply the test threshold in [`references/testing.md`](references/testing.md) to each behavior. Ask only when a missing decision changes observable behavior or the public interface. Use [`references/design.md`](references/design.md) when the test seam is unclear.
- After all tests pass, look for [refactor candidates](references/refactoring.md):
+ 2. **Workspace.** Prepare the selected route before editing. Preserve unrelated working-tree changes; ask one scope question when relevant and unrelated edits cannot be separated confidently.
- - [ ] Extract duplication
- - [ ] Deepen modules (move complexity behind simple interfaces)
- - [ ] Apply SOLID principles where natural
- - [ ] Consider what new code reveals about existing code
- - [ ] Run tests after each refactor step
+ 3. **Vertical loop.** Apply the test threshold per behavior; one work item may mix direct and red-green cycles. Complete one behavior before starting the next.
+ - **DIRECT:** below the test threshold, make the smallest change and verify it with existing checks or direct observation.
+ - **RED:** for test-worthy behavior, write one public-interface test and confirm it fails for the intended reason.
+ - **GREEN:** make the smallest implementation that passes; run the targeted test and relevant checks.
+ - **COMMIT:** create one atomic Conventional Commit for the completed behavior.
- **Never refactor while RED.** Get to GREEN first. Commit refactoring separately when it changes code.
+ 4. **Refactor.** Stay green. When the work exposes duplication, a shallow seam, or awkward coupling, use [`references/design.md`](references/design.md), refactor in small verified steps, and commit material refactoring separately.
- ## Checklist Per Cycle
+ 5. **Verify.** Run the relevant broader checks, inspect the final diff, and report behaviors delivered, commands run, commits, and blockers.
- ```
- [ ] Test describes behavior, not implementation
- [ ] Test uses public interface only
- [ ] Test would survive internal refactor
- [ ] Test covers meaningful behavior, not coverage padding
- [ ] Code is minimal for this test
- [ ] No speculative features added
- [ ] Relevant checks pass
- [ ] Completed behavior is committed
- ```
+ Completion: every selected behavior has proportionate evidence, relevant checks pass, unrelated work is untouched, and each completed behavior is committed.