Just a couple months ago, I was still doing a lot of “vibe coding.” I’d get a fuzzy feature idea in my head, then vomit words straight into the editor, and hope I would remember what I was thinking when I first prompted.
Today, that’s completely flipped.
Every meaningful feature for TutorPro now starts the same way: with an AI agent that interviews me, crawls my codebase and docs, cross‑checks my standards, and then hands me a stack of small, well‑formed GitHub issues—each sized to be implemented in roughly 3–8 hours (human time).
The star of that show is my custom spec-writer command, built on top of Claude Code's slash command system and a set of "skills" that know how to interact with my repo, docs, and GitHub CLI.
This post is the deep dive on that spec-writing phase: how it works, what it feels like to use, and why it’s the thing that lets me move with both precision and velocity instead of just shipping faster chaos. Also: fair warning, there will be dad jokes. I have teenagers and a codebase; the puns are compulsory – the more embarassing, the better.
When I began approaching AI as an entire distributed dev team—cloud agents, local agents, CI bots, and more (see this deep dive on agentic dev workflows)—I hit a classic scaling snag: my specs just weren’t cutting it.
That was survivable when I was the only “developer” in the loop. But as soon as I started delegating work to multiple agents and tools, poorly defined specs translated directly into:
The fix was simple but non‑negotiable: every feature gets decomposed into small, spec‑driven phases that respect my standards and constraints. That’s exactly what my spec-writer command enforces.
Instead of trying to hold everything in my head, I sit down with an AI spec writer that refuses to let me hand‑wave the hard parts. It drags the full picture out of me—architecture, UI, data, tests, logging, email rules, Firestore collections—before anyone (human or agent) writes a line of code.
I used to “ship and pray.” Now I “spec and pray less.”
Here’s the concrete stack I’m using today for this workflow:
.claude/commands/tutorpro/..claude/skills/ that encapsulate GitHub operations, refactoring discipline, database design, and UI testing.gh) for creating issues and wiring everything into my repo's workflow.docs/standards/ and meta‑guidance in AGENTS.md that define how everything should work.But while the implementation is very "TutorPro + Claude Code + GitHub," the pattern itself is portable:
So think of this as:
LLM-powered spec assistant + standards corpus + CLI automation → phased issues
The specifics are mine. The pattern can be yours.
To replicate the spirit of this setup, you need:
AGENTS.md plus docs/standards/global|frontend|backend|testing/*.gh issue create (guided by .claude/skills/github.md).spec-writer CommandThe spec-writer command lives in .claude/commands/tutorpro/spec-writer.md. It’s not a single prompt—it’s a full workflow.
At a high level, it runs through seven stages:
ghLet me unpack those the way the command does.
When I trigger /tutorpro:spec-writer with Claude or /tutorpro/spec-writer in Cursor chat, the command doesn’t immediately start writing specs. It first:
src/, Cloud Functions in functions/, or tests in tests/ or functions/test/.http://localhost:5173 (once I have npm run dev running).AGENTS.md for global rules.docs/standards/global/tech-stack.md for platform constraints.docs/standards/* for the right coding, API, validation, and testing rules.The command file literally instructs the agent to inspect the UI, note existing patterns, and look for inconsistencies to avoid. It’s not guessing from vibes; it’s reading the same source of truth I would.
Next, the command forces a decomposition step.
It has built‑in guidance around what makes a good phase:
It also provides decomposition patterns right in the spec:
The spec-writer uses those patterns to propose phases, then asks me to confirm or adjust them before proceeding.
Once phases are sketched, the command goes phase‑by‑phase and asks the right questions only for this phase:
The command also knows when to pull in specialized skills:
.claude/skills/database-design.md..claude/skills/refactoring.md..claude/skills/testing-user-interface.md..claude/skills/github.md. (I am exploring Github MCP as an alternative)This is where the agent forces me to think about the whole picture:
“Okay Jeremy, if we add this Firestore collection, did you remember security rules, indexes, seed scripts, and schema docs?”
For each phase, the command synthesizes a concise spec with:
It intentionally keeps each spec small and sharp. If a phase is bloated or ambiguous, the command tells me to break it down again.
gh issue createOnce the specs look right, the command moves into GitHub‑mode, using patterns from .claude/skills/github.md to:
gh.For example, a phase might become something like this under the hood:
gh issue create \
--title "Phase 1: Implement basic session scheduling data model" \
--label "phase-1,feature/scheduling,priority/medium" \
--body "$(cat <<'EOF'
## What This Phase Delivers
Implements the core Firestore collections, indexes, and security rules needed for basic session scheduling, without any UI.
## Requirements
1. Define Firestore collections and document shapes for sessions.
2. Add required entries to functions/functions/data-operations.js COLLECTIONS.
3. Add or update Firestore security rules and composite indexes.
4. Update docs/reference/database/schema.md with the new structures.
## Testing
- [ ] Emulator tests pass for read/write scenarios.
- [ ] Security rules verified for tutor/parent/student roles.
- [ ] No existing tests broken.
## Standards Compliance
- [ ] Follows docs/standards/backend/models.md
- [ ] Follows docs/standards/backend/queries.md
- [ ] Follows docs/standards/global/validation.md
> Generated with Claude Code spec-writer
EOF
)"
The spec-writer doesn’t just hand me text; it generates and runs GitHub CLI commands like this automatically via Claude’s tools, so issues get created for me while I watch.
Finally, the command presents a dependency‑ordered list of phases:
It also highlights dependencies between them (e.g., “Phase 2 requires Phase 1”) and gives a rough total estimate window based on 3–8 hour chunks.
At that point, I’ve gone from “I have a vague idea” to “I have a mini roadmap in GitHub with clear, testable units of work.” That’s where the magic really starts.
Here’s a (lightly anonymized) example of how this feels in practice:
Me:
/tutorpro/spec-writer— I want to add a new workflow that lets tutors propose session times and parents confirm them.
Spec Writer: Got it. Is this a new feature, an enhancement, or a refactor with behavior changes?
Me: New feature.
Spec Writer: Great. I’ll scan the existing scheduling and messaging code, plus your standards. Is the dev server running athttp://localhost:5173so I can inspect the UI?
Me: Yep.
Spec Writer: Which role should I log in as to see the relevant flows? (tutor, parent, student, admin)
Me: Tutor.
Spec Writer: Perfect. I see existing calendar patterns in the tutor dashboard and invitation flows I can mirror. I propose 3 phases: data & security, basic proposal/confirmation UI, and reminders & notifications. Does that match how you’re thinking about it?
Me: Yes, but let’s keep reminders out of scope for now.
Spec Writer: Cool, we’ll move reminders to a future phase. Also, I promise not to overbook your calendar—unlike your kids’ weekend activities.
It’s not “ask a single prompt, get perfect tickets.” It’s a guided interview that bakes your standards and context into the spec.
Let me walk through a typical session, end‑to‑end.
I sit down with a vague thought, like:
“Parents should be able to do X more easily.”
Historically, that’s where I’d jump straight into the editor. Now I:
/tutorpro/spec-writer.The spec-writer:
AGENTS.md to remember the “ALWAYS (NO EXCEPTIONS)” rules.docs/standards/global/* and the relevant frontend/backend/testing standards.It then reflects back what exists today, often catching things I forgot:
support@tutorpro.kids as the sender.”We iterate on a set of phases, usually:
Each phase is trimmed down until it’s:
For each phase, the agent proposes:
We tweak until it feels right, and then move on.
Finally, the spec-writer uses the GitHub skill to turn those specs into concrete gh commands and then runs them automatically for me.
Sometimes that means issuing them one at a time (roughly like this behind the scenes):
gh issue create \
--title "Phase 2: Tutor proposal & parent confirmation UI" \
--label "phase-2,feature/scheduling" \
--assignee "@me" \
--body "<full phase spec goes here>"
Sometimes it effectively chains multiple gh calls together in a mini shell session, conceptually like this:
PHASE1_URL=$(gh issue create --title "Phase 1: Scheduling data model" --body "<spec>" --label "phase-1,feature/scheduling,priority/medium")
PHASE2_URL=$(gh issue create --title "Phase 2: Tutor proposal UI" --body "<spec>" --label "phase-2,feature/scheduling,priority/medium")
PHASE3_URL=$(gh issue create --title "Phase 3: Parent confirmations & edge cases" --body "<spec>" --label "phase-3,feature/scheduling,priority/low")
echo "Created:"
echo "$PHASE1_URL"
echo "$PHASE2_URL"
echo "$PHASE3_URL"
Either way, the pipeline is the same:
Fuzzy idea → Structured conversation → Phases → Specs → GitHub issues → Implementation (by me or other agents).
The qualitative difference? I no longer wake up wondering “what was this ticket actually supposed to do?” I wrote it with an AI partner that refused to let me skip the thinking.
The irony is that the more constraints I’ve added to this process, the faster I’ve gotten.
The spec-writer doesn’t just ask “what do you want built?” It continually pulls in:
docs/standards/global/*
All of that gets baked into the spec, so when an agent picks up a phase, it already knows:
Here’s a simplified sketch of the kind of issue body the spec-writer will output for a phase:
## What This Phase Delivers
Adds a read-only tutor dashboard view showing upcoming confirmed sessions, using existing layout and responsive patterns.
## Requirements
1. Fetch confirmed sessions for the logged-in tutor from Firestore using existing hooks.
2. Display sessions in a responsive list, following components in src/components/Dashboard.
3. Show loading, empty, and error states consistent with docs/standards/frontend/components.md.
4. Log errors using the shared logger utility (no direct console calls).
## Testing
- [ ] Unit tests for data fetching hook.
- [ ] UI tests covering loading/empty/error/happy paths.
- [ ] Verified on desktop and mobile breakpoints.
## Standards Compliance
- [ ] docs/standards/global/coding-style.md
- [ ] docs/standards/frontend/components.md
- [ ] docs/standards/frontend/css.md
- [ ] docs/standards/testing/test-writing.md
Multiply that by a few phases, and you see why this feels more like intentional architecture than “ticket stuffing.”
You don’t need my exact stack to steal this idea.
The core pattern is:
LLM-powered spec assistant + standards corpus + CLI/API → phased work items
There are multiple ways to get there:
docs/ folder like mine.If you don’t want to roll your own from scratch, there are also prebuilt ecosystems that aim in a similar direction:
The point isn’t that you must use my spec-writer. It’s that your future development velocity is directly tied to how you spec work—and how well your tools can understand and act on those specs.
The biggest change for me isn’t just faster shipping. It’s the mindset shift.
I no longer think of specs as a chore I rush through so I can “get to the real work.” Specs are the work. They’re where I:
AI then amplifies that effort:
I still produce plenty of code—but now I’m acting more like a senior architect orchestrating agents than a solo dev panic‑coding features.
And because this is the internet and I am, in fact, a dad:
If you’re curious where to start, don’t try to automate everything on day one. Pick one feature, one LLM, one set of standards, and one way to auto‑create issues. Let your own spec-writer interview you, and see how it feels to ship with both precision and velocity.
–Jeremy
Thanks for reading! I'd love to hear your thoughts.
Have questions, feedback, or just want to say hello? I always enjoy connecting with readers.
Get in TouchPublished on December 03, 2025 in tech