Phase 1 of mathias/skills extraction (infra#62 Track D — homelab next-step plan addendum). Imports ~/dev/.skills/ verbatim (19 skill dirs + SKILLS_INDEX.md) and adds the installation surface: - Taskfile.yml — install / update / list / release / check targets - install.sh — bootstrap installer for hosts without Task. Idempotent symlink wirer; default checkout at ~/.local/share/skills/ on every host; SKILLS_REF env var pins a tag (default: main). - .gitea/workflows/release.yml — auto-tag every push to main by Bump-Type footer (major/minor/patch, default patch). Skipped when commit contains [skip-release]. - README — usage, versioning, contribution flow, secret-hygiene rule. Phase 1 wires Claude Code only (~/.claude/skills/<name> global + <repo>/.claude/skills/<name> per-repo). Phase 2 adds Crush, opencode, antigravity, and gitea-resident agents (cobalt-dingo, agentsquad) once their skill conventions are researched. Public repo, markdown-only — no secrets, no client names. Verified via pre-push grep before initial push. [skip-release]
8.3 KiB
name, description
| name | description |
|---|---|
| planning | Decompose work into small, verifiable, ordered tasks. Use when you have a spec or clear requirements and need to break work into implementable units. |
Planning and Task Breakdown
Overview
Good task breakdown is the difference between reliable delivery and a tangled mess. Every task should be small enough to implement, test, and verify in a single focused session.
Input: A spec (load spec-driven-dev skill) or clear requirements.
Output: A prioritized, ordered list of tasks with acceptance criteria and verification steps.
When to Use
- You have a spec and need to break it into implementable units
- A task feels too large or vague to start
- You need to communicate scope to Mathias
- The implementation order isn't obvious
- You want to identify parallelization opportunities
When NOT to use: Single-file changes with obvious scope.
The Planning Process
Step 1: Read-Only Discovery
Before writing any tasks, operate in read-only mode:
- Read the spec and relevant code
- Identify existing patterns, conventions, and infrastructure
- Map dependencies between components
- Note risks and unknowns
Do NOT write code during planning. The output is a plan document, not implementation.
Step 2: Map the Dependency Graph
Visualize what depends on what:
Database schema / migrations
│
├── Domain types (pure Go structs + interfaces)
│ │
│ ├── Service layer (business logic)
│ │ │
│ │ └── HTTP handlers
│ │
│ └── Store implementations (postgres, in-memory)
│
└── Seed data / test fixtures
Build foundations first. You can't test a handler before the service exists. You can't write a service before the domain types are defined.
Step 3: Slice Vertically
Build one complete feature path at a time, not one layer at a time.
Bad (horizontal slicing):
Task 1: Write all database migrations
Task 2: Write all store implementations
Task 3: Write all service methods
Task 4: Write all handlers
No working software until Task 4. If Task 1 is wrong, you discover it late.
Good (vertical slicing):
Task 1: User can create an account (migration + store + service + handler for create)
Task 2: User can log in (auth store + service + handler)
Task 3: User can view their invoices (query + service + handler + response type)
Each task delivers working, testable functionality. If Task 1 reveals a design issue, Tasks 2+ can adapt.
Step 4: Write Tasks
Each task follows this structure:
## Task [N]: [Short descriptive title]
**Description:** One sentence explaining what this task accomplishes.
**Acceptance criteria:**
- [ ] [Specific, testable condition]
- [ ] [Specific, testable condition]
**Verification:**
- [ ] Tests pass: `go test -run TestFeatureName ./...`
- [ ] Build: `go build ./...`
- [ ] Manual check: [description if needed]
**Dependencies:** Task [N-1], Task [N-2] (or "None")
**Files likely touched:**
- `internal/domain/user.go`
- `internal/store/user_store.go`
- `internal/service/user_service.go`
**Estimated scope:** [XS/S/M/L]
Step 5: Order and Add Checkpoints
Arrange tasks so:
- Dependencies are satisfied (build foundation first)
- Each task leaves the system in a working state
- High-risk tasks are early (fail fast)
- Checkpoints occur after every 2–3 tasks
## Checkpoint: After Tasks 1–3
- [ ] `go test ./...` passes
- [ ] `go build ./...` succeeds
- [ ] Core user flow works end-to-end (can register and log in)
- [ ] Mathias reviews before continuing
Task Sizing Guidelines
| Size | Files | Scope | Example |
|---|---|---|---|
| XS | 1 | Single function or type | Add a validation rule to User |
| S | 1–2 | One endpoint or store method | Add GetByEmail to UserStore |
| M | 3–5 | One feature slice | User registration (domain + store + service + handler) |
| L | 5–8 | Multi-component feature | Search with filtering, pagination, and sorting |
| XL | 8+ | Too large — break it down | — |
Break any XL task into smaller tasks. An agent performs best on XS, S, and M tasks.
Break a task down further when:
- It would take more than 2–3 hours of focused work
- The acceptance criteria have more than 4 bullet points
- It touches two independent subsystems (auth AND billing in the same task)
- You find yourself writing "and" in the task title
Plan Document Template
# Implementation Plan: [Feature/Project Name]
## Overview
[One paragraph: what we're building and the key technical decisions]
## Architecture Decisions
- [Decision 1 and rationale]
- [Decision 2 and rationale]
## Dependency Graph
[Diagram or list showing what depends on what]
## Task List
### Phase 1: Foundation
- [ ] **Task 1:** [Title] — [Scope: XS/S/M]
- AC: [criteria]
- Verify: `go test -run TestX ./...`
- Files: [list]
- [ ] **Task 2:** [Title] — [Scope: XS/S/M]
...
### Checkpoint: Foundation Complete
- [ ] `go test ./...` passes
- [ ] Build clean
- [ ] Foundation behavior works end-to-end
### Phase 2: Core Features
- [ ] **Task 3:** [Title] — [Scope: S/M]
...
### Checkpoint: Core Features Complete
- [ ] User-facing scenarios work
- [ ] Mathias reviews before Phase 3
### Phase 3: Polish and Edge Cases
- [ ] **Task 5:** Handle [edge case]
- [ ] **Task 6:** [Performance/error handling]
### Checkpoint: Complete
- [ ] All acceptance criteria from the spec are met
- [ ] `go test -race ./...` passes
- [ ] govulncheck passes
- [ ] Ready for review
## Risks and Mitigations
| Risk | Impact | Mitigation |
|------|--------|-----------|
| [External API behavior unknown] | High | Spike task first |
| [Data volume may be larger than expected] | Medium | Add pagination before shipping |
## Open Questions
- [Question requiring Mathias's input]
Parallelization
When working in parallel (multiple sessions or agents):
- Safe to parallelize: Independent feature slices, tests for already-implemented features
- Must be sequential: Database migrations, shared interface changes, dependency chains
- Needs coordination: Features that share an API contract — define the contract first, then parallelize
Go-Specific Planning Notes
Database First, Then Domain
If the feature requires a schema change:
- Write and apply migration first
- Generate sqlc code (
task generateorsqlc generate) - Then write domain types and service
Interface Contracts Before Parallel Work
If two tasks depend on a shared interface:
// Define this first, in its own task
type InvoiceStore interface {
Save(ctx context.Context, inv Invoice) error
GetByID(ctx context.Context, id InvoiceID) (Invoice, error)
}
Then write the postgres implementation and the service in parallel.
Spike Tasks for Unknowns
If a risk involves an unknown (new API, unfamiliar library, performance unknown):
## Task 0 (Spike): Validate Bankgirot API integration
**Description:** Verify we can submit an ISO 20022 message to Bankgirot sandbox.
**Timebox:** 2 hours
**Output:** Working code or decision to change approach
**Not:** Production-quality code — throw it away after learning
Spikes are timeboxed explorations. The code is thrown away. The learning is kept.
Verification Before Starting
Before beginning implementation:
- Every task has acceptance criteria
- Every task has a verification step
- Task dependencies are identified and ordered correctly
- No task touches more than ~5 files
- Checkpoints exist between major phases
- Mathias has reviewed and approved the plan
Common Rationalizations
| Rationalization | Reality |
|---|---|
| "I'll figure it out as I go" | That's how you end up with rework. 10 minutes of planning saves hours. |
| "The tasks are obvious" | Write them down. Explicit tasks surface hidden dependencies. |
| "Planning is overhead" | Planning IS the task. Implementation without a plan is just typing. |
| "I can hold it all in my head" | Context windows are finite. Written plans survive session boundaries. |
Cross-References
- Requires:
spec-driven-devskill output - During implementation: load
tddskill per task - For large refactoring tasks: load
refactoringskill - For architecture decisions: load
solidskill