This skill should be used when the user asks about "spec system", "session workflow", "createprd", "plansession", "implement session", "validate session", "phase build", "session scope", "task checklist", or when working in a project containing .spec_system/ directory. Provides guidance for specification-driven AI development workflows.
A specification-driven workflow system for AI-assisted development that breaks large projects into manageable 2-4 hour sessions with 12-25 tasks each.
1 session = 1 spec = 2-4 hours (12-25 tasks)
Break large projects into manageable, well-scoped implementation sessions that fit within AI context windows and human attention spans.
A collection of sessions is a phase. A collection of phases is a mature/late technical PRD.
The workflow has 3 distinct stages:
/initspec -> Set up spec system in project
|
v
/createprd -> Generate PRD from requirements doc (optional)
OR OR
[User Action] -> Manually populate PRD with requirements
|
v
/createuxprd -> Generate UX PRD from design docs (optional)
OR OR
[User Action] -> Manually populate UX PRD with requirements
|
v
/phasebuild -> Create first phase structure (session stubs)
/plansession -> Analyze project, create spec + task checklist
|
v
/implement -> AI-led task-by-task implementation
|
v
/validate -> Verify session completeness
|
v
/updateprd -> Sync PRD, mark session complete
|
+-------------> Loop back to /plansession
until ALL phase sessions complete
/audit -> Local dev tooling (formatter, linter, types, tests, observability, hooks)
|
v
/pipeline -> CI/CD workflows (quality, build, security, integration, ops)
|
v
/infra -> Production infrastructure (health, security, backup, deploy)
|
v
/carryforward -> Capture lessons learned (optional but recommended)
|
v
/documents -> Audit and update documentation
|
v
[User Action] -> Manual testing and LLM audit (HIGHLY recommended)
|
v
/phasebuild -> Create next phase structure
|
v
-> Return to Stage 2 for new phase
Projects using this system follow this layout:
project/
|-- .spec_system/ # All spec system files
| |-- state.json # Project state tracking
| |-- CONSIDERATIONS.md # Institutional memory (lessons learned)
| |-- SECURITY-COMPLIANCE.md # Security posture & GDPR compliance
| |-- CONVENTIONS.md # Project coding standards and conventions
| |-- PRD/ # Product requirements
| | |-- PRD.md # Master PRD
| | \-- phase_NN/ # Phase definitions
| |-- specs/ # Implementation specs
| | \-- phaseNN-sessionNN-name/
| | |-- spec.md
| | |-- tasks.md
| | |-- implementation-notes.md
| | |-- security-compliance.md
| | \-- validation.md
| |-- scripts/ # Bash automation (if copied locally)
| \-- archive/ # Completed work
\-- (project source files)
Monorepo projects use the same single .spec_system/ at the repo root. Sessions reference their target package in metadata (spec.md header and state.json), not in directory names.
monorepo-project/
|-- .spec_system/ # Single spec system at repo root
| |-- state.json # Includes monorepo flag + packages array
| |-- CONVENTIONS.md # Includes Workspace Structure table
| |-- CONSIDERATIONS.md
| |-- SECURITY-COMPLIANCE.md
| |-- PRD/
| | |-- PRD.md # Includes Package Map section
| | \-- phase_00/
| | |-- session_01_project_setup.md
| | |-- session_02_web_scaffold.md # Package: apps/web
| | \-- session_03_api_models.md # Package: apps/api
| |-- specs/
| | |-- phase00-session01-project-setup/ # Cross-cutting (no package)
| | |-- phase00-session02-web-scaffold/ # Scoped to apps/web
| | \-- phase00-session03-api-models/ # Scoped to apps/api
| \-- archive/
|-- apps/
| |-- web/ # Frontend package
| \-- api/ # Backend package
\-- packages/
\-- shared/ # Shared library
Key differences from single-repo:
Package: annotationPackage: and Package Stack: fieldsFormat: phaseNN-sessionNN-name
phaseNN: 2-digit phase number (phase00, phase01)sessionNN: 2-digit session number (session01, session02)name: lowercase-hyphenated descriptionExamples:
phase00-session01-project-setupphase01-session03-user-authenticationphase02-session08b-refinements| Limit | Value | |-------|-------| | Maximum tasks | 25 | | Maximum duration | 4 hours | | Objectives | Single clear objective |
| Target | Value | |--------|-------| | Task count | 12-25 (sweet spot: 20) | | Duration | 2-3 hours | | Focus | Stable/late MVP |
- [ ] TNNN [SNNMM] [P] Action verb + what + where (`path/to/file`)
Components:
TNNN: Sequential task ID (T001, T002, ...)[SNNMM]: Session reference (S0103 = Phase 01, Session 03)[P]: Optional parallelization markerMark tasks [P] when they:
All files must use ASCII-only characters (0-127):
Validate with:
file filename.txt # Should show: ASCII text
grep -P '[^\x00-\x7F]' filename.txt # Should return nothing
The .spec_system/state.json file tracks project progress:
{
"version": "2.0",
"project_name": "Project Name",
"current_phase": 0,
"current_session": null,
"phases": {
"0": {
"name": "Foundation",
"status": "in_progress",
"session_count": 5
}
},
"completed_sessions": [],
"next_session_history": []
}
When monorepo is confirmed true, state.json gains a packages array and uses object-form completed_sessions:
{
"version": "2.0",
"project_name": "Acme Platform",
"monorepo": true,
"packages": [
{ "name": "web", "path": "apps/web", "type": "frontend", "stack": "TypeScript + React" },
{ "name": "api", "path": "apps/api", "type": "backend", "stack": "Python 3.12 + FastAPI" },
{ "name": "shared", "path": "packages/shared", "type": "library", "stack": "TypeScript" }
],
"current_phase": 0,
"current_session": "phase00-session04-api-models",
"phases": {
"0": { "name": "Foundation", "status": "in_progress", "session_count": 6 }
},
"completed_sessions": [
{ "id": "phase00-session01-project-setup", "package": null },
{ "id": "phase00-session02-web-scaffold", "package": "apps/web" },
{ "id": "phase00-session03-shared-types", "package": "packages/shared" }
],
"next_session_history": []
}
The monorepo field uses three states:
| Value | Meaning | Behavior |
|-------|---------|----------|
| null (or absent) | Unknown / not yet determined | Commands look for signals, prompt if found |
| true | Confirmed monorepo | Commands use package-aware logic |
| false | Confirmed single-repo | Commands skip package logic entirely |
Single-repo projects see no packages field and keep string-form completed_sessions. Existing state files without monorepo are treated as null (unknown), which behaves identically to classic single-repo until the user confirms otherwise.
| Command | Purpose | Input | Output |
|---------|---------|-------|--------|
| /initspec | Initialize spec system | Project info | .spec_system/ structure |
| /createprd | Generate master PRD | Requirements doc or user text | PRD/PRD.md |
| /createuxprd | Generate UX PRD | Design docs or user text | PRD/PRD_UX.md |
| /plansession | Analyze, spec, and task list | state.json, PRD | specs/.../spec.md + tasks.md |
| /implement | Code implementation | spec.md, tasks.md | implementation-notes.md |
| /validate | Verify completeness | All session files | security-compliance.md, validation.md |
| /updateprd | Mark complete | validation.md | Updated state.json |
| /audit | Local dev tooling | CONVENTIONS.md | Updated tools, report |
| /pipeline | CI/CD workflows | CONVENTIONS.md | Workflow files, report |
| /infra | Production infra | CONVENTIONS.md | Configs, report |
| /documents | Audit/update docs | state.json, PRD, codebase | Updated docs, docs-audit.md |
| /carryforward | Capture lessons & security posture | Completed phase artifacts | CONSIDERATIONS.md, SECURITY-COMPLIANCE.md |
| /phasebuild | Create new phase | PRD | PRD/phase_NN/ |
Standalone helpers that operate outside the session workflow. They do not affect session state and can be run at any time. See docs/UTILITIES.md for the full reference and conventions for adding new utility commands.
Utility scripts are available at two locations:
${CLAUDE_PLUGIN_ROOT}/scripts/ (default, always up-to-date).spec_system/scripts/ (optional, for per-project customization)Local scripts take precedence - if .spec_system/scripts/ exists, commands use local scripts instead of plugin scripts.
Available scripts:
analyze-project.sh - Project state analysis (supports --json for structured output)check-prereqs.sh - Environment and tool verification (supports --json for structured output)common.sh - Shared functionsTo copy scripts locally during /initspec, choose "copy locally" when prompted. To revert to plugin scripts, delete .spec_system/scripts/.
Commands use a hybrid approach for reliability:
analyze-project.sh --json): Authoritative state factscheck-prereqs.sh --json): Tool and prerequisite validationWhy this matters:
analyze-project.sh JSON Output:
{
"project": "project-name",
"monorepo": true,
"packages": [
{"name": "web", "path": "apps/web", "type": "frontend", "stack": "TypeScript + React"}
],
"active_package": {"name": "web", "path": "apps/web"},
"monorepo_detection": null,
"current_phase": 1,
"current_session": "phase01-session02-feature",
"completed_sessions": [
{"id": "phase00-session01-setup", "package": null}
],
"candidate_sessions": [
{"file": "session_01_auth", "completed": false, "package": "apps/web"}
]
}
For single-repo projects: monorepo is null or false, packages is [], active_package is null, and completed_sessions uses the string array format.
check-prereqs.sh JSON Output:
{
"overall": "pass",
"environment": {
"spec_system": {"status": "pass"},
"jq": {"status": "pass", "info": "jq-1.7"}
},
"tools": {
"node": {"status": "pass", "info": "v20.10.0"},
"docker": {"status": "fail", "info": "not installed"}
},
"package": {
"registered": {"status": "pass", "info": "apps/web"},
"directory": {"status": "pass", "info": "apps/web"},
"manifest": {"status": "pass", "info": "package.json"},
"stack": {"status": "pass", "info": "TypeScript"}
},
"workspace": {
"status": {"status": "pass", "info": "monorepo detected"},
"manager": {"status": "pass", "info": "pnpm"},
"runner": {"status": "pass", "info": "turbo"}
},
"database": {
"type": {"status": "pass", "info": "PostgreSQL"},
"migration_tool": {"status": "pass", "info": "prisma"},
"tool_available": {"status": "pass", "info": "npx prisma"},
"seed_script": {"status": "warn", "info": "no seed script found"}
},
"issues": [
{"type": "tool", "name": "docker", "message": "required tool not installed"}
]
}
The package and workspace sections appear only when --package is used or monorepo is detected. The database section only appears when DB signals are detected in the project. For single-repo projects without databases, these sections are empty objects ({}).
Commands and their script usage:
| Command | analyze-project.sh | check-prereqs.sh |
|---------|-------------------|------------------|
| /plansession | State + candidates | - |
| /implement | Current session | Environment + tools |
| /validate | Current session | - |
| /documents | State + progress | - |
The system supports monorepo projects through a "gentle assumption" -- it auto-detects multi-package structures and offers package-aware workflows, but never requires them. Single-repo projects see zero behavioral change.
Detection is layered across commands:
/initspec (brownfield): Detects existing workspace configs (pnpm, npm, turbo, nx, cargo, go, lerna)/createprd (greenfield): Parses PRD content for multi-package signals/phasebuild: Checkpoint -- warns if PRD references packages but state lacks themPackage context flows through sessions:
/plansession determines the target package (user input, stub annotation, or prompt)Package: and Package Stack: fieldsapps/web/src/auth.ts)/implement validates files stay within declared package scope/updateprd records package in completed_sessionsSession numbering is global within a phase:
apps/web, session 03 apps/api)Scripts accept --package flag for scoped operations:
analyze-project.sh --json --package apps/web -- filters candidates by packagecheck-prereqs.sh --json --package apps/web -- validates package-specific tools| Manager | Detection File |
|---------|---------------|
| pnpm | pnpm-workspace.yaml |
| npm/yarn | package.json with "workspaces" field |
| Turborepo | turbo.json |
| Nx | nx.json |
| Cargo | Cargo.toml with [workspace] |
| Go | go.work |
| Lerna | lerna.json |
Each package gets a stack field based on its manifest files:
| Stack | Indicator |
|-------|-----------|
| TypeScript | tsconfig.json |
| JavaScript | package.json (no tsconfig) |
| Rust | Cargo.toml |
| Go | go.mod |
| Python | pyproject.toml, setup.py, or requirements.txt |
| Ruby | Gemfile |
| Java | pom.xml, build.gradle, or build.gradle.kts |
/documents after completing a phase or adding packages| Problem | Solution |
|---------|----------|
| Scope too large | Split session in PRD before /plansession |
| ASCII validation fails | Run grep -P '[^\x00-\x7F]' to find issues |
| State out of sync | Manually update .spec_system/state.json |
| Commands not found | Verify plugin is enabled |
| Tasks taking too long | Reduce scope, defer non-MVP items |
| Missing tools | Run check-prereqs.sh --tools "tool1,tool2" to verify |
| Environment issues | Run check-prereqs.sh --env to diagnose |
| Stale documentation | Run /documents to audit and update |
| Missing docs | Run /documents to create standard files |
| Lint/format issues | Run /audit to add tooling and auto-fix |
| CI failures | Run /pipeline to add workflows and fix errors |
| Infra not validated | Run /infra to configure health, security, backup, deploy |
| Monorepo not detected | Run /initspec on an existing repo or describe packages in PRD for /createprd |
| Wrong package context | Specify package when running /plansession (e.g., "plan for apps/web") |
| Cross-package session | Set package to null for sessions spanning multiple packages |
| Package tools missing | Run check-prereqs.sh --json --package apps/web to diagnose |
Monorepo not detected by /initspec: Workspace config may have been added after init, or uses a non-standard layout. Manually set "monorepo": true in state.json, add a packages array, add the Workspace Structure table to CONVENTIONS.md, then run /createprd or /plansession to pick up the config.
Session planned for wrong package: If caught before /updateprd, delete the session spec directory and re-run /plansession with the correct package. If caught after /updateprd, manually edit the package field in the relevant completed_sessions entry in state.json.
Package added mid-project: Add the package entry to state.json's packages array, update CONVENTIONS.md's Workspace Structure table, add session stubs to PRD/phase_NN/ with Package: annotations, and increment session_count in the phase's state entry.
Cross-package dependency discovered mid-session: Complete the current session with stubs/interfaces, note the dependency in implementation-notes.md, and plan the shared package session next. Use a cross-cutting session (package: null) when work genuinely spans packages.
Different packages need different tool versions: Use workspace-level version management (.nvmrc per package, engines in package.json). /audit handles shared tools at root with per-package overrides. Validate with check-prereqs.sh --package apps/web.
State disagrees with workspace configs: Run analyze-project.sh --json -- it reports both the state.json monorepo flag and live monorepo_detection. Compare them and update state.json manually if needed.
| Situation | Action |
|-----------|--------|
| New empty project | /initspec sets monorepo: null, deferred to /createprd |
| Existing monorepo project | /initspec auto-detects, confirms with user |
| PRD describes multiple services | /createprd prompts to confirm monorepo |
| Session targets one package | /plansession scopes spec and tasks to that package |
| Session spans packages | Use cross-cutting session (package: null) |
| Need to add a package mid-project | Manually update state.json and CONVENTIONS.md |
| Phase has mixed-package sessions | Normal -- sessions interleave, phase completes when all done |
| Different stacks per package | /audit and /pipeline handle per-package tool config |
Search for places (restaurants, cafes, etc.) via Google Places API proxy on localhost.
Interact with GitHub using the `gh` CLI. Use `gh issue`, `gh pr`, `gh run`, and `gh api` for issues, PRs, CI runs, and advanced queries.
Create or update AgentSkills. Use when designing, structuring, or packaging skills with scripts, references, and assets.
Start voice calls via the OpenClaw voice-call plugin.
Notion API for creating and managing pages, databases, and blocks.
Gemini CLI for one-shot Q&A, summaries, and generation.
Category:developer