spec-plan — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited spec-plan (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Write a proportional plan so clear that any engineer can follow it. The selected planning mode determines whether the plan stays in the conversation or becomes a persisted structured artifact. This skill does not write code or start implementation.
atelier-orchestrator owns automatic classification and the human may override it. When this skill is directly invoked without a selected mode, use Spec-backed Plan. If Inline planning reveals substantial design or coordination needs, ask the human whether to switch to a Spec-backed Plan before presenting the plan.
This skill produces exactly one plan output and then stops:
plan.json from an approved design.md.Planning drafts and annotation cycles stay in conversation. Do not modify design.md, persist a Markdown plan draft, create tracker entries, invoke another workflow skill, or edit implementation files. These rules still apply when the human asks to plan and implement in one request. Implementation requires a later, explicit request after this skill has finished.
same need.
layers.
Before presenting any plan, compare its size and concepts with the requested behavior. If a bounded migration or refactor introduces shared infrastructure, unrelated behavior, or a plan substantially larger than the behavior being changed, stop and simplify it.
Before presenting a plan, dispatch two read-only subagents in parallel with the draft plan and its design context. Select each agent explicitly (see Delegation in atelier-orchestrator):
and whether task ordering respects the dependencies.
unproven requirements, and propose simpler alternatives.
Each returns at most five evidence-backed findings. Fold in the valid ones, drop the rest with a reason, and present the plan with a short Challenged note listing what changed.
Run the gate on every Spec-backed Plan. Run it on an Inline Plan only when the change touches a data model, an API contract, or more than one module or layer; skip it for small bounded edits. Run it once per draft; do not re-run it for the human's annotation revisions unless the plan's structure changes.
No repository artifact and no task tracker entry. Read references/plan_template.md and present the plan in conversation using its structure. Omit optional subsections rather than rendering empty headings.
Read enough of the codebase to identify the current behavior, boundaries, affected files, and concrete validation. Keep the plan proportional to implementation risk. Fill the template with confirmed, file-and-symbol-level details, including cross-file wiring or ordering constraints where they matter. Apply the Planning Rules, Proportionality Gate, and Challenge Gate before presenting it.
Do not manufacture phases, task IDs, dependency graphs, acceptance matrices, design.md, plan.json, tracker entries, or harness todos. The conversation is the plan artifact.
Tell the human: "Inline Plan ready for review."
STOP. Wait for human review.
If the human requests any adjustment, apply it to the working plan and re-present the entire updated plan using references/plan_template.md. Include unchanged sections so the human reviews one coherent plan. Never respond with only the changed text, an affected section, a summary, or an acknowledgement. A one-word correction is still a plan revision: incorporate it and present the complete plan again.
Every revision invalidates prior approval. End each revised plan with "Inline Plan ready for review." and stop until the human explicitly approves that complete version. Do not implement until the current plan is approved.
When the human approves the Inline Plan, acknowledge that the plan is approved and stop. Do not implement it in the same invocation. A later explicit implementation request may execute the approved conversational plan directly using the Inline execution safeguards in atelier-orchestrator; it does not use spec-implement, spec-finish, code-subagents, or task tracking.
docs/specs/YYYY-MM-DD-<feature-name>/
├── design.md ← From spec-brainstorm (approved)
└── plan.json ← This skill's outputThe plan starts as a conversational draft for human annotation, then gets converted to structured plan.json when approved.
{
"feature": "user-authentication",
"spec": "docs/specs/2026-03-08-user-auth/design.md",
"goal": "Add email/password authentication with session management",
"preserved_behavior": [
"Existing sessions remain valid"
],
"phases": [
{
"id": "P1",
"name": "Authenticate with email and password",
"tasks": [
{
"id": "T1",
"name": "Accept valid credentials and reject invalid credentials",
"depends_on": [],
"inputs": [
"User schema from design.md",
"Validation rules (email format, password strength)"
],
"description": "Create UserEntity with email and password fields. Implement validation using a Result type. Password must be hashed, never stored plaintext.",
"files": {
"reuse": ["src/auth/password.ts"],
"create": ["src/entities/user.ts", "tests/entities/user.test.ts"],
"modify": [],
"delete": []
},
"new_abstractions": [
{
"name": "UserEntity",
"requirement": "Validate email/password credentials",
"consumers": ["POST /sessions"]
}
],
"validation": {
"tests": [
"rejects empty email",
"rejects invalid email format",
"rejects weak password",
"accepts valid user input"
],
"acceptance": [
"All validation tests pass",
"User.fromRequest returns Result<User>",
"No direct throws — all errors via Result"
]
}
}
]
}
]
}#### Top-level fields
| Field | Type | Description |
|---|---|---|
| feature | string | Kebab-case feature name |
| spec | string | Path to the approved design.md |
| goal | string | One-sentence goal |
| preserved_behavior | string[] | Short list of existing behavior that must remain unchanged |
| phases | Phase[] | Implementation phases in dependency order |
#### Phase fields
| Field | Type | Description |
|---|---|---|
| id | string | Phase identifier (P1, P2...) |
| name | string | Phase name (e.g. "Domain Model", "Data Access") |
| tasks | Task[] | Tasks within this phase |
#### Task fields
| Field | Type | Description |
|---|---|---|
| id | string | Task identifier (T1, T2...) |
| name | string | What this task implements |
| depends_on | string[] | Task IDs that must complete first |
| inputs | string[] | What you need to know before starting |
| description | string | What to build, key decisions, constraints |
| files | {reuse, create, modify, delete} | Existing code to reuse, modify, or delete, plus files to create |
| new_abstractions | {name, requirement, consumers}[] | New abstractions mapped to a present requirement and current consumers |
| validation | {tests, acceptance} | How to verify the task is done |
Read the approved design.md, apply the Challenge Gate to the draft, then present the plan draft in conversation. Do not write the draft into design.md or create a separate draft file.
Write assuming the implementer:
Each task should be self-contained and include:
when the task adds none
No exact code snippets. No implementation details. The task says WHAT and HOW TO VERIFY, not HOW to write the code.
Order tasks by required behavior and real dependencies. Keep changes across layers in one task when they implement and verify one contract; do not create one task per layer.
Each task should take 15-60 minutes. If larger, decompose into smaller tasks.
Tell the human: "Plan draft is ready for review."
STOP. Wait for human review.
The human annotates the plan draft directly — adding corrections, rejections, domain knowledge, business constraints, or "remove this entirely."
You write plan → Human adds inline notes → You address all notes → Repeat 1-6xWhen the human says "I added notes":
The "don't implement yet" guard is sacred. The plan is not ready until the human explicitly approves it.
| Pattern | Example | What to do |
|---|---|---|
| Correct assumptions | "use PATCH not PUT" | Fix it |
| Reject approaches | "remove caching, we don't need it" | Cut cleanly |
| Add constraints | "queue consumer already handles retries" | Restructure |
| Override choices | "use drizzle:generate, not raw SQL" | Direct override |
| Redirect sections | "visibility on the list, not items" | Rethink section |
| Trim scope | "remove download, not implementing now" | Remove, no stubs |
When the human approves — "looks good", "approved", "create tasks" — convert the plan into plan.json.
depends_on fieldsplan.jsonAfter creating plan.json, verify:
When plan.json is created, report its path and stop.
Tell the human:
"Planning complete. Plan written todocs/specs/<path>/plan.json. A separatespec-implementinvocation can execute it."
Do not invoke spec-implement, offer execution modes, or start implementing. The human must start implementation with a separate request.
Minor implementation deviations may be recorded inline and reflected in plan.json when they do not change approved behavior, scope, architecture, public contracts, or major dependencies. Material changes return to spec-plan for renewed approval; design changes return to spec-brainstorm. See atelier-orchestrator for iteration patterns.
| Selected mode / human says | You do |
|---|---|
| Inline / "write a plan" | Present the complete Inline Plan from the template, stop |
| Inline / "I added notes" | Apply the changes, re-present the entire updated Inline Plan, and stop for renewed approval |
| Inline / "approved" | Acknowledge approval and stop; create no artifacts and do not implement |
| Spec-backed / "write a plan" | Write the plan draft from design.md, stop |
| Spec-backed / "I added notes" | Re-read, address all notes, do NOT implement |
| Spec-backed / "approved" / "create tasks" | Create only plan.json, report its path, and stop |
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.