skills/plan-adr/SKILL.md
Break an accepted ADR into implementation issues with an Epic. Use when user types /plan-adr or asks to plan implementation of an ADR.
npx skillsauth add jamesc/skills plan-adrInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Take an accepted ADR and break it into a set of sequenced, agent-ready Linear issues grouped under an Epic. Each issue should be independently implementable and testable.
Key Philosophy: ADRs describe what to build and why. This skill turns that into how — concrete, ordered work items that agents can pick up via /pick-issue.
Identify the ADR: Ask the user for the ADR number or accept it from the command:
cat docs/ADR/NNNN-*.md
Verify its status is Accepted. If Proposed, suggest running draft-adr first.
Analyze implementation scope: From the ADR, identify:
a. Affected components — which pipeline layers need changes:
| Layer | Files | Example changes |
|-------|-------|----------------|
| Lexer | source_analysis/lexer.rs | New tokens |
| Parser | source_analysis/parser/mod.rs | New grammar rules |
| AST | ast.rs | New node types |
| Semantic | semantic_analysis/ | Validation rules |
| Codegen | codegen/ | Core Erlang generation |
| Runtime | runtime/apps/beamtalk_runtime/src/ | Erlang modules |
| REPL | beamtalk_repl*.erl | Interactive support |
| Stdlib | lib/*.bt | Standard library |
| Tests | tests/e2e/cases/, test/ | E2E and unit tests |
| Docs | docs/ | Language docs, examples |
b. Natural phases — group changes into implementable chunks:
c. Dependencies — which pieces must be done before others:
Check for existing issues: Search Linear for issues already tracking this ADR:
Search Linear for: ADR NNNN or the ADR title
Don't duplicate existing issues. Note which parts are already tracked.
Design the issue breakdown: Create a dependency graph:
Phase 1 (foundation):
BT-A: Runtime support for X
BT-B: Add AST node for Y
Phase 2 (core, depends on Phase 1):
BT-C: Parser support for Y (blocked by BT-B)
BT-D: Codegen for Y (blocked by BT-A, BT-B)
Phase 3 (integration, depends on Phase 2):
BT-E: REPL integration (blocked by BT-D)
BT-F: MCP tools if applicable (blocked by BT-D)
Phase 4 (validation + polish):
BT-G: E2E btscript test (blocked by BT-E) — REQUIRED for user-facing features
BT-H: Documentation and examples (blocked by BT-E)
Issue sizing rules:
Present the plan to user: Show the breakdown before creating issues:
## ADR NNNN Implementation Plan
### Phase 1: Foundation
1. **[Title]** (S) — [description] — Files: [list]
2. **[Title]** (M) — [description] — Files: [list]
### Phase 2: Core
3. **[Title]** (M) — [description] — Blocked by: #1, #2
### Phase 3: Integration
4. **[Title]** (S) — [description] — Blocked by: #3
**Total: X issues, estimated [size]**
Wait for user approval before creating issues.
Create the Epic: Create a parent Epic in Linear:
Epic: <ADR title> (ADR NNNN)Epic + relevant area labelsdocs/ADR/NNNN-*.mdCreate child issues: For each approved issue, create in Linear:
Required fields:
agent-ready + area label + type (Language Feature, Feature, Improvement) + size## Context
Part of ADR NNNN: <title>. Phase X of Y.
[Why this specific piece matters]
## Acceptance Criteria
- [ ] Specific, testable requirement 1
- [ ] Specific, testable requirement 2
- [ ] All existing tests pass (no regressions)
- [ ] New tests added for [what]
## Files to Modify
- `path/to/file.rs` — [what changes]
- `path/to/other.rs` — [what changes]
## Dependencies
- Blocked by: BT-XXX (if any)
## References
- ADR: `docs/ADR/NNNN-*.md`
- Related code: [links to relevant existing code]
## Out of Scope
- [Things explicitly NOT part of this issue]
Set up blocking relationships: Use Linear GraphQL to create all dependency links:
mutation {
issueRelationCreate(input: {
issueId: "<blocker issue ID>"
relatedIssueId: "<blocked issue ID>"
type: blocks
}) { success }
}
Also link Epic to all child issues.
Update the ADR: Add implementation tracking to the ADR file:
## Implementation Tracking
**Epic:** BT-XXX
**Issues:** BT-A, BT-B, BT-C, ...
**Status:** Planned
Commit and push:
git add docs/ADR/NNNN-*.md
git commit -m "docs: add implementation tracking to ADR NNNN BT-XXX"
git push
Summary:
## ADR NNNN Implementation Planned
**Epic:** BT-XXX — <title>
**Issues created:** X total (Y phases)
**Recommended start:** BT-A (Phase 1, no dependencies)
**Estimated total:** [S/M/L/XL]
Run `/pick-issue BT-A` to start Phase 1.
Every issue must be agent-ready — an agent should be able to pick it up with zero clarification:
Bottom-up by default: Runtime → Codegen → Parser → Tests → Docs
Each phase is independently shippable: After Phase 1 merges, the codebase is still healthy. You don't need Phase 2 to be "done."
Tests with each phase, not at the end: Every issue includes tests for its specific changes. Don't create a "write all the tests" issue at the end.
REPL integration is not optional: If the ADR affects user-facing behavior, include a REPL integration issue. Features aren't done until users can interact with them.
E2E validation as the final phase: The last issue in every epic MUST include an e2e btscript test (tests/e2e/cases/<feature>.btscript) that exercises the feature end-to-end from the Beamtalk REPL. This catches integration failures invisible to unit tests — missing code path dependencies, serialization bugs, broken describe/list-tools responses. The ADR 0069 tracing epic shipped 7 PRs that all passed CI but were non-functional from the REPL because no e2e test existed. EUnit and BUnit alone are insufficient for user-facing features.
If an issue feels like L or XL, split along these seams:
tools
Find the next logical piece of work. Use when user types /whats-next or asks what they should work on next, or wants recommendations for the next task.
development
Use when navigating code, finding references, looking up definitions, understanding types, or tracing call hierarchies in TypeScript, Rust, or Beamtalk (.bt) files. Prefer LSP over Grep/Glob for any navigation task where symbol semantics matter.
data-ai
Find and update Linear issues that need labels, blocking relationships, or metadata. Use when user says '/update-issues' with criteria like 'no labels', 'missing agent-ready', 'needs size', etc.
data-ai
Sync modified skills and agents back to the repo and create a PR. Use when user types /sync-skills or wants to save in-session skill improvements.