task-pipeline-skill 1.85.2 → 1.86.3
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 +87 -0
- package/CONTRIBUTING.md +2 -2
- package/README.md +2 -1
- package/SKILL-CARD.md +1 -1
- package/bin/task-pipeline.js +70 -9
- package/evals/cases/evidence-docs.json +188 -0
- package/evals/cases/project-audit.json +188 -0
- package/evals/cases/task-pipeline.json +191 -0
- package/package.json +5 -4
- package/plugins/task-pipeline/.claude-plugin/plugin.json +1 -1
- package/plugins/task-pipeline/skills/evidence-docs/SKILL.md +16 -11
- package/plugins/task-pipeline/skills/evidence-docs/references/GENERATED.md +8 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/documentation.md +472 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/gates.md +645 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/hooks.md +279 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/learned.md +292 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/retrospective.md +551 -0
- package/plugins/task-pipeline/skills/evidence-docs/references/setup.md +149 -0
- package/plugins/task-pipeline/skills/evidence-docs/templates/decisions.md +50 -0
- package/plugins/task-pipeline/skills/evidence-docs/templates/docgate.sh +537 -0
- package/plugins/task-pipeline/skills/project-audit/SKILL.md +66 -25
- package/plugins/task-pipeline/skills/project-audit/scripts/audit.py +11 -0
- package/plugins/task-pipeline/skills/task-pipeline/SKILL.md +71 -54
- package/plugins/task-pipeline/skills/task-pipeline/execution-attempt.schema.json +68 -0
- package/plugins/task-pipeline/skills/task-pipeline/execution-packet.example.json +42 -0
- package/plugins/task-pipeline/skills/task-pipeline/execution-packet.schema.json +217 -0
- package/plugins/task-pipeline/skills/task-pipeline/execution-result.example.json +49 -0
- package/plugins/task-pipeline/skills/task-pipeline/execution-result.schema.json +261 -0
- package/plugins/task-pipeline/skills/task-pipeline/graph.example.json +10 -1
- package/plugins/task-pipeline/skills/task-pipeline/graph.schema.json +172 -2
- package/plugins/task-pipeline/skills/task-pipeline/pipeline.schema.json +50 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/acceptance.md +7 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/artifacts.md +23 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/audit.md +6 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/backlog.md +8 -1
- package/plugins/task-pipeline/skills/task-pipeline/references/browser.md +8 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/build.md +32 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/companion-skills.md +14 -3
- package/plugins/task-pipeline/skills/task-pipeline/references/decomposition.md +83 -2
- package/plugins/task-pipeline/skills/task-pipeline/references/doctrine-map.md +53 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/documentation.md +3 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/grill.md +27 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/hooks.md +10 -5
- package/plugins/task-pipeline/skills/task-pipeline/references/model-tiering.md +19 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/planning.md +203 -26
- package/plugins/task-pipeline/skills/task-pipeline/references/portability.md +1 -0
- package/plugins/task-pipeline/skills/task-pipeline/references/retrospective.md +26 -8
- package/plugins/task-pipeline/skills/task-pipeline/references/work-graph.md +7 -1
- package/plugins/task-pipeline/skills/task-pipeline/scripts/context_packets.py +686 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/execution_authority.py +271 -0
- package/plugins/task-pipeline/skills/task-pipeline/scripts/graph.py +415 -18
- package/plugins/task-pipeline/skills/task-pipeline/scripts/packet.py +400 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/README.md +2 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/browser-claims.json +54 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/finding-evidence.json +42 -0
- package/plugins/task-pipeline/skills/task-pipeline/templates/hooks.example.json +2 -2
- package/plugins/task-pipeline/skills/task-pipeline/templates/run.md +2 -2
|
@@ -95,6 +95,56 @@
|
|
|
95
95
|
],
|
|
96
96
|
"description": "`blocked` is waiting on an edge; `parked` is the verifier's deliberate *«this is a blocker, continue around it»*. The two are different facts and collapsing them loses the one a person needs."
|
|
97
97
|
},
|
|
98
|
+
"claim": {
|
|
99
|
+
"type": [
|
|
100
|
+
"object",
|
|
101
|
+
"null"
|
|
102
|
+
],
|
|
103
|
+
"default": null,
|
|
104
|
+
"additionalProperties": false,
|
|
105
|
+
"description": "The live execution grant when this node is `running` — WHO (session/attempt), not the role in `owner`. It is the identity that lets two `next` runs race N-001 and only one win, and the fence that stops a lost holder from clobbering the run that reclaimed its node. The full contract, and the acquire/start/renew/release/recover verbs that write it, are `execution-attempt.schema.json` (PF-01). A `running` node carries one; every other status carries `null`.",
|
|
106
|
+
"required": [
|
|
107
|
+
"owner",
|
|
108
|
+
"attempt",
|
|
109
|
+
"revision",
|
|
110
|
+
"fence",
|
|
111
|
+
"expiry",
|
|
112
|
+
"state"
|
|
113
|
+
],
|
|
114
|
+
"properties": {
|
|
115
|
+
"owner": {
|
|
116
|
+
"type": "string",
|
|
117
|
+
"minLength": 1
|
|
118
|
+
},
|
|
119
|
+
"attempt": {
|
|
120
|
+
"type": "integer",
|
|
121
|
+
"minimum": 1
|
|
122
|
+
},
|
|
123
|
+
"revision": {
|
|
124
|
+
"type": "integer",
|
|
125
|
+
"minimum": 0
|
|
126
|
+
},
|
|
127
|
+
"fence": {
|
|
128
|
+
"type": "integer",
|
|
129
|
+
"minimum": 1
|
|
130
|
+
},
|
|
131
|
+
"expiry": {
|
|
132
|
+
"type": "string",
|
|
133
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?Z$"
|
|
134
|
+
},
|
|
135
|
+
"state": {
|
|
136
|
+
"enum": [
|
|
137
|
+
"ready",
|
|
138
|
+
"claimed",
|
|
139
|
+
"completed"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
"installed_at": {
|
|
143
|
+
"type": "string",
|
|
144
|
+
"pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}(\\.[0-9]+)?Z$"
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
},
|
|
98
148
|
"blocked_by": {
|
|
99
149
|
"type": "array",
|
|
100
150
|
"items": {
|
|
@@ -228,6 +278,94 @@
|
|
|
228
278
|
}
|
|
229
279
|
}
|
|
230
280
|
}
|
|
281
|
+
},
|
|
282
|
+
"proof": {
|
|
283
|
+
"type": [
|
|
284
|
+
"object",
|
|
285
|
+
"null"
|
|
286
|
+
],
|
|
287
|
+
"default": null,
|
|
288
|
+
"additionalProperties": true,
|
|
289
|
+
"description": "The proof identity `close` recorded (FIX-PF-02.01): the commit and tree the verdict was TESTED against, plus optional base/packet/attempt/graph_revision/checks. `close` writes it only after confirming the verdict's `tested.head` equals the current HEAD, so a node called done carries WHAT WAS PROVEN and against which tree — not merely the HEAD that happened to be checked out when the verdict landed. `head: \"unavailable\"` outside a checkout (canon 9a).",
|
|
290
|
+
"properties": {
|
|
291
|
+
"head": {
|
|
292
|
+
"type": "string"
|
|
293
|
+
},
|
|
294
|
+
"tree": {
|
|
295
|
+
"type": "string"
|
|
296
|
+
},
|
|
297
|
+
"graph_revision": {
|
|
298
|
+
"type": "string"
|
|
299
|
+
},
|
|
300
|
+
"base": {
|
|
301
|
+
"type": "string"
|
|
302
|
+
},
|
|
303
|
+
"packet": {
|
|
304
|
+
"type": "string"
|
|
305
|
+
},
|
|
306
|
+
"attempt": {
|
|
307
|
+
"type": "string"
|
|
308
|
+
},
|
|
309
|
+
"checks": {
|
|
310
|
+
"type": "array",
|
|
311
|
+
"items": {
|
|
312
|
+
"type": "string"
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
},
|
|
317
|
+
"exception": {
|
|
318
|
+
"type": [
|
|
319
|
+
"object",
|
|
320
|
+
"null"
|
|
321
|
+
],
|
|
322
|
+
"default": null,
|
|
323
|
+
"additionalProperties": false,
|
|
324
|
+
"required": [
|
|
325
|
+
"reason",
|
|
326
|
+
"by",
|
|
327
|
+
"at"
|
|
328
|
+
],
|
|
329
|
+
"properties": {
|
|
330
|
+
"reason": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"minLength": 1
|
|
333
|
+
},
|
|
334
|
+
"by": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"minLength": 1
|
|
337
|
+
},
|
|
338
|
+
"at": {
|
|
339
|
+
"type": "string"
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"description": "An AUTHORIZED EXCEPTION (FIX-PF-03.02): the operator's recorded decision that this node ships without/despite certification — reason + identity + the tree it was granted at. Its own disposition: it never turns anything into a PASS, and a failed certification stays visible beside it."
|
|
343
|
+
},
|
|
344
|
+
"dispatch_packet": {
|
|
345
|
+
"type": [
|
|
346
|
+
"object",
|
|
347
|
+
"null"
|
|
348
|
+
],
|
|
349
|
+
"default": null,
|
|
350
|
+
"additionalProperties": false,
|
|
351
|
+
"required": [
|
|
352
|
+
"address",
|
|
353
|
+
"sha256"
|
|
354
|
+
],
|
|
355
|
+
"properties": {
|
|
356
|
+
"address": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"minLength": 1
|
|
359
|
+
},
|
|
360
|
+
"sha256": {
|
|
361
|
+
"type": "string",
|
|
362
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
363
|
+
},
|
|
364
|
+
"base": {
|
|
365
|
+
"type": "string"
|
|
366
|
+
}
|
|
367
|
+
},
|
|
368
|
+
"description": "The IMMUTABLE dispatch packet this node was built from (FIX-PF-05.01): address + digest of the compiled packet (REQ refs, constraints, interfaces, artifact digests, base, scope, budget, profile, skill lock — no ephemeral secret). Links the node to the exact context it ran under, so a graph in a git-ignored workspace still points at a durable, content-addressed packet."
|
|
231
369
|
}
|
|
232
370
|
},
|
|
233
371
|
"allOf": [
|
|
@@ -239,6 +377,9 @@
|
|
|
239
377
|
},
|
|
240
378
|
{
|
|
241
379
|
"$ref": "#/definitions/rule_parked_needs_reason"
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"$ref": "#/definitions/rule_running_needs_claim"
|
|
242
383
|
}
|
|
243
384
|
]
|
|
244
385
|
},
|
|
@@ -280,9 +421,11 @@
|
|
|
280
421
|
"enum": [
|
|
281
422
|
"add",
|
|
282
423
|
"park",
|
|
283
|
-
"close"
|
|
424
|
+
"close",
|
|
425
|
+
"invalidate",
|
|
426
|
+
"waive"
|
|
284
427
|
],
|
|
285
|
-
"description": "Which mutation made this entry. `close` joined the two on 2026-08-17 with T-5 — and it was caught by a probe rather than by the fixture asserting *the graph after a close still validates*, because `violations()` never reaches an enum. The same disagreement B-084 records, one field over."
|
|
428
|
+
"description": "Which mutation made this entry. `close` joined the two on 2026-08-17 with T-5 — and it was caught by a probe rather than by the fixture asserting *the graph after a close still validates*, because `violations()` never reaches an enum. The same disagreement B-084 records, one field over. `invalidate` joined with PF-02.02: a REQ/interface/brief change supersedes a node and resets its downstream proofs."
|
|
286
429
|
},
|
|
287
430
|
"node": {
|
|
288
431
|
"type": "string",
|
|
@@ -294,6 +437,10 @@
|
|
|
294
437
|
"minLength": 1,
|
|
295
438
|
"pattern": "\\S",
|
|
296
439
|
"description": "The reason, written for a person reading it later. The non-whitespace pattern is required for the same reason `parked_reason` needs one: `minLength: 1` counts a space."
|
|
440
|
+
},
|
|
441
|
+
"precondition": {
|
|
442
|
+
"type": "string",
|
|
443
|
+
"description": "The tree the mutation was made against — the proven HEAD for a `close` (FIX-PF-02.01). A revision then carries a VERSION, so a brief/REQ/interface change that moves the tree is a visibly different precondition, which is what invalidates a proof taken before it."
|
|
297
444
|
}
|
|
298
445
|
}
|
|
299
446
|
},
|
|
@@ -378,6 +525,29 @@
|
|
|
378
525
|
}
|
|
379
526
|
}
|
|
380
527
|
}
|
|
528
|
+
},
|
|
529
|
+
"rule_running_needs_claim": {
|
|
530
|
+
"description": "PF-01: a `running` node carries a live grant, or two `next` runs both dispatch it and a lost holder orphans it forever. The grant is an identity (session/attempt), not the ROLE in `owner`, and it is fenced and expiring — the full contract is `execution-attempt.schema.json`. Referenced from `node.allOf`, same shape as done-needs-evidence.",
|
|
531
|
+
"if": {
|
|
532
|
+
"properties": {
|
|
533
|
+
"status": {
|
|
534
|
+
"const": "running"
|
|
535
|
+
}
|
|
536
|
+
},
|
|
537
|
+
"required": [
|
|
538
|
+
"status"
|
|
539
|
+
]
|
|
540
|
+
},
|
|
541
|
+
"then": {
|
|
542
|
+
"required": [
|
|
543
|
+
"claim"
|
|
544
|
+
],
|
|
545
|
+
"properties": {
|
|
546
|
+
"claim": {
|
|
547
|
+
"type": "object"
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
381
551
|
}
|
|
382
552
|
}
|
|
383
553
|
}
|
|
@@ -32,6 +32,55 @@
|
|
|
32
32
|
},
|
|
33
33
|
"retro": {
|
|
34
34
|
"$ref": "#/definitions/retro"
|
|
35
|
+
},
|
|
36
|
+
"must_understand": {
|
|
37
|
+
"type": "array",
|
|
38
|
+
"items": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"minLength": 1
|
|
41
|
+
},
|
|
42
|
+
"description": "Must-understand extension names (FIX-PF-06.01). A consumer (an importer, an adapter — e.g. Fabric's taskPipeline adapter) that does not recognise an entry here REFUSES the whole config rather than importing what it understood: the fields named are load-bearing, and a silently-omitted constraint is the one failure mode an interop layer must not have. Unknown fields NOT named here may be carried verbatim as extensions. On profile COMPILATION (FIX-TP-03.02) the runtime executes exactly the profile's declared stages and gates — no default stage numbers injected — but an entry here it does not recognise BLOCKS the compile rather than running with the capability silently absent."
|
|
43
|
+
},
|
|
44
|
+
"kernel": {
|
|
45
|
+
"type": "object",
|
|
46
|
+
"additionalProperties": true,
|
|
47
|
+
"required": [
|
|
48
|
+
"scope",
|
|
49
|
+
"evidence",
|
|
50
|
+
"deps",
|
|
51
|
+
"resume"
|
|
52
|
+
],
|
|
53
|
+
"description": "The INVARIANT contract every pipeline carries regardless of how many stages its profile has (FIX-TP-03.01). The `stages` array is the replaceable PROFILE; the kernel is not — a minimal three-stage profile still declares all four kernel fields, and no kernel field is tied to a stage number.",
|
|
54
|
+
"properties": {
|
|
55
|
+
"scope": {
|
|
56
|
+
"type": [
|
|
57
|
+
"string",
|
|
58
|
+
"object"
|
|
59
|
+
],
|
|
60
|
+
"description": "What a unit of work may change — the edit boundary."
|
|
61
|
+
},
|
|
62
|
+
"evidence": {
|
|
63
|
+
"type": [
|
|
64
|
+
"string",
|
|
65
|
+
"object"
|
|
66
|
+
],
|
|
67
|
+
"description": "How a claim carries its receipt (file:line, a command + output, a test name)."
|
|
68
|
+
},
|
|
69
|
+
"deps": {
|
|
70
|
+
"type": [
|
|
71
|
+
"string",
|
|
72
|
+
"object"
|
|
73
|
+
],
|
|
74
|
+
"description": "What each unit reads and what must precede it."
|
|
75
|
+
},
|
|
76
|
+
"resume": {
|
|
77
|
+
"type": [
|
|
78
|
+
"string",
|
|
79
|
+
"object"
|
|
80
|
+
],
|
|
81
|
+
"description": "The resume point that survives context loss."
|
|
82
|
+
}
|
|
83
|
+
}
|
|
35
84
|
}
|
|
36
85
|
},
|
|
37
86
|
"definitions": {
|
|
@@ -200,7 +249,7 @@
|
|
|
200
249
|
"check"
|
|
201
250
|
],
|
|
202
251
|
"additionalProperties": true,
|
|
203
|
-
"description": "Condition that must pass before advancing to the next stage.",
|
|
252
|
+
"description": "Condition that must pass before advancing to the next stage. A consumer that meets a gate type outside the enum (or one it cannot execute) REJECTS the config naming the gate — an unknown gate silently omitted is a pipeline that advances ungated (FIX-PF-06.01).",
|
|
204
253
|
"properties": {
|
|
205
254
|
"type": {
|
|
206
255
|
"enum": [
|
|
@@ -453,3 +453,10 @@ git add <submodule> && git commit -m "chore: bump <name> submodule — <why>"
|
|
|
453
453
|
Moved out of `SKILL.md` on 2026-08-16: the body was 6685 tokens against a
|
|
454
454
|
< 5000 budget, and stage-10 close-out is what this file is for.
|
|
455
455
|
|
|
456
|
+
|
|
457
|
+
|
|
458
|
+
**Handoff is repository-backed.** Apply `artifacts.md` → *Durable handoff across
|
|
459
|
+
agents and repositories*: reports, task context and next steps must be tracked,
|
|
460
|
+
with verified remote refs where push is authorized. A local preview or clean but
|
|
461
|
+
unpushed worktree is not delivery. Check a fresh checkout, not the author’s paths.
|
|
462
|
+
|
|
@@ -11,6 +11,7 @@ shape.
|
|
|
11
11
|
- Stage → input map — where each stage's information comes from
|
|
12
12
|
- Stage → artifact map
|
|
13
13
|
- This repo (task-pipeline itself), for reference
|
|
14
|
+
- Durable handoff across agents and repositories
|
|
14
15
|
|
|
15
16
|
## In the host project
|
|
16
17
|
|
|
@@ -221,3 +222,25 @@ README.md CHANGELOG.md LICENSE CLAUDE.md
|
|
|
221
222
|
CONTRIBUTING.md SECURITY.md CODE_OF_CONDUCT.md
|
|
222
223
|
<artifacts>/{specs,plans}/ # this repo's own design history
|
|
223
224
|
```
|
|
225
|
+
|
|
226
|
+
## Durable handoff across agents and repositories
|
|
227
|
+
|
|
228
|
+
Persist reports, plans, decisions and executor context in the owning repository,
|
|
229
|
+
including work that stops at planning. An app preview or ignored scratch directory
|
|
230
|
+
may be a working copy, never the only copy a successor needs. Before removing the
|
|
231
|
+
build scratch directory, promote the durable task inputs, outputs and unresolved
|
|
232
|
+
work into the artifact root; Git cannot recover files that were never tracked.
|
|
233
|
+
|
|
234
|
+
Give the successor one tracked entry point with the objective, accepted decisions,
|
|
235
|
+
completed and open task IDs, module/contracts context, evidence and next task.
|
|
236
|
+
Use relative artifact paths; source references name repository and commit. For
|
|
237
|
+
multiple repositories, one central index names each remote, branch, commit and
|
|
238
|
+
handoff path. Keep task packets bounded and refresh their hashes after relocation.
|
|
239
|
+
|
|
240
|
+
Before the handoff, commit task-owned changes and push the working branches when
|
|
241
|
+
the operator has authorized it, including standing authorization. Verify each
|
|
242
|
+
remote ref equals the recorded commit and open the entry from a fresh checkout.
|
|
243
|
+
Report missing access as a delivery blocker, never as a successful push. Preserve
|
|
244
|
+
unrelated edits and explicit local-only instructions. Exclude secrets, caches and
|
|
245
|
+
foreign dependency trees. A pushed planning branch is not a release or deployment;
|
|
246
|
+
production submodule pins change only through the normal integration process.
|
|
@@ -43,6 +43,12 @@ audit. That skill discovers what the project is, probes it, reads the production
|
|
|
43
43
|
evidence a repository cannot hold, and hands phase 4 back here — so the method
|
|
44
44
|
below stays the one place it is written.
|
|
45
45
|
|
|
46
|
+
Its findings keep their axes apart: a defect proven by reproduction stands with
|
|
47
|
+
incidence UNKNOWN — UNKNOWN ≠ 0, and absent telemetry lowers exposure claims,
|
|
48
|
+
never technical truth. `templates/finding-evidence.json` is the minimal evidence
|
|
49
|
+
schema (mechanism / reproduction / exposure / incidence / impact uncertainty,
|
|
50
|
+
observations apart from assumptions, scope and time recorded).
|
|
51
|
+
|
|
46
52
|
`loop-guard.md` governs loops that *change* things — the fix loop, a re-entered
|
|
47
53
|
stage. Its trip means a decision is being re-litigated at the wrong altitude. This
|
|
48
54
|
file governs loops that *look* for things. Its trip means the axis is exhausted,
|
|
@@ -90,7 +90,14 @@ So:
|
|
|
90
90
|
somebody else pick this up?"*, which is the only question the board is answering.
|
|
91
91
|
- **The ref is checkable and that is the point.** `git rev-parse` either resolves it or it
|
|
92
92
|
does not, so a row that has quietly expired can be found before somebody plans around
|
|
93
|
-
|
|
93
|
+
it.
|
|
94
|
+
|
|
95
|
+
An audit row is an entry point, not a complete execution handoff. Before an
|
|
96
|
+
independent agent takes it, attach the context closure, implementation decisions,
|
|
97
|
+
input revisions, dependencies and result contract from
|
|
98
|
+
[Execution packets](planning.md#execution-packets). Keep priority separate from dispatch
|
|
99
|
+
readiness, and account for every finding without turning every finding into an
|
|
100
|
+
isolated task that ignores shared module/interface changes.
|
|
94
101
|
|
|
95
102
|
**A prose detector was tried first and discarded.** Matching *"parked"*, *"is built"*,
|
|
96
103
|
*"ready to merge"* in the description cell fired on **three rows out of 187 and all three
|
|
@@ -147,6 +147,14 @@ await browser.close();
|
|
|
147
147
|
console error nobody asserted on is precisely what the look is for. This is `DEC-0004`
|
|
148
148
|
and it is the reason both halves exist.
|
|
149
149
|
|
|
150
|
+
**The claims are a contract, not prose** (PXS-05.01): `templates/browser-claims.json`
|
|
151
|
+
links each REQ/scenario id to the STATE it was verified in and the KIND of check
|
|
152
|
+
(this table's own look/suite/library split), and `python3 test/browser_claims_test.py`
|
|
153
|
+
validates a filled copy with stdlib only — a visual PASS needs its artifact, captured
|
|
154
|
+
in the claim's own state (the initial screenshot closes nothing about opened/error);
|
|
155
|
+
a suite PASS closes no look claim; a toggle owes its full cycle; no browser channel
|
|
156
|
+
is NOT_RUN with the reason.
|
|
157
|
+
|
|
150
158
|
## Getting past a login, and past a backend
|
|
151
159
|
|
|
152
160
|
A surface behind auth is the usual reason a run skips the look. Both channels solve it,
|
|
@@ -374,6 +374,38 @@ satisfied**, and code quality. The implementer's self-review never substitutes f
|
|
|
374
374
|
it. Rubric, inputs, prompt templates and how to build the diff package:
|
|
375
375
|
[`review.md`](review.md).
|
|
376
376
|
|
|
377
|
+
**The dispatch packet is compiled and IMMUTABLE.** Before a node is built, its
|
|
378
|
+
context is compiled into one packet — the REQ references, the global
|
|
379
|
+
constraints, the interfaces, the artifact digests, the base revision, the
|
|
380
|
+
scope, the budget, the run profile and the skill lock — every ref bound
|
|
381
|
+
(address + digest) or the compilation is refused; a missing required ref is a
|
|
382
|
+
refusal, not a default. **No ephemeral secret rides inside**: a packet outlives
|
|
383
|
+
the session that built it, so a value that must expire is referenced by the
|
|
384
|
+
NAME of its store, never carried by value. `scripts/context_packets.py
|
|
385
|
+
compile-dispatch` builds it and the node records its address + digest
|
|
386
|
+
(`dispatch_packet`), so a build in a git-ignored workspace still points at the
|
|
387
|
+
durable context it ran under.
|
|
388
|
+
|
|
389
|
+
**The result is typed, tied and comparable.** An attempt's result records its
|
|
390
|
+
TYPED outputs (name + kind + address + digest), the `packet_digest` of the
|
|
391
|
+
immutable packet it answered, and `consumed` — the predecessor outputs it read,
|
|
392
|
+
by name + digest. Freshness is then a comparison, never a feeling: when a
|
|
393
|
+
predecessor re-runs and an output digest changes, `scripts/packet.py`'s
|
|
394
|
+
`consumed_stale` names every result that read the old bytes, and those nodes
|
|
395
|
+
rebuild at a new revision. And the packet rule applies to the answer as to the
|
|
396
|
+
question: **no credential rides in a result** — an output whose name reads as
|
|
397
|
+
one is refused by `validate-result`.
|
|
398
|
+
|
|
399
|
+
**An authorized exception is its own disposition — never a fake PASS.** Where
|
|
400
|
+
the operator decides a node ships without (or despite) certification, that is
|
|
401
|
+
recorded with `graph.py waive --node … --reason … --by …`: an `exception`
|
|
402
|
+
object carrying the reason and the IDENTITY that signed it. The failed
|
|
403
|
+
certification stays visible beside it, the node is never marked certified, and
|
|
404
|
+
`close` stamps the exception into the evidence — a reader later sees a
|
|
405
|
+
decision, not a green. And reviewer EXPOSURE is stated honestly: a tier report
|
|
406
|
+
may say what the reviewer actually saw, and a syntax lint recorded as a blind
|
|
407
|
+
review is refused by `certify` by name.
|
|
408
|
+
|
|
377
409
|
**The boundary with certification:** this review closes a **prose-plan task** —
|
|
378
410
|
one reviewer, the five-round cap of §4.5. A **work-graph node** is closed by the
|
|
379
411
|
three blind tiers and `graph.py certify` instead
|
|
@@ -6,7 +6,18 @@ fallback path, no version skew, and no failure mode where a stage can't run beca
|
|
|
6
6
|
something isn't installed.
|
|
7
7
|
|
|
8
8
|
What remains is a short list of **optional** companions that make individual stages
|
|
9
|
-
better, plus one
|
|
9
|
+
better, plus one whose ARTIFACT is required for user-facing work.
|
|
10
|
+
|
|
11
|
+
**The provider rule — a gate checks artifacts and their quality, never package
|
|
12
|
+
presence.** For every row below, three ways satisfy the same contract: the
|
|
13
|
+
**preferred family provider**, an **alternative provider producing the same
|
|
14
|
+
artifact contract** (a third-party design workflow whose output records tokens,
|
|
15
|
+
states and decisions IS designed — judged on the result), or the **inline
|
|
16
|
+
fallback** (write the artifact by hand against the contract). What a gate
|
|
17
|
+
refuses is the missing ARTIFACT, not the missing package — and when a tool is
|
|
18
|
+
absent, the run writes down WHICH check was therefore not done ("scenario lint
|
|
19
|
+
NOT_RUN: /ux-lint unavailable"), because a silently skipped check and a passed
|
|
20
|
+
one must never look alike.
|
|
10
21
|
|
|
11
22
|
|
|
12
23
|
> **Decision `DEC-0004`** — two browser channels ranked by nothing, one detection rule,
|
|
@@ -49,8 +60,8 @@ better, plus one that is required only for user-facing work.
|
|
|
49
60
|
|
|
50
61
|
| Skill / tool | Needed for | Required? | Install |
|
|
51
62
|
|---|---|---|---|
|
|
52
|
-
| **super-ux** (`ux-foundation`, `ux-flows`, `ux-scenarios`, `ux-audit`, `/ux`, `/ux-lint` — **and the copy half**: `copywriting`, `brand-voice`, `/brand-init`, `/copy`, `/brand-lint`, plus `/vision`) | stage 3 — the **UX track** *and* the **COPY track**. This row named six surfaces until 2026-08-10 while super-ux shipped eight skills and fifteen commands: the whole brand-and-copy half was invisible to this pipeline, so a run built scenarios and screens and then wrote the interface strings by taste | **
|
|
53
|
-
| **sheleg-design** (`/sheleg-design`) | stage 3 — the **VISUAL track**: tokens and themes, typography and rhythm, motion and how it degrades to rest, the visual language a brand is recognised by. It answers *how it looks*, which no other companion here answers — `super-ux` decides what the interface must do, `copywriting` how it sounds. Before 2026-08-10 this skill appeared once in the whole bundle, as a name in a list | **Recommended** on any task with a visual surface; never a gate. Absent → the
|
|
63
|
+
| **super-ux** (`ux-foundation`, `ux-flows`, `ux-scenarios`, `ux-audit`, `/ux`, `/ux-lint` — **and the copy half**: `copywriting`, `brand-voice`, `/brand-init`, `/copy`, `/brand-lint`, plus `/vision`) | stage 3 — the **UX track** *and* the **COPY track**. This row named six surfaces until 2026-08-10 while super-ux shipped eight skills and fifteen commands: the whole brand-and-copy half was invisible to this pipeline, so a run built scenarios and screens and then wrote the interface strings by taste | **Artifact required for any user-facing task** — the scenarios, not the package: an equivalent scenario set from another provider or the inline fallback passes the same gate | `/plugin marketplace add ssheleg/super-ux` → `/plugin install super-ux@super-ux` (or `npx skills add ssheleg/super-ux`) |
|
|
64
|
+
| **sheleg-design** (`/sheleg-design`) | stage 3 — the **VISUAL track**: tokens and themes, typography and rhythm, motion and how it degrades to rest, the visual language a brand is recognised by. It answers *how it looks*, which no other companion here answers — `super-ux` decides what the interface must do, `copywriting` how it sounds. Before 2026-08-10 this skill appeared once in the whole bundle, as a name in a list | **Recommended** on any task with a visual surface; never a gate. Absent → judge the visual layer by its RESULT: a third-party design workflow that recorded tokens, states and decisions is designed; only a layer with no design evidence at all ships **undesigned**, which is the honest name for picking values at the keyboard | `/plugin marketplace add ssheleg/sheleg-design` → `/plugin install sheleg-design@sheleg-design-skill` |
|
|
54
65
|
| **context7** (MCP — call tools fully qualified: `context7:resolve-library-id`, `context7:query-docs`) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
|
|
55
66
|
| **Figma** (MCP) | stage 3 UX track, when the project designs visually — super-ux mirrors each `SCR-` screen/state into a frame | Optional, **UI + Figma-on only**. Absent → super-ux degrades to text-only *by itself and never blocks*, so shipping a UI feature with no mockups becomes a silent scope call — which is why the stage-0 sweep decides it | connect the Figma MCP server (`/mcp`, or your claude.ai connectors) |
|
|
56
67
|
| **[obsidian-wiki](https://github.com/ar9av/obsidian-wiki)** (`wiki-query`, `wiki-update`) | **stage 0 harvest** (query what's already known) **+ stage 9 sync** | **Recommended** — never a gate; absent → harvest runs on repo docs alone | `pip install obsidian-wiki` → `obsidian-wiki setup --vault /path/to/your/vault` |
|
|
@@ -5,8 +5,8 @@ brief describes more than one deliverable, more than one surface, or a system
|
|
|
5
5
|
rather than a change — must be cut into modules first, and then built one brick at
|
|
6
6
|
a time, each brick carrying its own documentation, spec, plan, build and gates.
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
Module mapping runs at the end of **stage 2**, before the spec; a single-module change skips that map explicitly.
|
|
9
|
+
Stage-4 leaf sizing still applies when work is handed to independent agents; skipping the map does not skip task sizing.
|
|
10
10
|
|
|
11
11
|
## Contents
|
|
12
12
|
|
|
@@ -15,6 +15,7 @@ written. It is skipped — explicitly, in writing — when the work is a single
|
|
|
15
15
|
- The module map — the artifact
|
|
16
16
|
- GATE (part of stage 2, manual)
|
|
17
17
|
- The program loop — one brick at a time
|
|
18
|
+
- Executor-sized tasks and context
|
|
18
19
|
- Program done
|
|
19
20
|
|
|
20
21
|
## When it applies
|
|
@@ -140,6 +141,86 @@ Rules for the loop:
|
|
|
140
141
|
loop guard ([`loop-guard.md`](loop-guard.md)) — stop, name the oscillation, and
|
|
141
142
|
fix the layer that owns it instead of iterating.
|
|
142
143
|
|
|
144
|
+
## Executor-sized tasks and context
|
|
145
|
+
|
|
146
|
+
The module map is not an execution queue. At stage 4, split each change into
|
|
147
|
+
small, reviewable outcomes before handing it to another agent. Keep the original
|
|
148
|
+
finding or feature as the parent; only its leaf tasks enter the dispatch queue.
|
|
149
|
+
Do not mark the parent done because its plan exists.
|
|
150
|
+
|
|
151
|
+
### Cut by outcome, with its proof
|
|
152
|
+
|
|
153
|
+
One leaf owns one observable behavior, invariant, or artifact contract. Include
|
|
154
|
+
the focused regression and necessary documentation with that outcome; do not
|
|
155
|
+
create separate "write tests" and "write docs" jobs by ritual. Split when a leaf
|
|
156
|
+
requires another independent decision, another resource owner, an unrelated
|
|
157
|
+
failure mechanism, or more primary context than its declared budget permits.
|
|
158
|
+
Do not split a transaction across tasks merely to reach a target task count.
|
|
159
|
+
|
|
160
|
+
For example, "fix the updater" is a parent. A leaf can make `--dry-run` return
|
|
161
|
+
an operation plan without mutation, proved by unchanged fixture bytes and no
|
|
162
|
+
mutating child calls. Atomic generation switching and replacement verification
|
|
163
|
+
are separate outcomes with their own prerequisites and tests.
|
|
164
|
+
|
|
165
|
+
Before dispatch, the planner records for every leaf:
|
|
166
|
+
|
|
167
|
+
- parent requirement/finding and module/interface owner;
|
|
168
|
+
- the concrete change, why it is needed, and the observable expected result;
|
|
169
|
+
- decisions already made, alternatives rejected, and explicit exclusions;
|
|
170
|
+
- exact existing edit targets and proposed create targets; historical evidence,
|
|
171
|
+
migrations and ADRs remain read-only unless their own contract permits edits;
|
|
172
|
+
- inputs, required predecessor outputs, and data/control/resource edge reasons;
|
|
173
|
+
- ordered implementation steps and a focused positive and negative acceptance;
|
|
174
|
+
- primary context manifest, source/context digests, outputs and rollback;
|
|
175
|
+
- one integration owner and the claim/capability checks from
|
|
176
|
+
[`planning.md`](planning.md) → Execution packets.
|
|
177
|
+
|
|
178
|
+
### Resolve material choices before implementation
|
|
179
|
+
|
|
180
|
+
An implementation leaf is not ready while product behavior, public interface,
|
|
181
|
+
data ownership, authorization, dependency policy, or failure semantics remain
|
|
182
|
+
undecided. Create a bounded decision task instead: one precise question, named
|
|
183
|
+
sources or experiment, time/context budget, required decision record, and the
|
|
184
|
+
criterion that resolves it. Its consumers wait for that record and receive a
|
|
185
|
+
new packet revision. Do not fill uncertainty with invented certainty.
|
|
186
|
+
|
|
187
|
+
Routine local implementation choices can remain with the executor. A plan need
|
|
188
|
+
not prescribe every variable name. New evidence that invalidates a recorded
|
|
189
|
+
decision returns to its owner with the smallest counterexample; the executor
|
|
190
|
+
does not silently redesign adjacent modules or restart the whole interview.
|
|
191
|
+
|
|
192
|
+
### Budget what the executor actually reads
|
|
193
|
+
|
|
194
|
+
Primary context contains the leaf brief, applicable module/interface decisions,
|
|
195
|
+
acceptance, and the relevant source ranges. The full audit, other modules,
|
|
196
|
+
alternative designs and historical discussion belong in an indexed appendix.
|
|
197
|
+
Keep every required reference resolvable and digest-bound, but do not inject
|
|
198
|
+
the entire reference closure into every prompt. Read deeper source on demand
|
|
199
|
+
when needed to verify the local change.
|
|
200
|
+
|
|
201
|
+
Set a primary-context budget for the chosen host before materialization. Record
|
|
202
|
+
the tokenizer/model when measuring tokens; a byte or character count is a byte
|
|
203
|
+
or character count, never a token measurement. If the materialized primary
|
|
204
|
+
context exceeds the budget, split the outcome or move truly optional material
|
|
205
|
+
to the appendix. Never truncate constraints, acceptance, error behavior or
|
|
206
|
+
dependency outputs to make a packet fit. No universal task duration, file count
|
|
207
|
+
or token limit establishes quality; use project defaults and report exceptions.
|
|
208
|
+
|
|
209
|
+
### Cold-start and completion checks
|
|
210
|
+
|
|
211
|
+
A fresh executor must be able to answer "what changes, where, why, under which
|
|
212
|
+
decision, and how success is observed" from the primary packet without reading
|
|
213
|
+
the planner's conversation. Validate this before dispatch; reading an ID or a
|
|
214
|
+
title alone is not the test. Recheck hashes and materialize predecessor outputs
|
|
215
|
+
after they exist. Planned input placeholders never count as satisfied inputs.
|
|
216
|
+
|
|
217
|
+
Review the leaf's actual candidate code and evidence. Then check the parent's
|
|
218
|
+
acceptance across its leaves so a collection of individually green tasks cannot
|
|
219
|
+
drop an end-to-end requirement. Parent close requires current child receipts,
|
|
220
|
+
cross-seam checks where applicable, and the integration result. Plan completeness,
|
|
221
|
+
dispatch readiness, implemented behavior and released availability are separate
|
|
222
|
+
states.
|
|
223
|
+
|
|
143
224
|
## Program done
|
|
144
225
|
|
|
145
226
|
The program is finished when every row is `done` or `deferred` with an agreed home,
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# The doctrine map — which reference owns which stage
|
|
2
|
+
|
|
3
|
+
Split out of `SKILL.md` on 2026-09-10, when its body measured 5429 tokens against the
|
|
4
|
+
house budget of 5000. Nothing here is new: it is the table that says where each stage's
|
|
5
|
+
built-in doctrine lives, so an agent loads the one file the stage needs instead of
|
|
6
|
+
carrying the whole index in every turn.
|
|
7
|
+
|
|
8
|
+
The rule the table serves stays in `SKILL.md`: every stage's doctrine ships inside this
|
|
9
|
+
skill, no stage blocks on an install, and the single deliberate exception is the stage-3
|
|
10
|
+
UX track on a user-facing task.
|
|
11
|
+
|
|
12
|
+
## Contents
|
|
13
|
+
|
|
14
|
+
- [Which reference owns which stage](#which-reference-owns-which-stage)
|
|
15
|
+
|
|
16
|
+
## Which reference owns which stage
|
|
17
|
+
|
|
18
|
+
| Stage | Built-in doctrine |
|
|
19
|
+
|---|---|
|
|
20
|
+
| 0, 9 · The documentation system | `references/documentation.md` |
|
|
21
|
+
| any stage · The canons, and where each is enforced | [`evidence-docs`](../../evidence-docs/SKILL.md) — the sibling skill in this plugin |
|
|
22
|
+
| 6–10 · Gates | `references/gates.md` |
|
|
23
|
+
| 7–8 · Deploy targets | `references/deploy-targets.md` |
|
|
24
|
+
| any stage · Hooks | `references/hooks.md` |
|
|
25
|
+
| 0 Knowledge harvest (pre-grill) | `references/knowledge-sources.md` |
|
|
26
|
+
| 0, 9 The code graph (graphify — recommended, never required) | `references/knowledge-graph.md` |
|
|
27
|
+
| 0 Intake grill | `references/grill.md` |
|
|
28
|
+
| 2 Brainstorm | `references/brainstorm.md` |
|
|
29
|
+
| 2 Decompose (platforms only) | `references/decomposition.md` |
|
|
30
|
+
| 3 Spec | `references/spec.md` |
|
|
31
|
+
| 4 Plan | `references/planning.md` |
|
|
32
|
+
| the queue the loop walks | `references/work-graph.md` |
|
|
33
|
+
| 5–8 · how a **work-graph node** is CLOSED — three blind readings at three distances, all three required (ceiling 3); a **prose-plan task** closes through `review.md` instead — one reviewer, five-round cap | `references/certification.md` |
|
|
34
|
+
| 5 Build (worktree, subagents, fix loop) | `references/build.md` + `references/review.md` |
|
|
35
|
+
| 5–6 TDD + suite gate | `references/tdd.md` |
|
|
36
|
+
| 5, 6, 8 The browser — the look, the spec suite, and the difference | `references/browser.md` |
|
|
37
|
+
| 10 Acceptance (REQ close-out) | `references/acceptance.md` |
|
|
38
|
+
| 10 Retrospective (the run's last act) | `references/retrospective.md` |
|
|
39
|
+
| 10 + any audit (what's *missing*) | `references/audit.md` |
|
|
40
|
+
| **first run in a project** (new or existing) | `references/adoption.md` |
|
|
41
|
+
| **first run · the entry audit** (offered once) | `references/setup.md` |
|
|
42
|
+
| **what travels with the bundle vs stays in a project** | `references/portability.md` |
|
|
43
|
+
| any repeating loop | `references/loop-guard.md` |
|
|
44
|
+
| run-wide · what the run **leaves running and leaves behind** — every gate, and stage 10 | `references/residue.md` |
|
|
45
|
+
| run-wide · what the run **prints about itself** — the rail, the iteration line | `references/progress.md` |
|
|
46
|
+
| run-wide · how a run keeps going (the loop mode + the context budget) | `references/continuity.md` |
|
|
47
|
+
| run-wide · the work-list **between** runs, and the order it comes off | `references/backlog.md` + `references/prioritisation.md` |
|
|
48
|
+
| run-wide · whether a **human** ever confirmed what shipped, and when | `references/verification.md` |
|
|
49
|
+
| run-wide · how much unconfirmed work has piled up, and what to look at first | `references/exposure.md` |
|
|
50
|
+
| any stage · Where each artifact belongs | `references/artifacts.md` |
|
|
51
|
+
| preflight · Companion skills and their fallbacks | `references/companion-skills.md` |
|
|
52
|
+
| 6–10 · How the host project's CLAUDE.md is read | `references/conventions.md` |
|
|
53
|
+
| preflight · Model map, ids and the override | `references/model-tiering.md` |
|
|
@@ -110,6 +110,9 @@ files read` and *the recorder was never installed* are opposite facts, and a `0`
|
|
|
110
110
|
the first while meaning the second — the most reassuring answer available, derived from
|
|
111
111
|
an instrument nobody switched on. So the unmeasured case prints a word, and the word says
|
|
112
112
|
why it cannot be a number.
|
|
113
|
+
The same refusal covers findings: a defect proven by reproduction records
|
|
114
|
+
incidence UNKNOWN — a word, never a zero — and stays a defect;
|
|
115
|
+
`templates/finding-evidence.json` is the minimal schema that keeps the axes apart.
|
|
113
116
|
|
|
114
117
|
The rule is written down because it arrived three times under three names before anyone
|
|
115
118
|
named it: `references/knowledge-graph.md` → *State zero out loud* (a fresh graph must
|