@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.
- package/README.md +16 -9
- package/manifest.json +48 -40
- package/package.json +1 -1
- package/scripts/lib/domains.js +1 -1
- package/scripts/lib/onboarding-apply.js +1 -1
- package/scripts/lib/onboarding.js +7 -7
- package/scripts/lib/retired-skills.js +4 -0
- package/scripts/lib/review-findings.js +3 -0
- package/scripts/lib/review-ledger.js +187 -0
- package/scripts/lib/risk.js +68 -0
- package/scripts/lib/spec-gate.js +10 -1
- package/scripts/rsc.js +104 -6
- package/scripts/spec-gate.js +13 -3
- package/skills/analyze/SKILL.md +3 -3
- package/skills/asdd/SKILL.md +183 -0
- package/skills/{sdd → asdd}/evals/README.md +10 -10
- package/skills/{sdd → asdd}/evals/cases.yaml +5 -5
- package/skills/{sdd → asdd}/references/model-routing.md +2 -2
- package/skills/building-agents/SKILL.md +1 -1
- package/skills/clarify/SKILL.md +59 -55
- package/skills/clarify/evals/cases.yaml +6 -7
- package/skills/constitution/SKILL.md +30 -16
- package/skills/constitution/evals/README.md +1 -1
- package/skills/constitution/evals/cases.yaml +1 -1
- package/skills/debug/SKILL.md +3 -3
- package/skills/fastapi/SKILL.md +1 -1
- package/skills/flutter/SKILL.md +1 -1
- package/skills/ftd/SKILL.md +26 -10
- package/skills/ftd/evals/cases.yaml +1 -1
- package/skills/ftd/evals/routing.json +4 -4
- package/skills/go/SKILL.md +1 -1
- package/skills/implement/SKILL.md +147 -132
- package/skills/implement/evals/cases.yaml +4 -2
- package/skills/implement/references/per-task-review.md +26 -24
- package/skills/implement/scripts/task-brief +28 -22
- package/skills/nextjs/SKILL.md +1 -1
- package/skills/parallel/SKILL.md +1 -1
- package/skills/plan/SKILL.md +3 -3
- package/skills/plan/evals/cases.yaml +1 -1
- package/skills/plan/references/plan-template.md +2 -2
- package/skills/postgresdb/SKILL.md +1 -1
- package/skills/react/SKILL.md +1 -1
- package/skills/review/SKILL.md +80 -41
- package/skills/sdd-init/SKILL.md +11 -9
- package/skills/ship/SKILL.md +58 -30
- package/skills/specify/SKILL.md +42 -41
- package/skills/specify/evals/cases.yaml +2 -2
- package/skills/specify/references/eliciting-requirements.md +1 -1
- package/skills/specify/references/spec-template.md +28 -6
- package/skills/suggest/SKILL.md +4 -4
- package/skills/tasks/SKILL.md +37 -33
- package/skills/tasks/evals/README.md +1 -1
- package/skills/tasks/evals/cases.yaml +3 -3
- package/skills/verify/SKILL.md +34 -18
- package/skills/verify/evals/README.md +2 -2
- package/skills/verify/evals/cases.yaml +2 -1
- package/skills/verify/references/generic-gate.md +43 -0
- package/skills/worktrees/SKILL.md +1 -1
- package/targets/clone-bootstrap.mjs +1 -1
- package/targets/hook-once.mjs +2 -2
- package/targets/sello.mjs +9 -3
- package/skills/sdd/SKILL.md +0 -250
package/skills/ship/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ship
|
|
3
|
-
description: "Use when a verified
|
|
4
|
-
tags: [
|
|
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
|
|
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
|
|
16
|
+
## The hard rule: git authorship is the responsible person, never an AI
|
|
17
17
|
|
|
18
|
-
> **Every commit and every PR ships under
|
|
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
|
|
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
|
|
25
|
-
- If `git config user.email` is unset or
|
|
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
|
|
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
|
|
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
|
|
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
|
-
##
|
|
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
|
-
|
|
163
|
-
|
|
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
|
-
##
|
|
188
|
+
## How to revert
|
|
166
189
|
|
|
167
|
-
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 `../
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
package/skills/specify/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
|
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** (`../
|
|
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 `../
|
|
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
|
-
**
|
|
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 +
|
|
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 `
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
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
|
|
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.
|
|
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
|
|
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 (`
|
|
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
|
|
45
|
-
|
|
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 `
|
|
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
|
|
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
|
|
87
|
-
|
|
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
|
package/skills/suggest/SKILL.md
CHANGED
|
@@ -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 → **
|
|
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` · `../
|
|
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.
|
|
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 —
|
|
45
|
+
show the plan command — ASDD needs a newly accepted plan id, never added silently.
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|