@ericrisco/rsc 3.7.5 → 4.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +16 -9
  2. package/manifest.json +48 -40
  3. package/package.json +1 -1
  4. package/scripts/lib/domains.js +1 -1
  5. package/scripts/lib/onboarding-apply.js +1 -1
  6. package/scripts/lib/onboarding.js +7 -7
  7. package/scripts/lib/retired-skills.js +4 -0
  8. package/scripts/lib/review-findings.js +3 -0
  9. package/scripts/lib/review-ledger.js +187 -0
  10. package/scripts/lib/risk.js +68 -0
  11. package/scripts/lib/spec-gate.js +10 -1
  12. package/scripts/rsc.js +104 -6
  13. package/scripts/spec-gate.js +13 -3
  14. package/skills/analyze/SKILL.md +3 -3
  15. package/skills/asdd/SKILL.md +183 -0
  16. package/skills/{sdd → asdd}/evals/README.md +10 -10
  17. package/skills/{sdd → asdd}/evals/cases.yaml +5 -5
  18. package/skills/{sdd → asdd}/references/model-routing.md +2 -2
  19. package/skills/building-agents/SKILL.md +1 -1
  20. package/skills/clarify/SKILL.md +59 -55
  21. package/skills/clarify/evals/cases.yaml +6 -7
  22. package/skills/constitution/SKILL.md +30 -16
  23. package/skills/constitution/evals/README.md +1 -1
  24. package/skills/constitution/evals/cases.yaml +1 -1
  25. package/skills/debug/SKILL.md +3 -3
  26. package/skills/fastapi/SKILL.md +1 -1
  27. package/skills/flutter/SKILL.md +1 -1
  28. package/skills/ftd/SKILL.md +26 -10
  29. package/skills/ftd/evals/cases.yaml +1 -1
  30. package/skills/ftd/evals/routing.json +4 -4
  31. package/skills/go/SKILL.md +1 -1
  32. package/skills/implement/SKILL.md +147 -132
  33. package/skills/implement/evals/cases.yaml +4 -2
  34. package/skills/implement/references/per-task-review.md +26 -24
  35. package/skills/implement/scripts/task-brief +28 -22
  36. package/skills/nextjs/SKILL.md +1 -1
  37. package/skills/parallel/SKILL.md +1 -1
  38. package/skills/plan/SKILL.md +3 -3
  39. package/skills/plan/evals/cases.yaml +1 -1
  40. package/skills/plan/references/plan-template.md +2 -2
  41. package/skills/postgresdb/SKILL.md +1 -1
  42. package/skills/react/SKILL.md +1 -1
  43. package/skills/review/SKILL.md +80 -41
  44. package/skills/sdd-init/SKILL.md +11 -9
  45. package/skills/ship/SKILL.md +58 -30
  46. package/skills/specify/SKILL.md +42 -41
  47. package/skills/specify/evals/cases.yaml +2 -2
  48. package/skills/specify/references/eliciting-requirements.md +1 -1
  49. package/skills/specify/references/spec-template.md +28 -6
  50. package/skills/suggest/SKILL.md +4 -4
  51. package/skills/tasks/SKILL.md +37 -33
  52. package/skills/tasks/evals/README.md +1 -1
  53. package/skills/tasks/evals/cases.yaml +3 -3
  54. package/skills/verify/SKILL.md +34 -18
  55. package/skills/verify/evals/README.md +2 -2
  56. package/skills/verify/evals/cases.yaml +2 -1
  57. package/skills/verify/references/generic-gate.md +43 -0
  58. package/skills/worktrees/SKILL.md +1 -1
  59. package/targets/clone-bootstrap.mjs +1 -1
  60. package/targets/hook-once.mjs +2 -2
  61. package/targets/sello.mjs +9 -3
  62. package/skills/sdd/SKILL.md +0 -250
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ship
3
- description: "Use when a verified, review-approved branch has to land — the close of the rsc SDD chain: safety checks, then three landing options (merge, PR, park/discard), authorship always Eric and never an AI trailer. NOT running the gates (that is `verify`), NOT reading the diff for defects (that is `review`), NOT shipping to a server (that is `deployment`)."
4
- tags: [sdd, ship, release, pr]
3
+ description: "Use when a verified branch that passed its closing review has to land — the close of rsc ASDD: safety checks, an explainer for the human (what changed, what the checks proved and would not catch), then three landing options (merge, PR with Testing/Risk/How to revert, park/discard). Risk tier 0-1 with CI green may self-merge; tier 2 waits for human approval. Authorship always the human, never an AI trailer. NOT running the gates (that is `verify`), NOT reading the diff for defects (that is `review`), NOT shipping to a server (that is `deployment`)."
4
+ tags: [asdd, ship, release, pr, risk]
5
5
  recommends: []
6
6
  profiles: [core, full]
7
7
  origin: risco
@@ -9,20 +9,20 @@ origin: risco
9
9
 
10
10
  # Ship — close the development branch
11
11
 
12
- Ship is the **last gate** of the rsc SDD chain: `constitution → specify → clarify → plan → tasks → analyze → implement → verify → review → **ship**`. Everything upstream proved the work is *correct* and *green*; ship is the act of **landing it** — turning an approved branch into merged history, a pull request, or a clean parked branch — without breaking the trunk and without ever forging the author.
12
+ Ship is the **last step** of ASDD's closing stage (`../asdd/SKILL.md`), after the closing review. Everything upstream proved the work is *correct* and *green*; ship is the act of **landing it** — turning an approved branch into merged history, a pull request, or a clean parked branch — without breaking the trunk and without ever forging the author.
13
13
 
14
14
  This skill owns one decision and its safe execution: **how does this work integrate?** It does not write code, run test gates, or read the diff for defects — those phases already happened. It is the **close, not the open**: creating the isolated branch or worktree is `../worktrees/SKILL.md`, taking the gates green is `../verify/SKILL.md`, reading the diff adversarially is `../review/SKILL.md`, and putting merged code onto a server is `../deployment/SKILL.md`.
15
15
 
16
- ## The hard rule: git authorship is Eric, never Claude
16
+ ## The hard rule: git authorship is the responsible person, never an AI
17
17
 
18
- > **Every commit and every PR ships under Eric's name. No `Co-Authored-By: Claude`. No `Co-Authored-By` for any AI. No "🤖 Generated with Claude Code" footer. No "made by an agent" line in the PR body. Nothing that attributes the work to a tool.**
18
+ > **Every commit and every PR ships under the name of the responsible person — the configured git user. No `Co-Authored-By: Claude`. No `Co-Authored-By` for any AI. No "🤖 Generated with Claude Code" footer. No "made by an agent" line in the PR body. Nothing that attributes the work to a tool.**
19
19
 
20
- This is absolute — not a preference to weigh against convenience — because a commit is a permanent, published claim about who wrote something. The work is Eric's; the agent is a tool he used, like an editor or a compiler, and you do not credit the compiler in the commit message. Once a forged trailer is pushed it is in everyone's history and only a rewrite removes it.
20
+ This is absolute — not a preference to weigh against convenience — because a commit is a permanent, published claim about who wrote something. The work is the responsible person's; the agent is a tool they used, like an editor or a compiler, and you do not credit the compiler in the commit message. Once a forged trailer is pushed it is in everyone's history and only a rewrite removes it.
21
21
 
22
22
  Concretely, before any commit or PR:
23
23
 
24
- - **Never** pass `--author` to set a non-Eric author. The repo's configured `user.name` / `user.email` (Eric's) is the author and committer.
25
- - If `git config user.email` is unset or clearly not Eric's, **stop and ask** which identity to commit under — do not guess, and do not substitute an agent identity.
24
+ - **Never** pass `--author` to set another author. The repo's configured `user.name` / `user.email` — the responsible person — is the author and committer.
25
+ - If `git config user.email` is unset or is an agent/bot identity, **stop and ask** which identity to commit under — do not guess, and do not substitute an agent identity.
26
26
  - If you find a Claude/AI trailer in a commit you are about to push (e.g. left over from an upstream tool), **strip it** before the branch lands.
27
27
 
28
28
  Verify it after writing the commit. A non-empty match is a blocker: amend and re-check before the branch goes anywhere.
@@ -36,7 +36,7 @@ git log -1 --format='%an <%ae>%n%n%b' | grep -iE 'co-authored-by.*(claude|anthro
36
36
  ## Read these first
37
37
 
38
38
  1. `02-DOCS/wiki/harness/user-profile.md` — `technical_level`, the register. It sets the words only, never whether you run the safety checklist.
39
- 2. The **review verdict** for this branch — ship runs only on `APPROVE` or `APPROVE WITH NITS`. `CHANGES REQUESTED` loops back to `implement`, not forward to ship. If there is no verdict on record, say so and treat it as a red flag: do not ship a diff that skipped `../review/SKILL.md` — offer to run it first.
39
+ 2. The **closing review verdict** for this branch — ship runs only on `APPROVE` or `APPROVE WITH NITS`. `CHANGES REQUESTED` loops back to `implement`, not forward to ship. If there is no verdict on record, say so and treat it as a red flag: do not ship a diff that skipped `../review/SKILL.md` — offer to run it first.
40
40
  3. `02-DOCS/wiki/sdd/decisions.md` and the spec/plan slug — so the commit message and PR body describe *what shipped against which spec*, not a vague "various changes".
41
41
 
42
42
  ## The pre-ship safety checklist
@@ -46,9 +46,11 @@ Run this before presenting the landing options. Any unchecked item is a stop —
46
46
  - [ ] **Review verdict is APPROVE / APPROVE WITH NITS** (not CHANGES REQUESTED, not absent).
47
47
  - [ ] **Working tree is clean** — `git status --short` is empty. No stray edits sneaking into the merge.
48
48
  - [ ] **On a feature branch, not the trunk** — `git rev-parse --abbrev-ref HEAD` is not `main`/`master`. If work landed directly on the trunk, that is its own problem; flag it, don't paper over it.
49
- - [ ] **Rebased / up to date with the base** — branch is on top of latest `main`; conflicts resolved locally, not punted to the merge.
49
+ - [ ] **Rebased / up to date with the base, and tested there** — branch is on top of latest `main`; conflicts resolved locally, not punted to the merge; the checks re-ran on the rebased branch.
50
+ - [ ] **Risk tier known** — `npx @ericrisco/rsc risk --base main` run; its tier, classes and `human approval` line go into the PR's Risk section.
51
+ - [ ] **No `blocking` entry in the decision queue** (`## Decision queue` in `progress/<slug>.md`) — or the PR says which remain and it does not self-merge. `review-after` entries never block; they are listed in the PR body (or the parked summary) for the human.
50
52
  - [ ] **No secrets in the diff** — scan the staged/branch diff for keys, tokens, `.env` values (`git diff main... | grep -iE 'api[_-]?key|secret|password|token|BEGIN .*PRIVATE KEY'`). A hit is a blocker; remove it, and rotate it if it was ever pushed.
51
- - [ ] **Authorship is Eric** — `git config user.email` is Eric's; no AI trailer in any commit on the branch (run the grep above across `main..HEAD`).
53
+ - [ ] **Authorship is the responsible person** — `git config user.email` is the configured human; no AI trailer in any commit on the branch (run the grep above across `main..HEAD`).
52
54
  - [ ] **Commit history is intelligible** — squashed or organized so the history reads as deliberate, not "wip wip fix fix".
53
55
 
54
56
  ```bash
@@ -56,11 +58,20 @@ Run this before presenting the landing options. Any unchecked item is a stop —
56
58
  echo "branch: $(git rev-parse --abbrev-ref HEAD)"
57
59
  echo "clean?: $([ -z "$(git status --short)" ] && echo yes || echo NO-dirty)"
58
60
  echo "behind: $(git rev-list --count HEAD..origin/main 2>/dev/null || echo '?') commits behind origin/main"
59
- git log main..HEAD --format='%an <%ae>' | sort -u # authors on this branch — expect only Eric
61
+ git log main..HEAD --format='%an <%ae>' | sort -u # authors on this branch — expect only the configured user
60
62
  git diff main...HEAD | grep -icE 'api[_-]?key|secret|password|token|BEGIN .*PRIVATE KEY' \
61
63
  | sed 's/^/secret-hits: /'
64
+ npx @ericrisco/rsc risk --base main # tier, classes, reviewers, human approval
62
65
  ```
63
66
 
67
+ ### The explainer — before the PR, for the human
68
+
69
+ Before any landing option, give the human a short explainer, in their register: **what the change
70
+ does** (behaviour, not files), **what the checks proved** (which tests, criteria, review tier), and
71
+ **what they would NOT catch** — the untested path, the environment only production has, the
72
+ judgement no test encodes. The last part is the point: it tells the human where to look. It also
73
+ goes into the PR's Testing section.
74
+
64
75
  ### Automated guard (PreToolUse) — you cannot quietly abandon a feature
65
76
 
66
77
  When rsc is installed for Claude Code, a `PreToolUse` hook (`.rsc/ship-guard.mjs`) enforces this
@@ -99,7 +110,7 @@ local merge is a commit on the default branch. Present option 2 (the recommendat
99
110
  and say in one line why option 1 is absent and that «desbloquea main» (`npx @ericrisco/rsc main
100
111
  unlock`) would bring it back. The branch guard denies the local merge anyway.
101
112
 
102
- Recommend based on repo signals: protected `main` or an existing PR culture (look for `.github/`, prior PRs via `gh pr list`) → recommend **option 2**. A solo project with no protection and a passed review → **option 1** is honest and faster. Never default to a PR ceremony the repo doesn't use, and never force-merge a repo that gates `main`.
113
+ Recommend based on repo signals: protected `main` or an existing PR culture (look for `.github/`, prior PRs via `gh pr list`) → recommend **option 2**. A solo project with no protection and a passed review → **option 1** is honest and faster. Never default to a PR ceremony the repo doesn't use, and never force-merge a repo that gates `main`. A tier-2 change takes option 1 only after human approval, same as a PR.
103
114
 
104
115
  ### Delivery strategy from SDD config
105
116
 
@@ -114,7 +125,13 @@ Stacked PR / feature-track support still fits inside the three landing options:
114
125
 
115
126
  ## Executing each option
116
127
 
117
- **Nothing below runs before the user picks an option.** Merging, pushing, opening a PR and deleting a branch are outward or irreversible — they change shared history or publish to a forge, and no later phase undoes them. A recommendation is not a yes; wait for one.
128
+ **Nothing below runs before an option is picked.** Merging, pushing, opening a PR and deleting a branch are outward or irreversible — they change shared history or publish to a forge, and no later phase undoes them. Interactively, the user picks: a recommendation is not a yes; wait for one.
129
+
130
+ **In autopilot** (the up-front yes, or `execution_mode: automatic` in `config.yaml`) the agent picks by these rules, and there is always a legal path:
131
+
132
+ - **A remote exists** → option 2, the PR. Self-merge only when `rsc risk` says tier 0-1, CI is green and **no `blocking` entry** is open; otherwise leave the PR open for the human. List every `review-after` entry in the PR body.
133
+ - **No remote** → option 3, **park**: leave the branch committed, write the explainer, the open queue entries and the exact merge command for the human (`git switch main && git merge --no-ff feature/<slug>`) into `progress/<slug>.md`, and stop.
134
+ - **Never merge locally around the branch guard.** When `rsc main status` says `closed: true`, the guard denies a local merge — that is the signal to park, not to find another command. Autopilot never discards.
118
135
 
119
136
  ### Option 1 — direct merge
120
137
 
@@ -157,19 +174,28 @@ PR body shape (no generated-with line, ever):
157
174
 
158
175
  Implements `02-DOCS/wiki/sdd/specs/<slug>.md`. <the user-facing reason>
159
176
 
160
- ## How
177
+ ## Testing
178
+
179
+ - <what ran: lint / types / tests / verify record; acceptance criteria met, each with its evidence>
180
+ - Closing review: APPROVE (<N> findings, all with an outcome).
181
+ - Not covered: <what these checks would NOT catch — from the explainer>
182
+
183
+ ## Risk
161
184
 
162
- - <key implementation point>
163
- - <key implementation point>
185
+ Tier <0|1|2> (`rsc risk`): <classes touched>. Human approval: <required|not required>.
186
+ Decision queue: <open `blocking` entries, or none> · Review after: <each `review-after` entry, or none>.
164
187
 
165
- ## Verification
188
+ ## How to revert
166
189
 
167
- - `verify` phase: lint / types / tests green (see the verification record).
168
- - Acceptance criteria from the spec: all met.
169
- - Review verdict: APPROVE.
190
+ <`git revert <merge-sha>` / the squash commit; plus anything a revert alone does not undo — a migration, a flag, data written>
170
191
  ```
171
192
 
172
- Then either let the gate run (team/CI) or self-merge once green: `gh pr merge --squash --delete-branch` (or `--merge` to preserve the history). Squash when the branch history is noisy; preserve when each commit is meaningful.
193
+ **Merge policy — by risk tier.** Tier 0-1, CI green and no `blocking` entry in the decision queue
194
+ → you may self-merge (autopilot): `gh pr merge --squash --delete-branch` (or `--merge` to preserve the
195
+ history; squash when the branch history is noisy, preserve when each commit is meaningful). **Tier
196
+ 2 waits for human approval** — a human's approving review on the PR, or their explicit yes in the
197
+ conversation. An agent's approval never counts as a human's: no refuter, reviewer subagent or bot
198
+ review stands in for it, however clean.
173
199
 
174
200
  Once it is merged, pull the trunk — `git switch main && git pull --ff-only` — and the cleanup rides along with that pull: `post-merge` fires on a fast-forward too, verified. A squashed pull request is exactly the case the reaper judges by content rather than by commit identity, so it is recognised as landed; the local branch is kept, because git will not delete a squashed branch safely and while it exists the work is recoverable.
175
201
 
@@ -184,7 +210,7 @@ Never stack to hide review risk. Stack because each slice is independently revie
184
210
 
185
211
  ### Option 3 — park or discard
186
212
 
187
- - **Park:** leave the branch, push it so it's not lost (`git push -u origin feature/<slug>`), and log *why it's parked* to `02-DOCS/wiki/sdd/decisions.md`. Do not merge.
213
+ - **Park:** leave the branch committed, push it if a remote exists (`git push -u origin feature/<slug>`), and log *why it's parked* to `02-DOCS/wiki/sdd/decisions.md`. Do not merge. A branch parked *ready to land* (autopilot, no remote) also gets its explainer, open queue entries and the exact merge command in `progress/<slug>.md`, so the human lands it with one command.
188
214
  - **Discard:** deletion is **destructive and unrecoverable** once the branch is gone from both sides, so it takes an explicit confirmation that quotes the branch name (the literal `yes, delete feature/<slug>`) before `git branch -D`. Anything ambiguous means keep it. Log the discard and the reason so the dead-end is remembered, not re-attempted.
189
215
 
190
216
  **Park and discard do NOT reap.** The cleanup default acts only on work that is already in the trunk;
@@ -197,7 +223,7 @@ reaper — it owns its own lifecycle and its tracking has to stay consistent.
197
223
 
198
224
  ## Commit message discipline
199
225
 
200
- The commit is the durable record. Make it describe the change and tie it to the spec — and keep it Eric's.
226
+ The commit is the durable record. Make it describe the change and tie it to the spec — and keep it the responsible person's.
201
227
 
202
228
  - **Subject:** `<gitmoji> type: imperative summary (<spec-slug>)` — `✨ feat:`, `🐛 fix:`, `♻️ refactor:`, etc. Under ~72 chars. The gitmoji is **not optional**: on Claude Code a PreToolUse guard denies a `git commit -m` without one, and the refusal hands back the corrected message. Emoji → intention table: `../git-workflow/references/gitmoji.md`.
203
229
  - **Body:** *why*, not a restatement of the diff. Reference the spec slug and any decision logged in `decisions.md`.
@@ -205,22 +231,24 @@ The commit is the durable record. Make it describe the change and tie it to the
205
231
 
206
232
  ## Model tier — `light` (opt-in routing)
207
233
 
208
- Closing the branch (PR / merge / cleanup) is mechanical, so this phase's default tier is **`light`**. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`; when it is on, follow `../sdd/references/model-routing.md` for resolving and announcing the switch rather than from memory. Routing off or no profile → honor the session model silently, and skip routing on a one-line change. The Eric-only authorship rule is independent of the model and never relaxes.
234
+ Closing the branch (PR / merge / cleanup) is mechanical, so this phase's default tier is **`light`**. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`; when it is on, follow `../asdd/references/model-routing.md` for resolving and announcing the switch rather than from memory. Routing off or no profile → honor the session model silently, and skip routing on a one-line change. The human-authorship rule is independent of the model and never relaxes.
209
235
 
210
236
  ## What ship shows
211
237
 
212
238
  Read `technical_level` from `02-DOCS/wiki/harness/user-profile.md`. It changes the words, **never** the safety checklist or the authorship rule. No profile → use analogies and proceed; don't stall the ship to ask.
213
239
 
214
- In the `orient` voice: the checklist result in one line, the three options as one-liners, the recommendation and its *why*, then execute on a yes — e.g. `Clean, rebased, authorship Eric. Recommend PR (main is protected). Open it?`. For a `non-technical` owner, explain the recommended option with an analogy: a protected `main` wants a PR ("asking permission before changing the shared copy"). Explain fast-forward vs `--no-ff` or what squashing trades away only when asked.
240
+ In the `orient` voice: the explainer, the checklist result in one line, the three options as one-liners, the recommendation and its *why*, then execute on a yes — e.g. `Clean, rebased, authorship <git user>. Recommend PR (main is protected). Open it?`. For a `non-technical` owner, explain the recommended option with an analogy: a protected `main` wants a PR ("asking permission before changing the shared copy"). Explain fast-forward vs `--no-ff` or what squashing trades away only when asked.
215
241
 
216
242
  ## Anti-patterns → STOP
217
243
 
218
244
  | Rationalization | Reality |
219
245
  | --- | --- |
220
- | "I'll add `Co-Authored-By: Claude` / a 'Generated with Claude Code' footer to be transparent" | It forges the record. The work is Eric's — no AI trailer, ever. Strip it. |
246
+ | "I'll add `Co-Authored-By: Claude` / a 'Generated with Claude Code' footer to be transparent" | It forges the record. The work is the responsible person's — no AI trailer, ever. Strip it. |
221
247
  | "Review didn't formally approve but it's obviously fine" | No verdict = not ready. Ship runs on APPROVE only. Route back to review. |
248
+ | "Tier 2, but the three refuters approved — I'll self-merge" | An agent's approval never counts as a human's. Tier 2 waits for human approval. |
222
249
  | "The tree has a couple of stray edits, they're harmless" | A dirty tree means the merge is not the reviewed diff. Clean it or stash it first. |
223
250
  | "`main` is protected but I'll just force-merge, I'm sure" | Protected means PR. Don't bypass the gate the repo deliberately set. |
251
+ | "No remote and the guard denies the merge — I'll merge another way" | The denial is the answer. Park the branch with the merge command for the human. |
224
252
  | "I'll rebase and resolve conflicts during the merge" | Resolve before. A conflicted merge commit hides what actually shipped. |
225
253
  | "The gitmoji is decoration, the conventional type is what matters" | Both ship or neither does. The type is for tooling, the emoji for the human scanning `git log` — and the guard denies the commit either way. |
226
254
  | "This branch is dead, I'll just delete it" | Discard is destructive — confirm with the quoted branch name and log why first. |
@@ -232,7 +260,7 @@ In the `orient` voice: the checklist result in one line, the three options as on
232
260
  Ship is mostly git actions, but the outcome is recorded so the knowledge model stays whole:
233
261
 
234
262
  - **The landing decision** (which of the three options, and why) → append to `02-DOCS/wiki/sdd/decisions.md`, the same append-only log `implement`, `verify`, and `review` write to. Parks and discards are logged with their reason so dead-ends aren't re-walked.
235
- - A **shipped feature** flips its spec under `02-DOCS/wiki/sdd/specs/<slug>.md` to a shipped state (note the merge commit / PR). The harness owns the wiki; ship just keeps the `sdd/` rows in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer) honest.
263
+ - A **shipped feature** flips its spec under `02-DOCS/wiki/sdd/specs/<slug>.md` to a shipped state (note the merge commit / PR). The harness owns the wiki; ship just keeps the `sdd/` rows in `02-DOCS/wiki/index.md` (the Knowledge map) honest — never the root `CLAUDE.md`.
236
264
  - An **archive bundle** closes the loop under `02-DOCS/wiki/sdd/archive/<slug>/`:
237
265
  - `final-report.md` — what shipped, why, landing decision, links.
238
266
  - `apply-progress.md` — copy or link to `progress/<slug>.md`.
@@ -259,13 +287,13 @@ End with:
259
287
  "fallback": [],
260
288
  "compact_rules": ["Keep exactly three landing options.", "Archive the final state."]
261
289
  },
262
- "evidence": ["review verdict", "verification record", "PR/merge/park/discard reference"]
290
+ "evidence": ["closing review verdict", "rsc risk tier", "verification record", "PR/merge/park/discard reference", "human approval when tier 2"]
263
291
  }
264
292
  ```
265
293
 
266
294
  ## Next in the chain
267
295
 
268
- Ship is the end of the SDD loop for a feature. Two onward paths: the merged code still has to reach a **server / release** → hand off to **deployment** (`../deployment/SKILL.md`); or the next feature restarts the loop at **specify** (`../specify/SKILL.md`), or at **constitution** if the project's principles changed. The `sdd` dispatcher (`../sdd/SKILL.md`) routes whichever comes next.
296
+ Ship is the end of the ASDD loop for a feature. Two onward paths: the merged code still has to reach a **server / release** → hand off to **deployment** (`../deployment/SKILL.md`); or the next feature restarts the loop at **specify** (`../specify/SKILL.md`), or at **constitution** if the project's principles changed. The `asdd` dispatcher (`../asdd/SKILL.md`) routes whichever comes next. Later, a revert of what shipped is an escape: `review` turns it into a case (`rsc review escapes`).
269
297
 
270
298
  ## Orientación (siempre)
271
299
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: specify
3
- description: "Use when a feature, change, or product idea is still fuzzy and must become an approved WHAT/WHY spec before any planning or code — the brainstorming front door of SDD. Turns a one-line intent into problem, goals, users, scope, behaviour and acceptance criteria, via frontier-round dialogue and 2-3 approaches with a recommendation, carrying zero implementation detail. Fires whenever someone jumps to HOW before WHAT is agreed, in any language. NOT the technical plan (that is `plan`), NOT the de-risking ambiguity sweep (that is `clarify`), NOT project-wide principles (that is `constitution`)."
3
+ description: "Use when a feature, change, or product idea is still fuzzy and must become an approved WHAT/WHY spec before any planning or code — the brainstorming front door of ASDD stage 2 (Spec). Turns a one-line intent into problem, goals, users, out-of-scope, the four ASDD questions (what the user can do, what result they get, what it must respect, how it proves it) and acceptance criteria, via frontier-round dialogue and 2-3 approaches with a recommendation, carrying zero implementation detail. Fires whenever someone jumps to HOW before WHAT is agreed, in any language. NOT the technical plan (that is `plan`), NOT the de-risking ambiguity sweep (that is `clarify`), NOT project-wide principles (that is `constitution`)."
4
4
  tags: [sdd, spec, requirements]
5
5
  recommends: [clarify, plan]
6
6
  profiles: [core, full]
@@ -9,7 +9,7 @@ origin: risco
9
9
 
10
10
  # Specify — intent becomes a spec
11
11
 
12
- This is the **specify** phase of the rsc-sdd chain: `constitution` → **`specify`** → `clarify` → `plan` → `tasks` → `analyze` → `implement` → `verify` → `review` → `ship`. Its single job is to turn a fuzzy intent into a written specification that states **WHAT** the change is and **WHY** it matters — and nothing about **HOW** it gets built.
12
+ This is the drafting half of ASDD stage 2, **Spec** (`../asdd/SKILL.md`): **`specify`** writes the draft → `clarify` hunts its gaps → the human approves. Its single job is to turn a fuzzy intent into a written specification that states **WHAT** the change is and **WHY** it matters — and nothing about **HOW** it gets built.
13
13
 
14
14
  A spec is a contract about behaviour and outcomes, readable by a non-technical stakeholder and precise enough that a `plan` can be derived from it. The output is one file: `02-DOCS/wiki/sdd/specs/<slug>.md`, indexed in `02-DOCS/wiki/index.md` (the Knowledge map; root `CLAUDE.md` keeps only a short pointer).
15
15
 
@@ -40,7 +40,7 @@ If, having looked, there is no real objection, **say so in one line and move on
40
40
  **Offer autopilot once, right here.** At this boundary, propose how to run the rest of the chain:
41
41
  > *"¿Quieres que lo lleve hasta el final yo solo — spec → plan → código → verify, parando solo si algo es ambiguo — o prefieres que pare a que apruebes en cada fase?"*
42
42
 
43
- A **yes engages autopilot** (`../sdd/SKILL.md`): you still write the spec and every artifact, but you auto-advance through the phases without re-asking — that up-front yes is the approval that satisfies the hard gate above, for the whole run. A **no** (or silence) keeps the default gated flow: write the spec, hand to `clarify`/`plan`, stop for approval before code. Either way the spec gets written; autopilot only changes whether you pause *between* phases — and it still stops for genuine ambiguity, hard failures, or destructive/outward actions (ship still confirms). If `sdd.autopilot: true` in config, autopilot is the default — still surface it once.
43
+ A **yes engages autopilot** (`../asdd/SKILL.md`): you still write the spec and every artifact, but you auto-advance through the phases without re-asking — that up-front yes is the approval that satisfies the hard gate above, for the whole run. A **no** (or silence) keeps the default gated flow: write the spec, hand to `clarify`/`plan`, stop for approval before code. Either way the spec gets written; autopilot only changes whether you pause *between* phases — and it still stops for genuine ambiguity, hard failures, or destructive/outward actions (ship still confirms). If `sdd.autopilot: true` in config, autopilot is the default — still surface it once.
44
44
 
45
45
  ## The one rule that defines this skill
46
46
 
@@ -52,7 +52,7 @@ If you cannot state a requirement without naming the technology, that is a real
52
52
 
53
53
  ## Model tier — `balanced` (opt-in routing)
54
54
 
55
- This phase's default model tier is **`balanced`** — it drafts the what/why spec through dialogue, not architecture. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`. When on: resolve this phase's tier (`models.overrides` wins over `models.phases`), map it to a model via `models.tiers`, and apply per `../sdd/references/model-routing.md` — announce the switch in one line when it differs from the session model, and dispatch any `Task`/`parallel` subagents on that model. Routing off or no profile → honor the session model silently. Never fake a switch a tool can't make; skip routing on a one-line change.
55
+ This phase's default model tier is **`balanced`** — it drafts the what/why spec through dialogue, not architecture. Routing is **off** unless `models.enabled: true` in `02-DOCS/wiki/sdd/config.yaml`. When on: resolve this phase's tier (`models.overrides` wins over `models.phases`), map it to a model via `models.tiers`, and apply per `../asdd/references/model-routing.md` — announce the switch in one line when it differs from the session model, and dispatch any `Task`/`parallel` subagents on that model. Routing off or no profile → honor the session model silently. Never fake a switch a tool can't make; skip routing on a one-line change.
56
56
 
57
57
  ## Read the room first (register)
58
58
 
@@ -103,8 +103,12 @@ Write these sections into `02-DOCS/wiki/sdd/specs/<slug>.md` using `references/s
103
103
  | Cost of not building it | What concretely happens if nobody does this, and what it costs | Softening a genuinely small cost — "not much" IS the finding |
104
104
  | The cheapest alternative | What would solve most of it without building this, and why that is not enough | "Nothing" — there is always a manual workaround or a smaller version |
105
105
  | Goals | What success delivers, in outcome terms | A "goal" that's actually a HOW |
106
- | Non-goals / out of scope | What is explicitly NOT done now — adjacent work, deferred features | Silence — unsaid scope becomes assumed scope |
106
+ | Non-goals / out of scope | What is explicitly NOT done now — adjacent work, deferred features, and what an agent could add "just in case" (the dropped token, the QR nobody asked for) | Silence — unsaid scope becomes assumed scope, and a long run fills it |
107
107
  | Users & context | Who acts, their context, what they're trying to achieve | An imagined user no one asked for |
108
+ | What the user can do | The action, its starting conditions, who is allowed to do it | A capability with no actor or no precondition |
109
+ | What result they get | The observable result against a reference the **human approved**: a screenshot or sketch for UI, the expected response for an API | An agent judging that two screenshots "look alike" — that is not a reference |
110
+ | What it must respect | Constraints and prior behaviour that must keep working. Consult the project's brain if it has one, otherwise `02-DOCS/wiki/sdd/decisions.md` and existing specs, so the spec never steps on a prior decision | A constraint you remember but did not look up |
111
+ | How it proves it | How the check runs and what evidence remains afterwards | "Yes, I tested it" — that is a claim, not evidence |
108
112
  | Behaviour | What the system does, in observable terms, incl. main + edge + error paths | A verb that's actually a HOW ("queries", "caches") |
109
113
  | Acceptance criteria | Testable, binary checks that say "done" | Vague critera ("works well", "is fast") |
110
114
  | Points to clarify | The typed handoff to `clarify` — see the four types below | An untyped list, or pretending there are none |
@@ -121,7 +125,7 @@ Then they see an empty-cart message and the "pay" button is disabled
121
125
 
122
126
  A criterion that needs a human to "decide if it's good enough" is not done yet — sharpen it or move the soft part to *Points to clarify*.
123
127
 
124
- **Two of those sections are enforced, not suggested.** For a spec dated 2026-09-06 or later, `spec:gate` refuses the file if *Cost of not building it* or *The cheapest alternative* is missing or still holding the template's guidance. Specs written before that date are exempt — they cannot answer honestly after the fact. The two exist because every other gate in the chain compares artifacts to each other, so a spec that is wrong-but-coherent passes all of them; these are the only two lines that ask whether the thing should exist at all.
128
+ **Six of those sections are enforced, not suggested, each from its own date.** For a spec dated 2026-09-06 or later, `rsc spec gate` refuses the file if *Cost of not building it* or *The cheapest alternative* is missing or still holding the template's guidance; from 2026-11-03 it also refuses one missing any of the four ASDD questions — *What the user can do*, *What result they get*, *What it must respect*, *How it proves it* (Spanish headings accepted: *Qué podrá hacer el usuario*, *Qué resultado obtiene*, *Qué debe respetar*, *Cómo lo demuestra*). Specs written before each date are exempt — they cannot answer honestly after the fact. The first two ask whether the thing should exist at all, because every other gate compares artifacts to each other and a wrong-but-coherent spec passes all of them. The four make the spec something a long autonomous run can be checked against: tests prove the code works, not that it does what was asked.
125
129
 
126
130
  ### Points to clarify carry a type
127
131
 
@@ -155,7 +159,8 @@ saves you work.
155
159
  Run these in order. It is a collaborative dialogue, not a form you fill in silence — and **you do not skip to a design dump.** Track the steps with a todo list so none is dropped.
156
160
 
157
161
  ```text
158
- 1. EXPLORE context → profile + sdd config + constitution + existing specs + wiki + recent git
162
+ 1. EXPLORE context → profile + sdd config + constitution + existing specs + decisions log (or the
163
+ project's brain) + wiki + recent git
159
164
  2. SCOPE check → if the request is several independent subsystems, DECOMPOSE into sub-specs first,
160
165
  then brainstorm the FIRST one; each gets its own spec → plan → build cycle
161
166
  3. RESTATE + OBJECT → one sentence of what you understood, plus the strongest objection you can
@@ -188,13 +193,11 @@ property of the **file**, not of your confidence:
188
193
  > Every template section carries content or an explicit typed open point, and no section holds an
189
194
  > unmarked assumption.
190
195
 
191
- Run `npm run spec:gate <path>` on the spec you just wrote (no path: the whole corpus). It reports the
192
- missing and the empty sections by name, and it prints what it does **not** check — the unmarked
193
- assumption is yours to catch, because no parser can. A red gate means the spec is not closed: name
194
- the section that failed and fix it before step 9.
195
-
196
- A gate that has never been seen fail is not known to work, so this one ships with the test that
197
- watches it fail and pass (`tests/spec-gate.test.js`).
196
+ Run `npx @ericrisco/rsc spec gate <path>` on the spec you just wrote (no path: every spec in the
197
+ project's `02-DOCS/wiki/sdd/specs/`). It prints `PASS`/`FAIL` per file, reports the missing and the
198
+ empty sections by name, exits non-zero on any `FAIL`, and prints what it does **not** check — the
199
+ unmarked assumption is yours to catch, because no parser can. A red gate means the spec is not
200
+ closed: name the section that failed and fix it before step 9.
198
201
 
199
202
  ### Fresh-eyes spec review (step 8, scaled to the stakes)
200
203
 
@@ -239,7 +242,11 @@ ask → user answers → fold it in → say what changed → show the revised sp
239
242
  **approved in autopilot, not item by item**, in the spec's `status:`. The spec then becomes the
240
243
  artifact the user reviews *after the fact*, and the work claims correspondingly less certainty
241
244
  about having captured their intent. Writing "aprobada" flat, when what happened was a blanket
242
- go-ahead, is the record telling a small lie about the strongest gate in the chain.
245
+ go-ahead, is the record telling a small lie about the strongest gate in the chain. The same goes
246
+ for *What result they get*: with no human to approve a reference, write one that can be checked
247
+ mechanically (the expected transcript, response or output), and record it as a `review-after`
248
+ entry in the decision queue (`## Decision queue`, `02-DOCS/wiki/sdd/progress/<slug>.md`) — the
249
+ run continues, the human confirms the reference afterwards.
243
250
  - **Rejection is information — keep it.** If the user turns the spec down, revise it in place and
244
251
  append the reason to `## Revisions`. Never delete and start clean: what they rejected, and why,
245
252
  is the most useful thing in the file.
@@ -268,10 +275,25 @@ drop-off, because the friction is the password itself, not the reset.
268
275
  ## Non-goals / out of scope
269
276
  - Social login (Google/Apple) — deferred.
270
277
  - Replacing existing sessions for already-signed-in users.
278
+ - A QR code to sign in from another device — nobody asked for it.
271
279
 
272
280
  ## Users & context
273
281
  A returning user on a new device who does not remember a password.
274
282
 
283
+ ## What the user can do
284
+ Any registered user, signed out, can request a link to their own email.
285
+
286
+ ## What result they get
287
+ The sign-in screen matches the approved sketch (linked); following the link
288
+ lands them signed in on the page they started from.
289
+
290
+ ## What it must respect
291
+ Existing sessions keep working; the decisions log says unknown emails reveal nothing.
292
+
293
+ ## How it proves it
294
+ An end-to-end check per acceptance criterion; its run log and a screenshot of
295
+ the signed-in page stay in the verification file.
296
+
275
297
  ## Behaviour
276
298
  - Main: user enters email → receives a link → following it signs them in.
277
299
  - Edge: an expired link shows a "request a new link" path.
@@ -296,28 +318,7 @@ Note what is *absent*: no token format, no table, no email provider, no framewor
296
318
 
297
319
  ## Optional proposal / pre-execution briefing
298
320
 
299
- For a tiny feature, skip this. For ambiguous, architectural, high-risk, high-review-cost or research-heavy work, write a proposal before the spec:
300
-
301
- ```text
302
- 02-DOCS/wiki/sdd/proposals/<slug>.md
303
- ```
304
-
305
- Proposal grammar:
306
-
307
- ```markdown
308
- # Proposal — <slug>
309
-
310
- ## Problem
311
- ## Intent
312
- ## Scope / Non-scope
313
- ## Research input
314
- ## Alternatives considered
315
- ## Tradeoffs
316
- ## Risks
317
- ## Rollback
318
- ## Success criteria
319
- ## Recommendation
320
- ```
321
+ For a tiny feature, skip this. For ambiguous, architectural, high-risk, high-review-cost or research-heavy work, write `02-DOCS/wiki/sdd/proposals/<slug>.md` before the spec, with these sections: Problem · Intent · Scope / Non-scope · Research input · Alternatives considered · Tradeoffs · Risks · Rollback · Success criteria · Recommendation.
321
322
 
322
323
  The proposal is allowed to mention options and tradeoffs; the spec that follows still stays WHAT/WHY. If research came from a transcript, doc, spike, or external briefing, cite it in `Research input` so the decision trail survives the chat.
323
324
 
@@ -333,7 +334,7 @@ repeated here as prohibitions: naming a behaviour makes it more available, not l
333
334
  | Name a framework, table, endpoint, or library | That's HOW. Strip it; describe the behaviour instead, or log the open question. |
334
335
  | Write "it should work well / be fast / be intuitive" | Not testable. Make it a binary Given/When/Then or move it to Points to clarify. |
335
336
  | Hand to `plan`/`implement` before the user approved the written spec | The approval at step 9 is the gate. No design approved → nothing gets built. |
336
- | Skip non-goals because "it's obvious" | Unsaid scope becomes assumed scope. State what you are *not* doing. |
337
+ | Skip non-goals because "it's obvious" | Unsaid scope becomes assumed scope. State what you are *not* doing, including what an agent would add "just in case". |
337
338
  | Resolve every ambiguity yourself to look finished | Inventing answers is worse than naming gaps. List them in Points to clarify. |
338
339
  | Start designing the solution because it's clearer | Stay on WHAT/WHY. The plan is a later, separate phase. |
339
340
  | Write the spec somewhere other than 02-DOCS/wiki/sdd/specs/ | That's the canonical location the rest of the chain reads. Use it. |
@@ -370,11 +371,11 @@ End with:
370
371
 
371
372
  ## Next in the chain
372
373
 
373
- A spec is the input to **`clarify`**, not the finish line. End by pointing there:
374
+ A spec is the input to **`clarify`**, not the finish line — both are ASDD stage 2 (**Spec**), which closes only when the human approves. End by pointing there:
374
375
 
375
- > "Spec written to `02-DOCS/wiki/sdd/specs/<slug>.md` with N open points. Next: run **`clarify`** to resolve them and de-risk the spec before planning."
376
+ > "Spec written to `02-DOCS/wiki/sdd/specs/<slug>.md` with N open points. ASDD stage 2 (Spec) continues: run **`clarify`** to hunt its gaps before the human approves and `plan` starts."
376
377
 
377
- If `clarify` surfaces answers, they get baked back into this same spec file. Only once the spec is de-risked does `plan` derive the technical approach.
378
+ If `clarify` surfaces answers, they get baked back into this same spec file. Only once the spec is de-risked and approved does stage 3 (`plan`) derive the technical approach.
378
379
 
379
380
  ## See Also
380
381
 
@@ -65,9 +65,9 @@ capability:
65
65
  must_include:
66
66
  - "Reads technical_level from 02-DOCS/wiki/harness/user-profile.md and the constitution first, inferring everything it can before asking, then asks only contract-changing gaps — the whole FRONTIER in one numbered round, each with its recommendation, and nothing whose answer depends on another question open in that same round."
67
67
  - "Stays strictly WHAT/WHY: no framework, token format, database table, endpoint shape, email provider, library, or file path appears in the spec — implementation-laden answers are flagged as points to clarify instead of guessed."
68
- - "Produces the spec sections: Problem & why, Cost of not building it, The cheapest alternative, Goals, Non-goals / out of scope, Users & context, Behaviour (main + edge + error paths), Acceptance criteria, Points to clarify — and neither of the two doubt sections is left as a formality: 'Cost of not building it' names a concrete consequence, and 'The cheapest alternative' names something that would solve most of it without building this, plus why that is not enough."
68
+ - "Produces the spec sections: Problem & why, Cost of not building it, The cheapest alternative, Goals, Non-goals / out of scope (including what an agent might add 'just in case'), Users & context, What the user can do, What result they get (against a human-approved reference), What it must respect (checked against the decisions log or the project's brain), How it proves it (what evidence remains), Behaviour (main + edge + error paths), Acceptance criteria, Points to clarify — and neither of the two doubt sections is left as a formality: 'Cost of not building it' names a concrete consequence, and 'The cheapest alternative' names something that would solve most of it without building this, plus why that is not enough."
69
69
  - "Writes testable acceptance criteria in Given/When/Then form that verify could later check (e.g. expired-link refusal, unknown-email revealing nothing)."
70
- - "Writes the file to 02-DOCS/wiki/sdd/specs/<slug>.md (kebab-case slug), indexes it in the root CLAUDE.md Knowledge map under sdd/specs, and logs the spec creation to the canonical SDD decisions log at 02-DOCS/wiki/sdd/decisions.md."
70
+ - "Writes the file to 02-DOCS/wiki/sdd/specs/<slug>.md (kebab-case slug), indexes it in 02-DOCS/wiki/index.md under sdd/specs (never the root CLAUDE.md), and logs the spec creation to the canonical SDD decisions log at 02-DOCS/wiki/sdd/decisions.md."
71
71
  - "Lists honest Points to clarify as the handoff rather than inventing values, and TYPES each one (pregunta abierta / suposición tomada / decisión diferida / área no formulable) so clarify knows whether to ask it, validate it, or leave it alone; a suposición carries its basis."
72
72
  - "Ends by pointing to the clarify phase as the next step in the SDD chain."
73
73
 
@@ -109,7 +109,7 @@ something `clarify` can validate instead of re-ask.
109
109
  ## When to stop
110
110
 
111
111
  Stop when the frontier is empty: every branch visited, nothing left silently
112
- assumed. Then run the exit gate (`npm run spec:gate <path>`) on the written
112
+ assumed. Then run the exit gate (`npx @ericrisco/rsc spec gate <path>`) on the written
113
113
  file — the bound is a property of the artifact, not of your confidence.
114
114
  Lingering unknowns are fine, and belong in *Points to clarify*, typed. Over-asking to feel thorough is itself an anti-pattern: it burns the
115
115
  user's patience and pushes them to rubber-stamp answers they haven't thought
@@ -41,13 +41,33 @@ version, or doing nothing. Required for specs dated 2026-09-06 or later.>
41
41
 
42
42
  ## Non-goals / out of scope
43
43
  - <What is explicitly NOT done in THIS change — adjacent features, deferred
44
- work, things a reader might assume are included. Be explicit, not silent:
45
- unsaid scope becomes assumed scope.>
44
+ work, things a reader might assume are included, and what an agent could be
45
+ tempted to add "just in case" (a feature nobody asked for). Be explicit, not
46
+ silent: unsaid scope becomes assumed scope.>
46
47
 
47
48
  ## Users & context
48
49
  <Who acts, the situation they're in, and what they're trying to achieve.
49
50
  Real users from the constitution/wiki, not invented personas.>
50
51
 
52
+ ## What the user can do
53
+ <The action, the starting conditions it needs, and who is (and is not)
54
+ allowed to do it. Required for specs dated 2026-11-03 or later.>
55
+
56
+ ## What result they get
57
+ <The observable result, against a reference the human approved: a screenshot
58
+ or sketch for UI, the expected response for an API. An agent's own judgement
59
+ that two screenshots "look alike" is not a reference. Required from 2026-11-03.>
60
+
61
+ ## What it must respect
62
+ <Constraints and prior behaviour that must keep working. Look them up in the
63
+ project's brain if it has one, otherwise in 02-DOCS/wiki/sdd/decisions.md and
64
+ the existing specs, so this spec never steps on a prior decision. Required from
65
+ 2026-11-03.>
66
+
67
+ ## How it proves it
68
+ <How the check runs and what evidence remains afterwards. "Yes, I tested it" is
69
+ not evidence. Required from 2026-11-03.>
70
+
51
71
  ## Behaviour
52
72
  - Main path: <what the system does, observably, in the common case>
53
73
  - Edge cases: <empty, maximum, boundary, concurrent, repeated…>
@@ -78,13 +98,15 @@ costliest of the four.>
78
98
  - **Status** moves `draft` → `clarified` (after the `clarify` phase) → `planned`
79
99
  (once `plan` exists). Don't invent other states. An approval obtained as a
80
100
  blanket "just run it" is recorded as **approved in autopilot**, not flat.
81
- - **Before you call it written**, run `npm run spec:gate <path>`. It checks that
101
+ - **Before you call it written**, run `npx @ericrisco/rsc spec gate <path>`. It checks that
82
102
  every section here carries content or an explicit open point, and prints the
83
103
  clauses it cannot check (the unmarked assumption is yours).
84
- - **The two doubt sections are dated, not retroactive.** `Cost of not building
104
+ - **The enforced sections are dated, not retroactive.** `Cost of not building
85
105
  it` and `The cheapest alternative` are required only for specs whose
86
- frontmatter `timestamp` is `2026-09-06` or later. Specs written before that
87
- are exempt — they cannot answer honestly after the fact, and a gate that turns
106
+ frontmatter `timestamp` is `2026-09-06` or later; the four ASDD questions
107
+ (`What the user can do`, `What result they get`, `What it must respect`, `How
108
+ it proves it`, or their Spanish headings) from `2026-11-03`. Specs written
109
+ before are exempt — they cannot answer honestly after the fact, and a gate that turns
88
110
  the whole corpus red is a gate that gets switched off. A spec with no readable
89
111
  `timestamp` falls on the exempt side too.
90
112
  - **Sharpness, not difficulty**, sorts the last two types from the first: *can
@@ -29,9 +29,9 @@ intent is ambiguous, ask one question and stay here — ambiguity slows the lane
29
29
 
30
30
  **You choose the lane; never hand that choice to the person.** Simple → **FTD**: one feature document
31
31
  in `02-DOCS` (intent, scope, checklist, evidence, next step), tasks checked off against observed proof.
32
- Big, or decisions that affect each other → **SDD**: enter the chain; the person approves the spec and
32
+ Big, or decisions that affect each other → **ASDD**: enter the chain; the person approves the spec and
33
33
  clarify, then picks manual or autopilot. Say which and why in one line; switch if asked.
34
- → `../ftd/SKILL.md` · `../sdd/SKILL.md`.
34
+ → `../ftd/SKILL.md` · `../asdd/SKILL.md`.
35
35
 
36
36
  **Where.** Default branch open (chosen at install, or nothing complex) → work on it, no branch
37
37
  question. Closed («ramas y PR», CI, team) → before each code change ask: this branch, a new one, or
@@ -40,9 +40,9 @@ question. Closed («ramas y PR», CI, team) → before each code change ask: thi
40
40
  Judge the **meaning**, not the wording: the trigger is semantic in any language. A bug fix restoring
41
41
  intended behaviour is `debug`. Autopilot consent covers a whole run — advance without re-asking.
42
42
 
43
- Lane's skill missing? Offer it (§2) first. SDD recorded as deferred in `.rsc.json`? Run
43
+ Lane's skill missing? Offer it (§2) first. ASDD recorded as deferred in `.rsc.json`? Run
44
44
  `npx @ericrisco/rsc@latest reassess`; silent on `RSC_REASSESSMENT_NO_CHANGE`, and on new evidence
45
- show the plan command — SDD still needs a newly accepted plan id, never added silently.
45
+ show the plan command — ASDD needs a newly accepted plan id, never added silently.
46
46
 
47
47
  ---
48
48