@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.
- package/README.md +16 -9
- package/manifest.json +49 -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 +185 -0
- package/scripts/lib/risk.js +65 -0
- package/scripts/lib/spec-gate.js +10 -1
- package/scripts/rsc.js +91 -6
- package/skills/analyze/SKILL.md +3 -3
- package/skills/asdd/SKILL.md +159 -0
- package/skills/{sdd → asdd}/evals/README.md +10 -10
- package/skills/{sdd → asdd}/evals/cases.yaml +4 -4
- package/skills/{sdd → asdd}/references/model-routing.md +2 -2
- package/skills/building-agents/SKILL.md +1 -1
- package/skills/clarify/SKILL.md +48 -55
- package/skills/clarify/evals/cases.yaml +6 -7
- package/skills/connect-tool/SKILL.md +119 -21
- package/skills/connect-tool/THIRD_PARTY.md +43 -0
- package/skills/connect-tool/bridge-kit/01-TOOLS-plantilla/test_connection.sh +33 -0
- package/skills/connect-tool/bridge-kit/LICENSE +27 -0
- package/skills/connect-tool/bridge-kit/README.md +48 -0
- package/skills/connect-tool/bridge-kit/UPSTREAM.json +8 -0
- package/skills/connect-tool/bridge-kit/access/access_a_sqlite.py +82 -0
- package/skills/connect-tool/bridge-kit/dbhub/dbhub.toml.ejemplo +65 -0
- package/skills/connect-tool/bridge-kit/red/cloudflared-config.yml.ejemplo +18 -0
- package/skills/connect-tool/bridge-kit/red/tailscale-grants.hujson +22 -0
- package/skills/connect-tool/bridge-kit/sqlserver/01-login-servidor.sql +25 -0
- package/skills/connect-tool/bridge-kit/sqlserver/02-usuario-y-vistas.sql +69 -0
- package/skills/connect-tool/bridge-kit/sqlserver/03-prueba-solo-lectura.sql +65 -0
- package/skills/connect-tool/bridge-kit/sqlserver/copia-nocturna.ps1 +68 -0
- package/skills/connect-tool/evals/cases.yaml +41 -4
- package/skills/connect-tool/references/connect-or-migrate.md +96 -0
- package/skills/connect-tool/references/database-bridge.md +159 -0
- package/skills/connect-tool/references/file-exchange.md +103 -0
- package/skills/connect-tool/references/messages.md +120 -0
- package/skills/connect-tool/references/program-types.md +97 -0
- package/skills/connect-tool/references/spain.md +103 -0
- package/skills/connect-tool/references/what-to-find-out.md +57 -0
- package/skills/constitution/SKILL.md +21 -8
- package/skills/constitution/evals/README.md +1 -1
- package/skills/debug/SKILL.md +1 -1
- 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 +126 -113
- package/skills/implement/evals/cases.yaml +4 -2
- package/skills/implement/references/per-task-review.md +19 -26
- package/skills/nextjs/SKILL.md +1 -1
- package/skills/parallel/SKILL.md +1 -1
- package/skills/plan/SKILL.md +2 -2
- package/skills/postgresdb/SKILL.md +1 -1
- package/skills/react/SKILL.md +1 -1
- package/skills/review/SKILL.md +58 -31
- package/skills/sdd-init/SKILL.md +6 -6
- package/skills/ship/SKILL.md +38 -18
- package/skills/specify/SKILL.md +32 -33
- package/skills/specify/evals/cases.yaml +1 -1
- package/skills/specify/references/spec-template.md +27 -5
- 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 +2 -2
- package/skills/verify/SKILL.md +30 -15
- package/skills/verify/evals/README.md +2 -2
- package/skills/verify/evals/cases.yaml +1 -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 +1 -1
- package/skills/sdd/SKILL.md +0 -250
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, `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
|
|
@@ -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
|
|
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.
|
|
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
|
|
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…>
|
|
@@ -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
|
|
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
|
|
package/skills/tasks/SKILL.md
CHANGED
|
@@ -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
|
|
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
|
-
`../
|
|
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
|
|
49
|
-
|
|
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
|
|
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
|
|
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
|
|
129
|
-
or send the gap to `clarify`/`specify`.
|
|
130
|
-
6.
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
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 | — |
|
|
166
|
-
| T002 | [P] | Add `sessions` table migration | migration applies; FK to users present | T001 |
|
|
167
|
-
| T003 | | Write failing test for `POST /login` | `pytest tests/auth/test_login.py` fails: no route | T001 |
|
|
168
|
-
| T004 | | Implement `POST /login` | T003 test green; bad pw → 401 | T003 |
|
|
169
|
-
| ... | ... | ... | ... | ... | ... |
|
|
170
|
-
| T0NN | | All done-checks pass + `verify.sh` green | every row above checked; `scripts/verify.sh` exits 0 | all |
|
|
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
|
-
|
|
|
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
|
-
|
|
213
|
-
|
|
214
|
-
|
|
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
|
|
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
|
|
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
|
|
257
|
-
**`implement
|
|
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 (`
|
|
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
|
|
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
|
-
- "
|
|
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."
|
package/skills/verify/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verify
|
|
3
|
-
description: "Use when
|
|
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
|
|
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 `../
|
|
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
|
-
##
|
|
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`
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
- Determine which subprojects/stacks the
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
238
|
+
## Next in ASDD
|
|
224
239
|
|
|
225
|
-
A **PASS** record is the entry ticket to
|
|
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
|
|
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
|
|
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 `../
|
|
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.
|