task-pipeline-skill 1.27.0 → 1.29.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 +106 -0
- package/CONTRIBUTING.md +33 -1
- package/README.md +12 -6
- package/SKILL-CARD.md +1 -1
- package/cursor/rules/task-pipeline.mdc +17 -2
- package/package.json +1 -1
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +20 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +50 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +8 -2
- package/plugins/task-pipeline/skills/task-pipeline/templates/carryover.md +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,111 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## v1.29.0 — a sixth axis, and three summaries that each read as complete
|
|
4
|
+
|
|
5
|
+
**Re-derivation** joins the rotation axes in `references/audit.md`: take a number the
|
|
6
|
+
audit already produced and produce it again with a command of a **different shape**,
|
|
7
|
+
then print both. Not a second opinion — a second route. Re-running the same command is
|
|
8
|
+
a spell-check of the first run; only a differently-shaped question can come back
|
|
9
|
+
disagreeing. The exit criterion is **the pair printed**, never "verified", never
|
|
10
|
+
"matches": a re-derivation reported as agreement is a claim about a measurement nobody
|
|
11
|
+
can see.
|
|
12
|
+
|
|
13
|
+
It earns its place from this repository's own record. Four applications, two of which
|
|
14
|
+
refuted something already written down as fact: the version invariant called *four-way*
|
|
15
|
+
over five surfaces (`CONTRIBUTING.md:74`), and a graph shrink read as legitimate
|
|
16
|
+
tightening at 864→839 and as erosion at 839→798 — **same procedure, opposite answers**,
|
|
17
|
+
which is the whole argument for the axis in one line.
|
|
18
|
+
|
|
19
|
+
**The enumeration had already drifted, and nothing could see it.** Measured before
|
|
20
|
+
writing a word of doctrine: `audit.md` defined five axes, the Cursor rule summarised
|
|
21
|
+
four, `README.md` three. Each reads as complete on its own, because a list of three
|
|
22
|
+
orthogonal things is a convincing list of three orthogonal things. The Cursor rule now
|
|
23
|
+
carries all six (it is self-contained by contract and cannot point anywhere); README
|
|
24
|
+
stops enumerating and names the file that defines them — deleting a restatement is how
|
|
25
|
+
every count this repository got wrong has been fixed.
|
|
26
|
+
|
|
27
|
+
A guard now derives the axis keys from `audit.md` **at check time** and requires any
|
|
28
|
+
paragraph naming three or more of them to name all of them. Its first run accused
|
|
29
|
+
`stages.md` of enumerating three axes whose three hits were 595 lines apart and meant
|
|
30
|
+
different things; scoped to the file, the predicate was measuring vocabulary rather
|
|
31
|
+
than enumeration. The unit is the paragraph, and the guard says so in its own comment.
|
|
32
|
+
|
|
33
|
+
**Found by the false positive:** `gates.md` was titled *the two axes* over a file with
|
|
34
|
+
Axis A, B and C, and four surfaces repeated the two. README's prose named two and never
|
|
35
|
+
mentioned degrees of freedom at all — the axis about how much latitude an instruction
|
|
36
|
+
leaves, which is the one that gets skipped. All five sites corrected, and the count is
|
|
37
|
+
now computed from the `## Axis` headings by a claim-registry class, alongside a second
|
|
38
|
+
class for the rotation axes. The two are separated by the qualifier, because *axes* is
|
|
39
|
+
polysemous in this corpus and a guard that conflates them reports drift that is not
|
|
40
|
+
there.
|
|
41
|
+
|
|
42
|
+
**Review round.** Four findings, none from the probes. The guard re-read thirty
|
|
43
|
+
surfaces already cached; the flattening idiom had been hand-rolled three times, each
|
|
44
|
+
commenting on the earlier ones, and is now `_flatten()`; the spec claimed a guard that
|
|
45
|
+
did not exist. And the Cursor rule's **own** Gates section still said *"two axes"* with
|
|
46
|
+
no Axis C — introduced by this PR, fifty lines below an edit it made. Nothing could see
|
|
47
|
+
it: the claim registry's corpus held neither the Cursor rule nor the command file.
|
|
48
|
+
Both are in it now, and the count moved 6 → 7 the moment they were.
|
|
49
|
+
|
|
50
|
+
A second round found the same I/O class at two more call sites. Re-deriving its size
|
|
51
|
+
with a differently-shaped command — an instrumented run rather than a grep of the
|
|
52
|
+
source — put it at **25 reads of `audit.md` and 668 `.md` opens per run**, against an
|
|
53
|
+
estimate of "3+". The two named sites are fixed; the rest is carry-over row 12 with the
|
|
54
|
+
number attached, because a class measured and then left unmentioned is the TODO this
|
|
55
|
+
repository refuses to keep.
|
|
56
|
+
|
|
57
|
+
A third round found the sibling of the idiom the second round found — the
|
|
58
|
+
paragraph-split, hand-rolled at four sites — now `_paragraphs()`, whose docstring says
|
|
59
|
+
what the unit costs. And it found that the new **rotation axes** claim class was
|
|
60
|
+
permanently dormant and had **never been watched failing**: dormant is green by design
|
|
61
|
+
here, which is exactly why a dormant class still needs its plant. It has one now.
|
|
62
|
+
|
|
63
|
+
Guards: 136 → **144**.
|
|
64
|
+
|
|
65
|
+
## v1.28.0
|
|
66
|
+
|
|
67
|
+
### Eight ways to say "I don't know", and no way to count them
|
|
68
|
+
|
|
69
|
+
This bundle has eight vocabularies for declining to claim — `partial`, `unknown`,
|
|
70
|
+
`cannot verify from diff`, `review`, `dormant`, `skip`, `recalled`, `ungated` — spread
|
|
71
|
+
across sixteen reference files. Only one of them, `unknown`, blocks anything. **None of
|
|
72
|
+
them appeared beside a verdict**, and `grep` for a counter returned zero.
|
|
73
|
+
|
|
74
|
+
So `PASS` read as *verified*. It never read as *"green, and here is what nobody claimed
|
|
75
|
+
and what nothing looked at"*, which is the only thing a gate can honestly mean.
|
|
76
|
+
|
|
77
|
+
**The obvious fix is a ratchet, and it is wrong.** A ratchet may only shrink. A count of
|
|
78
|
+
abstentions under that rule puts pressure on exactly one thing: **claiming more**. A run
|
|
79
|
+
that reaches `abstained: 0` is not more careful — it has stopped saying *I don't know*,
|
|
80
|
+
which is the cheapest way to make the number fall. Refusals and wrong answers are
|
|
81
|
+
communicating vessels; squeeze one column and it reappears in the other, silently, because
|
|
82
|
+
a wrong claim looks like a claim.
|
|
83
|
+
|
|
84
|
+
`gates.md` therefore gains a second kind of counted set — a **disclosure**. Printed beside
|
|
85
|
+
the verdict exactly like a ratchet, and carrying the opposite rule: **no floor, no
|
|
86
|
+
direction, and never a target.** A target on an abstention count is an instruction to guess.
|
|
87
|
+
|
|
88
|
+
Two of them, kept apart because they are different facts:
|
|
89
|
+
|
|
90
|
+
| | Counts | How to read it |
|
|
91
|
+
|---|---|---|
|
|
92
|
+
| `abstained` | claims the run **declined to make** — `partial`, `unknown`, `cannot verify from diff` | a **choice**. Rising can mean the work got harder or the run got honest |
|
|
93
|
+
| `unlooked` | checks that **did not look** — `dormant`, `skip` | a **state of the corpus**, not a decision; it falls as the project grows the inputs |
|
|
94
|
+
|
|
95
|
+
`recalled` and `ungated` are deliberately not counted: the first is a property of one claim
|
|
96
|
+
and already lives in the ledger, the second a property of the whole run and said once in
|
|
97
|
+
words. Collapsing all eight into one number would be the false precision this change exists
|
|
98
|
+
to avoid — a figure nobody can act on.
|
|
99
|
+
|
|
100
|
+
Both print beside every worked verdict in the doctrine, both are required by the stage-6 and
|
|
101
|
+
stage-10 gates, and a guard holds the four verdict formats together — one statement on four
|
|
102
|
+
surfaces is this repository's most recurrent defect.
|
|
103
|
+
|
|
104
|
+
**Where this came from.** The programme that produced it started from a review of the
|
|
105
|
+
hallucination-mitigation literature, whose one directly importable idea was that
|
|
106
|
+
*uncertain refusals* belong in the results table **next to** factual errors, because the two
|
|
107
|
+
trade off. Everything else in that literature the doctrine already had. This is the import.
|
|
108
|
+
|
|
3
109
|
## v1.27.0
|
|
4
110
|
|
|
5
111
|
### A retirement trigger whose counter only some work moves
|
package/CONTRIBUTING.md
CHANGED
|
@@ -317,7 +317,39 @@ stall, which is why it is not belt-and-braces. Entry **rotation** ("entries olde
|
|
|
317
317
|
stamps move to the archive") is a different mechanism and is deliberately out of scope.
|
|
318
318
|
*(guard: `states the cold-retirement condition as five run stamp`)*
|
|
319
319
|
|
|
320
|
-
**38. Every
|
|
320
|
+
**38. Every worked GATE verdict prints both disclosures.** `abstained` — what the run
|
|
321
|
+
declined to claim — and `unlooked` — what a check never looked at. Without them a `PASS`
|
|
322
|
+
reads as *verified* rather than as *"green, and here is what nobody claimed"*. They are
|
|
323
|
+
**not** ratchets and the distinction is load-bearing: a ratchet may only shrink, and an
|
|
324
|
+
abstention count under that rule pressures exactly one thing — claiming more. A run
|
|
325
|
+
reporting `abstained: 0` is not more careful; it stopped saying *I don't know*. Refusals
|
|
326
|
+
and wrong answers are communicating vessels, so a disclosure has no floor, no direction,
|
|
327
|
+
and **may never be given a target** — a target on an abstention count is an instruction to
|
|
328
|
+
guess. This repository had eight vocabularies for declining to claim and, until v1.28.0,
|
|
329
|
+
zero counters.
|
|
330
|
+
*(guard: `a worked GATE verdict omits `)*
|
|
331
|
+
|
|
332
|
+
**39. A surface that enumerates the rotation axes enumerates all of them.** The axes
|
|
333
|
+
live once, in `references/audit.md`; the Cursor rule summarises them because it is
|
|
334
|
+
self-contained by contract and can point nowhere. Measured on 2026-08-09: the
|
|
335
|
+
definition held five, the Cursor rule four, README three — and each read as complete,
|
|
336
|
+
because a list of three orthogonal things is a convincing list of three orthogonal
|
|
337
|
+
things. The keys are derived from `audit.md` at check time, never hand-listed, and the
|
|
338
|
+
unit is the **paragraph**: scoped to the file, the first version of this guard reported
|
|
339
|
+
`stages.md` for three hits 595 lines apart that meant three different things. Either
|
|
340
|
+
name every axis or stop enumerating and name the file.
|
|
341
|
+
*(guard: `enumerates the rotation axes but names`)*
|
|
342
|
+
|
|
343
|
+
**40. Counts of "axes" are computed, and the two kinds are kept apart.** `gates.md` is
|
|
344
|
+
built on three of its own (context, enforcement, degrees of freedom) and `audit.md`
|
|
345
|
+
rotates between six; the word is polysemous in this corpus. `gates.md` was titled *"the
|
|
346
|
+
two axes"* over a file with Axis A, B and C, and four surfaces repeated it — including
|
|
347
|
+
README's prose, which never mentioned degrees of freedom at all. Both counts are now
|
|
348
|
+
claim-registry classes, separated by the qualifier, so a guard cannot report drift
|
|
349
|
+
between two things that were never the same list.
|
|
350
|
+
*(guard: `gates.md's own axes`)*
|
|
351
|
+
|
|
352
|
+
**41. Every invariant above names the guard that enforces it, and that guard exists.**This list claims to be *what the validator enforces*; it was eight guards behind when
|
|
321
353
|
an audit measured it. A claim of enforcement is now checked like any other claim.
|
|
322
354
|
*(guard: `whose message does not appear in`)* — and a cited literal must lie inside
|
|
323
355
|
a **single** string in `test/validate.py`: the check reads that file as text, so a
|
package/README.md
CHANGED
|
@@ -131,7 +131,7 @@ until it is installed.
|
|
|
131
131
|
| 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) |
|
|
132
132
|
| 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 |
|
|
133
133
|
| 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 |
|
|
134
|
-
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the
|
|
134
|
+
| 6–10 + any check you write | [`gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) — the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors |
|
|
135
135
|
| 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 |
|
|
136
136
|
|
|
137
137
|
**Ported, not depended on.** Stage 0 is adapted from
|
|
@@ -431,8 +431,9 @@ Three rules keep the audit from becoming another loop:
|
|
|
431
431
|
Measured over seven passes on a production repository, by pass six the audit was
|
|
432
432
|
mostly repairing its own previous pass — while the finding count still looked
|
|
433
433
|
healthy. So count both numbers every pass (new findings vs. self-inflicted ones);
|
|
434
|
-
when the second overtakes the first, **rotate the axis
|
|
435
|
-
|
|
434
|
+
when the second overtakes the first, **rotate the axis**. The axes are orthogonal
|
|
435
|
+
by construction and there is one list of them, in `references/audit.md` — this line
|
|
436
|
+
used to restate three of the five that existed, and read as complete while doing it.
|
|
436
437
|
- **A class that repeats twice becomes a gate, not a note.** Once is an incident;
|
|
437
438
|
twice is a category, and a category belongs in lint or CI where nobody has to
|
|
438
439
|
remember it. The third instance in a ledger is how a mechanical defect becomes
|
|
@@ -482,12 +483,17 @@ teaches everyone on day one that the gate is noise.
|
|
|
482
483
|
|
|
483
484
|
### Gates and hooks — how a rule becomes something that can say no
|
|
484
485
|
|
|
485
|
-
|
|
486
|
+
Three axes, deliberately not conflated. **The stage gate type** (`auto` = verify it
|
|
486
487
|
yourself; `manual` = wait for an explicit go) is about this pipeline. **The
|
|
487
488
|
enforcement mechanism** is a ladder a rule climbs: a doctrine line → a review
|
|
488
489
|
question → a script check (promote here once the class has occurred *twice*) → a CI
|
|
489
490
|
step → a hook. A rule may sit on several rungs; what it may never do is *pretend* to
|
|
490
|
-
be on a higher one.
|
|
491
|
+
be on a higher one. **Degrees of freedom** is the third and the one that gets
|
|
492
|
+
skipped: how much latitude the *instruction* leaves — an open field where many
|
|
493
|
+
routes reach a good answer, a narrow bridge where the guardrails are the wording.
|
|
494
|
+
Over-constraining costs as much as under-constraining and is harder to see, because
|
|
495
|
+
an agent following the letter past the point where the letter fits still reports
|
|
496
|
+
success.
|
|
491
497
|
|
|
492
498
|
The skill ships the anatomy of a gate that cannot lie — non-zero exit on any
|
|
493
499
|
failure, the verdict block last with nothing after it, a scope header saying what it
|
|
@@ -810,7 +816,7 @@ recommendation, so you arm the whole run in one exchange. Detail:
|
|
|
810
816
|
| [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
|
|
811
817
|
| [`references/conventions.md`](plugins/task-pipeline/skills/task-pipeline/references/conventions.md) | how stages 6–10 read the host project's `CLAUDE.md`, and how the documentation regime is detected |
|
|
812
818
|
| [`references/documentation.md`](plugins/task-pipeline/skills/task-pipeline/references/documentation.md) | the doc system: the inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built |
|
|
813
|
-
| [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the
|
|
819
|
+
| [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs |
|
|
814
820
|
| [`references/deploy-targets.md`](plugins/task-pipeline/skills/task-pipeline/references/deploy-targets.md) | stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, the verification trio |
|
|
815
821
|
| [`references/hooks.md`](plugins/task-pipeline/skills/task-pipeline/references/hooks.md) | the `PreToolUse` contract, the fail-open hazard, placement, and the Claude-Code-only limit |
|
|
816
822
|
| [`references/knowledge-graph.md`](plugins/task-pipeline/skills/task-pipeline/references/knowledge-graph.md) | the code graph: install line, stage-0 reach queries, the stage-9 refresh, the graph↔docs divergence check |
|
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.29.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, 5 categories. One recorded run, **self-observed by the author**; **zero blind runs on zero of three models** — the split, and the numbers, live in [`evals/RESULTS.md`](evals/RESULTS.md) and are computed by `evals/run.py` |
|
|
@@ -404,7 +404,11 @@ its own previous pass while the finding count still looked healthy. So:
|
|
|
404
404
|
to end (every error path, every count, every status vocabulary), then — where a
|
|
405
405
|
code graph exists — **the graph against the docs**, the only axis that finds an
|
|
406
406
|
absence without reading for it (a hub no document names, an edge the docs deny, a
|
|
407
|
-
doc naming a module the graph no longer has)
|
|
407
|
+
doc naming a module the graph no longer has), then **false success** (not "is this
|
|
408
|
+
check correct" but "what does this mechanism print when it did not look?"), then
|
|
409
|
+
**re-derivation** — a number the audit already produced, produced again by a
|
|
410
|
+
command of a *different shape*, with **both printed**; agreement asserted instead
|
|
411
|
+
of a pair printed is not a re-derivation.
|
|
408
412
|
- **Audit bottom-up.** A missing artefact at a low rung makes everything above it
|
|
409
413
|
meaningless; top-down you polish a surface for a contract that doesn't exist.
|
|
410
414
|
- **A class that repeats twice becomes a check, not a note.** Once is an incident;
|
|
@@ -453,7 +457,7 @@ you *read*; the matrix names the documents you *owe*. The document nobody read i
|
|
|
453
457
|
exactly the document nobody updated. At stage 9, walk the matrix for every change
|
|
454
458
|
type the run produced, then run the documentation gate and print its ratchet counts.
|
|
455
459
|
|
|
456
|
-
## Gates:
|
|
460
|
+
## Gates: three axes, and how to build one that cannot lie
|
|
457
461
|
|
|
458
462
|
**Axis A — the stage gate type.** `auto` = verify the check yourself and stop on
|
|
459
463
|
fail; `manual` = wait for an explicit operator go. An auto gate never substitutes
|
|
@@ -465,6 +469,17 @@ script check (promote here once the class has occurred **twice**) → CI step
|
|
|
465
469
|
A rule may sit on several rungs; what it may never do is *pretend* to be on a higher
|
|
466
470
|
one — that is the same failure as a gate that prints `FAIL` and exits `0`.
|
|
467
471
|
|
|
472
|
+
**Axis C — degrees of freedom**, and it is the one that gets skipped. Axis B says how
|
|
473
|
+
hard a rule bites; this says how much latitude the *instruction* leaves. **high** —
|
|
474
|
+
prose direction, no prescribed sequence, for steps where many routes reach a good
|
|
475
|
+
answer. **medium** — a named order with room inside each step. **low** — run exactly
|
|
476
|
+
this, in this order, for a step that is fragile, irreversible, or must be identical
|
|
477
|
+
every time. Match the level to how fragile the step is, not to how important it feels:
|
|
478
|
+
an open field versus a narrow bridge. **Over-constraining costs as much as
|
|
479
|
+
under-constraining and is harder to see** — a high-freedom step written as low freedom
|
|
480
|
+
produces an agent that follows the letter past the point where the letter stopped
|
|
481
|
+
fitting, and reports success, because it did what it was told.
|
|
482
|
+
|
|
468
483
|
**Before you run any check:** the base is green (or its known-red baseline is
|
|
469
484
|
recorded); the check has been probed; you have read its scope header and know what
|
|
470
485
|
it does **not** cover; you have read its ratchet floors.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "task-pipeline-skill",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.29.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.29.0",
|
|
6
6
|
"author": {
|
|
7
7
|
"name": "ssheleg",
|
|
8
8
|
"url": "https://x.com/sshlg93"
|
|
@@ -269,7 +269,7 @@ capable available — see `references/model-tiering.md`).
|
|
|
269
269
|
| 7 | Lint + deploy | host lint → deploy per host convention | lint clean + suite green before deploy; deploy needs a go (or the brief's specific standing authorization) | manual |
|
|
270
270
|
| 8 | Post-deploy | tail deploy logs / health-check | clean boot or honest degradation report; **a deployed web target is opened, not curled** — a `200` proves the server answered and says nothing about a 404'd bundle or a console full of errors on load (`chrome-devtools`; absent → call it an HTTP response, which is its honest name) | auto |
|
|
271
271
|
| 9 | Docs + wiki | host module docs/runbook rules → `wiki-update` ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki), recommended) → `/graphify . --update` ([`references/knowledge-graph.md`](references/knowledge-graph.md), recommended) | every stale row of the stage-0 source ledger updated; **the propagation matrix walked for every change type this run produced** — the ledger names what you read, the matrix names what you owe — every settled thing recorded with an id, every answered question resolved, and **the documentation gate green with its ratchet counts printed**; docs synced; wiki synced; **the code graph refreshed where one exists** and checked against the docs (a hub no doc names, a doc naming a node the graph lost); **every number computed rather than restated, every named command or file resolvable** ([`references/learned.md`](references/learned.md)); the carry-over count printed beside the verdict | auto |
|
|
272
|
-
| 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) → [`references/retrospective.md`](references/retrospective.md) (retro: stamp, prune, entry) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off; **every check this close-out leans on — the documentation gate included — has been seen failing once against a planted defect, and its ratchet counts are printed beside the verdict**; **the retrospective written last, and in order — the run stamped with its commit FIRST (the cold-retirement trigger reads that stamp), then the prune with the list at or under its cap and every deletion logged, then the entry; every deletion and every entry carrying its commit, entries older than five stamps rotated into the archive, counts printed** | manual |
|
|
272
|
+
| 10 | **Acceptance** | built in: [`references/audit.md`](references/audit.md) (ladder walk) → [`references/acceptance.md`](references/acceptance.md) (coverage table) → [`references/retrospective.md`](references/retrospective.md) (retro: stamp, prune, entry) | ladder walk ran, its absences became REQ rows; every REQ accounted for with evidence from a check seen failing once; ledger has no unresolved row; **axis rotation recorded** (new findings vs self-inflicted, rule 1 of [`references/learned.md`](references/learned.md)), **every closure verified against the artefact rather than the document describing it**, **each correction swept across its class**, **every deferral a printed ratchet rather than a TODO**; **in a multi-repository project, every repository is clean, pushed and pointed at** (below); operator signs off; **every check this close-out leans on — the documentation gate included — has been seen failing once against a planted defect, and its ratchet counts are printed beside the verdict**; **the retrospective written last, and in order — the run stamped with its commit FIRST (the cold-retirement trigger reads that stamp), then the prune with the list at or under its cap and every deletion logged, then the entry; every deletion and every entry carrying its commit, entries older than five stamps rotated into the archive, counts printed** ; **both disclosures printed beside the verdict** — `abstained` (what the run declined to claim) and `unlooked` (what a check never looked at), neither a ratchet, neither with a floor, neither ever a target ([`references/gates.md`](references/gates.md) → *Disclosures*) | manual |
|
|
273
273
|
|
|
274
274
|
|
|
275
275
|
### Stage 10 in a project of several repositories
|
|
@@ -335,7 +335,7 @@ automation is on — `pipeline.schema.json` is the only contract.
|
|
|
335
335
|
- `references/acceptance.md` — the built-in stage-10 close-out: REQ coverage, evidence, sign-off
|
|
336
336
|
- `references/retrospective.md` — stage 10's last act: the project retro (`docs/superpowers/retro.md`), the three grades of fix, the mandatory prune and its cap of ten
|
|
337
337
|
- `references/documentation.md` — cross-cutting: the doc inventory, registers and ids, SSOT, the Doc Loop, supersede semantics, the propagation matrix, intent vs as-built
|
|
338
|
-
- `references/gates.md` — cross-cutting: the
|
|
338
|
+
- `references/gates.md` — cross-cutting: the three axes, the promotion ladder, gate anatomy, the probe recipe, ratchet floors, where a gate runs
|
|
339
339
|
- `references/deploy-targets.md` — stages 7–8: writing the runbook when there is none, the template, per-platform deploy and log verbs, and the verification trio
|
|
340
340
|
- `references/hooks.md` — agent-time enforcement: the PreToolUse contract, the fail-open hazard, placement, and the Claude-Code-only limit
|
|
341
341
|
- `references/audit.md` — cross-cutting: the L0→L7 ladder and its seams (what was never written), axis rotation, ratchets, proven checks
|
|
@@ -198,6 +198,7 @@ ledger's, so a list that quietly grew back is visible at the moment it happened:
|
|
|
198
198
|
```
|
|
199
199
|
GATE 10 acceptance: PASS — 14/14 REQ verified
|
|
200
200
|
carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
|
|
201
|
+
abstained: 2 (1 partial · 1 cannot-verify) · unlooked: 3 dormant
|
|
201
202
|
```
|
|
202
203
|
|
|
203
204
|
## GATE (manual)
|
|
@@ -222,6 +223,13 @@ All of:
|
|
|
222
223
|
ledger or here) and, for `deferred`, a tracker entry.
|
|
223
224
|
7. **No carry-over row is left `unresolved`** — every one has a home, and the
|
|
224
225
|
ledger's counts are printed with this verdict, not just filed.
|
|
226
|
+
7a. **Both disclosures are printed** ([`gates.md`](gates.md) → *Disclosures*):
|
|
227
|
+
`abstained` — every REQ closing `partial`, every `unknown`, every ⚠️ *cannot verify
|
|
228
|
+
from diff* the controller could not resolve — and `unlooked`, every check that
|
|
229
|
+
reported `dormant` or `skip`. They are **not** ratchets: no floor, no direction, and
|
|
230
|
+
a movement either way wants one sentence. A run reporting `abstained: 0` is claiming
|
|
231
|
+
it knew everything, which is a stronger statement than any run this stage has ever
|
|
232
|
+
seen close honestly.
|
|
225
233
|
8. **Every repository is closed, the parent included** — `git submodule status`
|
|
226
234
|
shows no `+`, and each repo is clean and pushed. A submodule is finished when
|
|
227
235
|
its parent points at it.
|
|
@@ -291,6 +291,25 @@ construction**:
|
|
|
291
291
|
every pass that reads for wrongness. Sweep the change for actions trusted by
|
|
292
292
|
their own reply. Definition and the known shapes: [`gates.md`](gates.md) →
|
|
293
293
|
*False success*.
|
|
294
|
+
6. **Re-derivation** — take a number the audit has already produced and produce it
|
|
295
|
+
again with a command of a **different shape**, then print both. Not a second
|
|
296
|
+
opinion: a second *route*. Re-running the same command is a spell-check of the
|
|
297
|
+
first run; asking a different question that must land on the same number is the
|
|
298
|
+
only version that can come back disagreeing. The exit criterion is **the pair
|
|
299
|
+
printed** — never "verified", never "matches". A re-derivation reported as
|
|
300
|
+
agreement is a claim about a measurement nobody can see.
|
|
301
|
+
|
|
302
|
+
```
|
|
303
|
+
claimed: the version invariant is four-way (CONTRIBUTING.md, prose)
|
|
304
|
+
re-derived: grep -rl '"version"\|^## v' --include='*.json' --include='*.md' . \
|
|
305
|
+
| wc -l -> 5 surfaces
|
|
306
|
+
verdict: REFUTED — the sentence and the corpus disagree; the corpus wins
|
|
307
|
+
```
|
|
308
|
+
|
|
309
|
+
Rotate onto this axis when the reading axes go quiet **and the change carries
|
|
310
|
+
numbers**: counts in prose, thresholds, "N of M" claims, anything a document
|
|
311
|
+
asserts about itself. Its yield is not proportional to effort — it is
|
|
312
|
+
proportional to how long the first number went unchallenged.
|
|
294
313
|
|
|
295
314
|
**The crossover is measurable, so measure it.** Every pass, count two numbers: new
|
|
296
315
|
findings, and findings caused by the previous pass's own fixes. When the second
|
|
@@ -310,6 +329,7 @@ beside the verdict**:
|
|
|
310
329
|
```
|
|
311
330
|
GATE 6 tests: PASS — full suite green (247 tests)
|
|
312
331
|
carry-over: 4 open (was 6) · unresolved: 0 · audit findings deferred: 2
|
|
332
|
+
abstained: 1 (1 cannot-verify) · unlooked: 2 dormant
|
|
313
333
|
```
|
|
314
334
|
|
|
315
335
|
The difference from a TODO is not bookkeeping. A TODO is invisible until somebody
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Gates — the
|
|
1
|
+
# Gates — the three axes, and how to build one that cannot lie
|
|
2
2
|
|
|
3
3
|
**One job: turn a rule into something that can say no.** [`audit.md`](audit.md)
|
|
4
4
|
says a class seen twice *belongs in a script*; this file is where that script comes
|
|
@@ -32,6 +32,7 @@ elsewhere and is not restated here:
|
|
|
32
32
|
- Probing — plant, run, restore
|
|
33
33
|
- The false-positive budget
|
|
34
34
|
- Ratchets
|
|
35
|
+
- Disclosures — counted like a ratchet, and deliberately not monotone
|
|
35
36
|
- Where a gate runs
|
|
36
37
|
- Adding a check to an existing gate
|
|
37
38
|
- Rationalizations
|
|
@@ -300,10 +301,58 @@ A **ratchet** is a named, counted set that may only shrink, printed on every run
|
|
|
300
301
|
|
|
301
302
|
```
|
|
302
303
|
GATE 9 docs: PASS — propagation backlog: 121 (was 162) · unmarked residue: 0
|
|
304
|
+
abstained: 0 · unlooked: 4 (3 dormant · 1 skip — no submodules in this repo)
|
|
303
305
|
```
|
|
304
306
|
|
|
305
307
|
A ratchet nobody prints is a TODO with a better name.
|
|
306
308
|
|
|
309
|
+
## Disclosures — counted like a ratchet, and deliberately not monotone
|
|
310
|
+
|
|
311
|
+
A ratchet may only shrink. **Some numbers must not be**, and printing them under a
|
|
312
|
+
ratchet's discipline inverts the thing they measure.
|
|
313
|
+
|
|
314
|
+
**Abstention is the case that matters.** This bundle has eight vocabularies for declining
|
|
315
|
+
to claim — `partial`, `unknown`, `cannot verify from diff`, `review`, `dormant`, `skip`,
|
|
316
|
+
`recalled`, `ungated` — and until they were counted, none of them appeared beside a
|
|
317
|
+
verdict. So `PASS` read as *verified* rather than as *"green, and here is what nobody
|
|
318
|
+
claimed"*.
|
|
319
|
+
|
|
320
|
+
The obvious fix is a ratchet, and it is wrong. A count of abstentions that may only shrink
|
|
321
|
+
puts pressure on exactly one thing: **claiming more**. A run reaching `abstained: 0` is not
|
|
322
|
+
more careful; it is a run that stopped saying *I don't know*, which is the cheapest way to
|
|
323
|
+
make the number fall. Refusals and wrong answers are communicating vessels — squeeze one
|
|
324
|
+
column and it reappears in the other, silently, because a wrong claim looks like a claim.
|
|
325
|
+
|
|
326
|
+
So a **disclosure** is printed beside the verdict like a ratchet and carries the opposite
|
|
327
|
+
rule: **no floor, no direction, and a movement in either direction wants one sentence.**
|
|
328
|
+
|
|
329
|
+
Two disclosures, kept separate because they are different facts:
|
|
330
|
+
|
|
331
|
+
| Disclosure | Counts | Reading it |
|
|
332
|
+
|---|---|---|
|
|
333
|
+
| `abstained: N` | claims the run **declined to make** — `partial`, `unknown`, `cannot verify from diff` | a *choice*. Rising can mean the work got harder or the run got honest; falling can mean either the reverse |
|
|
334
|
+
| `unlooked: N` | checks that **did not look** — `dormant`, `skip` | a *state of the corpus*, not a decision. It falls as the project grows the inputs those checks need |
|
|
335
|
+
|
|
336
|
+
Three are deliberately **not** counted, and saying which is part of the disclosure:
|
|
337
|
+
|
|
338
|
+
- **`review`** — *no check can decide this* — is an abstention, and it is the one this
|
|
339
|
+
section first listed and then forgot, which is exactly the failure it exists to catch.
|
|
340
|
+
It stays out of `abstained` because it is not a claim the run declined: it is a rule
|
|
341
|
+
that **declined to be mechanical**, recorded once at rung 2 with its reason (→ *Axis B*).
|
|
342
|
+
Counted per run it would report the same standing number every time and say nothing
|
|
343
|
+
about the run.
|
|
344
|
+
- **`recalled`** — a property of one claim, already carried in the ledger beside the
|
|
345
|
+
command that would re-derive it.
|
|
346
|
+
- **`ungated`** — a property of the whole run, said once, in words.
|
|
347
|
+
|
|
348
|
+
A vocabulary that is named and then left out of every bucket is the one that goes
|
|
349
|
+
uncounted forever. So each gets its line, including the one that got missed here.
|
|
350
|
+
|
|
351
|
+
**What makes a disclosure honest rather than decorative** is the same thing that makes a
|
|
352
|
+
ratchet honest: it is *computed*, and it is printed whether or not anyone likes the
|
|
353
|
+
number. What makes it different is that **nobody may set a target for it.** A target on an
|
|
354
|
+
abstention count is an instruction to guess.
|
|
355
|
+
|
|
307
356
|
---
|
|
308
357
|
|
|
309
358
|
## Where a gate runs
|
|
@@ -196,6 +196,7 @@ does ([`audit.md`](audit.md) → *What can't be fixed now becomes a ratchet, nev
|
|
|
196
196
|
```
|
|
197
197
|
GATE 10 acceptance: PASS — 14/14 REQ verified
|
|
198
198
|
carry-over: 0 unresolved · retro: 7 standing (was 9) · retired 3 · added 1
|
|
199
|
+
abstained: 2 · unlooked: 3
|
|
199
200
|
```
|
|
200
201
|
|
|
201
202
|
A pruned list that nobody prints is a list that quietly grows back.
|
|
@@ -330,7 +330,10 @@ never that the work was skipped quietly.
|
|
|
330
330
|
is covered; no `skip`/`xfail` smuggling a red suite past the gate. Never advance
|
|
331
331
|
to deploy on a red or partial run. **The carry-over count is printed beside this
|
|
332
332
|
verdict** — a ratchet nobody prints is a TODO with a better name
|
|
333
|
-
([`audit.md`](audit.md))
|
|
333
|
+
([`audit.md`](audit.md)) — **and so are the two disclosures**, `abstained` and
|
|
334
|
+
`unlooked` ([`gates.md`](gates.md) → *Disclosures*): what the run declined to claim,
|
|
335
|
+
and what a check never looked at. Neither has a floor and neither may be targeted; a
|
|
336
|
+
target on an abstention count is an instruction to guess.
|
|
334
337
|
- **Web front end? Then the surface is checked in a browser, not in the diff.**
|
|
335
338
|
A passing suite proves the code does what its assertions say. It does not prove the
|
|
336
339
|
page rendered — a component can be correct and land under a fixed header, a request
|
|
@@ -513,7 +516,10 @@ never that the work was skipped quietly.
|
|
|
513
516
|
a messy run is the failure the file exists to stop. Stage 0 reads the standing
|
|
514
517
|
instructions in full next time, which is why the cap is not negotiable.
|
|
515
518
|
- **GATE (manual):** the ladder walk ran and its absences became REQ rows before
|
|
516
|
-
the table was written; **
|
|
519
|
+
the table was written; **both disclosures printed beside the verdict** — `abstained` (what the run declined
|
|
520
|
+
to claim) and `unlooked` (what a check never looked at), neither a ratchet, neither
|
|
521
|
+
with a floor, neither ever a target ([`gates.md`](gates.md) → *Disclosures*); **the
|
|
522
|
+
retrospective is written — stamped first, then pruned, then the entry; the
|
|
517
523
|
list at or under its cap, every deletion logged in the archive with its commit,
|
|
518
524
|
entries older than five run stamps rotated into `docs/superpowers/retro/`, the run
|
|
519
525
|
stamped with its commit, every SHA in either file resolvable, and the
|
|
@@ -36,6 +36,7 @@ set that may only shrink, and it is printed beside every gate verdict:**
|
|
|
36
36
|
```
|
|
37
37
|
GATE 6 tests: PASS — full suite green (247 tests)
|
|
38
38
|
carry-over: 4 open (was 6) · unresolved: 0 · audit findings deferred: 2
|
|
39
|
+
abstained: 1 (1 cannot-verify) · unlooked: 2 dormant
|
|
39
40
|
```
|
|
40
41
|
|
|
41
42
|
That one line is the whole mechanism. Without it, `PASS` reads as *verified*; with
|