task-pipeline-skill 1.12.0 → 1.14.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/CHANGELOG.md +89 -0
- package/CONTRIBUTING.md +23 -1
- package/README.md +1 -0
- package/SKILL-CARD.md +3 -3
- package/cursor/rules/task-pipeline.mdc +34 -0
- package/evals/RESULTS.md +1 -1
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +14 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/continuity.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +35 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/learned.md +2 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +28 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +3 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/review.md +10 -4
- package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +36 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +6 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,94 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.14.0 — 2026-08-05
|
|
4
|
+
|
|
5
|
+
### Added — false success: the failure mode that removes the reason to look
|
|
6
|
+
|
|
7
|
+
Every incident this repository has recorded of a mechanism reporting a win it never
|
|
8
|
+
checked was fixed as its own instance, because the class had no name to be swept by:
|
|
9
|
+
the hook that fails open (any exit code but `2` is non-blocking, so a **crashed**
|
|
10
|
+
guard *allows* the action), the cancel that accepted an id that was never scheduled
|
|
11
|
+
and returned success, the counter that asserted the new number was present instead of
|
|
12
|
+
the old one being gone — green for three releases while four surfaces printed the old
|
|
13
|
+
one — and R-002's batch of edits reporting done while one edit never applied.
|
|
14
|
+
|
|
15
|
+
- **`references/gates.md` gains the class**: the law (*an actor's own reply is not
|
|
16
|
+
evidence about the world*), the five known shapes, the test that separates a checked
|
|
17
|
+
pass from a silent one — *what does it print when it did not look?* — and two rules:
|
|
18
|
+
verify by re-reading rather than by the reply, and assert the **absence of the old**
|
|
19
|
+
rather than the presence of the new.
|
|
20
|
+
- **`references/audit.md` gains a fifth axis.** The four existing axes read for
|
|
21
|
+
wrongness, which is exactly what a false success is not. The new axis asks where a
|
|
22
|
+
mechanism can report a win it never checked.
|
|
23
|
+
- **The other files cite the class, never restate it.** `continuity.md`'s cancel rule
|
|
24
|
+
became one named instance instead of a second definition.
|
|
25
|
+
|
|
26
|
+
### Added — effect verification: the diff cannot show what the task did
|
|
27
|
+
|
|
28
|
+
`v1.12.0` added a hygiene gate over what a task **wrote**. It is blind to what a task
|
|
29
|
+
**did** — a file moved, a job cancelled, a service restarted, a record migrated — and
|
|
30
|
+
the implementer's report is not evidence about any of it.
|
|
31
|
+
|
|
32
|
+
- **`references/build.md`**: the implementer contract now requires a `verified-by:`
|
|
33
|
+
line for every step whose effect lives outside its own diff, carrying the command
|
|
34
|
+
that *confirmed* the state rather than the one that caused it. The hygiene-gate
|
|
35
|
+
section names its own blind side and tells the controller to read those lines back.
|
|
36
|
+
- **`references/review.md`**: a new rubric item — **Effect verification** — rated
|
|
37
|
+
**Important**, not Minor. A finding that never blocks is a finding the fix loop
|
|
38
|
+
never sees.
|
|
39
|
+
|
|
40
|
+
### Guards — 80 → 94
|
|
41
|
+
|
|
42
|
+
Fourteen new checks, each with a negative self-test whose plant asserts it landed
|
|
43
|
+
before the edit. Two invariants added to `CONTRIBUTING.md`, both citing a literal the
|
|
44
|
+
validator actually prints. The negatives floor moved 80 → 94.
|
|
45
|
+
|
|
46
|
+
**One defect found by this run's own discipline:** the first draft of these guards was
|
|
47
|
+
appended *below* the validator's verdict block, so on a clean run they executed after
|
|
48
|
+
`PASS` was printed and on a corrupted one they never executed at all — fourteen guards
|
|
49
|
+
that could not fail. The negatives runner caught it because it requires positive
|
|
50
|
+
evidence (`OK:` in stdout), not merely a non-zero exit. A runner that accepted silence
|
|
51
|
+
would have shipped the exact defect this release is about.
|
|
52
|
+
|
|
53
|
+
## v1.13.0 — 2026-08-05
|
|
54
|
+
|
|
55
|
+
### Added — the read-back: four rules that existed and were never handed over
|
|
56
|
+
|
|
57
|
+
Stages 3 and 4 produced documents stating things nobody verified: that a named
|
|
58
|
+
check exists, that the spec agrees with decisions already made, that the
|
|
59
|
+
self-review happened at all, and that the change still costs what it was worth.
|
|
60
|
+
|
|
61
|
+
Five defects, and **four of them are one shape.** The rule already lived in this
|
|
62
|
+
bundle, in a stage that never handed it to the stage which had to obey it. The
|
|
63
|
+
evidence-for-checks rule sits at stages 6 and 10; the rejected-alternatives rule
|
|
64
|
+
sits at stage 2; `learned.md` rule 14 has sat at stage 9 since v1.4.0. Stage 3
|
|
65
|
+
names checks, contradicts decisions and writes DoDs — and read none of them back.
|
|
66
|
+
|
|
67
|
+
So the fix is one mechanism applied four times. `spec.md`'s self-review now asks
|
|
68
|
+
whether every check it names is real, reads back the brief's `Decisions locked`
|
|
69
|
+
table **and** the alternatives stage 2 rejected, and prints the cost.
|
|
70
|
+
`planning.md` asks whether every command, path and file a DoD names resolves.
|
|
71
|
+
`learned.md`'s stage map binds rule 14 at 3 and 4, not only at 9.
|
|
72
|
+
|
|
73
|
+
**The fifth is a genuine absence, and it prints rather than decides.** Nothing
|
|
74
|
+
anywhere asked whether a change had outgrown its worth. The new checkpoint counts
|
|
75
|
+
surfaces, guards and REQ rows now versus at stage 2 and prints all three — the
|
|
76
|
+
stage-3 gate is the operator's, and an agent that narrows the task on its own
|
|
77
|
+
judgement breaks *never narrow the task silently*.
|
|
78
|
+
|
|
79
|
+
**Both self-reviews now leave a committed trace.** A `## Self-review` section,
|
|
80
|
+
identical in shape across the two files, every line a **computed number rather
|
|
81
|
+
than a tick** — because a number nobody computed is visible as such and a
|
|
82
|
+
checkbox never is. `planning.md` already demanded the REQ set difference be
|
|
83
|
+
*printed*; this extends that principle to the rest of the checklist.
|
|
84
|
+
|
|
85
|
+
Three guards prove the files carry the items, with four probes. What they cannot
|
|
86
|
+
prove is that a run in someone else's repository performed a self-review — and
|
|
87
|
+
that boundary is stated in the spec, in the guard's own comment and here, because
|
|
88
|
+
a guard claiming otherwise would be the exact defect this release fixes.
|
|
89
|
+
|
|
90
|
+
Negative self-tests: 76 → 80.
|
|
91
|
+
|
|
3
92
|
## v1.12.0 — 2026-08-05
|
|
4
93
|
|
|
5
94
|
### Added — a gate for the defects an agent leaves behind
|
package/CONTRIBUTING.md
CHANGED
|
@@ -124,6 +124,13 @@ scripts are validated by one iterated block, not two copies, and both must keep
|
|
|
124
124
|
`# ---------- VERDICT` marker with nothing after it.
|
|
125
125
|
*(guard: `the VERDICT block must be last and must `)*
|
|
126
126
|
|
|
127
|
+
**Stages 3 and 4 must keep reading their rules back.** `spec.md`'s self-review asks
|
|
128
|
+
whether every check it names is real, reads back the brief's decisions and stage 2's
|
|
129
|
+
rejected options, and prints the cost; `planning.md` asks whether every command a DoD
|
|
130
|
+
names resolves; `learned.md` binds rule 14 at both stages. Both files carry a
|
|
131
|
+
committed `## Self-review` section of computed numbers rather than ticks.
|
|
132
|
+
*(guard: `the self-review no longer asks `)*
|
|
133
|
+
|
|
127
134
|
**11. Every reference over 100 lines carries a `## Contents` list**, and the list is
|
|
128
135
|
compared against that file's own `##` headings. The guidance asks for it because a
|
|
129
136
|
long file gets previewed with a partial read; the comparison is because a hand-kept
|
|
@@ -203,7 +210,22 @@ releases and the link checker stayed green throughout, because it resolves from
|
|
|
203
210
|
file's home. Name the file in a code span instead — the same rule the Cursor rule
|
|
204
211
|
follows, for the same reason. *(guard: `resolves only from`)*
|
|
205
212
|
|
|
206
|
-
**28.
|
|
213
|
+
**28. The False success class has one home, and the files that use it cite it.**
|
|
214
|
+
`references/gates.md` defines it — the law, the did-not-look test, and its two
|
|
215
|
+
rules; `audit.md` (the fifth axis), `build.md`, `review.md` and `continuity.md`
|
|
216
|
+
point at that section instead of restating it. Every incident this repository has
|
|
217
|
+
recorded of a mechanism reporting a win it never checked was fixed as its own
|
|
218
|
+
instance, because the class had no name to be swept by.
|
|
219
|
+
*(guard: `the False success class is gone`)*
|
|
220
|
+
|
|
221
|
+
**29. A side effect is confirmed by re-reading the state, never by the reply.**
|
|
222
|
+
`references/build.md` binds the implementer to a `verified-by:` line for every
|
|
223
|
+
step whose effect lives outside its own diff, and names the hygiene gate's blind
|
|
224
|
+
side; `references/review.md` rates an effect asserted without one as **Important**,
|
|
225
|
+
not Minor. A finding that never blocks is a finding the fix loop never sees.
|
|
226
|
+
*(guard: `the report no longer requires verified-by lines`)*
|
|
227
|
+
|
|
228
|
+
**30. Every invariant above names the guard that enforces it, and that guard exists.**
|
|
207
229
|
This list claims to be *what the validator enforces*; it was eight guards behind when
|
|
208
230
|
an audit measured it. A claim of enforcement is now checked like any other claim.
|
|
209
231
|
*(guard: `whose message does not appear in`)* — and a cited literal must lie inside
|
package/README.md
CHANGED
|
@@ -129,6 +129,7 @@ until it is installed.
|
|
|
129
129
|
| any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
|
|
130
130
|
| run-wide pacing | [`continuity.md`](plugins/task-pipeline/skills/task-pipeline/references/continuity.md) — the loop mode (`run.loop`, default off, never collapses a manual gate) and the context budget (fires on a harness signal, never on an estimate) |
|
|
131
131
|
| 0 + 9 + any settled decision | [`documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) — the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
|
|
132
|
+
| 3 + 4 · every spec and plan | the self-review reads its rules back — is every named check real, does anything contradict a locked decision or a rejected option, and what does this cost now versus at design time. Answers land as a committed `## Self-review` of computed numbers |
|
|
132
133
|
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the two axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
|
|
133
134
|
| any agent-time enforcement | [`hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) — the `PreToolUse` contract, the fail-open hazard, the Claude-Code-only limit |
|
|
134
135
|
|
package/SKILL-CARD.md
CHANGED
|
@@ -12,7 +12,7 @@ harmless.
|
|
|
12
12
|
|---|---|
|
|
13
13
|
| **Purpose** | Runs a substantial task through ten gated delivery stages — intake grill, docs study, brainstorm, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs+registers, acceptance — refusing to advance until each gate passes |
|
|
14
14
|
| **Owner** | ssheleg ([github.com/ssheleg/task-pipeline](https://github.com/ssheleg/task-pipeline)) |
|
|
15
|
-
| **Version** | 1.
|
|
15
|
+
| **Version** | 1.14.0 |
|
|
16
16
|
| **Surface** | Claude Code (filesystem skill + plugin) and the vercel `skills` CLI. **Not** uploaded to the Skills API; custom Skills do not sync across surfaces |
|
|
17
17
|
| **Dependencies** | None required. Optional: `context7` (MCP), `figma` (MCP), super-ux, agent-sync, graphify, obsidian-wiki. Every stage's doctrine ships in-repo; the one conditional requirement is super-ux for the stage-3 UX track on a user-facing task |
|
|
18
18
|
| **Evaluation status** | Suite authored (15 evals, 5 categories). **Never executed** — see [`evals/RESULTS.md`](evals/RESULTS.md) |
|
|
@@ -38,7 +38,7 @@ apply.
|
|
|
38
38
|
instruction surface, and every one is linked directly from `SKILL.md`.
|
|
39
39
|
2. Read `templates/docgate.sh` before seeding it; it is the only shipped script a
|
|
40
40
|
host project will run on its own repository.
|
|
41
|
-
3. Run `npm run test:all` —
|
|
41
|
+
3. Run `npm run test:all` — 94 guards, each with a negative self-test that plants a
|
|
42
42
|
defect and requires rejection.
|
|
43
43
|
4. Run `python3 evals/run.py` for the behavioural protocol, and read
|
|
44
44
|
`evals/RESULTS.md` for what has actually been observed.
|
|
@@ -54,7 +54,7 @@ apply.
|
|
|
54
54
|
- **Versions are pinned by git tag** and mirrored into `sshlg-skills`'s catalogue.
|
|
55
55
|
Rollback is `git checkout v<previous>` or pinning the previous plugin version;
|
|
56
56
|
the previous version is never deleted.
|
|
57
|
-
- **Behavioural evidence is missing, not merely thin.**
|
|
57
|
+
- **Behavioural evidence is missing, not merely thin.** 94 structural guards prove
|
|
58
58
|
the skill is well-formed. Until `evals/RESULTS.md` carries a dated run, nothing in
|
|
59
59
|
this repository proves it *behaves* — triggers correctly, stays quiet on a
|
|
60
60
|
question, or performs the steps it documents.
|
|
@@ -197,6 +197,13 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
|
|
|
197
197
|
exact values every later task inherits. Self-review it for placeholders,
|
|
198
198
|
contradictions, ambiguity and scope before showing it. For UI tasks, run the UX
|
|
199
199
|
chain FIRST (see super-ux below) and embed it.
|
|
200
|
+
**Before handing a spec or a plan over, read your rules back:** does every
|
|
201
|
+
check you named actually exist (or say `review`)? does anything here
|
|
202
|
+
contradict a decision already locked, including an option deliberately
|
|
203
|
+
rejected? how many surfaces, guards and requirements is this now versus
|
|
204
|
+
when the design was approved — print all three and let the operator
|
|
205
|
+
decide. Leave the answers as a committed `Self-review` section of
|
|
206
|
+
computed numbers, not ticks.
|
|
200
207
|
4. **Plan** (auto) — every task names the REQ ids it `Implements:`, and the set of those ids must **equal** the brief's REQ set — a difference is scope lost, print it and fix it. Zero-context tasks: exact paths, complete code in every step,
|
|
201
208
|
the exact command and its expected output, TDD steps, DoD each, dependency graph
|
|
202
209
|
+ parallel groups, non-overlapping file ownership. **No placeholders** — no TBD,
|
|
@@ -443,6 +450,33 @@ is not portable and silently edits nothing on BSD), run, assert `$?` is non-zero
|
|
|
443
450
|
restore, assert zero. **Doubt the probe before the check** — four of five silent
|
|
444
451
|
probes on a real project were the probe's fault. Record the probe.
|
|
445
452
|
|
|
453
|
+
## False success — the failure that removes the reason to look
|
|
454
|
+
|
|
455
|
+
An actor's own reply is not evidence about the world. A failure is loud and gets
|
|
456
|
+
fixed; a mechanism that reports a win it never checked is silent, so it survives
|
|
457
|
+
every pass that reads for wrongness. Known shapes: a hook that fails open (any exit
|
|
458
|
+
code but 2 is non-blocking, so a crashed guard ALLOWS the action), a cancel that
|
|
459
|
+
accepts an id that was never scheduled and returns success, a check asserting the
|
|
460
|
+
new value is present instead of the old one being gone, a batch of edits reporting
|
|
461
|
+
done while one edit never applied, and a section with no input whose silence is
|
|
462
|
+
read as a pass.
|
|
463
|
+
|
|
464
|
+
Two rules:
|
|
465
|
+
|
|
466
|
+
1. **Verify by re-reading, not by the reply.** After a teardown, cancel, delete,
|
|
467
|
+
disable, publish or migrate — query the authoritative state and assert the new
|
|
468
|
+
condition.
|
|
469
|
+
2. **Assert the absence of the old, not the presence of the new.** A check that only
|
|
470
|
+
proves the new value exists stays green while the old one is still shipping.
|
|
471
|
+
|
|
472
|
+
The test for any mechanism you are about to trust: what does it print when it did
|
|
473
|
+
not look? If that is indistinguishable from what it prints when it looked and found
|
|
474
|
+
nothing wrong, it is not evidence.
|
|
475
|
+
|
|
476
|
+
**In a build:** every step whose effect lives outside your own diff carries a
|
|
477
|
+
`verified-by:` line — the command that CONFIRMED the state, not the one that caused
|
|
478
|
+
it. A step without one is unverified, not done, and a review rates it Important.
|
|
479
|
+
|
|
446
480
|
## Hooks — the limit first
|
|
447
481
|
|
|
448
482
|
Hooks exist **only in Claude Code**. Elsewhere the same rules run as a self-check
|
package/evals/RESULTS.md
CHANGED
|
@@ -37,7 +37,7 @@ or it belongs in a check.
|
|
|
37
37
|
| Dated runs recorded | **0** | 2026-08-03 |
|
|
38
38
|
|
|
39
39
|
The bottom two numbers are the honest state of this skill's behavioural evidence.
|
|
40
|
-
Everything else in this repository is proven by
|
|
40
|
+
Everything else in this repository is proven by 94 structural guards that check the
|
|
41
41
|
*form*; these are the only checks that would speak to the *behaviour*, and they have
|
|
42
42
|
not been run yet. Printed here so "63 of 63 green" is never read as "the skill is
|
|
43
43
|
known to work".
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.14.0",
|
|
4
4
|
"description": "Full-cycle delivery pipeline for coding agents: a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine ships inside the skill — no companion plugin required. This package is the installer CLI.",
|
|
5
5
|
"bin": {
|
|
6
6
|
"task-pipeline": "bin/task-pipeline.js"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "task-pipeline",
|
|
3
3
|
"displayName": "Task Pipeline",
|
|
4
4
|
"description": "Runs a substantial task through a mandatory built-in intake grill, then 10 gated stages (docs, brainstorm+decompose, spec, plan, subagent build, tests, lint/deploy, post-deploy, docs/wiki, acceptance). Every stage's doctrine is built into the skill — no companion plugin required — with typed auto/manual gates, a frozen requirement spine that must close with evidence, a loop guard that breaks churn, one provider-agnostic model confirmed up front, and an optional super-ux UX track for user-facing work.",
|
|
5
|
-
"version": "1.
|
|
5
|
+
"version": "1.14.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -228,6 +228,12 @@ construction**:
|
|
|
228
228
|
doc naming a module the graph has no node for describes something that no longer
|
|
229
229
|
exists. This axis is the only one that finds absences without reading for them,
|
|
230
230
|
which is why it is worth rotating onto when the reading axes go quiet.
|
|
231
|
+
5. **False success** — not *"is this check correct"* but *"what does this mechanism
|
|
232
|
+
print when it did not look?"* Wrongness is loud and the reading axes above find
|
|
233
|
+
it; a mechanism that reports a win it never checked is silent, so it survives
|
|
234
|
+
every pass that reads for wrongness. Sweep the change for actions trusted by
|
|
235
|
+
their own reply. Definition and the known shapes: [`gates.md`](gates.md) →
|
|
236
|
+
*False success*.
|
|
231
237
|
|
|
232
238
|
**The crossover is measurable, so measure it.** Every pass, count two numbers: new
|
|
233
239
|
findings, and findings caused by the previous pass's own fixes. When the second
|
|
@@ -188,8 +188,12 @@ Record the implementer's agent identity: fix rounds 1–3 resume it.
|
|
|
188
188
|
> code exists before a test you **watched fail**: write the failing test → run it
|
|
189
189
|
> and confirm it fails for the right reason → write the minimal code that passes →
|
|
190
190
|
> run it and confirm it passes, with the rest of the suite still green → commit.
|
|
191
|
-
> Assert on real behavior, never on mock behavior.
|
|
192
|
-
>
|
|
191
|
+
> Assert on real behavior, never on mock behavior. **Any step with a side effect
|
|
192
|
+
> outside your own diff — a command that moves, deletes, publishes, migrates,
|
|
193
|
+
> restarts or cancels something — is confirmed by re-reading the state it changed,
|
|
194
|
+
> never by the command's own reply; record each one in the report as a
|
|
195
|
+
> `verified-by:` line carrying the command you ran to confirm and its output.**
|
|
196
|
+
> Commit as you go, conventional commits. When done, self-review your diff, then write the full report to
|
|
193
197
|
> `<report path>`:
|
|
194
198
|
> what you built, the files touched, the commits, the test command and its
|
|
195
199
|
> output, decisions you made, anything you're unsure about. Return **only**:
|
|
@@ -272,6 +276,14 @@ instruction R-002 — and it is invisible in a status report. Found one task lat
|
|
|
272
276
|
costs a re-dispatch; found eight tasks later it is fixed by an agent that no longer
|
|
273
277
|
remembers the code.
|
|
274
278
|
|
|
279
|
+
**The hygiene gate reads what the task wrote; it cannot see what the task did.**
|
|
280
|
+
A file the task moved, a job it cancelled, a service it restarted, a record it
|
|
281
|
+
migrated — none of that is in the diff, and the implementer's report is not evidence
|
|
282
|
+
about it either. Before the review, read back the report's `verified-by:` lines:
|
|
283
|
+
every side-effecting step must carry the command that **confirmed** the state, not
|
|
284
|
+
the command that caused it. A step with no such line is unverified, not done
|
|
285
|
+
([`gates.md`](gates.md) → *False success*).
|
|
286
|
+
|
|
275
287
|
**The gate never edits. Fixing is yours.** A finding is repaired inside the same
|
|
276
288
|
task, or it becomes a carry-over row with a reason — never a silent pass. A gate
|
|
277
289
|
whose findings nobody acts on is a slower way of ignoring them.
|
|
@@ -136,8 +136,8 @@ job list should agree with that.
|
|
|
136
136
|
**Verify the cancel by listing the jobs, never by the cancel's own reply.** A
|
|
137
137
|
teardown call will happily accept an id that was never scheduled and report
|
|
138
138
|
success, which leaves the real job running while the transcript says it stopped.
|
|
139
|
-
List afterwards and read the list. This is
|
|
140
|
-
|
|
139
|
+
List afterwards and read the list. This is one instance of a named class —
|
|
140
|
+
[`gates.md`](gates.md) → *False success*, rule 1 — and a loop is
|
|
141
141
|
exactly where breaking it goes unnoticed, because the symptom is a message
|
|
142
142
|
arriving on time.
|
|
143
143
|
|
|
@@ -26,6 +26,7 @@ elsewhere and is not restated here:
|
|
|
26
26
|
- Axis C — degrees of freedom
|
|
27
27
|
- Progressive arming
|
|
28
28
|
- Before you run a check
|
|
29
|
+
- False success — when a mechanism reports a win it never checked
|
|
29
30
|
- Anatomy of a project gate
|
|
30
31
|
- Writing the check itself
|
|
31
32
|
- Probing — plant, run, restore
|
|
@@ -136,6 +137,40 @@ Four preconditions. Skipping any of them turns a run into a claim.
|
|
|
136
137
|
|
|
137
138
|
---
|
|
138
139
|
|
|
140
|
+
## False success — when a mechanism reports a win it never checked
|
|
141
|
+
|
|
142
|
+
The four preconditions above protect a *check*. The same law binds an **action**:
|
|
143
|
+
|
|
144
|
+
> **An actor's own reply is not evidence about the world. Confirm an effect by
|
|
145
|
+
> re-reading the state it changed.**
|
|
146
|
+
|
|
147
|
+
A failure is loud and gets fixed on the pass that finds it. A false success is
|
|
148
|
+
silent and **removes the reason to look**, which is why every shape below survived
|
|
149
|
+
at least one release in this repository:
|
|
150
|
+
|
|
151
|
+
| Shape | What reported success | What was actually true |
|
|
152
|
+
|---|---|---|
|
|
153
|
+
| Fail-open hook | any exit code but `2` is non-blocking, so a **crashed** guard *allows* the action | the guard never ran |
|
|
154
|
+
| Teardown by reply | a cancel accepted an id that was never scheduled and returned success | the job was still armed |
|
|
155
|
+
| Presence instead of absence | a counter asserted the new number was present, not that the old one was gone | four surfaces still printed the old number, green for three releases |
|
|
156
|
+
| Half-applied batch | a batch of edits reported done while one edit never applied (R-002) | the file was unchanged |
|
|
157
|
+
| Silence read as a pass | a section with no input printed nothing, and the caller counted it as checked | nothing was looked at |
|
|
158
|
+
|
|
159
|
+
**The test.** For any mechanism you are about to trust, ask:
|
|
160
|
+
*what does it print when it did not look?* If that is indistinguishable from what
|
|
161
|
+
it prints when it looked and found nothing wrong, it is not evidence — give it a distinct `dormant`
|
|
162
|
+
or `skip` state (→ *Progressive arming*), or verify the effect independently.
|
|
163
|
+
|
|
164
|
+
Two rules follow. Elsewhere in this bundle they are **cited, never restated**:
|
|
165
|
+
|
|
166
|
+
1. **Verify by re-reading, not by the reply.** After a teardown, cancel, delete,
|
|
167
|
+
disable, publish or migrate: query the authoritative state and assert the item's
|
|
168
|
+
new condition.
|
|
169
|
+
2. **Assert the absence of the old, not the presence of the new.** A check that only
|
|
170
|
+
proves the new value exists stays green while the old one is still shipping.
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
139
174
|
## Anatomy of a project gate
|
|
140
175
|
|
|
141
176
|
Ten properties. Each one is here because its absence has shipped.
|
|
@@ -154,6 +154,8 @@ answer would have exposed it in a minute.
|
|
|
154
154
|
| 3 Spec · 4 Plan | 2 (both directions), 8 (compute, never restate) |
|
|
155
155
|
| 5 Dev | 9 (generators seed green), 12 (tests create their own state), 13 (local infra) |
|
|
156
156
|
| 6 Tests | 4, 5, 10, 11 — every new check probed both ways, measured, and asserted on its exit code |
|
|
157
|
+
| 3 Spec | 14 — every check the spec **names** must resolve at the moment it is named, or be marked `review` |
|
|
158
|
+
| 4 Plan | 14 — every command, path and file a DoD names must resolve |
|
|
157
159
|
| 9 Docs | 8, 14 — every number computed, every target resolvable |
|
|
158
160
|
| 10 Acceptance | 1, 3, 6, 7 — axis rotation recorded, closure verified against artefacts, classes swept, ratchets printed |
|
|
159
161
|
|
|
@@ -193,6 +193,34 @@ A checklist you run yourself, inline. No subagent:
|
|
|
193
193
|
5. **Parallel safety:** no two tasks in the same group write the same file; every
|
|
194
194
|
`depends:` points at a task that really produces what's consumed.
|
|
195
195
|
6. **DoD present and verifiable** on every task.
|
|
196
|
+
7. **Every command, path and file a DoD names resolves.** Walk each task's
|
|
197
|
+
*Definition of done* and its steps and check the targets exist — a DoD that says
|
|
198
|
+
`npm run lint:paths` when no such script exists is an instruction the implementer
|
|
199
|
+
cannot follow and a check the acceptance cannot run.
|
|
200
|
+
[`learned.md`](learned.md) rule 14 has said *every target resolvable* since
|
|
201
|
+
v1.4.0 and fired only at stage 9 — four stages after the target is written here.
|
|
202
|
+
8. **Run the hygiene gate** over what this stage wrote and record its counts below.
|
|
203
|
+
|
|
204
|
+
**R-003 asked of this file, and answered:** `spec.md`'s items 8 and 9 — reading
|
|
205
|
+
decisions back, and printing the cost — deliberately do **not** appear here. This
|
|
206
|
+
stage settles nothing (see below), so it has no decisions to contradict and no scope
|
|
207
|
+
of its own to grow. Its sibling's item 7 does belong, reworded for DoDs.
|
|
208
|
+
|
|
209
|
+
### The `## Self-review` section — committed, not asserted
|
|
210
|
+
|
|
211
|
+
Identical in shape to `spec.md`'s, so one habit covers both stages. Last section
|
|
212
|
+
before the gate; every line a **computed number, not a tick**.
|
|
213
|
+
|
|
214
|
+
```markdown
|
|
215
|
+
## Self-review
|
|
216
|
+
|
|
217
|
+
- REQ coverage: <n> in brief, <n> covered, difference <set or ∅>
|
|
218
|
+
- Named checks: <n> named, <n> resolve, <n> marked `review`
|
|
219
|
+
- Decisions: checked against <the brief's D-table> and <stage 2's rejected options> — <verdict>
|
|
220
|
+
- Cost: <surfaces>/<guards>/<REQ> now, <…> at stage 2 — <proportionate | grown, and why>
|
|
221
|
+
- Hygiene: <n> checks, <n> findings, <n> open
|
|
222
|
+
- Placeholders: <n> · Ambiguity: <n> found, <n> resolved inline
|
|
223
|
+
```
|
|
196
224
|
|
|
197
225
|
## This stage settles nothing — and that is a rule, not an omission
|
|
198
226
|
|
|
@@ -58,6 +58,7 @@ a row pointing outside the bundle is the defect this file exists to catch.
|
|
|
58
58
|
| **The routing default and its boundary** | `templates/routing-rule.md` |
|
|
59
59
|
| The seeded doc map, registers and gate | `templates/docmap.md`, `templates/decisions.md`, `templates/open-questions.md`, `templates/docgate.sh` |
|
|
60
60
|
| Which agent-introduced defects are found, and that the agent fixes them rather than the script | `templates/hygiene.sh`, `references/build.md` |
|
|
61
|
+
| What a stage-3/4 self-review must read back, and that its trace is computed numbers | `references/spec.md`, `references/planning.md`, `references/learned.md` |
|
|
61
62
|
| What a stage reads, and which host files bind it | `references/artifacts.md` |
|
|
62
63
|
| The design conversation, its hard gate, UI detection, user paths | `references/brainstorm.md` |
|
|
63
64
|
| Cutting a platform into modules, brick criteria, build order | `references/decomposition.md` |
|
|
@@ -65,6 +66,8 @@ a row pointing outside the bundle is the defect this file exists to catch.
|
|
|
65
66
|
| The zero-context plan format, parallel groups, set equality | `references/planning.md` |
|
|
66
67
|
| Workspace isolation, the subagent loop, who may write the register | `references/build.md` |
|
|
67
68
|
| The review rubric, diff packages, the three verdicts | `references/review.md` |
|
|
69
|
+
| **False success** — the class, its known shapes and its two rules | `references/gates.md` |
|
|
70
|
+
| **Effect verification** — the `verified-by:` contract and the rubric item that blocks | `references/build.md`, `references/review.md` |
|
|
68
71
|
| The TDD iron law and the suite gate | `references/tdd.md` |
|
|
69
72
|
| The REQ coverage table, evidence rules, the closing question | `references/acceptance.md` |
|
|
70
73
|
| How the host project's own conventions are read | `references/conventions.md` |
|
|
@@ -88,14 +88,20 @@ Review in this order; stop reading the diff only when you've covered all of it.
|
|
|
88
88
|
passes regardless of the production code. No `skip`/`xfail`/commented assertion
|
|
89
89
|
smuggling a red suite past a gate. New behavior has a covering test; the failure
|
|
90
90
|
path has one too.
|
|
91
|
-
6. **
|
|
91
|
+
6. **Effect verification.** Claims about the world outside the diff — a migration
|
|
92
|
+
run, a job cancelled, a file moved, a service restarted, an artifact published —
|
|
93
|
+
carry evidence that the **state was re-read**, not that the command returned
|
|
94
|
+
success. A report asserting an effect with no `verified-by:` line is an
|
|
95
|
+
unverified claim, and it is **Important**, not Minor
|
|
96
|
+
([`gates.md`](gates.md) → *False success*).
|
|
97
|
+
7. **Error handling and degradation.** Every external call (network, DB, file, MCP,
|
|
92
98
|
API) handles failure, and the failure is reported honestly rather than swallowed.
|
|
93
|
-
|
|
99
|
+
8. **Boundaries and clarity.** One responsibility per unit; names that say what the
|
|
94
100
|
thing is; no duplication of a logic block that should be shared; nothing left
|
|
95
101
|
dead.
|
|
96
|
-
|
|
102
|
+
9. **Security.** No secrets in code, logs or fixtures; input validated at the
|
|
97
103
|
boundary; no new injection or path-traversal surface.
|
|
98
|
-
|
|
104
|
+
10. **Docs in the same change.** Module docs, runbooks and (for UI work) the
|
|
99
105
|
super-ux layers updated alongside the code, not deferred.
|
|
100
106
|
|
|
101
107
|
**Severities:**
|
|
@@ -143,6 +143,42 @@ Read what you wrote with fresh eyes and fix inline. No subagent, no second pass:
|
|
|
143
143
|
4. **Scope:** is this one implementable plan, or does it need decomposition?
|
|
144
144
|
5. **Ambiguity:** can any requirement be read two ways? Pick one and say it.
|
|
145
145
|
6. **Traceability (UI):** does every user-facing requirement name its scenario ID?
|
|
146
|
+
7. **Every check this spec names resolves.** Walk the verification claims — the
|
|
147
|
+
table, and every sentence that says how something is proven. For each: does that
|
|
148
|
+
check exist today, or is this plan building it? A check that is neither is **not**
|
|
149
|
+
a verification: mark it `review` and say so, or build it. This repository's whole
|
|
150
|
+
doctrine is that a green from a check nobody watched fail is not evidence — and
|
|
151
|
+
this stage is where checks are first *named*, which is one step earlier than
|
|
152
|
+
anyone was looking.
|
|
153
|
+
8. **Read the decisions back.** Open the brief's `## Decisions locked` table **and**
|
|
154
|
+
the register entries stage 2 recorded for the alternatives it *rejected*
|
|
155
|
+
(`references/brainstorm.md` → *The approved design is a set of decisions*). Does
|
|
156
|
+
any contract here contradict one? Resolve it **out loud** — amend the spec, or
|
|
157
|
+
reverse the decision and record the reversal. A spec that quietly contradicts a
|
|
158
|
+
settled decision re-opens a question the operator already answered.
|
|
159
|
+
9. **Print the cost.** Count the surfaces this spec touches, the guards it adds and
|
|
160
|
+
the REQ rows, now versus at stage 2. **Print all three and decide nothing.**
|
|
161
|
+
Growth is information for the operator, whose gate this is; an agent that narrows
|
|
162
|
+
the task on its own judgement breaks *never narrow the task silently*.
|
|
163
|
+
10. **Run the hygiene gate** over what this stage wrote and record its counts below.
|
|
164
|
+
|
|
165
|
+
### The `## Self-review` section — committed, not asserted
|
|
166
|
+
|
|
167
|
+
The checklist above leaves a **committed trace**, last section before the gate.
|
|
168
|
+
Every line carries a **computed number, not a tick**: a number nobody computed is
|
|
169
|
+
visible as such, and a checkbox never is. `planning.md` uses the identical shape, so
|
|
170
|
+
one habit covers both stages.
|
|
171
|
+
|
|
172
|
+
```markdown
|
|
173
|
+
## Self-review
|
|
174
|
+
|
|
175
|
+
- REQ coverage: <n> in brief, <n> covered, difference <set or ∅>
|
|
176
|
+
- Named checks: <n> named, <n> resolve, <n> marked `review`
|
|
177
|
+
- Decisions: checked against <the brief's D-table> and <stage 2's rejected options> — <verdict>
|
|
178
|
+
- Cost: <surfaces>/<guards>/<REQ> now, <…> at stage 2 — <proportionate | grown, and why>
|
|
179
|
+
- Hygiene: <n> checks, <n> findings, <n> open
|
|
180
|
+
- Placeholders: <n> · Ambiguity: <n> found, <n> resolved inline
|
|
181
|
+
```
|
|
146
182
|
|
|
147
183
|
## Locked contracts are decisions — the register, not only the spec
|
|
148
184
|
|
|
@@ -251,7 +251,10 @@ never that the work was skipped quietly.
|
|
|
251
251
|
`SCR-` screens, the CJM stages the feature serves, and the UX
|
|
252
252
|
patterns/principles from super-ux that apply (`best-practices.md`,
|
|
253
253
|
`ux-design-principles.md`, `component-guidelines.md`).
|
|
254
|
-
- **GATE (manual):**
|
|
254
|
+
- **GATE (manual):** the **`## Self-review` section written and committed with
|
|
255
|
+
computed values** — every check the spec names resolving or marked `review`, the
|
|
256
|
+
brief's decisions and stage 2's rejected options read back with no unresolved
|
|
257
|
+
contradiction, and the cost delta printed; spec committed **and** user-reviewed; **every section carries
|
|
255
258
|
`covers: REQ-…` and every REQ appears in at least one section**; for UI tasks
|
|
256
259
|
additionally: the super-ux chain (foundation → flows → screens → scenarios) is
|
|
257
260
|
designed, validated and approved; scenarios validated in `docs/ux/scenarios.md`;
|
|
@@ -270,7 +273,8 @@ never that the work was skipped quietly.
|
|
|
270
273
|
paths, complete code in every step, TDD steps with expected output, DoD each,
|
|
271
274
|
dependency graph + parallel groups, non-overlapping file ownership, and the
|
|
272
275
|
Global Constraints block copied verbatim from the spec.
|
|
273
|
-
- **GATE (auto):**
|
|
276
|
+
- **GATE (auto):** the **`## Self-review` section written with computed values**,
|
|
277
|
+
every command, path and file a DoD names resolving; **set equality — the REQ ids in the brief equal the union of
|
|
274
278
|
`Implements:` across plan tasks.** A non-empty difference fails the gate and is
|
|
275
279
|
reported as the explicit list of dropped requirements; this is the seam where
|
|
276
280
|
scope leaks silently, so the check is mechanical, not a judgement call. Plus:
|