task-pipeline-skill 1.79.1 → 1.80.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/README.md +4 -3
  3. package/SKILL-CARD.md +1 -1
  4. package/cursor/rules/task-pipeline.mdc +3 -1
  5. package/evals/RESULTS.md +212 -9
  6. package/evals/evidence-docs.evals.json +109 -0
  7. package/evals/project-audit.evals.json +108 -0
  8. package/evals/run.py +47 -19
  9. package/package.json +1 -1
  10. package/plugins/task-pipeline/.claude-plugin/plugin.json +3 -2
  11. package/plugins/task-pipeline/commands/task-pipeline.md +2 -1
  12. package/plugins/task-pipeline/hooks/gate-observer.sh +19 -2
  13. package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +1 -0
  14. package/plugins/task-pipeline/skills/project-audit/SKILL.md +7 -2
  15. package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +49 -56
  16. package/plugins/task-pipeline/skills/task-pipeline/pipeline.example.json +1 -1
  17. package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +1 -1
  18. package/plugins/task-pipeline/skills/task-pipeline/references/adoption.md +15 -4
  19. package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +4 -2
  20. package/plugins/task-pipeline/skills/task-pipeline/references/brainstorm.md +6 -1
  21. package/plugins/task-pipeline/skills/task-pipeline/references/build.md +11 -1
  22. package/plugins/task-pipeline/skills/task-pipeline/references/certification.md +7 -0
  23. package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +33 -2
  24. package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +2 -2
  25. package/plugins/task-pipeline/skills/task-pipeline/references/exposure.md +7 -3
  26. package/plugins/task-pipeline/skills/task-pipeline/references/gates.md +17 -185
  27. package/plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md +13 -0
  28. package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -0
  29. package/plugins/task-pipeline/skills/task-pipeline/references/probing.md +202 -0
  30. package/plugins/task-pipeline/skills/task-pipeline/references/progress.md +8 -4
  31. package/plugins/task-pipeline/skills/task-pipeline/references/spec.md +60 -1
  32. package/plugins/task-pipeline/skills/task-pipeline/references/stages.md +32 -54
  33. package/plugins/task-pipeline/skills/task-pipeline/references/work-graph.md +1 -1
  34. package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +28 -5
  35. package/plugins/task-pipeline/skills/task-pipeline/templates/backlog.md +6 -2
  36. package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,84 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.80.0 — the doctrine pack: one home per rule, and the boundaries said out loud
4
+
5
+ The largest doctrine reconciliation since the corpus was audited whole. The
6
+ wave-2/3 audit read all ~717KB of shipped doctrine against itself and this
7
+ release closes its deferred pack: every contradiction between a short-form
8
+ gate and its long form, every count restated where a list already was the
9
+ count, and the two closure protocols that had no boundary sentence between
10
+ them.
11
+
12
+ **Two closure protocols, one boundary.** A work-graph node closes through the
13
+ three blind tiers and `graph.py certify` (ceiling 3); a prose-plan task closes
14
+ through `build.md` §4.4's single reviewer (five-round cap). Both were true and
15
+ nothing said which applied — a run could pick whichever was cheaper at the
16
+ moment of closing. The boundary sentence now lives in `SKILL.md`'s routing
17
+ row, `certification.md` and `build.md`: the artifact the queue is decides.
18
+
19
+ **The COPY/VISUAL track doctrine moved into `spec.md` whole** — its one home —
20
+ and `stages.md`'s stage 3 keeps a routed summary; the example config's stage-3
21
+ check now demands the tracks and their convergence record. `references/
22
+ probing.md` is new: the four probe-authoring sections extracted from
23
+ `gates.md` (plant/run/restore, how a probe rots, the neighbour probe, the
24
+ landed-mutation rule), routed from the gate doctrine they prove; the guards
25
+ and plants that read those sections moved with them, and the bundle's
26
+ reference-file counts were re-derived to 38 by the registry that refuses a
27
+ stale one.
28
+
29
+ **The `judgment` gate type reaches every surface that taught `auto`/`manual`**
30
+ — SKILL.md (three places), stages.md, the command, the Cursor rule, README,
31
+ plugin.json — and a new cross-surface guard compares the schema's enum against
32
+ the sentence that teaches it, so the next type cannot sit seven releases in
33
+ the schema alone. The browser gate cells say when the look binds and what the
34
+ weaker claim is; brainstorm's GATE names the queue-artifact and loop-arming
35
+ criteria; the loop arms where `run.loop.arm` says, not unconditionally at
36
+ preflight; stage-0 seeding covers the three gate scripts stages 5–10 run;
37
+ the template board's State vocabulary admits `parked`/`waived`; project-audit
38
+ prices with the board header's declared formula and never effort, and its
39
+ disambiguation table gains the fifth audit (`/seo-aeo-audit`). Four domain
40
+ companions (sheleg-dev, agent-stack, telegram-dev, seo-aeo-audit) enter the
41
+ matrix, the preflight block and the stages they bind — recommended, never a
42
+ gate. `model-tiering.md` gains the per-generation stress-test rule and the
43
+ judgment gate the rubric-steering note, both with dated sources.
44
+
45
+ **Mechanics: the PR gate now runs what `npm test` documents.** `graph_test.py`
46
+ and `project_audit_test.py` reached CI only at tag time; a PR breaking
47
+ `graph.py` merged green. The blind rule covers every prose field of a tier
48
+ report — a cross-tier citation hiding in `scope` or a finding's `what`/`fix`
49
+ is refused, fixtured, and mutation-proven (17/17 noticed, control 22).
50
+ `gate-observer.sh` reads the documented `tool_response` payload with
51
+ `tool_output` as fallback — the exit-code branch had been dead on the
52
+ documented shape — with fixtures on both shapes, each watched red against the
53
+ reverted hook. The upstream strict validation is its own CI job, so an npm
54
+ outage and a house failure stop masking each other.
55
+
56
+ **Ledgers: the board re-ranks on real ages.** Every open row's Age and Prio
57
+ re-derived against its Source date — rows filed 08-17/08-20 still said Age 0
58
+ on 08-29 under a header claiming re-derivation. The verification ledger's
59
+ `Shipped state` header is gated against `package.json` (it had sat six
60
+ releases stale), the two 2026-08-22 run stamps stop claiming retro entries
61
+ that do not exist, the two rows frozen at `unreleased` gain superseding rows
62
+ naming v1.72.0, and v1.76.0's absence from the ledger is stated beside the
63
+ 08-20 note. Five board rows filed from the harness-engineering articles
64
+ (B-114…B-117) and from this release's own probes (B-118).
65
+
66
+ **Evals: three blind runs, one per model.** evidence-docs and project-audit
67
+ gain behavioural suites with near-miss negatives («аудит модуля» one word
68
+ from «аудит проекта»); `evals/run.py` discovers every suite instead of the
69
+ one filename it shipped pinned to; and 147 fresh-subagent probes (49 queries
70
+ × haiku/sonnet/opus) produced the first dated blind rows in both RESULTS
71
+ files — opus 42/42, sonnet 40/42, haiku 39/42, with haiku's three misses
72
+ sharing one shape that is now B-118. Method and limits stated in the ledgers,
73
+ INSTR cases recorded as not reproducible rather than guessed.
74
+
75
+ `compatibility` frontmatter on task-pipeline and project-audit; a 3-line
76
+ Degradation block in SKILL.md paid for by the model blockquote it displaced;
77
+ `$schema` in both manifests.
78
+
79
+ Guards: 417 → **419** — the gate-type vocabulary plant and the stale
80
+ shipped-state-header plant, both watched red locally before shipping.
81
+
3
82
  ## v1.79.1 — the probe that a healthy release disarmed
4
83
 
5
84
  The first round of `v1.79.0` failed in the release job on the
package/README.md CHANGED
@@ -587,7 +587,7 @@ must say so.
587
587
  ### Held to Anthropic's own Skill authoring guidance
588
588
 
589
589
  Audited against the four Agent Skills pages. Most of it already held — `name`
590
- 13/64 chars, `description` inside 1024, `SKILL.md` 334/500 lines, all 37 references
590
+ 13/64 chars, `description` inside 1024, `SKILL.md` 334/500 lines, all 38 references
591
591
  linked **directly** from `SKILL.md`, 436 KB against a 30 MB ceiling. What did not,
592
592
  now does:
593
593
 
@@ -787,7 +787,7 @@ Stages 0→10 above are the plugin's **example** flow. It is a machine-readable
787
787
  written against a universal contract
788
788
  ([`pipeline.schema.json`](plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json)):
789
789
  copy the example to `pipeline.json` in your repo and rewrite it with your own stages
790
- (any count), your own `skills[]`, and your own `auto`/`manual` gate types. The
790
+ (any count), your own `skills[]`, and your own `auto`/`judgment`/`manual` gate types. The
791
791
  framework bakes in no fixed stage count and no opinion on which gates are manual.
792
792
 
793
793
  ```jsonc
@@ -932,7 +932,8 @@ recommendation, so you arm the whole run in one exchange. Detail:
932
932
  | [`references/artifacts.md`](plugins/task-pipeline/skills/task-pipeline/references/artifacts.md) | the canonical document layout each stage writes to |
933
933
  | [`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 |
934
934
  | [`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 |
935
- | [`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 |
935
+ | [`references/gates.md`](plugins/task-pipeline/skills/task-pipeline/references/gates.md) | the three axes, the promotion ladder, gate anatomy, ratchet floors, where a gate runs |
936
+ | [`references/probing.md`](plugins/task-pipeline/skills/task-pipeline/references/probing.md) | the probe recipe — plant, run, restore; how a probe rots; the neighbour probe; the landed-mutation rule |
936
937
  | [`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 |
937
938
  | [`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 |
938
939
  | [`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.79.1 |
15
+ | **Version** | 1.80.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, and **one of two browser channels** — `playwright` (CLI or MCP) or `chrome-devtools` (MCP); either satisfies the browser step and neither is required. 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` |
@@ -499,7 +499,9 @@ type the run produced, then run the documentation gate and print its ratchet cou
499
499
  ## Gates: three axes, and how to build one that cannot lie
500
500
 
501
501
  **Axis A — the stage gate type.** `auto` = verify the check yourself and stop on
502
- fail; `manual` = wait for an explicit operator go. An auto gate never substitutes
502
+ fail; `judgment` = a named judge rules where no deterministic check exists, and the
503
+ ruling is recorded as judgement, never as a measurement; `manual` = wait for an
504
+ explicit operator go. Neither of the first two ever substitutes
503
505
  for a required manual approval.
504
506
 
505
507
  **Axis B — where the rule is actually enforced**, and a rule climbs this ladder
package/evals/RESULTS.md CHANGED
@@ -1,9 +1,10 @@
1
1
  # Evaluation results — task-pipeline
2
2
 
3
- **Status: the suite is authored. One run is recorded and it was self-observed by the
4
- author; no blind run has been made on any model.** Recorded this way rather than left
5
- blank, because an empty results file and an unrun suite look identical, and this
6
- repository's own doctrine calls that the failure — a skip is not a pass.
3
+ **Status: three suites authored (task-pipeline, evidence-docs, project-audit);
4
+ one self-observed run and, since 2026-08-31, three blind trigger runs one per
5
+ model (haiku, sonnet, opus).** The instruction-following cases remain unexecuted
6
+ and say so per run, because they need a full interactive session — a skip is not
7
+ a pass, and a guessed verdict is worse than a vacant row.
7
8
 
8
9
  **The numbers below are computed, not asserted.** `python3 evals/run.py` counts the
9
10
  suite and the dated run headings in this file. A value typed here that disagrees with
@@ -39,11 +40,11 @@ or it belongs in a check.
39
40
 
40
41
  | Metric | Value | Computed by | As of |
41
42
  |---|---|---|---|
42
- | Evals authored | 15 | `python3 evals/run.py` → `suite: N evals` | 2026-08-08 |
43
- | Categories covered | 5 of 5 | the suite's own `category` fields | 2026-08-08 |
44
- | Dated runs recorded | **1** | `python3 evals/run.py` → `recorded runs: N` | 2026-08-08 |
45
- | …of those, **blind** | **0** | run headings not marked `self-observed` | 2026-08-08 |
46
- | Models exercised blind | **0 of 3** | distinct models across blind runs | 2026-08-08 |
43
+ | Evals authored | 46 (three suites: task-pipeline 28, evidence-docs 9, project-audit 9) | `python3 evals/run.py` → `suite: N evals` | 2026-08-31 |
44
+ | Categories covered | 5 of 5, per suite | the suite's own `category` fields | 2026-08-31 |
45
+ | Dated runs recorded | **4** | `python3 evals/run.py` → `recorded runs: N` | 2026-08-31 |
46
+ | …of those, **blind** | **3** | run headings not marked `self-observed` | 2026-08-31 |
47
+ | Models exercised blind | **3 of 3** | distinct models across blind runs | 2026-08-31 |
47
48
 
48
49
  **The last three rows are the honest state of this skill's behavioural evidence**, and
49
50
  the split matters more than the total: a run the author watched, knowing the expected
@@ -67,6 +68,208 @@ green structural suite is never read as "the skill is known to work".
67
68
  Newest first. Each entry states the model, the task, and how the evidence was
68
69
  obtained — a self-observed run and a blind one are not the same claim.
69
70
 
71
+ **Method (wave-3 subagent protocol, and its limits).** One FRESH general-purpose
72
+ subagent per query per model, launched from a Claude Code harness with the model
73
+ pinned. Each received: the query verbatim; the family's 28 skill
74
+ names-with-descriptions (built once from the members' `SKILL.md` frontmatters,
75
+ including evidence-docs and project-audit from this plugin); the instruction to
76
+ answer with one skill name from that list, or `none`. Blind: no expected answer
77
+ was named. Limits, stated rather than implied: the harness's OWN installed-skill
78
+ inventory is also visible to a subagent's system prompt — a real coexistence
79
+ environment rather than a cleanroom, and four early sonnet probes answered from
80
+ it without opening the provided list (one chose `build-dashboard`, a skill
81
+ outside the family; recorded as the miss it is, and the remaining prompts were
82
+ tightened to "choose only from that file's list"). A trigger `pass` means the
83
+ model NAMED the skill; it does not prove a full session loaded and obeyed the
84
+ doctrine — the INSTR cases need exactly that and are recorded as **not
85
+ reproducible from this harness**, not guessed.
86
+
87
+ ## 2026-08-31 · haiku · blind trigger probes, subagent protocol
88
+
89
+ **39 of 42 scored cases passed** across the three suites' trigger-shaped
90
+ categories (should_trigger, should_not_trigger; ambiguous and coexistence
91
+ recorded unscored). Three misses, one shape: checkup/setup/prod-check phrasings («что у нас накопилось непроверенного?», «проверь документацию проекта…», «проверь, всё ли живо в проде…») routed to `project-audit` instead of task-pipeline's own checkup/setup modes — the two skills now share the "what is unverified/true" ground and the cheaper model takes the newer, narrower description.
92
+
93
+ task-pipeline suite:
94
+
95
+ | id | verdict | what happened |
96
+ |---|---|---|
97
+ | TRIG-01 | pass | named `task-pipeline` |
98
+ | TRIG-02 | pass | named `task-pipeline` |
99
+ | TRIG-03 | pass | named `task-pipeline` |
100
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
101
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
102
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
103
+ | AMB-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
104
+ | AMB-02 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
105
+ | COEX-01 | observed | answered `ux-flows` (ambiguous/coexistence — recorded, not scored) |
106
+ | TRIG-04 | pass | named `task-pipeline` |
107
+ | NOTRIG-04 | pass | answered `none` — did not route to the excluded skill |
108
+ | TRIG-05 | fail | answered `project-audit` |
109
+ | TRIG-06 | fail | answered `project-audit` |
110
+ | NOTRIG-05 | pass | answered `none` — did not route to the excluded skill |
111
+ | TRIG-07 | pass | named `task-pipeline` |
112
+ | TRIG-08 | pass | named `task-pipeline` |
113
+ | TRIG-09 | fail | answered `project-audit` |
114
+ | TRIG-10 | pass | named `task-pipeline` |
115
+ | NOTRIG-06 | pass | answered `seo-aeo-audit` — did not route to the excluded skill |
116
+ | NOTRIG-07 | pass | answered `ux-audit` — did not route to the excluded skill |
117
+ | NOTRIG-08 | pass | answered `make-skill` — did not route to the excluded skill |
118
+
119
+ evidence-docs suite:
120
+
121
+ | id | verdict | what happened |
122
+ |---|---|---|
123
+ | TRIG-01 | pass | named `evidence-docs` |
124
+ | TRIG-02 | pass | named `evidence-docs` |
125
+ | TRIG-03 | pass | named `evidence-docs` |
126
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
127
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
128
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
129
+ | AMB-01 | observed | answered `evidence-docs` (ambiguous/coexistence — recorded, not scored) |
130
+ | COEX-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
131
+
132
+ project-audit suite:
133
+
134
+ | id | verdict | what happened |
135
+ |---|---|---|
136
+ | TRIG-01 | pass | named `project-audit` |
137
+ | TRIG-02 | pass | named `project-audit` |
138
+ | TRIG-03 | pass | named `project-audit` |
139
+ | NOTRIG-01 | pass | answered `task-pipeline` — did not route to the excluded skill |
140
+ | NOTRIG-02 | pass | answered `task-pipeline` — did not route to the excluded skill |
141
+ | NOTRIG-03 | pass | answered `make-skill` — did not route to the excluded skill |
142
+ | AMB-01 | observed | answered `project-audit` (ambiguous/coexistence — recorded, not scored) |
143
+ | COEX-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
144
+
145
+ INSTR-01…07 (task-pipeline) and INSTR-01 (evidence-docs, project-audit): **not
146
+ reproducible from this harness** — each needs a full interactive pipeline run,
147
+ and a guessed verdict would be the exact substitution this file exists to refuse.
148
+
149
+ ## 2026-08-31 · sonnet · blind trigger probes, subagent protocol
150
+
151
+ **40 of 42 scored cases passed** across the three suites' trigger-shaped
152
+ categories (should_trigger, should_not_trigger; ambiguous and coexistence
153
+ recorded unscored). Two misses: TRIG-03 (`build a support-agent dashboard…`) answered `build-dashboard` — a skill OUTSIDE the offered list, from the harness's own inventory, before the choose-only-from-list tightening; TRIG-10 («посмотри PR #24 и скажи, что там не так») answered `none` — the PR-review findings class did not reach sonnet from the description alone.
154
+
155
+ task-pipeline suite:
156
+
157
+ | id | verdict | what happened |
158
+ |---|---|---|
159
+ | TRIG-01 | pass | named `task-pipeline:task-pipeline` |
160
+ | TRIG-02 | pass | named `task-pipeline` |
161
+ | TRIG-03 | fail | answered `build-dashboard` |
162
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
163
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
164
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
165
+ | AMB-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
166
+ | AMB-02 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
167
+ | COEX-01 | observed | answered `ux-flows` (ambiguous/coexistence — recorded, not scored) |
168
+ | TRIG-04 | pass | named `task-pipeline` |
169
+ | NOTRIG-04 | pass | answered `none` — did not route to the excluded skill |
170
+ | TRIG-05 | pass | named `task-pipeline` |
171
+ | TRIG-06 | pass | named `task-pipeline` |
172
+ | NOTRIG-05 | pass | answered `none` — did not route to the excluded skill |
173
+ | TRIG-07 | pass | named `task-pipeline` |
174
+ | TRIG-08 | pass | named `task-pipeline` |
175
+ | TRIG-09 | pass | named `task-pipeline` |
176
+ | TRIG-10 | fail | answered `none` |
177
+ | NOTRIG-06 | pass | answered `none` — did not route to the excluded skill |
178
+ | NOTRIG-07 | pass | answered `super-ux:ux-audit` — did not route to the excluded skill |
179
+ | NOTRIG-08 | pass | answered `make-skill:skill-audit` — did not route to the excluded skill |
180
+
181
+ evidence-docs suite:
182
+
183
+ | id | verdict | what happened |
184
+ |---|---|---|
185
+ | TRIG-01 | pass | named `evidence-docs` |
186
+ | TRIG-02 | pass | named `evidence-docs` |
187
+ | TRIG-03 | pass | named `evidence-docs` |
188
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
189
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
190
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
191
+ | AMB-01 | observed | answered `evidence-docs` (ambiguous/coexistence — recorded, not scored) |
192
+ | COEX-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
193
+
194
+ project-audit suite:
195
+
196
+ | id | verdict | what happened |
197
+ |---|---|---|
198
+ | TRIG-01 | pass | named `task-pipeline:project-audit` |
199
+ | TRIG-02 | pass | named `task-pipeline:project-audit` |
200
+ | TRIG-03 | pass | named `project-audit` |
201
+ | NOTRIG-01 | pass | answered `task-pipeline` — did not route to the excluded skill |
202
+ | NOTRIG-02 | pass | answered `task-pipeline` — did not route to the excluded skill |
203
+ | NOTRIG-03 | pass | answered `make-skill:skill-audit` — did not route to the excluded skill |
204
+ | AMB-01 | observed | answered `task-pipeline:project-audit` (ambiguous/coexistence — recorded, not scored) |
205
+ | COEX-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
206
+
207
+ INSTR-01…07 (task-pipeline) and INSTR-01 (evidence-docs, project-audit): **not
208
+ reproducible from this harness** — each needs a full interactive pipeline run,
209
+ and a guessed verdict would be the exact substitution this file exists to refuse.
210
+
211
+ ## 2026-08-31 · opus · blind trigger probes, subagent protocol
212
+
213
+ **42 of 42 scored cases passed** across the three suites' trigger-shaped
214
+ categories (should_trigger, should_not_trigger; ambiguous and coexistence
215
+ recorded unscored). No misses. All four audit near-misses routed away correctly (module audit → task-pipeline, skill standard → make-skill, landing-page traffic → seo-aeo-audit, UX conformance → ux-audit).
216
+
217
+ task-pipeline suite:
218
+
219
+ | id | verdict | what happened |
220
+ |---|---|---|
221
+ | TRIG-01 | pass | named `task-pipeline` |
222
+ | TRIG-02 | pass | named `task-pipeline` |
223
+ | TRIG-03 | pass | named `task-pipeline` |
224
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
225
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
226
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
227
+ | AMB-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
228
+ | AMB-02 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
229
+ | COEX-01 | observed | answered `ux-flows` (ambiguous/coexistence — recorded, not scored) |
230
+ | TRIG-04 | pass | named `task-pipeline` |
231
+ | NOTRIG-04 | pass | answered `none` — did not route to the excluded skill |
232
+ | TRIG-05 | pass | named `task-pipeline` |
233
+ | TRIG-06 | pass | named `task-pipeline` |
234
+ | NOTRIG-05 | pass | answered `none` — did not route to the excluded skill |
235
+ | TRIG-07 | pass | named `task-pipeline` |
236
+ | TRIG-08 | pass | named `task-pipeline` |
237
+ | TRIG-09 | pass | named `task-pipeline` |
238
+ | TRIG-10 | pass | named `task-pipeline` |
239
+ | NOTRIG-06 | pass | answered `seo-aeo-audit` — did not route to the excluded skill |
240
+ | NOTRIG-07 | pass | answered `ux-audit` — did not route to the excluded skill |
241
+ | NOTRIG-08 | pass | answered `make-skill` — did not route to the excluded skill |
242
+
243
+ evidence-docs suite:
244
+
245
+ | id | verdict | what happened |
246
+ |---|---|---|
247
+ | TRIG-01 | pass | named `evidence-docs` |
248
+ | TRIG-02 | pass | named `evidence-docs` |
249
+ | TRIG-03 | pass | named `evidence-docs` |
250
+ | NOTRIG-01 | pass | answered `none` — did not route to the excluded skill |
251
+ | NOTRIG-02 | pass | answered `none` — did not route to the excluded skill |
252
+ | NOTRIG-03 | pass | answered `none` — did not route to the excluded skill |
253
+ | AMB-01 | observed | answered `evidence-docs` (ambiguous/coexistence — recorded, not scored) |
254
+ | COEX-01 | observed | answered `task-pipeline` (ambiguous/coexistence — recorded, not scored) |
255
+
256
+ project-audit suite:
257
+
258
+ | id | verdict | what happened |
259
+ |---|---|---|
260
+ | TRIG-01 | pass | named `project-audit` |
261
+ | TRIG-02 | pass | named `project-audit` |
262
+ | TRIG-03 | pass | named `project-audit` |
263
+ | NOTRIG-01 | pass | answered `task-pipeline` — did not route to the excluded skill |
264
+ | NOTRIG-02 | pass | answered `task-pipeline` — did not route to the excluded skill |
265
+ | NOTRIG-03 | pass | answered `make-skill` — did not route to the excluded skill |
266
+ | AMB-01 | observed | answered `project-audit` (ambiguous/coexistence — recorded, not scored) |
267
+ | COEX-01 | observed | answered `project-audit` (ambiguous/coexistence — recorded, not scored) |
268
+
269
+ INSTR-01…07 (task-pipeline) and INSTR-01 (evidence-docs, project-audit): **not
270
+ reproducible from this harness** — each needs a full interactive pipeline run,
271
+ and a guessed verdict would be the exact substitution this file exists to refuse.
272
+
70
273
  ## 2026-08-03 · opus · self-observed, not a blind run
71
274
 
72
275
  **Scope of this evidence.** The author ran the skill on a real task
@@ -0,0 +1,109 @@
1
+ {
2
+ "_note": "Behavioural evaluations for the evidence-docs skill — the ten-canon navigator that ships in this plugin. Same format and dimensions as task-pipeline.evals.json; the negatives are NEAR MISSES on purpose (a commit message and a code comment are the excluded surfaces closest to the trigger ground), because a control that shares no words with the trigger proves nothing about the boundary.",
3
+ "skill": "evidence-docs",
4
+ "models": ["haiku", "sonnet", "opus"],
5
+ "evals": [
6
+ {
7
+ "id": "TRIG-01",
8
+ "category": "should_trigger",
9
+ "skills": ["evidence-docs"],
10
+ "query": "запиши решение: внутренние сервисы переходят с REST на gRPC, обратной дороги нет",
11
+ "expected_behavior": [
12
+ "Invokes the evidence-docs skill (or its routed documentation doctrine), not a freehand note",
13
+ "The decision lands in the project's one decision register, append-only, with an id",
14
+ "The record carries its evidence and its date rather than only the conclusion"
15
+ ],
16
+ "why": "«записать решение» is a declared Russian trigger; the failure it guards is a decision written into chat instead of the register."
17
+ },
18
+ {
19
+ "id": "TRIG-02",
20
+ "category": "should_trigger",
21
+ "skills": ["evidence-docs"],
22
+ "query": "Write the acceptance report for the export migration — and make sure every claim in it is actually backed",
23
+ "expected_behavior": [
24
+ "Invokes the evidence-docs skill for the canon layer (a claim carries its address; numbers computed, never restated)",
25
+ "Each verified claim names the check that was seen deciding it; unverified ones are marked as such rather than dropped"
26
+ ],
27
+ "why": "An acceptance report is the archetypal will-be-read-as-true document; the canons are its standard."
28
+ },
29
+ {
30
+ "id": "TRIG-03",
31
+ "category": "should_trigger",
32
+ "skills": ["evidence-docs"],
33
+ "query": "Is this verified? The README claims the importer handles 10k rows per second.",
34
+ "expected_behavior": [
35
+ "Invokes the evidence-docs skill — the question is whether a claim is documentation or an assertion",
36
+ "Answers with the claim's evidence condition: what observable signal would license the number, and whether one exists",
37
+ "Does not re-assert the number without an address"
38
+ ],
39
+ "why": "'is this verified' is a declared trigger; the failure is grading the claim by plausibility instead of by evidence."
40
+ },
41
+ {
42
+ "id": "NOTRIG-01",
43
+ "category": "should_not_trigger",
44
+ "skills": ["evidence-docs"],
45
+ "query": "Write a commit message for this diff — it renames the exporter and fixes the retry backoff",
46
+ "expected_behavior": [
47
+ "Writes the commit message directly",
48
+ "Does NOT invoke the evidence-docs skill or demand file:line receipts for a commit message"
49
+ ],
50
+ "why": "Near miss by design: a commit message describes a change truthfully but is an excluded surface — demanding canons here teaches routing around them."
51
+ },
52
+ {
53
+ "id": "NOTRIG-02",
54
+ "category": "should_not_trigger",
55
+ "skills": ["evidence-docs"],
56
+ "query": "добавь комментарий в код, почему в этом месте ретрай с экспоненциальной задержкой",
57
+ "expected_behavior": [
58
+ "Writes the code comment directly",
59
+ "Does NOT invoke the evidence-docs skill — a code comment is an excluded surface by the skill's own Not-for list"
60
+ ],
61
+ "why": "Near miss: 'почему' invites an evidence reflex, and the boundary says a code comment is not documentation-read-as-true."
62
+ },
63
+ {
64
+ "id": "NOTRIG-03",
65
+ "category": "should_not_trigger",
66
+ "skills": ["evidence-docs"],
67
+ "query": "Draft some rough notes on how we might approach caching — just thinking out loud, no docs",
68
+ "expected_behavior": [
69
+ "Produces the draft directly",
70
+ "Does NOT apply the canons — 'без доков'/'no docs' is the declared opt-out, and a draft is outside the boundary anyway"
71
+ ],
72
+ "why": "The refusal phrase plus the draft exclusion; the failure is refusing exploratory writing for want of receipts."
73
+ },
74
+ {
75
+ "id": "AMB-01",
76
+ "category": "ambiguous",
77
+ "skills": ["evidence-docs"],
78
+ "query": "Update the README",
79
+ "expected_behavior": [
80
+ "Names the route: a developer README section is direct work, while a claim a reader will take as true (a benchmark, a guarantee) passes the canons",
81
+ "Does not silently pick one reading of the request"
82
+ ],
83
+ "why": "A README holds both excluded and covered content; the observable is naming the split, not the choice itself."
84
+ },
85
+ {
86
+ "id": "COEX-01",
87
+ "category": "coexistence",
88
+ "skills": ["evidence-docs", "task-pipeline"],
89
+ "query": "прогони миграцию через конвейер и запиши архитектурное решение в реестр",
90
+ "expected_behavior": [
91
+ "task-pipeline carries the change; the decision record goes through the documentation doctrine evidence-docs routes",
92
+ "One register entry with an id — not a second decision home invented for the run"
93
+ ],
94
+ "why": "The two skills share a plugin and a boundary: the pipeline owns delivery, evidence-docs owns what is written as true."
95
+ },
96
+ {
97
+ "id": "INSTR-01",
98
+ "category": "instruction_following",
99
+ "skills": ["evidence-docs"],
100
+ "query": "Record the decision that we drop Python 3.8 support, and note it was discussed in Slack",
101
+ "expected_behavior": [
102
+ "The record is appended to the existing register, never a new file beside it",
103
+ "A correction or later reversal would be appended, not edited over",
104
+ "The Slack discussion is cited as the decision's source, not pasted as its evidence"
105
+ ],
106
+ "why": "Append-only and one-home are the canons most often broken by a helpful rewrite."
107
+ }
108
+ ]
109
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "_note": "Behavioural evaluations for the project-audit skill. Same format and dimensions as task-pipeline.evals.json. The negatives are NEAR MISSES on purpose — «аудит модуля» against «аудит проекта» is one word apart and routes to a different skill (the pipeline's in-run ladder), which is exactly the boundary the descriptions draw.",
3
+ "skill": "project-audit",
4
+ "models": ["haiku", "sonnet", "opus"],
5
+ "evals": [
6
+ {
7
+ "id": "TRIG-01",
8
+ "category": "should_trigger",
9
+ "skills": ["project-audit"],
10
+ "query": "сделай аудит проекта — что реально готово, что наполовину, что сломано?",
11
+ "expected_behavior": [
12
+ "Invokes the project-audit skill, not the pipeline's in-run audit ladder",
13
+ "Starts with discovery (what the project IS) before choosing probes",
14
+ "Leaves the HTML report and the JSON sidecar; proposes board rows and commits nothing"
15
+ ],
16
+ "why": "«аудит проекта» is the declared trigger; the failure is running a fixed checklist or treating it as a change-task."
17
+ },
18
+ {
19
+ "id": "TRIG-02",
20
+ "category": "should_trigger",
21
+ "skills": ["project-audit"],
22
+ "query": "What is actually true of this project right now — what is finished, what is half-built, what has nobody looked at?",
23
+ "expected_behavior": [
24
+ "Invokes the project-audit skill — the subject is the whole project, not one change",
25
+ "Reads production evidence (published artefact vs source, CI history, telemetry presence), not only the working tree"
26
+ ],
27
+ "why": "The skill's own opening sentence as a user query; the failure is answering from the README."
28
+ },
29
+ {
30
+ "id": "TRIG-03",
31
+ "category": "should_trigger",
32
+ "skills": ["project-audit"],
33
+ "query": "Run a project health check on this repository and leave me the report",
34
+ "expected_behavior": [
35
+ "Invokes the project-audit skill",
36
+ "Blind probes are rendered as their own section with reasons — a probe that could not look is not a probe that found nothing"
37
+ ],
38
+ "why": "'project health check' is a declared trigger; the blind verdict is the design worth probing for."
39
+ },
40
+ {
41
+ "id": "NOTRIG-01",
42
+ "category": "should_not_trigger",
43
+ "skills": ["project-audit"],
44
+ "query": "сделай аудит модуля оплат",
45
+ "expected_behavior": [
46
+ "Routes to the pipeline's audit path (a finding that lands in the repository), not to project-audit",
47
+ "Does NOT start a cold whole-project discovery for a one-module question"
48
+ ],
49
+ "why": "Near miss by one word: «аудит проекта» is this skill, «аудит модуля» is one deliverable inside a run — the pipeline's own ladder."
50
+ },
51
+ {
52
+ "id": "NOTRIG-02",
53
+ "category": "should_not_trigger",
54
+ "skills": ["project-audit"],
55
+ "query": "Review PR #24 and tell me what is wrong with it",
56
+ "expected_behavior": [
57
+ "Routes to the pipeline's PR-review findings path or answers directly",
58
+ "Does NOT invoke project-audit — reviewing a diff is its declared Not-for"
59
+ ],
60
+ "why": "A diff has a change as its subject; project-audit's subject is the project."
61
+ },
62
+ {
63
+ "id": "NOTRIG-03",
64
+ "category": "should_not_trigger",
65
+ "skills": ["project-audit"],
66
+ "query": "проверь, соответствует ли этот скил стандарту Agent Skills",
67
+ "expected_behavior": [
68
+ "Routes to make-skill's audit (/skill-audit), not to project-audit",
69
+ "Does NOT run whole-project probes over a skill-construction question"
70
+ ],
71
+ "why": "The disambiguation table's own row: a skill's construction belongs to make-skill even when the word 'audit' appears."
72
+ },
73
+ {
74
+ "id": "AMB-01",
75
+ "category": "ambiguous",
76
+ "skills": ["project-audit"],
77
+ "query": "проверь проект",
78
+ "expected_behavior": [
79
+ "Names the route it is taking in one line — whole-project diagnosis (project-audit) versus a specific check the operator may mean",
80
+ "Does not silently start either the full audit or a random spot-check"
81
+ ],
82
+ "why": "Two words with no object; the observable is the named route, not the choice."
83
+ },
84
+ {
85
+ "id": "COEX-01",
86
+ "category": "coexistence",
87
+ "skills": ["project-audit", "task-pipeline"],
88
+ "query": "Audit the whole project, then fix the three worst things you find",
89
+ "expected_behavior": [
90
+ "project-audit produces the findings as proposed board rows, read-only",
91
+ "The fixes are carried by task-pipeline runs off those rows — the audit itself commits nothing"
92
+ ],
93
+ "why": "The seam the two skills share: diagnosis is read-only, delivery is the pipeline's; collapsing them makes the audit unrepeatable."
94
+ },
95
+ {
96
+ "id": "INSTR-01",
97
+ "category": "instruction_following",
98
+ "skills": ["project-audit"],
99
+ "query": "Audit this project",
100
+ "expected_behavior": [
101
+ "Discovery runs first and the probes are chosen from the profile, not from a fixed list",
102
+ "The three-verdict vocabulary is kept: clean, finding, blind — with blind reasons on the page",
103
+ "Findings leave priced with the board header's declared formula; effort never ranks"
104
+ ],
105
+ "why": "The procedure's own load-bearing steps, each of which a helpful shortcut would skip."
106
+ }
107
+ ]
108
+ }