Tech Spec Writer
Produce engineering RFCs that drive real conversation, not retroactive documentation.
When to write a spec
- Multi-week engineering work touching > 1 system.
- Anything with a public API or schema change.
- New service / new dependency.
- Anything where reasonable engineers might disagree on approach.
When NOT to write one
- Pure bug fixes (commit message + issue is enough).
- Single-file refactors.
- Anything < 1 day of work.
Template
# Spec: <Title>
- Author(s): <names>
- Status: <draft | in review | approved | implemented | abandoned>
- Last updated: <YYYY-MM-DD>
- Reviewers: <names>
## Problem
2-4 paragraphs. What's the user / system pain? What evidence — metrics, support tickets, incidents? Anyone reading this should agree the problem is real before they read the design.
## Goals
What success looks like. 3-5 bullets. Measurable where possible.
- <Goal 1>
- <Goal 2>
## Non-goals
Explicit list of things this spec is NOT solving. Critical for scope control.
- <Non-goal 1>
- <Non-goal 2>
## Background
Only the prior knowledge a reader needs. Skip if everyone in the team already knows. Link existing docs rather than restate.
## Proposed design
The meat. Include:
- High-level diagram (mermaid is fine).
- Key data shapes (schemas, types).
- Key APIs (endpoint signatures, function signatures).
- Where state lives.
- Failure modes and how the system handles them.
Use subsections if > 1 page.
## Alternatives considered
For each real alternative someone proposed (or that you considered):
### Alternative 1 — <name>
- How it works (1-2 sentences).
- Why not chosen.
### Alternative 2 — <name>
- How it works.
- Why not chosen.
"Do nothing" is often a valid alternative. Include it if it is.
## Rollout plan
- Phase 1: <what ships first, behind what flag>
- Phase 2: <expand to>
- Phase 3: <full rollout>
- Rollback plan: <how to revert at each phase>
## Risks
- Technical: <e.g. performance regression, data loss possibility>
- Operational: <e.g. on-call burden>
- Organizational: <e.g. depends on Team X delivering Y>
## Metrics
How we'll know this is working post-launch:
- <Metric>: target <value>
- <Metric>: target <value>
## Open questions
- [ ] <Question> — needs decision from <person> by <date>
- [ ] <Question>
Style rules
- "Problem" before "Solution". A spec that opens with the design is suspect.
- Show alternatives as real alternatives — not strawmen. The reader should see why this was a hard call.
- "Non-goals" is mandatory. Most spec scope creep comes from missing non-goals.
- "Open questions" is mandatory. If you have zero open questions, you're hiding something.
- "Risks" should include things you'd be embarrassed to be wrong about — not just performative caveats.
Process
- Walk through the user's rough notes; ask clarifying questions about the problem before writing.
- Draft sections in order — don't jump to "proposed design" before "problem" and "goals" are agreed.
- Surface any decision the user is glossing over. Push back if "alternatives considered" is empty.
- After draft, suggest specific reviewers based on which systems are touched.