/SKILL.md
Persistent spec management for AI coding workflows. Use this skill when the user explicitly mentions specs, forging, or structured planning: says "forge", "forge a spec", "write a spec for X", "create a spec", "plan X as a spec", "resume", "what was I working on", "spec list/status/pause/switch/activate", "implement the spec", "implement phase N", "implement all phases", "generate openapi", or exits plan mode (offer to save as a spec). Also trigger when a `.specs/` directory exists at session start. Do NOT trigger on general feature requests, coding tasks, or questions that don't mention specs or forging — those are normal coding tasks, not spec management.
npx skillsauth add ngvoicu/specsmith-forge specmint-coreInstall 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.
Turn ephemeral plans into structured, persistent specs built through deep
research and iterative interviews. Specs have phases, tasks, acceptance
criteria, a registry, resume context, a decision log, and a deviations
log. They live in .specs/ at the project root and work with any AI
coding tool that can read markdown.
Whether .specs/ is committed is repository policy. Respect .gitignore
and the user's preference for tracked vs local-only spec state.
SKILL.md file..specs/registry.md.specs/<id>/SPEC.md, .specs/<id>/research-*.md,
.specs/<id>/interview-*.mdSPEC.md frontmatter is authoritative. Registry is a
denormalized index for quick lookup.← current marker, phase marker) AND
registry.md (progress count, date). Then re-read both files to verify
the edits landed correctly. Never move to the next task without updating
both files. Never end a session with the registry out of sync with
SPEC.md. This is non-negotiable — if you do nothing else, do this.If running as a Claude Code plugin, slash commands like /specmint-core:forge,
/specmint-core:resume, /specmint-core:pause etc. are available. See the
plugin's commands/ directory for the full set. The /forge command
replaces plan mode with deep research, iterative interviews, and spec
writing.
If active-spec context was injected by host tooling, use it directly instead of reading files. Otherwise, fall back to reading files manually:
.specs/registry.md to check for a spec with active status| Situation | Required behavior |
|-----------|-------------------|
| .specs/registry.md missing | If .specs/ exists, report "No registry yet" and offer to initialize it. If .specs/ is missing, report "No specs yet" and continue normally. |
| Malformed registry row | Skip malformed row, emit warning with row text, continue parsing remaining rows. |
| Multiple active rows | Warn user. Pick the row with the newest Updated date (or first active row if dates are unavailable) for this run. On next write, normalize to a single active spec. |
| Registry row exists but .specs/<id>/SPEC.md missing | Warn and continue. Keep row visible in list/status with (SPEC.md missing). |
| Registry and SPEC conflict | Trust SPEC.md, then repair registry values on next write. |
| No active spec | List available specs and ask which to activate or resume. |
When the user says "resume", "what was I working on", or similar:
Read .specs/registry.md — find the spec with active status. If none, list specs and ask which to resume
Load .specs/<id>/SPEC.md
Parse progress:
[x] vs total tasks per phase[in-progress] phase)← current marker, or first unchecked in current phase)Read the Resume Context section
Present a compact summary:
Resuming: User Auth System
Progress: 5/12 tasks (Phase 2: OAuth Integration)
Current: Implement Google OAuth callback handler
Context: Token exchange is working. Need to handle the callback
URL parsing and store refresh tokens in the user model.
Next file: src/auth/oauth/google.ts
Begin working on the current task — don't wait for permission
After completing each task, immediately edit the SPEC.md file to record progress. Do not wait until the end of a session or until asked — update the spec as you go. This is sacred (see Critical Invariant #6).
- [ ] -> - [x]← current to the next unchecked task[in-progress] -> [completed][pending] -> [in-progress]updated date in YAML frontmatterX/Y) and updated date in .specs/registry.mdUpdate transaction (required order — never skip steps):
SPEC.md (checkbox, current marker, phase marker, resume context).SPEC.md checkboxes.SPEC.md and registry.md to confirm the
edits are correct. If the registry progress doesn't match the SPEC.md
checkbox count, fix it now.SPEC.md as source of truth and emit a
warning with exact repair action for .specs/registry.md.If you notice you forgot to update after a previous task, stop what you're doing and update now before continuing. Stale tracking is the single most common failure mode — it makes resume unreliable and the registry useless.
Also:
When the user says "pause", switches specs, or a session is ending:
← current marker to the right taskstatus: paused in frontmatterupdated dateResume Context is the most important part of pausing. Write it as if
briefing a colleague who will pick up tomorrow. Include specific file paths,
function names, and the exact next step. Vague context like "was working on
auth" is useless — write "implementing verifyRefreshToken() in
src/auth/tokens.ts, the JWT verification works but refresh rotation isn't
hooked up to the /auth/refresh endpoint yet."
.specs/<target-id>/SPEC.md exists. If not, stop with an error.active in frontmatter and in .specs/registry.md.SKILL.md: global invariants, lifecycle rules, state authority, and conflict
handling, plus cross-tool OpenAPI behavior.commands/*.md: command-specific entrypoints, prompts, and output shapes.Critical Invariants from this file and
apply command-specific behavior only where it does not violate invariants.YAML frontmatter with: id, title, status, created, updated,
optional priority and tags.
Status values: active, paused, completed, archived
[pending], [in-progress], [completed], [blocked]
- [ ] [CODE-01] unchecked, - [x] [CODE-01] done<PREFIX>-<NN> — prefix is a short (2-4 letter) uppercase
abbreviation of the spec (e.g., user-auth-system → AUTH). Numbers
auto-increment across all phases starting at 01← current after the task text marks the active task[NEEDS CLARIFICATION] after the task code on unclear tasksTestable conditions that define when the spec is "done". Written during forge, verified after each phase completes. Format: checkboxes with specific, verifiable statements — not vague goals.
## Acceptance Criteria
- [ ] Users can sign in with Google OAuth and receive a JWT
- [ ] Expired tokens return 401 with `{"error": "token_expired"}`
- [ ] Refresh tokens rotate on each use (old token is invalidated)
- [ ] Rate limiting returns 429 after 100 requests per minute
Check off criteria as they are satisfied during implementation. At phase completion, review which acceptance criteria are now met. At spec completion, all criteria must be checked — if any remain unchecked, the spec is not done.
Blockquote section with specific file paths, function names, and exact next step. This is what makes cross-session continuity work.
Markdown table with date, decision, and rationale columns. Log non-obvious technical choices (library selection, architecture pattern, API design).
Markdown table tracking where implementation diverged from the spec: task, what the spec said, what was actually done, and why. Only log changes that would surprise someone comparing the spec to the code.
See references/spec-format.md for the full SPEC.md template.
When asked to forge, plan, spec out, or "write a spec for X", follow the full forge workflow: setup, research deeply, interview the user, iterate until clear, then write the spec.
If the environment is in read-only plan mode, do not run forge in that mode.
Ask the user to exit plan mode (Shift+Tab) and rerun /specmint-core:forge.
The forge workflow never produces application code. Its outputs are only
.specs/ files: research notes, interview notes, and the SPEC.md. If the
user says "write a spec", that means write a SPEC.md — not implement the
feature. Implementation happens separately, after the user reviews and
approves the spec.
"User Auth System" -> user-auth-system.specs/<id>/SPEC.md already exists or the ID
appears in .specs/registry.md, warn the user and ask:
<id>-v2 or ask for a new title)mkdir -p .specs/<id>
.specs/registry.md doesn't exist, initialize it:
# Spec Registry
| ID | Title | Status | Priority | Progress | Updated |
|----|-------|--------|----------|----------|---------|
Research is the foundation of a good spec. Be exhaustive — use every available resource. The goal is to gather enough context that the spec won't need revision mid-build.
Research runs on two parallel tracks to maximize thoroughness and speed:
Always spawn the specmint-core:researcher agent for codebase + internet
research. Don't skip this — the researcher is purpose-built for exhaustive
multi-source analysis and runs in parallel so it doesn't slow down the
workflow.
Spawn it with the Task tool, providing:
.specs/<id>/research-01.mdThe researcher will:
While the researcher runs, do these yourself — they use MCP tools that the researcher agent doesn't have access to:
When the researcher agent completes, read its output at
.specs/<id>/research-01.md. Merge your Context7 and cross-skill findings
into the research notes — either append to the file or keep them in mind
for the interview. The combined research should cover:
architecture, relevant code, tech stack, library comparisons, internet
research, Context7 docs, UI research (if applicable), risk assessment,
and open questions.
Present your research findings and ask targeted questions. Your research should inform specific questions, not generic ones.
STOP after presenting questions. Wait for the user to answer before proceeding. Do not answer your own questions, do not assume answers, and do not continue to Step 4 or Step 5 until the user has responded. The interview is a conversation — the user's answers shape the spec. If you skip this, the spec will be based on guesses instead of decisions.
Save to .specs/<id>/interview-01.md with: questions asked, user answers,
key decisions, and any new research needed.
Based on the user's answers, do another round of research — explore the
specific paths they chose, check feasibility, find potential issues. Save
to .specs/<id>/research-02.md.
Then present deeper findings and ask about trade-offs, edge cases,
implementation sequence, and scope refinement. Save each interview round
to interview-02.md, interview-03.md, etc.
Repeat research-then-interview until:
Two rounds is typical. Don't rush it — but don't drag it out either.
Synthesize all research notes, interview answers, and decisions into a
comprehensive SPEC.md. See references/spec-format.md for the full template.
The spec should be thorough and detailed — someone reading it should be able to implement the feature without guessing. Include:
[PREFIX-NN]) — be specific:
include file paths, function names, and expected behaviorDiagram guidelines:
Client → API Gateway → Auth Middleware → Route Handler → Database
↓
Cache Layer
graph TD
A[Client] --> B[API Gateway]
B --> C{Auth?}
C -->|Yes| D[Handler]
C -->|No| E[401]
Solution quality standards:
Coherence and logic review (mandatory before presenting):
Save to .specs/<id>/SPEC.md. Update .specs/registry.md — set
status to active.
Present the spec and wait for approval. Show the user the complete spec and ask: "Does this look right? Want to adjust anything before we start?" Do not begin implementing until the user explicitly approves. The forge workflow produces only spec files (SPEC.md, research-.md, interview-.md) — never application code. Implementation starts only after the user approves the spec and says to proceed.
Phase/task guidelines:
[in-progress], the rest as [pending]← currentWhen the user says "implement the spec", "implement phase N", "implement all phases", or similar:
Parse the user's request to determine scope:
← current marker) and work forward.specs/registry.md to find the active spec.specs/<id>/SPEC.md and parse phases/tasks← current
b. Implement it — write the actual code
c. Check it off: - [ ] → - [x]
d. Remove the ← current marker
e. When all tasks in a phase complete:
[in-progress] → [completed][pending] → [in-progress]
f. Update updated date in frontmatter
g. Update progress and date in .specs/registry.md[blocked] only when the whole phase is blockedWhen implementing, follow the testing strategy from the spec:
Before reporting any phase or spec as complete, provide evidence:
Evidence first, then assertions. This applies at task, phase, and spec completion boundaries.
When all tasks are done:
[completed]completed in frontmatter and registryupdated dateWhen the user says "generate openapi", "update api docs", or similar:
.openapi/openapi.yaml (OpenAPI 3.1.1) with:
operationId for every operationcomponents/schemas and $ref usage.openapi/endpoints/ using
{method}-{path-slug}.md names (e.g., get-api-users-id.md)..openapi/ files when updating.If the session is ending:
All state lives in .specs/ at the project root:
.specs/
├── registry.md # Denormalized index for status/progress lookups
└── <spec-id>/
├── SPEC.md # The spec document
├── research-01.md # Deep research findings
├── interview-01.md # Interview notes
└── ...
.specs/registry.md is a simple markdown table:
# Spec Registry
| ID | Title | Status | Priority | Progress | Updated |
|----|-------|--------|----------|----------|---------|
| user-auth-system | User Auth System | active | high | 5/12 | 2026-02-10 |
| api-refactor | API Refactoring | paused | medium | 2/8 | 2026-02-09 |
SPEC.md frontmatter is authoritative. The registry is a denormalized index for quick lookups. Always update both together — when you change status, progress, or dates in SPEC.md, immediately mirror those changes in the registry. If they ever conflict, SPEC.md wins.
Read .specs/registry.md and present specs grouped by status:
Active:
-> user-auth-system: User Auth System (5/12 tasks, Phase 2)
Paused:
|| api-refactor: API Refactoring (2/8 tasks, Phase 1)
Completed:
ok ci-pipeline: CI Pipeline Setup (8/8 tasks)
Use these concise formats consistently:
Resume
Resuming: <Title> (<id>)
Progress: <done>/<total> tasks
Phase: <phase name>
Current: <task text>
Context: <one to three lines from Resume Context>
List
Active:
-> <id>: <Title> (<done>/<total>, <phase>) [<priority>]
Paused:
|| <id>: <Title> (<done>/<total>, <phase>) [<priority>]
Completed:
ok <id>: <Title> (<done>/<total>) [<priority>]
Status
<Title> [<status>, <priority>]
Created: <date> | Updated: <date>
Phase <n>: <name> [<marker>]
Progress: <done>/<total> (<pct>%)
Current: <task text or none>
completed in frontmatter and registryupdated date in bothArchive completed specs to keep the registry clean:
archived in frontmatter and registry.specs/<id>/ can optionally be deleted
(the SPEC.md has all the decisions and context)Specs can be archived from completed or paused status. To reactivate
an archived spec, set its status back to active.
To remove a spec entirely:
.specs/<id>/ (contains SPEC.md, research notes, interviews).specs/registry.mdThis is irreversible — consider archiving instead if you might need it later.
The spec format is pure markdown with YAML frontmatter. Any tool that can read and write files can use these specs:
npx skills addnpx skills addTo configure another tool, run npx skills add ngvoicu/specmint-core -g -a <tool>.
Be proactive about spec management. If you notice the user has been working for a while and made progress, update the spec without being asked. If a session is ending, offer to pause and save context.
Specs should evolve. It's fine to add tasks, reorder phases, or split a phase into two as understanding deepens. Specs aren't contracts — they're living documents that adapt as you learn more about the problem.
The Decision Log matters. When the user makes a non-obvious technical choice (library selection, architecture pattern, API design), log it with the rationale. Future-you resuming this spec will thank present-you.
Don't over-structure. A spec with 3 phases and 15 tasks is useful. A spec with 12 phases and 80 tasks is a project plan, not a coding spec. Keep it lean enough to parse and act on in one read.
Respect the user's flow. Don't interrupt deep coding work to update the spec. Batch updates for natural pauses — task completion, phase transitions, or session boundaries.
development
Persistent spec management for AI coding workflows. Use this skill when the user explicitly mentions specs, forging, or structured planning: says "forge", "forge a spec", "write a spec for X", "create a spec", "plan X as a spec", "resume", "what was I working on", "spec list/status/pause/switch/activate", "implement the spec", "implement phase N", "implement all phases", "generate openapi", or exits plan mode (offer to save as a spec). Also trigger when a `.specs/` directory exists at session start. Do NOT trigger on general feature requests, coding tasks, or questions that don't mention specs or forging — those are normal coding tasks, not spec management.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.