[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72WCPES9DCSYA53FGHN2JHE":3,"skill-same:01M72WCPES9DCSYA53FGHN2JHE":48},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M72WCPES9DCSYA53FGHN2JHE","new",null,"Start a dossier wave from a goal sentence; the sole entrypoint. Invoke when the user says \"ds:new\" or \"start a dossier\", or when work meets the start rule — more than one session, more than 5 files, or an operator step.","raisedadead\u002Fclaude-code-plugins","raisedadead","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F1884376?v=4","01M72WC4WYRJGZ2CXMCSF7B6VG","Mrugesh Mohapatra","01M72WC4XJTNHQ0D89QPG2H0W4",3,"ISC","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdossier\u002Fskills\u002Fnew\u002FSKILL.md",[],[],"2026-11-10 22:39:42",false,"---\nname: new\ndescription: Start a dossier wave from a goal sentence; the sole entrypoint. Invoke when the user says \"ds:new\" or \"start a dossier\", or when work meets the start rule — more than one session, more than 5 files, or an operator step.\nargument-hint: '\"\u003Cgoal sentence>\" | \u003Cslug>'\n---\n\n# ds:new — start a wave\n\nCreates `.scratchpad\u002Fdossier\u002F\u003CYYYY-MM-DD>-\u003Cslug>\u002FDOSSIER.md` per `${CLAUDE_PLUGIN_ROOT}\u002FFORMAT.md`, then asks the operator for goal, scope and repos.\n\n## Inputs\n\n- `\"\u003Cgoal sentence>\"` from `$ARGUMENTS` — the normal start. Run `ds:grill \"\u003Cgoal sentence>\"` first, then come back with the slug it confirms; step 1.5 consumes its draft. Skip the grill only when the goal is one line with no open decision, and derive the slug from it.\n- `\u003Cslug>` (kebab-case, ≤30 chars) — the start after a grill, or for a backfill. Empty → ask for the goal sentence.\n- Date defaults to today (`date +%Y-%m-%d`). Override by prompt when backfilling historical work.\n\n## Steps\n\n### 0. Helpers\n\n§S lines append via `\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds s-append \u003Cdir> \"\u003Cevent>\"` (FORMAT.md §15) — pass the text **after** the timestamp, which the script prepends; `ds new-finish` (step 5) writes the DONE line. The initial scaffold is a full Write (new file).\n\n### 1. Validate slug + path\n\n- Slug matches `^[a-z0-9][a-z0-9-]{0,29}$`. Anything else is refused with an explanation.\n- Run `\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds root` and compute `dir=\u003Croot>\u002F.scratchpad\u002Fdossier\u002F\u003Cdate>-\u003Cslug>\u002F` from the path it prints. Every `.scratchpad\u002F` path below is under that root. In a linked worktree with no ledger yet, the root is the primary checkout, so removing the worktree cannot delete the ledger.\n- Collision check: `dir` exists **or `.scratchpad\u002Fdossier\u002F_archive\u002F\u003Cdate>-\u003Cslug>\u002F` exists** (a same-day close+reopen) → ask the operator to bump to `\u003Cslug>-2`, `\u003Cslug>-3`, etc. Checking `_archive\u002F` too avoids two INDEX rows keyed to one slug (Vm.1).\n- Ignore check: in a git work tree, `git -C \u003Croot> check-ignore -q .scratchpad\u002F` exiting 1 means the ledger will show as untracked and a `git add -A` would commit it; any exit other than 0 or 1 means the check could not run, so say that. Carry the result into the step-6 report with the per-clone fix — append `.scratchpad\u002F` to the file `git -C \u003Croot> rev-parse --git-path info\u002Fexclude` names — and leave the choice to the operator; some repos track `.scratchpad\u002F` on purpose.\n\n### 1.5. Grill gate (conditional)\n\nFires only when a grill artifact exists for this slug, so trivial `ds:new` runs are untouched. `\u003Cslug>` is the RESOLVED slug from step 1 (post-collision-bump; a bumped `\u003Cslug>-2` starts without `\u003Cslug>`'s grill):\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds assert-grill .scratchpad \"\u003Cslug>\"\n```\n\nThe helper discovers the newest `.grill\u002F\u003Cdate>-\u003Cslug>.md` by slug — grill's own date may be days older than today (multi-day `--resume`, pending-external waits) and the gate still finds it. Route on the exact exit code:\n\n| exit   | meaning                                                          | action                                                                                                                                                                                                              |\n| ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 0      | complete (path printed)                                          | consume its `## Draft` §G\u002F§C in step 2 — do NOT re-ask; after the step-3 Write lands, stamp via `ds assert-grill --consume .scratchpad \"\u003Cslug>\" \"\u003Cdate>-\u003Cslug>\"` (atomic tmp+mv per Vm.8; refuses a double-consume) |\n| 1      | no artifact                                                      | proceed normally — grill is never required; step 2's clarify lever recommends it                                                                                                                                    |\n| 2, 3   | artifact incomplete \u002F unconfirmed                                | REFUSE scaffold; point at `ds:grill --resume \u003Cslug>` (or delete the artifact to abandon)                                                                                                                            |\n| 4      | artifact already consumed                                        | proceed normally; recommend a fresh `ds:grill \"\u003Cgoal sentence>\"` — a consumed grill never feeds twice                                                                                                               |\n| 69, 70 | `cli\u002Fds` did not run (69: no Node.js 22.18+; 70: internal error) | REFUSE scaffold; report the stderr line                                                                                                                                                                             |\n\nA new slug does not bypass an open grill. When this session left a grill under another slug incomplete or unconfirmed, refuse the scaffold and point at `ds:grill --resume \u003Cthat slug>`, unless the operator abandons it.\n\n### 2. Gather inputs (operator-interactive)\n\nAsk one block at a time, tersely, no preamble:\n\n1. **§G goal** — one-line outcome, then up to 5 scope bullets (IN \u002F NOT IN).\n1. **§C constraints** — locked decisions, stack notes. Bullets, ≤10.\n1. **§X repos** — each repo this dossier touches, as `\u003Corg>\u002F\u003Cname>` or an absolute path. Operator-provided; no git-remote magic.\n1. **Initial §T tasks** — ask for T1..Tn now; an empty answer leaves §T empty. Give a row `who=H` only after the agent tried to prove it in a scratch fixture (a throwaway directory, an isolated tmux socket, a disposable session) and could not. A re-check that waits on a date gets its own row with a `T\u003Cn>+\u003Ck>d` need, so `ds close --carry` carries it; a row that joins it to work done now holds the wave open until the date.\n\n**A wide refactor is sequenced expand–contract.** One mechanical change whose blast radius breaks many call sites at once (rename a column, retype a shared symbol) cannot land green as one task. Expand first: add the new form beside the old. Then migrate the call sites in batches, one task each, each `needs` the expand. Contract last: delete the old form in a task that `needs` every batch.\n\n**Clarify before freezing (the highest-value lever):** an underspecified §G or §C decision — ambiguous scope, an unstated choice, more than one plausible approach — gets its resolving question NOW, before §T is authored. A vague goal yields vague tasks, and one or two sharp questions here beat a wrong build. More than a couple of open questions → recommend `ds:grill \u003Cslug>` (full interrogation protocol, artifact-gated). \"Just go\" → record the assumption as a §C bullet so it stays auditable.\n\n§I, §V, §B, §S and §Z grow during the build; the scaffold leaves them empty.\n\n### 2.5. Resolve pins (proactive verify)\n\nFrom the stack named in §C plus the repos in §X, derive a pin-spec list and resolve current versions once (shared 24h cache, offline-safe):\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds resolve-pins eol:\u003Cslug>... \u003Cecosystem>:\u003Cpkg>...\n```\n\n- `eol:` results → §C bullets (current stable \u002F EOL note).\n- A version, SHA or deprecation claim in §C that no spec covers → `dossier:verify` checks it against a primary source.\n- package results → the §I \"Pinned deps\" table (FORMAT.md §6).\n- Map the libs actually named to specs (e.g. \"Go backend + React UI\" → `eol:go npm:react npm:react-dom go:\u003Cmodule>`). The model does the stack→spec mapping; do not blind-parse §C prose into specs.\n- `{\"offline\": true}` \u002F `latest: null`, or exit 69 (no Node.js 22.18+) \u002F 70 (internal error) → record the pin as `offline` and proceed; the scaffold continues either way.\n- `go:\u003Cmodule>` without a `\u002FvN` suffix names the v0\u002Fv1 path, so the resolver walks `\u002Fv2` through `\u002Fv12` and answers from the highest that resolves — pin the module path in `src`, not the one you asked for. A `warning` on the object means a probe went unanswered: the version is a floor, not the ceiling.\n\nThese fold into the single atomic step-3 Write — no extra commit, no TDD cycle.\n\n### 2.6. Subtraction pass (ungrilled wave only)\n\nRuns when step 1.5 exited 1 or 4 — no grill fed this wave, so no set audit or subtraction pass has seen it — and whetstone is installed. Spawn the subtraction pass (whetstone `doubt-pass`, \"Subtraction pass\": its template, its model rule) on the draft §G, §C and §T as the artifact, with §G as the contract. One cycle. Show each cut to the operator and ask which to take; a cut never edits a §C bullet the operator gave without that answer. Hold the `SUBTRACT:` line and append it to §S after step 3 as `ds:new — subtract=\u003Cverdict>`. Without whetstone, skip it and say so in the step-6 report.\n\n### 2.7. Write the contract\n\nThe repo decides the home. `.dossier\u002F` exists → the repo opted into tracked contracts: write `.dossier\u002F\u003Cdate>-\u003Cslug>.md` and commit it before the first task — citable as evidence, outliving the wave. Otherwise write `\u003Cwave-dir>\u002FCONTRACT.md` beside the ledger and price that home out loud: untracked wherever `.scratchpad\u002F` is gitignored (the assumed setup), archived with the wave, citable by nobody, and its criteria run as shell from a file no diff ever showed a reviewer — where a tracked contract's criteria appear in the commit that added them. Name the opt-in (`mkdir .dossier`, track it) so the choice stays the operator's. **Never create `.dossier\u002F` yourself** — a tracked directory appearing in a repo that did not ask for one is the artifact rule this split exists to respect.\n\nEither way the content is FORMAT.md §2.5's — `consumer`, `reached-via`, `budget`, an optional `milestone` (the cutover row, when rows run after it), and a `## done-when` table whose every row is a command with an expected exit code. `ds:converge` and the `UserPromptSubmit` hook resolve both homes, tracked first.\n\n`consumer` is the field that asks whether the work reaches anyone, and the one nobody writes unprompted. Ask for it plainly: who runs this, and by what path does it get to them? A wave once hardened a checker through three review rounds while no consumer could execute it, and no step in this skill had ever asked. `ds:converge` refuses a contract whose `consumer` row is missing or empty (`CONVERGE: PARSE`, exit 2), so a contract written without the answer fails its first run.\n\nA criterion that cannot be written as a command is a criterion nobody can check. Turn it into one, or drop it and say what was dropped.\n\nA done-when command reads source and repo state only. It does not read a deployed target, a pushed remote, or anything that waits on an operator step. A runtime rewrite or an operator delay then fails the check. Put pushes, deploys and reloads in `who=H` rows. `ds close --carry` carries them as `after:` rows.\n\nA §T row marked `route=delegate` adds the done-when row `` `\u003Cplugin>\u002Fcli\u002Fds delegation-check \u003Cdossier-dir>` `` with `exit 0 guard` (it passes before any row is built), so `ds:converge` checks each delegated row's review and rebuild lines.\n\nIn the tracked home, commit the contract after the step-3.7 sign-off and before the first task — the `UserPromptSubmit` hook counts budget from the commit that added the contract.\n\n### 3. Scaffold DOSSIER.md\n\nCompute fields:\n\n```\ntitle = \u003Cslug>\nheader_line = `\u003Cdate>` · `live`\n```\n\nWrite the file at `\u003Cdir>\u002FDOSSIER.md` per FORMAT.md §2 section order:\n\n```markdown\n# \u003Cslug>\n\n`\u003Cdate>` · `live`\n\n## Goal\n\n\u003Cgoal-from-step-2>\n\nScope:\n\u003Cscope-bullets>\n\n## Constraints\n\n\u003Cconstraint-bullets>\n\n## Interfaces\n\n_(empty — populate when first contract lands)_\n\n## Invariants\n\n| id | invariant | check |\n|----|-----------|-------|\n\n## Tasks\n\n| id | state | who | task | needs | cite | verify |\n|----|-------|-----|------|-------|------|--------|\n\u003Cinitial-tasks-if-provided>\n\n## Bugs\n\n| id | bug | root cause | invariant added | fix cite |\n|----|-----|------------|-----------------|----------|\n\n## Repos\n\n| repo | branch | ahead | tag | pushed | notes |\n|------|--------|-------|-----|--------|-------|\n\u003Crepo-rows-from-step-2-with-placeholders>\n\n## Status\n\n\u003C!-- Each entry is its own paragraph (blank lines before AND after). Per FORMAT.md §11. -->\n\n\u003CYYYY-MM-DD HH:MM:SS> ds:new — created slug=\u003Cslug>\n\n## Closeout\n\n_(empty — written by ds:close)_\n```\n\nWrite `\u003Cdir>\u002FDOSSIER.md` directly: the file is new, and step 3.5 catches a partial write.\n\n### 3.5. Assert scaffold completeness\n\nBefore touching INDEX or §S, confirm the write landed intact:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds assert-scaffold \"\u003Cdir>\"\n```\n\nIt exits 1 naming any missing `§`-section (or the title line) — deterministic, so nobody eyeballs the Write output. On failure step 5 waits: report the missing sections, re-run the step-3 Write to repair, then re-assert. Mirrors the post-move assertion `ds:close` runs via `ds archive-move`. Exit 69 (no Node.js 22.18+) or 70 (internal error) means the assertion did not run: report its stderr line and stop before step 5.\n\n### 3.6. Baseline the contract\n\nA row that passes before the work cannot judge the work. Run every row once, now:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds converge --baseline \u003Ccontract-path>\n```\n\n`BASELINE: OK` (exit 0) appends `ds:converge — baseline OK …` to §S; then go to step 3.7. `BASELINE: FAIL \u003Cids>` (exit 1) appends `ds:converge — baseline FAIL \u003Cids>` to §S (nothing is written when no live wave owns the contract) and names each row that passed or did not run (exit 124, 126 or 127), or each `guard` row that failed: rewrite the row so it fails until the work lands (a script the wave has not written yet: `test -f tools\u002Fx.ts && node tools\u002Fx.ts`), or, for a row that must stay green throughout (a full CI run), end its expect cell with `guard` (`exit 0 guard`), then rerun. Which row is a guard is model-judgment; the baseline line lists every guard so the operator sees them. `CONVERGE: PARSE` (exit 2) is a contract to fix first.\n\n### 3.7. Sign off the design\n\nThe sign-off judges the design before any build, from a notes file and the lines it cites, so it reads nothing else. One design covers one slice. This step signs off the wave's first slice. `ds:build` step 5.7 signs off each later slice before its build.\n\n1. Write the first slice's design to `\u003Croot>\u002F.scratchpad\u002Ftmp\u002F\u003Cdate>-\u003Cslug>\u002Fdesign-notes.md`: the goal in the operator's words, each claim about current code with its `path:N` cite, a `## done-when` table in the contract's shape (a row that must stay green ends its expect cell with `guard`), and one `REMOVES: \u003Cname>` line per skill, file or command the wave deletes or renames.\n1. Run the computed checks until they pass:\n\n   ```bash\n   \"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds design-check \u003Cnotes> \u003Crepo>\n   ```\n\n   `DESIGN: OK` (exit 0) writes `\u003Cnotes minus .md>-evidence.md` with every cited line. `DESIGN: FAIL \u003Cn>` (exit 1) names each cite that does not resolve, each check that passes today or did not run, and each file that names a `REMOVES:` item and is not in the notes: fix the notes and run it again. `DESIGN: PARSE` (exit 2) is a notes file to fix first.\n1. With `evidence` in the session's agent list, spawn one `evidence` agent with the notes path, the evidence path, the repo path and the findings path below. It runs its own checks, then spawns `signoff`, and returns the `signoff` reply. Otherwise, with `signoff` in the list, spawn one `signoff` agent. The plugin ships neither: they are the operator's own agents (ADAPTERS.md). A `signoff` agent may have no read tool, so put the full text of the notes file and the evidence file in its mission. Name a separate findings file for either agent, `\u003Croot>\u002F.scratchpad\u002Ftmp\u002F\u003Cdate>-\u003Cslug>\u002Fsignoff-findings.md`. Read the findings from that file, or from the reply when the file is empty (an `evidence` agent that stops early writes its findings in the reply). There is one line per finding: `block:` or `note:`, then `missing: \u003Cwhat>, at \u003Cfile:line or section>` or `evidence missing: \u003Cfact>, at \u003Cfile:line>`. A `block:` finding makes the build wrong or unsafe; every other finding is a `note:`. The reply ends with `SIGNOFF: PASS` when no line is `block:`, else `SIGNOFF: CHANGES`. Without either agent, the verdict is `skipped-absent`.\n1. Append §S `ds:new signoff=\u003CPASS|CHANGES|skipped-absent> notes=\u003Cnotes>`, where `\u003Cnotes>` is the design notes path from item 1, never the findings file: `ds:build` hands it to the builder and the reviewer as the design. Put each `note:` line in the step-6 report as a follow-up. On `CHANGES`, fix each `block:` line once, re-run item 2 (`ds design-check`), and ask for one re-check; a second `CHANGES` goes to the operator with both lists.\n\nThen commit the contract (tracked home). Whether the sign-off is sound is model-judgment; that the line exists is code: step 5 exits 1 without it.\n\n### 4. Initial §X refresh\n\nFor each repo row added in step 2, run:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds x-refresh \u003Cdir> \u003Crepo-label> \u003Crepo-path>\n```\n\nWhen it refuses with `not a git repo`, the row keeps its placeholders plus the note `_(repo not found — verify path)_`.\n\n### 5. Finish\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds new-finish \u003Cdir>\n```\n\nIt exits 1 naming the missing line when §S has no `ds:new signoff=` line: run step 3.7. Otherwise it regenerates `.scratchpad\u002FINDEX.md`, appends `ds:new — DONE slug=\u003Cslug> dir=\u003Cdir>` to §S, prints the `ds handoff` lines and exits 0.\n\n### 6. Report\n\n```\nds:new \u003Cslug> → .scratchpad\u002Fdossier\u002F\u003Cdate>-\u003Cslug>\u002FDOSSIER.md\n§X: \u003CN> repos seeded\nfollow-ups: \u003Ceach sign-off note: line, or none>\nnext:\n\u003Ceach handoff line step 5 printed, verbatim>\n```\n\nAdd `.scratchpad\u002F is not gitignored here` plus the fix when step 1's ignore check fired.\n\n## Idempotency\n\n`\u003Cdir>\u002FDOSSIER.md` already exists → refuse; the operator picks a new slug or opens the existing one via `ds:status`.\n\n`\u003Cdir>` exists with DOSSIER.md missing (a rare crash mid-scaffold) → recreate it, preserving any §S entries from the partial run.\n\n## Cite\n\n- FORMAT.md §2 (section order), §2.5 (wave contract), §10 (§X format), §11 (§S format), §17 (Vm rules)\n","# ds:new — start a wave\n\nCreates `.scratchpad\u002Fdossier\u002F\u003CYYYY-MM-DD>-\u003Cslug>\u002FDOSSIER.md` per `${CLAUDE_PLUGIN_ROOT}\u002FFORMAT.md`, then asks the operator for goal, scope and repos.\n\n## Inputs\n\n- `\"\u003Cgoal sentence>\"` from `$ARGUMENTS` — the normal start. Run `ds:grill \"\u003Cgoal sentence>\"` first, then come back with the slug it confirms; step 1.5 consumes its draft. Skip the grill only when the goal is one line with no open decision, and derive the slug from it.\n- `\u003Cslug>` (kebab-case, ≤30 chars) — the start after a grill, or for a backfill. Empty → ask for the goal sentence.\n- Date defaults to today (`date +%Y-%m-%d`). Override by prompt when backfilling historical work.\n\n## Steps\n\n### 0. Helpers\n\n§S lines append via `\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds s-append \u003Cdir> \"\u003Cevent>\"` (FORMAT.md §15) — pass the text **after** the timestamp, which the script prepends; `ds new-finish` (step 5) writes the DONE line. The initial scaffold is a full Write (new file).\n\n### 1. Validate slug + path\n\n- Slug matches `^[a-z0-9][a-z0-9-]{0,29}$`. Anything else is refused with an explanation.\n- Run `\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds root` and compute `dir=\u003Croot>\u002F.scratchpad\u002Fdossier\u002F\u003Cdate>-\u003Cslug>\u002F` from the path it prints. Every `.scratchpad\u002F` path below is under that root. In a linked worktree with no ledger yet, the root is the primary checkout, so removing the worktree cannot delete the ledger.\n- Collision check: `dir` exists **or `.scratchpad\u002Fdossier\u002F_archive\u002F\u003Cdate>-\u003Cslug>\u002F` exists** (a same-day close+reopen) → ask the operator to bump to `\u003Cslug>-2`, `\u003Cslug>-3`, etc. Checking `_archive\u002F` too avoids two INDEX rows keyed to one slug (Vm.1).\n- Ignore check: in a git work tree, `git -C \u003Croot> check-ignore -q .scratchpad\u002F` exiting 1 means the ledger will show as untracked and a `git add -A` would commit it; any exit other than 0 or 1 means the check could not run, so say that. Carry the result into the step-6 report with the per-clone fix — append `.scratchpad\u002F` to the file `git -C \u003Croot> rev-parse --git-path info\u002Fexclude` names — and leave the choice to the operator; some repos track `.scratchpad\u002F` on purpose.\n\n### 1.5. Grill gate (conditional)\n\nFires only when a grill artifact exists for this slug, so trivial `ds:new` runs are untouched. `\u003Cslug>` is the RESOLVED slug from step 1 (post-collision-bump; a bumped `\u003Cslug>-2` starts without `\u003Cslug>`'s grill):\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds assert-grill .scratchpad \"\u003Cslug>\"\n```\n\nThe helper discovers the newest `.grill\u002F\u003Cdate>-\u003Cslug>.md` by slug — grill's own date may be days older than today (multi-day `--resume`, pending-external waits) and the gate still finds it. Route on the exact exit code:\n\n| exit   | meaning                                                          | action                                                                                                                                                                                                              |\n| ------ | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 0      | complete (path printed)                                          | consume its `## Draft` §G\u002F§C in step 2 — do NOT re-ask; after the step-3 Write lands, stamp via `ds assert-grill --consume .scratchpad \"\u003Cslug>\" \"\u003Cdate>-\u003Cslug>\"` (atomic tmp+mv per Vm.8; refuses a double-consume) |\n| 1      | no artifact                                                      | proceed normally — grill is never required; step 2's clarify lever recommends it                                                                                                                                    |\n| 2, 3   | artifact incomplete \u002F unconfirmed                                | REFUSE scaffold; point at `ds:grill --resume \u003Cslug>` (or delete the artifact to abandon)                                                                                                                            |\n| 4      | artifact already consumed                                        | proceed normally; recommend a fresh `ds:grill \"\u003Cgoal sentence>\"` — a consumed grill never feeds twice                                                                                                               |\n| 69, 70 | `cli\u002Fds` did not run (69: no Node.js 22.18+; 70: internal error) | REFUSE scaffold; report the stderr line                                                                                                                                                                             |\n\nA new slug does not bypass an open grill. When this session left a grill under another slug incomplete or unconfirmed, refuse the scaffold and point at `ds:grill --resume \u003Cthat slug>`, unless the operator abandons it.\n\n### 2. Gather inputs (operator-interactive)\n\nAsk one block at a time, tersely, no preamble:\n\n1. **§G goal** — one-line outcome, then up to 5 scope bullets (IN \u002F NOT IN).\n1. **§C constraints** — locked decisions, stack notes. Bullets, ≤10.\n1. **§X repos** — each repo this dossier touches, as `\u003Corg>\u002F\u003Cname>` or an absolute path. Operator-provided; no git-remote magic.\n1. **Initial §T tasks** — ask for T1..Tn now; an empty answer leaves §T empty. Give a row `who=H` only after the agent tried to prove it in a scratch fixture (a throwaway directory, an isolated tmux socket, a disposable session) and could not. A re-check that waits on a date gets its own row with a `T\u003Cn>+\u003Ck>d` need, so `ds close --carry` carries it; a row that joins it to work done now holds the wave open until the date.\n\n**A wide refactor is sequenced expand–contract.** One mechanical change whose blast radius breaks many call sites at once (rename a column, retype a shared symbol) cannot land green as one task. Expand first: add the new form beside the old. Then migrate the call sites in batches, one task each, each `needs` the expand. Contract last: delete the old form in a task that `needs` every batch.\n\n**Clarify before freezing (the highest-value lever):** an underspecified §G or §C decision — ambiguous scope, an unstated choice, more than one plausible approach — gets its resolving question NOW, before §T is authored. A vague goal yields vague tasks, and one or two sharp questions here beat a wrong build. More than a couple of open questions → recommend `ds:grill \u003Cslug>` (full interrogation protocol, artifact-gated). \"Just go\" → record the assumption as a §C bullet so it stays auditable.\n\n§I, §V, §B, §S and §Z grow during the build; the scaffold leaves them empty.\n\n### 2.5. Resolve pins (proactive verify)\n\nFrom the stack named in §C plus the repos in §X, derive a pin-spec list and resolve current versions once (shared 24h cache, offline-safe):\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds resolve-pins eol:\u003Cslug>... \u003Cecosystem>:\u003Cpkg>...\n```\n\n- `eol:` results → §C bullets (current stable \u002F EOL note).\n- A version, SHA or deprecation claim in §C that no spec covers → `dossier:verify` checks it against a primary source.\n- package results → the §I \"Pinned deps\" table (FORMAT.md §6).\n- Map the libs actually named to specs (e.g. \"Go backend + React UI\" → `eol:go npm:react npm:react-dom go:\u003Cmodule>`). The model does the stack→spec mapping; do not blind-parse §C prose into specs.\n- `{\"offline\": true}` \u002F `latest: null`, or exit 69 (no Node.js 22.18+) \u002F 70 (internal error) → record the pin as `offline` and proceed; the scaffold continues either way.\n- `go:\u003Cmodule>` without a `\u002FvN` suffix names the v0\u002Fv1 path, so the resolver walks `\u002Fv2` through `\u002Fv12` and answers from the highest that resolves — pin the module path in `src`, not the one you asked for. A `warning` on the object means a probe went unanswered: the version is a floor, not the ceiling.\n\nThese fold into the single atomic step-3 Write — no extra commit, no TDD cycle.\n\n### 2.6. Subtraction pass (ungrilled wave only)\n\nRuns when step 1.5 exited 1 or 4 — no grill fed this wave, so no set audit or subtraction pass has seen it — and whetstone is installed. Spawn the subtraction pass (whetstone `doubt-pass`, \"Subtraction pass\": its template, its model rule) on the draft §G, §C and §T as the artifact, with §G as the contract. One cycle. Show each cut to the operator and ask which to take; a cut never edits a §C bullet the operator gave without that answer. Hold the `SUBTRACT:` line and append it to §S after step 3 as `ds:new — subtract=\u003Cverdict>`. Without whetstone, skip it and say so in the step-6 report.\n\n### 2.7. Write the contract\n\nThe repo decides the home. `.dossier\u002F` exists → the repo opted into tracked contracts: write `.dossier\u002F\u003Cdate>-\u003Cslug>.md` and commit it before the first task — citable as evidence, outliving the wave. Otherwise write `\u003Cwave-dir>\u002FCONTRACT.md` beside the ledger and price that home out loud: untracked wherever `.scratchpad\u002F` is gitignored (the assumed setup), archived with the wave, citable by nobody, and its criteria run as shell from a file no diff ever showed a reviewer — where a tracked contract's criteria appear in the commit that added them. Name the opt-in (`mkdir .dossier`, track it) so the choice stays the operator's. **Never create `.dossier\u002F` yourself** — a tracked directory appearing in a repo that did not ask for one is the artifact rule this split exists to respect.\n\nEither way the content is FORMAT.md §2.5's — `consumer`, `reached-via`, `budget`, an optional `milestone` (the cutover row, when rows run after it), and a `## done-when` table whose every row is a command with an expected exit code. `ds:converge` and the `UserPromptSubmit` hook resolve both homes, tracked first.\n\n`consumer` is the field that asks whether the work reaches anyone, and the one nobody writes unprompted. Ask for it plainly: who runs this, and by what path does it get to them? A wave once hardened a checker through three review rounds while no consumer could execute it, and no step in this skill had ever asked. `ds:converge` refuses a contract whose `consumer` row is missing or empty (`CONVERGE: PARSE`, exit 2), so a contract written without the answer fails its first run.\n\nA criterion that cannot be written as a command is a criterion nobody can check. Turn it into one, or drop it and say what was dropped.\n\nA done-when command reads source and repo state only. It does not read a deployed target, a pushed remote, or anything that waits on an operator step. A runtime rewrite or an operator delay then fails the check. Put pushes, deploys and reloads in `who=H` rows. `ds close --carry` carries them as `after:` rows.\n\nA §T row marked `route=delegate` adds the done-when row `` `\u003Cplugin>\u002Fcli\u002Fds delegation-check \u003Cdossier-dir>` `` with `exit 0 guard` (it passes before any row is built), so `ds:converge` checks each delegated row's review and rebuild lines.\n\nIn the tracked home, commit the contract after the step-3.7 sign-off and before the first task — the `UserPromptSubmit` hook counts budget from the commit that added the contract.\n\n### 3. Scaffold DOSSIER.md\n\nCompute fields:\n\n```\ntitle = \u003Cslug>\nheader_line = `\u003Cdate>` · `live`\n```\n\nWrite the file at `\u003Cdir>\u002FDOSSIER.md` per FORMAT.md §2 section order:\n\n```markdown\n# \u003Cslug>\n\n`\u003Cdate>` · `live`\n\n## Goal\n\n\u003Cgoal-from-step-2>\n\nScope:\n\u003Cscope-bullets>\n\n## Constraints\n\n\u003Cconstraint-bullets>\n\n## Interfaces\n\n_(empty — populate when first contract lands)_\n\n## Invariants\n\n| id | invariant | check |\n|----|-----------|-------|\n\n## Tasks\n\n| id | state | who | task | needs | cite | verify |\n|----|-------|-----|------|-------|------|--------|\n\u003Cinitial-tasks-if-provided>\n\n## Bugs\n\n| id | bug | root cause | invariant added | fix cite |\n|----|-----|------------|-----------------|----------|\n\n## Repos\n\n| repo | branch | ahead | tag | pushed | notes |\n|------|--------|-------|-----|--------|-------|\n\u003Crepo-rows-from-step-2-with-placeholders>\n\n## Status\n\n\u003C!-- Each entry is its own paragraph (blank lines before AND after). Per FORMAT.md §11. -->\n\n\u003CYYYY-MM-DD HH:MM:SS> ds:new — created slug=\u003Cslug>\n\n## Closeout\n\n_(empty — written by ds:close)_\n```\n\nWrite `\u003Cdir>\u002FDOSSIER.md` directly: the file is new, and step 3.5 catches a partial write.\n\n### 3.5. Assert scaffold completeness\n\nBefore touching INDEX or §S, confirm the write landed intact:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds assert-scaffold \"\u003Cdir>\"\n```\n\nIt exits 1 naming any missing `§`-section (or the title line) — deterministic, so nobody eyeballs the Write output. On failure step 5 waits: report the missing sections, re-run the step-3 Write to repair, then re-assert. Mirrors the post-move assertion `ds:close` runs via `ds archive-move`. Exit 69 (no Node.js 22.18+) or 70 (internal error) means the assertion did not run: report its stderr line and stop before step 5.\n\n### 3.6. Baseline the contract\n\nA row that passes before the work cannot judge the work. Run every row once, now:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds converge --baseline \u003Ccontract-path>\n```\n\n`BASELINE: OK` (exit 0) appends `ds:converge — baseline OK …` to §S; then go to step 3.7. `BASELINE: FAIL \u003Cids>` (exit 1) appends `ds:converge — baseline FAIL \u003Cids>` to §S (nothing is written when no live wave owns the contract) and names each row that passed or did not run (exit 124, 126 or 127), or each `guard` row that failed: rewrite the row so it fails until the work lands (a script the wave has not written yet: `test -f tools\u002Fx.ts && node tools\u002Fx.ts`), or, for a row that must stay green throughout (a full CI run), end its expect cell with `guard` (`exit 0 guard`), then rerun. Which row is a guard is model-judgment; the baseline line lists every guard so the operator sees them. `CONVERGE: PARSE` (exit 2) is a contract to fix first.\n\n### 3.7. Sign off the design\n\nThe sign-off judges the design before any build, from a notes file and the lines it cites, so it reads nothing else. One design covers one slice. This step signs off the wave's first slice. `ds:build` step 5.7 signs off each later slice before its build.\n\n1. Write the first slice's design to `\u003Croot>\u002F.scratchpad\u002Ftmp\u002F\u003Cdate>-\u003Cslug>\u002Fdesign-notes.md`: the goal in the operator's words, each claim about current code with its `path:N` cite, a `## done-when` table in the contract's shape (a row that must stay green ends its expect cell with `guard`), and one `REMOVES: \u003Cname>` line per skill, file or command the wave deletes or renames.\n1. Run the computed checks until they pass:\n\n   ```bash\n   \"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds design-check \u003Cnotes> \u003Crepo>\n   ```\n\n   `DESIGN: OK` (exit 0) writes `\u003Cnotes minus .md>-evidence.md` with every cited line. `DESIGN: FAIL \u003Cn>` (exit 1) names each cite that does not resolve, each check that passes today or did not run, and each file that names a `REMOVES:` item and is not in the notes: fix the notes and run it again. `DESIGN: PARSE` (exit 2) is a notes file to fix first.\n1. With `evidence` in the session's agent list, spawn one `evidence` agent with the notes path, the evidence path, the repo path and the findings path below. It runs its own checks, then spawns `signoff`, and returns the `signoff` reply. Otherwise, with `signoff` in the list, spawn one `signoff` agent. The plugin ships neither: they are the operator's own agents (ADAPTERS.md). A `signoff` agent may have no read tool, so put the full text of the notes file and the evidence file in its mission. Name a separate findings file for either agent, `\u003Croot>\u002F.scratchpad\u002Ftmp\u002F\u003Cdate>-\u003Cslug>\u002Fsignoff-findings.md`. Read the findings from that file, or from the reply when the file is empty (an `evidence` agent that stops early writes its findings in the reply). There is one line per finding: `block:` or `note:`, then `missing: \u003Cwhat>, at \u003Cfile:line or section>` or `evidence missing: \u003Cfact>, at \u003Cfile:line>`. A `block:` finding makes the build wrong or unsafe; every other finding is a `note:`. The reply ends with `SIGNOFF: PASS` when no line is `block:`, else `SIGNOFF: CHANGES`. Without either agent, the verdict is `skipped-absent`.\n1. Append §S `ds:new signoff=\u003CPASS|CHANGES|skipped-absent> notes=\u003Cnotes>`, where `\u003Cnotes>` is the design notes path from item 1, never the findings file: `ds:build` hands it to the builder and the reviewer as the design. Put each `note:` line in the step-6 report as a follow-up. On `CHANGES`, fix each `block:` line once, re-run item 2 (`ds design-check`), and ask for one re-check; a second `CHANGES` goes to the operator with both lists.\n\nThen commit the contract (tracked home). Whether the sign-off is sound is model-judgment; that the line exists is code: step 5 exits 1 without it.\n\n### 4. Initial §X refresh\n\nFor each repo row added in step 2, run:\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds x-refresh \u003Cdir> \u003Crepo-label> \u003Crepo-path>\n```\n\nWhen it refuses with `not a git repo`, the row keeps its placeholders plus the note `_(repo not found — verify path)_`.\n\n### 5. Finish\n\n```bash\n\"${CLAUDE_PLUGIN_ROOT}\"\u002Fcli\u002Fds new-finish \u003Cdir>\n```\n\nIt exits 1 naming the missing line when §S has no `ds:new signoff=` line: run step 3.7. Otherwise it regenerates `.scratchpad\u002FINDEX.md`, appends `ds:new — DONE slug=\u003Cslug> dir=\u003Cdir>` to §S, prints the `ds handoff` lines and exits 0.\n\n### 6. Report\n\n```\nds:new \u003Cslug> → .scratchpad\u002Fdossier\u002F\u003Cdate>-\u003Cslug>\u002FDOSSIER.md\n§X: \u003CN> repos seeded\nfollow-ups: \u003Ceach sign-off note: line, or none>\nnext:\n\u003Ceach handoff line step 5 printed, verbatim>\n```\n\nAdd `.scratchpad\u002F is not gitignored here` plus the fix when step 1's ignore check fired.\n\n## Idempotency\n\n`\u003Cdir>\u002FDOSSIER.md` already exists → refuse; the operator picks a new slug or opens the existing one via `ds:status`.\n\n`\u003Cdir>` exists with DOSSIER.md missing (a rare crash mid-scaffold) → recreate it, preserving any §S entries from the partial run.\n\n## Cite\n\n- FORMAT.md §2 (section order), §2.5 (wave contract), §10 (§X format), §11 (§S format), §17 (Vm rules)\n",{"name":5,"description":7,"argument-hint":24},"\"\u003Cgoal sentence>\" | \u003Cslug>","main","1b514c89a85d4bef67e5305bc21f2757f523a5db","plugins\u002Fdossier\u002Fskills\u002Fnew",0,"https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins","https:\u002F\u002Fgithub.com\u002Fraisedadead","https:\u002F\u002Fmrugesh.dev","dad • dev\u002F\u002Fops • open-source","2026-11-13 12:58:58",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add raisedadead\u002Fclaude-code-plugins --skill new",{"tool":40,"command":41},"bunx","bunx skills add raisedadead\u002Fclaude-code-plugins --skill new",{"tool":43,"command":44},"pnpm","pnpm dlx skills add raisedadead\u002Fclaude-code-plugins --skill new","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fdossier\u002Fskills\u002Fnew\u002FSKILL.md",true,[],[49,57,64,71,78,85],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":56},"01M76ACYEV4AABQFW2E5F0JGDK","suite-review","Run the monthly evidence review of this repo's plugin skills. Count each skill's opportunities and uses with the census, read what happened where a skill was not used, put each skill in one bucket, act, and write the actions as predictions with a check date. Use when the operator says \"suite review\" or \"monthly review\", or when the suite-review line on LATER.md is due.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fsuite-review\u002FSKILL.md",[],[],"2026-11-12 13:55:43",{"skillNo":58,"name":59,"nameZh":6,"description":60,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":19},"01M72WE0F58KDB68QPBGQEA91F","tiger-style","Check the column budget of the lines a change adds, and read that change against the TIGER_STYLE shape rules a script cannot judge. Use when the user asks about line length or column limits, to check code shape, what the column check flagged, or why a commit was blocked on a column budget.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fwhetstone\u002Fskills\u002Ftiger-style\u002FSKILL.md",[],[],{"skillNo":65,"name":66,"nameZh":6,"description":67,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":68,"categories":69,"keywords":70,"publishedAt":19},"01M72WDX5A781BKCTSDN0GF3M8","tdd-cycle","Drive one vertical slice of behaviour red-green-refactor, seam agreed before the first test. Use when the user asks to add a feature, fix a bug, write code test-first, says \"TDD this\", \"red green refactor\", or \"write a failing test first\". Inside a live dossier:build covenant, invoke dossier:build instead — it composes this skill's run-slice command as its RED\u002FGREEN proof.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fwhetstone\u002Fskills\u002Ftdd-cycle\u002FSKILL.md",[],[],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":19},"01M72WDPE6ESWEK5GVRRRV5EC1","prototype","Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fwhetstone\u002Fskills\u002Fprototype\u002FSKILL.md",[],[],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":84,"publishedAt":19},"01M72WD6W8XSQT2RHRE3VV9ED6","doubt-pass","Adversarial doubt cycle on a plan or design before any code exists — distinct from post-hoc code review. Use when the user asks to doubt this, stress-test a design before building it, poke holes in a plan, find the flaw in an approach, or before committing to a non-trivial architecture or design decision.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fwhetstone\u002Fskills\u002Fdoubt-pass\u002FSKILL.md",[],[],{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":19},"01M72WD2MWAENN8RKFD9AXHQ3B","diagnose","Diagnose a hard bug or a performance regression with a feedback loop first, then ranked hypotheses, instrumentation and a regression test. Use when the user says diagnose or debug this, or reports something broken, throwing, failing or slow.","https:\u002F\u002Fgithub.com\u002Fraisedadead\u002Fclaude-code-plugins\u002Fblob\u002Fmain\u002Fplugins\u002Fwhetstone\u002Fskills\u002Fdiagnose\u002FSKILL.md",[],[]]