When to use
User wants a non-trivial feature, API, schema, or product change. Work starts with a specification, not code.
Language (Studio locale)
Match the user's Studio UI language (ru or en only):
- Chat (questions, summaries, progress) — that language only
- All SDD artifacts via
sdd_write_artifact (proposal, design, specs, tasks) — that language only
sdd_update_understanding summary / questions — that language only
- Do not mix languages; do not write specs in the other language
- Structural OpenSpec markers may stay English (
## ADDED Requirements, GIVEN/WHEN/THEN), but narrative text, requirement titles, scenarios, and task descriptions must be in the selected locale
If the Studio prompt states locale=ru or locale=en, treat that as authoritative.
Multi-project workspaces
A workspace may contain several projects, each with its own openspec/.
sdd_list_projects — pick the project path (empty string = workspace root)
- Pass
project=<path> to every subsequent sdd_* tool for that work
Workflow (propose)
sdd_status with project= — if not initialized → sdd_init with the same project=
sdd_list_specs + sdd_read_spec for relevant domains
sdd_list_changes — avoid duplicate open changes
sdd_create_change with slug id and request= (user request text)
Understanding gate (if enabled in user prefs — see create_change response).
Before any clarifying questions to the user, complete this order:
- Existing SDD knowledge
sdd_list_specs + sdd_read_spec for relevant domains (openspec/specs/)
sdd_list_changes with include_archive=true
- Read related archived change artifacts under
openspec/changes/archive/
(proposal, specs, design, tasks) and any overlapping open changes
- Project context /
/init if needed
- Read
.holix/HOLIX.md (and project-local notes if any)
- If missing, empty, or insufficient for this request/domain: run project
onboarding equivalent to
/init for the project path (scan layout +
key files; update HOLIX.md via update_holix_section, or ask the user once
to run /init <path> if you cannot write). Do not skip when the codebase
is unknown.
- Assess understanding
- Call
sdd_update_understanding with honest score (0–100) and summary
of what you learned from main specs, archives, and HOLIX — before
dumping questions at the user
- Only then ask residual clarifying questions in chat
- After each answer:
sdd_update_understanding again with user_answer and
updated score / questions
- If
score < threshold → keep clarifying (status clarifying)
- If
score ≥ threshold → status ready: offer proceed or more questions
- If later answers drop
score below threshold → new clarifying cycle
- Only after user agrees to proceed:
sdd_confirm_understanding
- Do not fill full proposal/specs/tasks until confirmed (or gate disabled/
skipped)
- Do not open with a long questionnaire before steps 1–3
Fill artifacts via sdd_write_artifact only (not write_file / inventing paths):
- proposal →
openspec/changes/<id>/proposal.md
- design →
openspec/changes/<id>/design.md
- tasks →
openspec/changes/<id>/tasks.md
- specs →
openspec/changes/<id>/specs/<domain>/spec.md (pass domain= or omit)
- There is no
openspec/changes/<id>/specs.md — do not read_file that path
- Prefer
sdd_status(change_id=…) → artifact_paths before reading anything
- proposal content — Why / What / Impact
- specs content — delta with
## ADDED|MODIFIED|REMOVED Requirements and GIVEN/WHEN/THEN
- design content — approach + task→assignee table
- tasks content — checklist with assignees (see below)
Assignees (you choose who does the work)
- Call
list_subagent_types first.
- Custom types (user-created Agents tab): prefer matching custom agents by role.
- No custom types: pick a built-in (
coder, reviewer, researcher, analyst, writer, web_researcher) that fits each task.
main: shared / risky / merge-conflict work that must stay on the main agent.
- Apply mode is chosen later by the user:
- self — assignees are ignored; main does everything (no need to over-optimize assignees).
- subagents / hybrid — assignees drive dispatch; task graph controls order:
only ready tasks spawn (deps done); later waves auto-dispatch after completion.
Same type on many ready tasks → parallel jobs
type-1, type-2, …
tasks.md format (required — OpenSpec Holix checklist only)
Studio and sdd_* tools parse only checkbox lines. Free-form sections are rejected.
Size & decomposition (required for subagents)
Before writing tasks.md, estimate volume and split large work.
| size |
Meaning |
Typical sub-agent steps |
xs |
One file / one function / stub |
~40 |
s |
One slice, 1–3 files, one deliverable |
~60 |
m |
Focused module feature |
~90 |
l / xl |
Too big — sdd_write_artifact rejects for subagent assignees |
— |
Rules for volume:
- Prefer 5–15 small tasks over 1–3 mega-tasks.
- One sub-agent task = one deliverable (one endpoint or one UI screen or one test file — not all).
- Put
- **size:** \s`(orxs/m`) on every task. Holix also estimates missing sizes.
- If a task would be L/XL (full feature, frontend+backend, "entire module") → split with
depends_on before write.
- Parallelize independent slices (same
depends_on) so waves stay short.
Correct (required):
# Tasks: <change-id>
## 1. Backend
- [ ] 1.1 Add OAuth token endpoint only
- **assignee:** `coder`
- **size:** `s`
- **reason:** isolated API surface
- **depends_on:**
- [ ] 1.2 Persist session store
- **assignee:** `coder`
- **size:** `s`
- **reason:** needs 1.1
- **depends_on:** `1.1`
## 2. Frontend
- [ ] 2.1 Login button + redirect (UI only)
- **assignee:** `coder`
- **size:** `s`
- **reason:** needs API from 1.1
- **depends_on:** `1.1`
- [ ] 1.3 Shared auth config
- **assignee:** `main`
- **size:** `m`
- **reason:** conflict-prone shared code
- **depends_on:** `1.1`
Wrong (rejected — too large / free-form):
- [ ] 1.1 Implement full OAuth (backend, frontend, tests, docs)
- **assignee:** `coder`
## 1. Add OAuth endpoints
- **Описание:** …
- **Исполнитель:** coder
Rules:
- Every task is
- [ ] <id> <title> (or - [x] when done)
- Nested
- **assignee:** \type` is mandatory structure (main, subagent type, or unassigned`)
- Nested
- **size:** \xs|s|m`` — required for good dispatch budgets
- Optional
- **reason:** …
- Optional
- **depends_on:** \1.1, 1.2`` — execution graph (empty = no explicit deps)
- Same-section order (1.1 before 1.2) is inferred when
depends_on is empty
- Parallel work: independent sections (1.x vs 2.x) or shared
depends_on only
- Use
sdd_write_artifact(artifact=tasks, …) only — never invent another schema
- If write returns size errors → rewrite
tasks.md with smaller checklist items (do not force L/XL)
Assignees: main or a type name from list_subagent_types (custom or built-in).
sdd_status with change_id until apply_ready: true
- Stop and let the user review. Do not implement until apply skill / user asks.
Do NOT
- Do not write product code during propose
- Prefer real type names for subagents/hybrid;
unassigned is OK for mode self (runs on main), but blocks apply-ready for pure subagents
- Do not skip reading main specs for brownfield work
- Do not skip understanding gate when it is enabled and status is not
confirmed/skipped
- Do not write SDD artifacts or clarifying questions in a language other than the user's Studio locale (
ru or en)
1---2name: holix-sdd-propose3description: Create Spec-Driven Development changes (OpenSpec-style) — multi-project openspec, understanding gate, assigned tasks before coding4---56## When to use78User wants a **non-trivial feature, API, schema, or product change**. Work starts with a **specification**, not code.910## Language (Studio locale)1112Match the user's Studio UI language (**`ru`** or **`en`** only):1314- Chat (questions, summaries, progress) — that language only15- All SDD artifacts via `sdd_write_artifact` (proposal, design, specs, tasks) — that language only16- `sdd_update_understanding` `summary` / `questions` — that language only17- **Do not mix** languages; do not write specs in the other language18- Structural OpenSpec markers may stay English (`## ADDED Requirements`, `GIVEN`/`WHEN`/`THEN`), but narrative text, requirement titles, scenarios, and task descriptions must be in the selected locale1920If the Studio prompt states `locale=ru` or `locale=en`, treat that as authoritative.2122## Multi-project workspaces2324A workspace may contain several projects, each with its own `openspec/`.25261. `sdd_list_projects` — pick the project `path` (empty string = workspace root)272. Pass `project=<path>` to **every** subsequent `sdd_*` tool for that work2829## Workflow (propose)30311. `sdd_status` with `project=` — if not initialized → `sdd_init` with the same `project=`322. `sdd_list_specs` + `sdd_read_spec` for relevant domains333. `sdd_list_changes` — avoid duplicate open changes344. `sdd_create_change` with slug id **and** `request=` (user request text)355. **Understanding gate** (if enabled in user prefs — see create_change response).3637 **Before any clarifying questions to the user**, complete this order:3839 1. **Existing SDD knowledge**40 - `sdd_list_specs` + `sdd_read_spec` for relevant domains (`openspec/specs/`)41 - `sdd_list_changes` with `include_archive=true`42 - Read related **archived** change artifacts under `openspec/changes/archive/`43 (proposal, specs, design, tasks) and any overlapping open changes44 2. **Project context / `/init` if needed**45 - Read `.holix/HOLIX.md` (and project-local notes if any)46 - If missing, empty, or insufficient for this request/domain: run project47 onboarding equivalent to **`/init`** for the project path (scan layout +48 key files; update HOLIX.md via `update_holix_section`, or ask the user once49 to run `/init <path>` if you cannot write). Do not skip when the codebase50 is unknown.51 3. **Assess understanding**52 - Call `sdd_update_understanding` with honest `score` (0–100) and `summary`53 of what you learned from main specs, archives, and HOLIX — **before**54 dumping questions at the user55 4. **Only then** ask residual clarifying questions in chat56 - After each answer: `sdd_update_understanding` again with `user_answer` and57 updated `score` / `questions`58 - If `score < threshold` → keep clarifying (status `clarifying`)59 - If `score ≥ threshold` → status `ready`: offer **proceed** or **more questions**60 - If later answers drop `score` below threshold → new clarifying cycle61 5. Only after user agrees to proceed: `sdd_confirm_understanding`62 - **Do not** fill full proposal/specs/tasks until confirmed (or gate disabled/`skipped`)63 - **Do not** open with a long questionnaire before steps 1–3646. Fill artifacts via `sdd_write_artifact` only (not `write_file` / inventing paths):65 - **proposal** → `openspec/changes/<id>/proposal.md`66 - **design** → `openspec/changes/<id>/design.md`67 - **tasks** → `openspec/changes/<id>/tasks.md`68 - **specs** → `openspec/changes/<id>/specs/<domain>/spec.md` (pass `domain=` or omit)69 - There is **no** `openspec/changes/<id>/specs.md` — do not `read_file` that path70 - Prefer `sdd_status(change_id=…)` → `artifact_paths` before reading anything71 - **proposal** content — Why / What / Impact72 - **specs** content — delta with `## ADDED|MODIFIED|REMOVED Requirements` and GIVEN/WHEN/THEN73 - **design** content — approach + task→assignee table74 - **tasks** content — checklist with assignees (see below)7576### Assignees (you choose who does the work)77781. Call `list_subagent_types` first.792. **Custom types** (user-created Agents tab): prefer matching custom agents by role.803. **No custom types**: pick a built-in (`coder`, `reviewer`, `researcher`, `analyst`, `writer`, `web_researcher`) that fits each task.814. **`main`**: shared / risky / merge-conflict work that must stay on the main agent.825. Apply mode is chosen later by the user:83 - **self** — assignees are ignored; main does everything (no need to over-optimize assignees).84 - **subagents / hybrid** — assignees drive dispatch; **task graph** controls order:85 only **ready** tasks spawn (deps done); later waves auto-dispatch after completion.86 Same type on many **ready** tasks → parallel jobs `type-1`, `type-2`, …8788### tasks.md format (required — OpenSpec Holix checklist only)8990Studio and `sdd_*` tools parse **only** checkbox lines. Free-form sections are **rejected**.9192### Size & decomposition (required for subagents)9394**Before writing `tasks.md`, estimate volume and split large work.**9596| size | Meaning | Typical sub-agent steps |97|------|---------|-------------------------|98| `xs` | One file / one function / stub | ~40 |99| `s` | One slice, 1–3 files, **one** deliverable | ~60 |100| `m` | Focused module feature | ~90 |101| `l` / `xl` | **Too big** — `sdd_write_artifact` **rejects** for subagent assignees | — |102103Rules for volume:1041. **Prefer 5–15 small tasks** over 1–3 mega-tasks.1052. One sub-agent task = **one deliverable** (one endpoint **or** one UI screen **or** one test file — not all).1063. Put ` - **size:** \`s\`` (or `xs`/`m`) on every task. Holix also estimates missing sizes.1074. If a task would be L/XL (full feature, frontend+backend, "entire module") → **split** with `depends_on` before write.1085. Parallelize independent slices (same `depends_on`) so waves stay short.109110**Correct (required):**111112```markdown113# Tasks: <change-id>114115## 1. Backend116117- [ ] 1.1 Add OAuth token endpoint only118 - **assignee:** `coder`119 - **size:** `s`120 - **reason:** isolated API surface121 - **depends_on:**122123- [ ] 1.2 Persist session store124 - **assignee:** `coder`125 - **size:** `s`126 - **reason:** needs 1.1127 - **depends_on:** `1.1`128129## 2. Frontend130131- [ ] 2.1 Login button + redirect (UI only)132 - **assignee:** `coder`133 - **size:** `s`134 - **reason:** needs API from 1.1135 - **depends_on:** `1.1`136137- [ ] 1.3 Shared auth config138 - **assignee:** `main`139 - **size:** `m`140 - **reason:** conflict-prone shared code141 - **depends_on:** `1.1`142```143144**Wrong (rejected — too large / free-form):**145146```markdown147- [ ] 1.1 Implement full OAuth (backend, frontend, tests, docs)148 - **assignee:** `coder`149150## 1. Add OAuth endpoints151- **Описание:** …152- **Исполнитель:** coder153```154155Rules:156- Every task is `- [ ] <id> <title>` (or `- [x]` when done)157- Nested ` - **assignee:** \`type\`` is mandatory structure (`main`, subagent type, or `unassigned`)158- Nested ` - **size:** \`xs|s|m\`` — required for good dispatch budgets159- Optional ` - **reason:** …`160- Optional ` - **depends_on:** \`1.1, 1.2\`` — execution graph (empty = no explicit deps)161- Same-section order (1.1 before 1.2) is **inferred** when `depends_on` is empty162- Parallel work: independent sections (1.x vs 2.x) or shared `depends_on` only163- Use `sdd_write_artifact(artifact=tasks, …)` only — never invent another schema164- If write returns size errors → rewrite `tasks.md` with smaller checklist items (do not force L/XL)165166Assignees: `main` or a type name from `list_subagent_types` (custom or built-in).1671687. `sdd_status` with `change_id` until `apply_ready: true`1698. Stop and let the user review. **Do not implement** until apply skill / user asks.170171## Do NOT172173- Do not write product code during propose174- Prefer real type names for subagents/hybrid; `unassigned` is OK for mode `self` (runs on main), but blocks apply-ready for pure `subagents`175- Do not skip reading main specs for brownfield work176- Do not skip understanding gate when it is enabled and status is not `confirmed`/`skipped`177- Do not write SDD artifacts or clarifying questions in a language other than the user's Studio locale (`ru` or `en`)