@ericrisco/rsc 3.7.4 → 4.0.0

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 (77) hide show
  1. package/README.md +16 -9
  2. package/manifest.json +49 -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 +185 -0
  10. package/scripts/lib/risk.js +65 -0
  11. package/scripts/lib/spec-gate.js +10 -1
  12. package/scripts/rsc.js +91 -6
  13. package/skills/analyze/SKILL.md +3 -3
  14. package/skills/asdd/SKILL.md +159 -0
  15. package/skills/{sdd → asdd}/evals/README.md +10 -10
  16. package/skills/{sdd → asdd}/evals/cases.yaml +4 -4
  17. package/skills/{sdd → asdd}/references/model-routing.md +2 -2
  18. package/skills/building-agents/SKILL.md +1 -1
  19. package/skills/clarify/SKILL.md +48 -55
  20. package/skills/clarify/evals/cases.yaml +6 -7
  21. package/skills/connect-tool/SKILL.md +119 -21
  22. package/skills/connect-tool/THIRD_PARTY.md +43 -0
  23. package/skills/connect-tool/bridge-kit/01-TOOLS-plantilla/test_connection.sh +33 -0
  24. package/skills/connect-tool/bridge-kit/LICENSE +27 -0
  25. package/skills/connect-tool/bridge-kit/README.md +48 -0
  26. package/skills/connect-tool/bridge-kit/UPSTREAM.json +8 -0
  27. package/skills/connect-tool/bridge-kit/access/access_a_sqlite.py +82 -0
  28. package/skills/connect-tool/bridge-kit/dbhub/dbhub.toml.ejemplo +65 -0
  29. package/skills/connect-tool/bridge-kit/red/cloudflared-config.yml.ejemplo +18 -0
  30. package/skills/connect-tool/bridge-kit/red/tailscale-grants.hujson +22 -0
  31. package/skills/connect-tool/bridge-kit/sqlserver/01-login-servidor.sql +25 -0
  32. package/skills/connect-tool/bridge-kit/sqlserver/02-usuario-y-vistas.sql +69 -0
  33. package/skills/connect-tool/bridge-kit/sqlserver/03-prueba-solo-lectura.sql +65 -0
  34. package/skills/connect-tool/bridge-kit/sqlserver/copia-nocturna.ps1 +68 -0
  35. package/skills/connect-tool/evals/cases.yaml +41 -4
  36. package/skills/connect-tool/references/connect-or-migrate.md +96 -0
  37. package/skills/connect-tool/references/database-bridge.md +159 -0
  38. package/skills/connect-tool/references/file-exchange.md +103 -0
  39. package/skills/connect-tool/references/messages.md +120 -0
  40. package/skills/connect-tool/references/program-types.md +97 -0
  41. package/skills/connect-tool/references/spain.md +103 -0
  42. package/skills/connect-tool/references/what-to-find-out.md +57 -0
  43. package/skills/constitution/SKILL.md +21 -8
  44. package/skills/constitution/evals/README.md +1 -1
  45. package/skills/debug/SKILL.md +1 -1
  46. package/skills/fastapi/SKILL.md +1 -1
  47. package/skills/flutter/SKILL.md +1 -1
  48. package/skills/ftd/SKILL.md +26 -10
  49. package/skills/ftd/evals/cases.yaml +1 -1
  50. package/skills/ftd/evals/routing.json +4 -4
  51. package/skills/go/SKILL.md +1 -1
  52. package/skills/implement/SKILL.md +126 -113
  53. package/skills/implement/evals/cases.yaml +4 -2
  54. package/skills/implement/references/per-task-review.md +19 -26
  55. package/skills/nextjs/SKILL.md +1 -1
  56. package/skills/parallel/SKILL.md +1 -1
  57. package/skills/plan/SKILL.md +2 -2
  58. package/skills/postgresdb/SKILL.md +1 -1
  59. package/skills/react/SKILL.md +1 -1
  60. package/skills/review/SKILL.md +58 -31
  61. package/skills/sdd-init/SKILL.md +6 -6
  62. package/skills/ship/SKILL.md +38 -18
  63. package/skills/specify/SKILL.md +32 -33
  64. package/skills/specify/evals/cases.yaml +1 -1
  65. package/skills/specify/references/spec-template.md +27 -5
  66. package/skills/suggest/SKILL.md +4 -4
  67. package/skills/tasks/SKILL.md +37 -33
  68. package/skills/tasks/evals/README.md +1 -1
  69. package/skills/tasks/evals/cases.yaml +2 -2
  70. package/skills/verify/SKILL.md +30 -15
  71. package/skills/verify/evals/README.md +2 -2
  72. package/skills/verify/evals/cases.yaml +1 -0
  73. package/skills/worktrees/SKILL.md +1 -1
  74. package/targets/clone-bootstrap.mjs +1 -1
  75. package/targets/hook-once.mjs +2 -2
  76. package/targets/sello.mjs +1 -1
  77. package/skills/sdd/SKILL.md +0 -250
@@ -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, `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
@@ -268,10 +273,25 @@ drop-off, because the friction is the password itself, not the reset.
268
273
  ## Non-goals / out of scope
269
274
  - Social login (Google/Apple) — deferred.
270
275
  - Replacing existing sessions for already-signed-in users.
276
+ - A QR code to sign in from another device — nobody asked for it.
271
277
 
272
278
  ## Users & context
273
279
  A returning user on a new device who does not remember a password.
274
280
 
281
+ ## What the user can do
282
+ Any registered user, signed out, can request a link to their own email.
283
+
284
+ ## What result they get
285
+ The sign-in screen matches the approved sketch (linked); following the link
286
+ lands them signed in on the page they started from.
287
+
288
+ ## What it must respect
289
+ Existing sessions keep working; the decisions log says unknown emails reveal nothing.
290
+
291
+ ## How it proves it
292
+ An end-to-end check per acceptance criterion; its run log and a screenshot of
293
+ the signed-in page stay in the verification file.
294
+
275
295
  ## Behaviour
276
296
  - Main: user enters email → receives a link → following it signs them in.
277
297
  - Edge: an expired link shows a "request a new link" path.
@@ -296,28 +316,7 @@ Note what is *absent*: no token format, no table, no email provider, no framewor
296
316
 
297
317
  ## Optional proposal / pre-execution briefing
298
318
 
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
- ```
319
+ 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
320
 
322
321
  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
322
 
@@ -333,7 +332,7 @@ repeated here as prohibitions: naming a behaviour makes it more available, not l
333
332
  | Name a framework, table, endpoint, or library | That's HOW. Strip it; describe the behaviour instead, or log the open question. |
334
333
  | 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
334
  | 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. |
335
+ | 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
336
  | Resolve every ambiguity yourself to look finished | Inventing answers is worse than naming gaps. List them in Points to clarify. |
338
337
  | Start designing the solution because it's clearer | Stay on WHAT/WHY. The plan is a later, separate phase. |
339
338
  | 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 +369,11 @@ End with:
370
369
 
371
370
  ## Next in the chain
372
371
 
373
- A spec is the input to **`clarify`**, not the finish line. End by pointing there:
372
+ 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
373
 
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."
374
+ > "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
375
 
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.
376
+ 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
377
 
379
378
  ## See Also
380
379
 
@@ -65,7 +65,7 @@ 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
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."
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."
@@ -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…>
@@ -81,10 +101,12 @@ costliest of the four.>
81
101
  - **Before you call it written**, run `npm run 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
 
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: tasks
3
- description: "Use when an approved plan needs slicing into an ordered task list before any code — the SDD `tasks` phase. Each row carries a literal done-check, dependencies, a parallel-safe marker and a spec trace, appended to the plan artifact. NOT writing the plan (that is `plan`), NOT the consistency gate (that is `analyze`), NOT executing the tasks (that is `implement`)."
4
- tags: [sdd, tasks, breakdown]
3
+ description: "Use when an approved plan needs slicing into an ordered task list before any code — the `tasks` step of ASDD stage 3 (Plan). Each row carries the spec criterion it covers, a risk forecast (tier 0/1/2), a literal done-check, dependencies and a parallel-safe marker, appended to the plan artifact. NOT writing the plan (that is `plan`), NOT the consistency gate (that is `analyze`), NOT executing the tasks (that is `implement`)."
4
+ tags: [asdd, sdd, tasks, breakdown]
5
5
  recommends: [analyze, implement]
6
6
  profiles: [core, full]
7
7
  origin: risco
@@ -28,7 +28,7 @@ appended to the plan it was built from.
28
28
  This phase's default tier is **`balanced`**: decomposing an approved plan is
29
29
  structured work, not architecture. Routing is off unless `models.enabled: true`
30
30
  in `02-DOCS/wiki/sdd/config.yaml`; when on, resolve the tier and apply it per
31
- `../sdd/references/model-routing.md`, which owns the resolution order and the
31
+ `../asdd/references/model-routing.md`, which owns the resolution order and the
32
32
  announcement rules. Routing off or no profile → honor the session model silently.
33
33
 
34
34
  ## Read the harness profile first
@@ -45,8 +45,8 @@ You break down a **plan**, not an intent. Before slicing, confirm all three exis
45
45
 
46
46
  1. **The plan** — `02-DOCS/wiki/sdd/plans/<slug>.md`, written by the `plan`
47
47
  phase. It must contain the architecture, interfaces, and testing strategy.
48
- 2. **The spec** — `02-DOCS/wiki/sdd/specs/<slug>.md`, so every task traces to a
49
- requirement. A task with no spec line behind it is scope you are inventing.
48
+ 2. **The spec** — `02-DOCS/wiki/sdd/specs/<slug>.md`, so every task traces to an
49
+ acceptance criterion. A task with no criterion behind it is scope you are inventing.
50
50
  3. **The constitution** — `02-DOCS/wiki/sdd/constitution.md`, the non-negotiable
51
51
  bars (stack canon, quality gates) every task must respect.
52
52
  4. **The SDD config** — `02-DOCS/wiki/sdd/config.yaml`, if present. Use its
@@ -61,7 +61,7 @@ exact thing `analyze` will catch next, and you will have wasted the round trip.
61
61
 
62
62
  ## What makes a task well-formed
63
63
 
64
- Every task is one row. A row is well-formed only when all six fields hold:
64
+ Every task is one row. A row is well-formed only when all seven fields hold:
65
65
 
66
66
  | Field | Rule |
67
67
  | --- | --- |
@@ -70,7 +70,12 @@ Every task is one row. A row is well-formed only when all six fields hold:
70
70
  | **Title** | One imperative verb + object. "Implement", "Add", "Wire", "Migrate" — not "Handle" or "Support". |
71
71
  | **Done-check** | The **literal** command or observation that proves done. Runnable, not a feeling. See below. |
72
72
  | **Depends-on** | The task IDs that must finish first, or `—` for none. Drives the ordering and the parallel markers. |
73
- | **Trace** | The spec section / acceptance criterion this task satisfies. Every task traces to one; if it can't, it's out of scope. |
73
+ | **Trace** | The spec acceptance criterion this task covers (`AC3`). Every task traces to one; if it can't, it's out of scope. |
74
+ | **Risk forecast** | Tier `0`/`1`/`2` from the paths the task expects to touch: `npx @ericrisco/rsc risk <expected paths…>`. Never guessed. |
75
+
76
+ **Coverage runs both ways.** A criterion with no task, or a task with no criterion, is a defect
77
+ `analyze` flags. The forecast budgets review; `implement` recomputes the tier on the task's actual
78
+ diff, and that one wins.
74
79
 
75
80
  Put `[P]` (parallel-safe) in its own field only when the task shares **no files
76
81
  and no state** with another unblocked task. When in doubt, leave it blank — a
@@ -125,12 +130,12 @@ will execute.
125
130
  service → API → UI. A task never precedes what it depends on.
126
131
  4. MARK [P] only on tasks that share no files/state with another
127
132
  unblocked task. Default to sequential.
128
- 5. TRACE each task back to a spec line. No trace → cut it (scope creep)
129
- or send the gap to `clarify`/`specify`.
130
- 6. ADD the cross-cutting closers: a final "all done-checks pass" task
131
- and a "verify.sh green" task that hands off to `verify`.
132
- 7. ADD a review workload + delivery forecast before implementation.
133
- 8. APPEND the table to the plan artifact (see below). Do not start a
133
+ 5. TRACE each task to a spec criterion, and each criterion to ≥1 task.
134
+ No trace → cut it (scope creep) or send the gap to `clarify`/`specify`.
135
+ 6. FORECAST risk per task: `npx @ericrisco/rsc risk <expected paths…>`.
136
+ 7. ADD the closer: "all done-checks pass + verify.sh green" (stage 5).
137
+ 8. ADD a review workload + delivery forecast before implementation.
138
+ 9. APPEND the table to the plan artifact (see below). Do not start a
134
139
  new file; the list lives with the plan it came from.
135
140
  ```
136
141
 
@@ -160,14 +165,14 @@ delete a user's map entry.
160
165
  ## Tasks
161
166
  <!-- generated by tasks on 2026-06-01; IDs are stable, do not renumber -->
162
167
 
163
- | ID | [P] | Task | Done-check | Depends-on | Trace |
164
- | --- | --- | --- | --- | --- | --- |
165
- | T001 | | Add `users` table migration | `alembic upgrade head` applies clean; `\d users` shows email UNIQUE | — | spec §3 Data |
166
- | T002 | [P] | Add `sessions` table migration | migration applies; FK to users present | T001 | spec §3 Data |
167
- | T003 | | Write failing test for `POST /login` | `pytest tests/auth/test_login.py` fails: no route | T001 | spec §4 Auth |
168
- | T004 | | Implement `POST /login` | T003 test green; bad pw → 401 | T003 | spec §4 Auth |
169
- | ... | ... | ... | ... | ... | ... |
170
- | T0NN | | All done-checks pass + `verify.sh` green | every row above checked; `scripts/verify.sh` exits 0 | all | spec §Acceptance |
168
+ | ID | [P] | Task | Done-check | Depends-on | Trace | Risk |
169
+ | --- | --- | --- | --- | --- | --- | --- |
170
+ | T001 | | Add `users` table migration | `alembic upgrade head` applies clean; `\d users` shows email UNIQUE | — | AC1 | 2 |
171
+ | T002 | [P] | Add `sessions` table migration | migration applies; FK to users present | T001 | AC2 | 2 |
172
+ | T003 | | Write failing test for `POST /login` | `pytest tests/auth/test_login.py` fails: no route | T001 | AC3 | 1 |
173
+ | T004 | | Implement `POST /login` | T003 test green; bad pw → 401 | T003 | AC3 | 2 |
174
+ | ... | ... | ... | ... | ... | ... | ... |
175
+ | T0NN | | All done-checks pass + `verify.sh` green | every row above checked; `scripts/verify.sh` exits 0 | all | all ACs | — |
171
176
  ```
172
177
 
173
178
  ### Per-task Interfaces (for context-isolated implementers)
@@ -205,15 +210,13 @@ before a giant diff exists.
205
210
  | --- | --- | --- |
206
211
  | Estimated changed lines | <number or range> | based on task count + touched areas |
207
212
  | Files / areas | <count and names> | modules, migrations, UI, tests, docs |
208
- | Review risk | low / medium / high | complexity, cross-stack scope, security/data changes |
213
+ | Risk | max tier; count of tier-2 tasks | tier 2 tasks need three refuters and park in the decision queue for the human |
209
214
  | Suggested delivery | single-pr / ask-on-risk / autochain / exception | matched to config.review_budget |
210
215
  ```
211
216
 
212
- Pick the delivery strategy from the forecast: tiny change → `single-pr`; estimated
213
- lines over `config.sdd.review_budget.line_budget` (default 400) → recommend
214
- splitting or `ask-on-risk`; many areas or cross-stack contracts touched →
215
- `autochain` or a feature-track branch. A deadline or emergency that justifies a
216
- large review is marked `exception` and requires explicit user approval later.
217
+ Delivery: tiny → `single-pr`; over `config.sdd.review_budget.line_budget` (default
218
+ 400) → split or `ask-on-risk`; many areas or cross-stack contracts → `autochain`;
219
+ `exception` (deadline, emergency) needs explicit user approval.
217
220
 
218
221
  ## Anti-patterns → STOP
219
222
 
@@ -223,9 +226,10 @@ large review is marked `exception` and requires explicit user approval later.
223
226
  | "Done-check: 'feature works'" | Not runnable, not evidence. Quote the literal test/command, or it's not a done-check. |
224
227
  | "One giant task: 'build the backend'" | Unverifiable, un-handoffable. Split until each slice has its own runnable check. |
225
228
  | "Mark everything `[P]` so it goes faster" | Shared files = merge collisions. `[P]` only when scope is truly disjoint. |
226
- | "This task has no spec line but we obviously need it" | That's scope creep wearing a hat. Trace it or cut it; if it's real, send it to `clarify`. |
229
+ | "This task has no criterion but we obviously need it" | That's scope creep wearing a hat. Trace it or cut it; if it's real, send it to `clarify`. |
227
230
  | "The plan is thin here, I'll guess the slice" | `analyze` will reject the guess next phase. Tighten the plan first. |
228
231
  | "I'll start coding the easy task while I list the rest" | This phase writes zero runtime code. Implementation is `implement`. |
232
+ | "Risk is obviously low, I'll write 0" | The tier comes from `rsc risk` on the paths, never from the agent's judgement. |
229
233
  | "Renumber the IDs so they're contiguous" | Downstream phases cite IDs. They're stable once written. Append, don't renumber. |
230
234
 
231
235
  ## Result envelope
@@ -243,19 +247,19 @@ End with:
243
247
  "used": ["tasks"],
244
248
  "missing": [],
245
249
  "fallback": [],
246
- "compact_rules": ["Every task needs a runnable done-check.", "Forecast review load before implementation."]
250
+ "compact_rules": ["Every task needs a runnable done-check, a criterion trace and a risk forecast.", "Forecast review load before implementation."]
247
251
  },
248
252
  "evidence": ["task table appended", "review workload forecast appended"]
249
253
  }
250
254
  ```
251
255
 
252
- ## Next in the SDD chain
256
+ ## Next in ASDD
253
257
 
254
258
  The task list is now the contract for the rest of the build. Hand off to
255
259
  **`analyze`** — the consistency gate that cross-checks constitution ↔ spec ↔ plan
256
- ↔ **tasks** and surfaces orphan tasks and untraceable scope — and then to
257
- **`implement`**, which executes the list TDD-style, using `parallel` for the `[P]`
258
- tasks and `worktrees` for isolation.
260
+ ↔ **tasks** and flags uncovered criteria and untraced tasks — and then to
261
+ **`implement`** (stage 4), which runs each task through its build–review–fix loop,
262
+ using `parallel` for the `[P]` tasks and `worktrees` for isolation.
259
263
 
260
264
  Do not jump straight to `implement`. The whole point of writing a checkable list
261
265
  was to let `analyze` audit it cheaply *before* code exists.
@@ -20,7 +20,7 @@ human spot-check.
20
20
  Goal: the skill fires when it should and never on a near-miss.
21
21
 
22
22
  1. Configure an agent with the **full catalog of skill descriptions** available
23
- for routing — the other rsc-sdd phases (`sdd`, `constitution`, `specify`,
23
+ for routing — the other rsc-sdd phases (`asdd`, `constitution`, `specify`,
24
24
  `clarify`, `plan`, `analyze`, `implement`, `verify`, `review`, `ship`,
25
25
  `debug`, `worktrees`, `parallel`) plus the stack/process skills (`fastapi`,
26
26
  `nextjs`, `go`, `postgresdb`, `flutter`, `harness`, …) — so routing competes
@@ -66,10 +66,10 @@ capability:
66
66
  must_include:
67
67
  - "Confirms the inputs first: plan, spec, AND constitution must exist; if the plan were missing it would STOP and route to `plan` rather than slice from intent."
68
68
  - "Reads technical_level from 02-DOCS/wiki/harness/user-profile.md and picks the register; the table is complete either way, and the chat adds only one line of why-this-slicing plus the risky tasks."
69
- - "Emits sequential zero-padded stable IDs (T001, T002… — no hyphen, GitHub Spec Kit canon) with the six well-formed fields: ID, a separate [P] marker field after the ID, imperative title, done-check, depends-on, and a trace to a spec section."
69
+ - "Emits sequential zero-padded stable IDs (T001, T002… — no hyphen, GitHub Spec Kit canon) with the seven well-formed fields: ID, a separate [P] marker field after the ID, imperative title, done-check, depends-on, a trace to the spec acceptance criterion it covers, and a risk forecast (tier 0/1/2 from `npx @ericrisco/rsc risk <expected paths>`, never guessed)."
70
70
  - "Every done-check is a LITERAL runnable command or checkable observation (e.g. `pytest tests/auth/test_login.py` green; `alembic upgrade head` applies; bad password → 401) — never 'login works'."
71
71
  - "Orders by dependency (migration/schema → data → service → API), so no task precedes what it depends on; marks `[P]` only on file/state-disjoint tasks and defaults to sequential when unsure."
72
72
  - "Uses TDD-shaped slicing: a failing-test task before its implementation task, whose done-check is 'the test that was red is now green'."
73
- - "Ensures every task traces to a spec line and cuts/flags any task with no trace as scope creep (route to clarify/specify), rather than inventing scope."
73
+ - "Checks coverage both ways: every task traces to a criterion and every criterion has a task; a task with no criterion is cut/flagged as scope creep (route to clarify/specify), and either gap is a defect analyze will flag."
74
74
  - "Appends the table under a `## Tasks` heading INSIDE 02-DOCS/wiki/sdd/plans/auth.md (not a new file) and confirms the plan is indexed in the root CLAUDE.md Knowledge map under sdd/."
75
75
  - "Adds a final closer task gating on all done-checks passing plus `scripts/verify.sh` green, and hands off to `analyze` next (then implement) — not straight to implementation."
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: verify
3
- description: "Use when implementation is finished and about to be called done or merged — the rsc-sdd evidence gate: runs the stack's scripts/verify.sh (lint, type, test, audit), walks every task done-check and acceptance criterion, records a dated verdict. NOT judging the diff by eye (that is `review`, spec-less `code-review`), NOT diagnosis (that is `debug`)."
4
- tags: [sdd, verify, test]
3
+ description: "Use when work is about to be called done — the ASDD evidence gate, in two modes: per task inside `implement`'s loop (tests, build, security, traceability) and at closing over the whole branch against main (stack scripts/verify.sh, every done-check and acceptance criterion, rollback plan, dated verdict). A check that did not execute is reported not run, never passed. NOT judging the diff by eye (that is `review`, spec-less `code-review`), NOT diagnosis (that is `debug`)."
4
+ tags: [asdd, sdd, verify, test]
5
5
  recommends: [review]
6
6
  profiles: [core, full]
7
7
  origin: risco
@@ -9,7 +9,7 @@ origin: risco
9
9
 
10
10
  # verify — the evidence gate before "done"
11
11
 
12
- `verify` is the post-implementation **gate** in the rsc-sdd chain. Implementation just finished; nobody is allowed to call it *done*, *fixed*, *working*, or *ready to merge* until the evidence exists and has been read. This skill produces that evidence: it runs the project's real quality gate, walks every task's done-check and every acceptance criterion from the spec, and records the result. Pass or fail, the verdict is grounded in command output you actually saw — never in a hunch.
12
+ `verify` is the evidence **gate** of ASDD. Nobody is allowed to call work *done*, *fixed*, *working*, or *ready to merge* until the evidence exists and has been read. This skill produces that evidence: it runs the project's real quality gate, walks every task's done-check and every acceptance criterion from the spec, and records the result. Pass or fail, the verdict is grounded in command output you actually saw — never in a hunch.
13
13
 
14
14
  The one rule everything else serves: **a claim of done is a claim about evidence. No evidence, no claim.** A green feeling is not green output.
15
15
 
@@ -19,7 +19,7 @@ Not this phase: still writing tests or production code → `../implement/SKILL.m
19
19
 
20
20
  ## Model tier — `balanced` (opt-in routing)
21
21
 
22
- This phase's default model tier is **`balanced`** — it runs the checks and interprets failures with judgment. 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.
22
+ This phase's default model tier is **`balanced`** — it runs the checks and interprets failures with judgment. 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.
23
23
 
24
24
  ## Read the room first (register)
25
25
 
@@ -27,12 +27,23 @@ Before running anything, read `technical_level` in `02-DOCS/wiki/harness/user-pr
27
27
 
28
28
  Report in the `orient` voice: pass/fail per gate, then one line of *why* per failing check, then what the user should decide next. For a `non-technical` reader, say what each failing check protects with an everyday analogy.
29
29
 
30
- ## The gate (run in this order)
30
+ ## Two modes
31
+
32
+ | Mode | When | Scope | Output |
33
+ | --- | --- | --- | --- |
34
+ | **Per task** | step e of `implement`'s loop, every tier | the task's diff: **tests** (affected suite), **build** (compile + types), **security** (stack audit; `../secure-coding/SKILL.md` on input/authz/secrets), **traceability** (every new behaviour traces to a spec criterion — untraced behaviour is a finding) | one line per control in the task's progress entry |
35
+ | **Closing** | ASDD stage 5, once, before `review` and `ship` | the whole branch against main: merge main in (or rebase) and run the full gate below on the result | the dated record, with a rollback plan |
36
+
37
+ **Both modes, one rule: a check that was not executed is listed as not run** — never as passed, never
38
+ omitted. A task with a control **not run** is not done; a closing record with one is a FAIL.
39
+
40
+ ## The closing gate (run in this order)
31
41
 
32
42
  ```text
33
43
  LOCATE → find the spec, the task done-checks, and which stack(s) changed
34
44
  RUN → execute the relevant stack scripts/verify.sh (lint, type, test+coverage, audit)
35
45
  WALK → check every task done-check and every spec acceptance criterion against real output
46
+ ROLLBACK→ write how to undo the change (revert sha, migration down, flag off) into the record
36
47
  RECORD → write the verification record under 02-DOCS/wiki/sdd/, index it
37
48
  VERDICT → PASS only if every item has passing evidence; otherwise FAIL with the gaps + handoff
38
49
  ```
@@ -46,10 +57,10 @@ Never collapse a step. Never write the verdict before RUN and WALK have produced
46
57
  non-trivial, mark that as a verification risk and recommend `sdd-init`.
47
58
  - Read the spec at `02-DOCS/wiki/sdd/specs/<slug>.md` for its **acceptance criteria**.
48
59
  - Read the plan/task list at `02-DOCS/wiki/sdd/plans/<slug>.md` for each task's **done-check**.
49
- - Read `02-DOCS/wiki/sdd/progress/<slug>.md` if present for apply evidence and
50
- completed tasks. Missing progress does not automatically fail, but it is a
51
- traceability gap to record.
52
- - Determine which subprojects/stacks the change touched (from `git status`/`git diff --name-only` and the manifests). That tells you *which* stack `verify.sh` to run — possibly more than one in a monorepo.
60
+ - Read `02-DOCS/wiki/sdd/progress/<slug>.md` for apply evidence, per-task controls and the
61
+ `## Decision queue`. Missing progress is a traceability gap to record; parked tasks are listed
62
+ in the record, never counted as done.
63
+ - Determine which subprojects/stacks the branch touched (from `git diff --name-only main...HEAD` and the manifests). That tells you *which* stack `verify.sh` to run — possibly more than one in a monorepo.
53
64
  - If the constitution exists (`02-DOCS/wiki/sdd/constitution.md`), note its quality bars (coverage floor, lint level) — they are part of the gate.
54
65
 
55
66
  If the spec or task list is missing, stop: there is nothing to verify against. Say so and point back up the chain.
@@ -95,7 +106,7 @@ The dangerous way a checker breaks is not a crash — it is **fail-open**: nothi
95
106
 
96
107
  **Over-blocking is not the safe side.** It feels like caution and it is not: a gate that fires on correct work gets muted, worked around, or wedges the pipeline that depends on it, which is the same damage as a gate that checks nothing with the sign reversed. And it is *harder* to notice, because the failure arrives dressed as diligence.
97
108
 
98
- Where this bites hardest is a check that matches text rather than structure — **"the path appears in the string" is not "the write targets that location"**. Our own integrity gate learned this twice in one day: it flagged a transcript that merely *named* a protected path (the skill body it had been handed named it), then flagged a sandbox directory whose path *contained* the protected one as a substring. Twelve mutants had proven it could fail; not one had asked whether it could pass, so the defect shipped and surfaced on first real use with the filesystem provably untouched. → `02-DOCS/wiki/harness/puertas-y-mecanismos.md`
109
+ Where this bites hardest is a check that matches text rather than structure — **"the path appears in the string" is not "the write targets that location"**. Our own integrity gate shipped that defect: twelve mutants proved it could fail, none asked whether it could pass. → `02-DOCS/wiki/harness/puertas-y-mecanismos.md`
99
110
 
100
111
  So when you write the negative control, write the positive one beside it, and prefer matching **structure** (a parsed tool call, a resolved path, an exit code) over matching text that happens to contain the thing you care about.
101
112
 
@@ -138,6 +149,9 @@ source_state: 3f9a1c2 (clean)
138
149
  - [x] AC1 user can place an order — evidence: e2e test green
139
150
  - [ ] AC3 duplicate submit is a no-op — UNVERIFIED: no observable proof
140
151
 
152
+ ## Rollback plan
153
+ - `git revert <merge sha>`; migration `0042` has a tested down step; no flag involved.
154
+
141
155
  ## Capas no ejecutadas
142
156
  - **NO-APLICA** — mutation: no logic module changed, only templates.
143
157
  - **HERRAMIENTA-AUSENTE** — mypy: not installed in this environment; verify.sh printed SKIP and **nothing ran in its place**.
@@ -153,7 +167,7 @@ source_state: 3f9a1c2 (clean)
153
167
 
154
168
  **All numbers come from one fresh run made after the last edit.** A figure from mid-task is stale and does not go in the record, however true it was when you saw it.
155
169
 
156
- **Split "didn't run" three ways**, because one `SKIP` list collapses three different confidence claims and they read identically:
170
+ **Every not-run check is listed, labelled.** Split "didn't run" three ways, because one `SKIP` list collapses three different confidence claims and they read identically:
157
171
 
158
172
  | Label | Means | Reader should conclude |
159
173
  |---|---|---|
@@ -178,7 +192,7 @@ Append-only spirit: don't overwrite a prior run's record; a new run is a new dat
178
192
 
179
193
  ### 5 — VERDICT
180
194
 
181
- - **PASS** only when *every* stack gate that ran is green (no FAILs), *every* task done-check is met with evidence, and *every* acceptance criterion has observable proof. Then, and only then, say it's verified — and point to `review`.
195
+ - **PASS** only when *every* stack gate ran green (none **not run** but `NO-APLICA`), *every* task done-check is met with evidence, *every* acceptance criterion has observable proof, and the rollback plan is written. Then, and only then, say it's verified — and point to `review`. Parked tasks don't block the verdict; they travel to the human with it.
182
196
  - **FAIL** the moment any item lacks passing evidence. List the open items precisely (which check, which criterion, what's missing). Do not soften it. A single unverified acceptance criterion fails the whole gate.
183
197
  - Hand each failing kind to the right place: a failing test/type error → `debug`; a missing test for a criterion → back to `implement`; a spec ambiguity that surfaced → `clarify`.
184
198
 
@@ -187,7 +201,8 @@ Append-only spirit: don't overwrite a prior run's record; a new run is a new dat
187
201
  | Anti-pattern | Why it fails / fix |
188
202
  | --- | --- |
189
203
  | "The tests passed last run, I'll trust that." | Re-run now. Code changed since; stale green is not green. Evidence is current, or it isn't evidence. |
190
- | "verify.sh printed SKIP for the tests — close enough." | A SKIP is *unverified*, not passing. The criterion it covers is still open until a real run passes. |
204
+ | "verify.sh printed SKIP for the tests — close enough." | A SKIP is **not run**, not passing. The criterion it covers is still open until a real run passes. |
205
+ | "The security audit didn't run, but the task is clearly fine." | List it **not run**. The task is not done until it runs or the human accepts the gap. |
191
206
  | "I read the code and the criterion is obviously satisfied." | Reading is `review`. Verifying needs an observable result — a test, a response, a rendered page. |
192
207
  | "Lint and types are green, so it's done." | The stack gate proves clean code, not correct behavior. Walk the acceptance criteria too. |
193
208
  | "Coverage dipped below the floor but the feature works." | The constitution's coverage bar is part of the gate. Below floor = FAIL, not a footnote. |
@@ -220,9 +235,9 @@ End with:
220
235
  }
221
236
  ```
222
237
 
223
- ## Next in the chain
238
+ ## Next in ASDD
224
239
 
225
- A **PASS** record is the entry ticket to the next phase: **`../review/SKILL.md`** (adversarial read of the diff for what the gate can't catch), then **`../ship/SKILL.md`** (PR/merge). A **FAIL** routes back per the VERDICT step. Either way the verification record under `02-DOCS/wiki/sdd/verifications/` travels with the work as its proof.
240
+ Per-task mode returns to `implement`'s loop (step f). A closing **PASS** record is the entry ticket to **`../review/SKILL.md`** (whole-branch adversarial read against the spec), then **`../ship/SKILL.md`** (PR with Testing / Risk / How to revert). A **FAIL** routes back per the VERDICT step. Either way the verification record under `02-DOCS/wiki/sdd/verifications/` travels with the work as its proof.
226
241
 
227
242
  ## Orientación (siempre)
228
243
 
@@ -1,6 +1,6 @@
1
1
  # Eval harness — `verify` skill
2
2
 
3
- `verify` is the rsc-sdd post-implementation **gate**. These evals check two
3
+ `verify` is the ASDD evidence **gate** (per task and at closing). These evals check two
4
4
  things: that it **triggers** at the right moment (someone is about to claim
5
5
  "done"/"green"/"ready to merge") and stays quiet on near-misses, and that it
6
6
  **measurably changes the behavior** — running the real stack gate, walking the
@@ -28,7 +28,7 @@ pure shell runner.
28
28
  Goal: the skill fires when a "done" claim is imminent and never on a near-miss.
29
29
 
30
30
  1. Configure an agent with the **full catalog of skill descriptions** available
31
- for routing (verify + the rsc-sdd phase skills it chains to — implement,
31
+ for routing (verify + the ASDD phase skills it chains to — implement,
32
32
  debug, review, clarify, ship — plus the stack/process skills: fastapi, go,
33
33
  nextjs, flutter, postgresdb, secure-coding, deployment, harness, init) so
34
34
  routing competes realistically.
@@ -101,4 +101,5 @@ capability:
101
101
  - "Before trusting any home-grown gate that reports green, asks for it to be watched failing on a known-bad input, and states the limit: one negative control proves one bad case reaches the failure path, not that the gate covers the rule it claims to enforce."
102
102
  - "Splits layers that did not run into NO-APLICA / HERRAMIENTA-AUSENTE / SUSTITUIDA rather than one undifferentiated SKIP list, and never writes SUSTITUIDA as a pass."
103
103
  - "Binds the record to a source state (short commit SHA plus clean/dirty) and takes every number from one fresh run made after the last edit, refusing to reuse mid-task figures."
104
+ - "Lists every check that did not execute (the mypy SKIP) as 'not run', never as passed, and writes a rollback plan into the closing record."
104
105
  - "Gives any dismissed finding its own evidence line (command, file:line, or the test that disproves it) rather than asserting it was not a real problem."
@@ -184,7 +184,7 @@ a linked worktree (`git rev-parse --git-dir` ≠ `--git-common-dir`), rule out a
184
184
 
185
185
  ## Model tier — `light` (opt-in routing)
186
186
 
187
- This phase's default model tier is **`light`** — isolating the workspace is mechanical git work. 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.
187
+ This phase's default model tier is **`light`** — isolating the workspace is mechanical git work. 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.
188
188
 
189
189
  ## Talking about it
190
190
 
@@ -95,7 +95,7 @@ export function readManifest(root) {
95
95
  const ids = (v) => (Array.isArray(v) ? v.filter((x) => typeof x === 'string' && ID.test(x)) : []);
96
96
  // Retired skills read as their successors. Canonical map: scripts/lib/retired-skills.js — inlined
97
97
  // because this file cannot import anything, and tests/retired-skills.test.js holds the two equal.
98
- const RETIRED = { eli5: 'orient', 'show-me': 'orient', bro: 'unslop', 'design-loop': 'design', 'design-dna': 'design', 'motion-craft': 'design', 'ui-engineering': 'ux' };
98
+ const RETIRED = { eli5: 'orient', 'show-me': 'orient', bro: 'unslop', 'design-loop': 'design', 'design-dna': 'design', 'motion-craft': 'design', 'ui-engineering': 'ux', sdd: 'asdd' };
99
99
  const skills = [...new Set(ids(parsed.skills).map((id) => (Object.hasOwn(RETIRED, id) ? RETIRED[id] : id)))];
100
100
  const own = ids(parsed.ownSkills);
101
101
  // A manifest with nothing declared is not a clone waiting to be equipped; there is nothing to offer.