task-pipeline-skill 1.33.0 → 1.37.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 CHANGED
@@ -1,5 +1,212 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.37.0 — the audit, and the four things it found the pipeline could not say
4
+
5
+ One release, four modules, and an audit that put four questions to this pipeline and
6
+ answered them with measurements rather than opinion:
7
+
8
+ - **99 shipped REQ, 99 of them at `Human: never`** — nothing has ever been confirmed by
9
+ a person, and the exposure line has been saying so on every run.
10
+ - **`copywriting` appeared 0 times in the bundle and `sheleg-design` once**, as a name in
11
+ a README list.
12
+ - **The review loop ran ten rounds, ten, eight, four, three** against a stated ceiling of
13
+ two stage re-entries — because a review round was named in no cap at all.
14
+ - **Nothing ever printed which pipeline, which module, or which iteration was running.**
15
+ The run checklist existed and was marked *"copy it, tick it"*.
16
+
17
+ Guards: 188 → **210**, property checks 8. Every one watched failing against a planted
18
+ defect, and three of the probes were wrong before their guards were.
19
+
20
+ ### The lesson that stopped dying in the repository that learned it
21
+
22
+ `retrospective.md` has said *"open an issue upstream"* since v1.9.0 and named no
23
+ repository, no trigger and no authorization — an instruction on rung 1 that every reader
24
+ took for done. So a defect in **the skill** — a gate that loops, a doctrine promising
25
+ what nothing enforces, a rule firing on the wrong shape — was rediscovered independently
26
+ in every project that ran the pipeline and fixed in none of them.
27
+
28
+ **Opt-in, per project, off by default**, `pipeline.json` → `retro.publish`:
29
+
30
+ ```json
31
+ "retro": { "publish": { "repo": "…", "label": "retro-insight", "redact": "strict" } }
32
+ ```
33
+
34
+ Absent, nothing is published and nothing is asked. Opening an issue in another
35
+ repository is an **outward act**, and an outward act taken from a generic flag is one
36
+ nobody authorized — the same floor deploy authorization uses.
37
+
38
+ **The body is printed in full before it is sent, and the printed string and the sent
39
+ string are one string.** Redacting after the print, or printing a tidier version of what
40
+ actually goes out, is the false-success shape this bundle names outright: a mechanism
41
+ reporting on itself instead of on what it did.
42
+
43
+ **Five numbered redaction rules**, because *insight only* is not a specification. No host
44
+ paths — only paths inside task-pipeline itself. No host identifiers: repository,
45
+ organisation, branch, commit, tag, issue. No code, no config values, no data, not even
46
+ redacted. No names of any kind. And the title states the **class**, not the incident.
47
+ When in doubt the rule is subtraction: an insight that survives losing a detail is still
48
+ an insight, and a detail that leaks cannot be recalled from an index.
49
+
50
+ **Seven guards, and one of them was broken by the fence above.** The check that makes the
51
+ doctrine's own worked issue obey its own rules was silent against three separate plants —
52
+ an absolute path, a commit id, a foreign repository slug — because the fence scan matched
53
+ ` ``` ` followed by a newline, and the ```json block one paragraph up made every
54
+ subsequent fence pair with the wrong delimiter. Five fence scans across four modules had
55
+ the same bug; all are language-tolerant now, and the earlier modules' probes were re-run
56
+ to prove the change broke nothing (R-003: sweep the detector's siblings).
57
+
58
+ ### What it does, how it sounds, how it looks
59
+
60
+ The audit measured this one rather than argued it: **`copywriting` appeared zero times
61
+ in the whole bundle, and `sheleg-design` once — as a name in a list in the README.**
62
+ Meanwhile the companion matrix named six super-ux surfaces while super-ux shipped eight
63
+ skills and fifteen commands. So a run designed a flow, then wrote its interface strings
64
+ by taste and picked its visual values at the keyboard, and every gate in the pipeline
65
+ reported green over both.
66
+
67
+ **Stage 3 now runs three tracks, and none substitutes for another:**
68
+
69
+ | Track | Answers | Owner |
70
+ |---|---|---|
71
+ | UX | what the interface must **do** | super-ux — the WHY→UI→scenario chain |
72
+ | COPY | how it **sounds** | `copywriting`, against the brand pack |
73
+ | VISUAL | how it **looks** | `sheleg-design` — tokens, themes, rhythm, motion |
74
+
75
+ Each carries its boundary in both directions, because a track that over-reaches is
76
+ routed around. The copy track takes interface strings, errors, empty states, the
77
+ landing, the user-facing changelog — and explicitly **not** commit messages, PR text,
78
+ code comments or a developer README. The visual track takes the visual layer and
79
+ explicitly **not** a purely structural change, which is the UX track's.
80
+
81
+ **A refusal is a sentence, never a silence.** *"as is"* ends the visual track and
82
+ *"draft"* ends the copy track; either is the operator's call and costs nothing. But it
83
+ is recorded in the brief and said in the close-out, because a track skipped in silence
84
+ and a track that ran are identical afterwards — the `⊘` rule one layer up.
85
+
86
+ **`sheleg-design` joins the matrix and the preflight**, and super-ux's row finally names
87
+ its copy half.
88
+
89
+ **The new guard found a live defect on the clean tree before it found anything else.**
90
+ It compares the matrix's *"needed for stage N"* cell against what that stage actually
91
+ says, and reported that `chrome-devtools` had been pointed at **stages 5–6 since the day
92
+ it was added, with stage 5 never naming it**. Fixed here: stage 5 now checks a rendered
93
+ surface per task, while the implementer that wrote it is still dispatched.
94
+
95
+ **And a probe found a hole in its own guard.** Removing `copywriting` from stage 3 left
96
+ the check silent, because it reads matrix **row names** and the copy half lives inside
97
+ super-ux's own cell — precisely where it had been invisible all along. A second, narrow
98
+ check now covers the three tracks by name. It is narrow on purpose: generalising the
99
+ sub-skill mapping would demand stage 3 name `/brand-lint` and `ux-audit` too, and a
100
+ check that over-reaches is switched off by the third person who hits it.
101
+
102
+ ### The loop that had no ceiling, the exemption nobody measured
103
+
104
+ Three findings from the same audit, all of them gates behaving as prose.
105
+
106
+ **The review loop was capped by nothing.** `build.md` caps the stage-5 fix loop at five
107
+ rounds per task and `loop-guard.md` caps stage re-entries at two — and a review round is
108
+ neither, so nothing counted them. The run stamps say what that cost: **ten rounds, ten,
109
+ eight, four, three**, in one programme.
110
+
111
+ **A flat cap would have been the wrong fix**, and this is the part worth keeping. Every
112
+ one of those runs recorded *"none from my probes"* beside its count — the reader was
113
+ still finding real defects on round nine. Stopping at two would have shipped them. So
114
+ the cap is a **decision point**: default 3 rounds per artifact (`pipeline.json` →
115
+ `run.review.maxRounds`), and at the cap the run stops reviewing and prints the pair
116
+ `audit.md` already defines, per round:
117
+
118
+ ```
119
+ review cap reached — 3 rounds — artifact: test/validate.py
120
+ round 1: 12 new · 0 self-inflicted
121
+ round 2: 5 new · 1 self-inflicted
122
+ round 3: 1 new · 3 self-inflicted
123
+ ```
124
+
125
+ Self-inflicted ≥ new and the axis is exhausted; new still ahead and continuing is the
126
+ operator's call, made with numbers rather than fatigue. Rounds are counted from the run
127
+ ledger's `touch:` pass numbers, never from memory. Every finding left open at the cap
128
+ leaves as a board row with its evidence, never as a shrug.
129
+
130
+ **The pipeline ran eleven stages over a typo because nothing measured the exemption.**
131
+ The boundary — a one-line fix, a mechanical rename — existed in prose and depended on an
132
+ agent remembering it. Stage 0 now runs a three-question triage with something behind each
133
+ question, and **proposes** the short path: stages 1–4 marked `⊘` with the triage answer
134
+ as the reason. Propose, never take: the answer goes in the brief and silence takes the
135
+ full flow, the same floor deploy authorization uses. The glyph is what makes it safe —
136
+ a skipped stage is printed on the rail *with its reason*, and a skip nobody can see is
137
+ indistinguishable from a stage never entered.
138
+
139
+ **`exposure.md`'s worked example disagreed with its own output, in both directions at
140
+ once.** It taught `31 releases since the last human confirmation` while the code printed
141
+ `releases carry one`, and it hardcoded `99` — a live count that drifts. The example now
142
+ carries no digits at all, and a guard computes the format's vocabulary **from the print
143
+ statement** and requires the doctrine to show it.
144
+
145
+ **Six new guards, each watched failing.** Two of them found their own author first: the
146
+ short-path check was scoped to a paragraph while the bullet it reads carries a fenced
147
+ block, so it stopped three lines short of the glyph and passed in silence — and its
148
+ replacement matched the fence's own backtick and accused the clean tree. A detector that
149
+ finds itself before it finds anything else is checking the wrong thing, twice in one
150
+ module.
151
+
152
+ ### A run that says which pipeline it is on, and where in it
153
+
154
+ An audit of this pipeline asked four questions of it. The first was *does the agent
155
+ understand the plan it is executing?* — and the honest answer was that nothing in eleven
156
+ stages ever printed which pipeline, which module, or which iteration was running. The
157
+ run checklist existed and was marked *"copy it, tick it"*: an instruction with no gate
158
+ behind it, which is the same failure it was written to prevent, one level up.
159
+
160
+ **The run prints where it is, at two boundaries and only two** — task start and
161
+ iteration close ([`references/progress.md`](plugins/task-pipeline/skills/task-pipeline/references/progress.md)):
162
+
163
+ ```
164
+ task-pipeline v1.34.0 · pipeline-audit · module P1 «the progress print» (1 of 4)
165
+ 0 ✓ 1 ✓ 2 ✓ 3 ▶ 4 · 5 · 6 · 7 · 8 · 9 · 10 ·
166
+ ███████░░░░░░░░░░░░░░░░░░░ gates 3/11 · now 3 Spec · manual
167
+ board B-028 · carry-over 0 rows · exposure 99 never · unlooked 0
168
+ ```
169
+
170
+ An iteration is already defined as *one item taken to its gate*, not one agent turn.
171
+ Printing per turn would put a bar above every tool call and teach the operator to skip
172
+ the block that matters.
173
+
174
+ **The rail is computed from the project's own `pipeline.json` and carries no stage count
175
+ of its own.** The eleven above are this plugin's *example* flow; a host replaces them. A
176
+ bar reading `gates 5/11` in a project with six stages is a summary confidently wrong
177
+ about the thing it summarises, printed in the one place a run is trusted at a glance.
178
+
179
+ **Every number on the block is borrowed, and the block computes nothing.** `board` comes
180
+ from the backlog, `carry-over` from the ledger, `exposure` from the verification file,
181
+ `unlooked` from the gate's own disclosure. If the block disagrees with a gate verdict,
182
+ the block is wrong — that direction, always, because the gate looked and the block
183
+ quoted. A progress line that computed its own counts would be the fourth copy of the
184
+ truth, and this repository already knows what happens to those.
185
+
186
+ **A glyph is read from the verdict its gate wrote, never from memory.** `✓` means the
187
+ gate passed, not that the stage was walked — a rail is a summary, and a summary is the
188
+ easiest artefact in a run to write from recollection. `⊘` may never be silent: a skipped
189
+ stage with no recorded reason is indistinguishable from a stage never entered, and the
190
+ two mean opposite things.
191
+
192
+ **`.task-pipeline/run.md` is finally written.** `loop-guard.md` has named it since the
193
+ day it shipped, calls its own churn detection *mechanical*, and reads `touch:` lines from
194
+ it — and **no run had ever created it**. The detector had no input; the guard sat on
195
+ rung 1 while every reader took it for rung 3. It is now seeded at stage 0 from
196
+ [`templates/run.md`](plugins/task-pipeline/skills/task-pipeline/templates/run.md), named
197
+ in that stage's gate, and serves two readers: the guard reads the touches, the progress
198
+ block reads the stage verdicts and counts the `iter:` lines. The counter is a `grep -c`,
199
+ not a number the agent is carrying — after a compaction the agent's count is gone and
200
+ the file's is not.
201
+
202
+ **Five new guards, each watched failing against a planted defect.** The header block's
203
+ field set compared **both ways** between its two copies; every glyph a rail prints
204
+ present in the legend; the computed-rail promise stated where a reader meets it; and the
205
+ ledger's line shapes compared declared-vs-shown **and** against the files that read them.
206
+ The first version of the fourth probe removed one of three `touch:` lines from the worked
207
+ log, left the shape shown, and read the guard's correct silence as a broken guard — R-001
208
+ again, and the reason it is a standing instruction.
209
+
3
210
  ## v1.33.0 — the number, the list, and the command that shows them with no task running
4
211
 
5
212
  Three modules shipped as one, because they are one capability: the index, the list it
package/CONTRIBUTING.md CHANGED
@@ -411,6 +411,72 @@ an audit measured it. A claim of enforcement is now checked like any other claim
411
411
  a **single** string in `test/validate.py`: the check reads that file as text, so a
412
412
  quote straddling a line-continuation is a citation nothing can find.
413
413
 
414
+ **48. The progress header exists in two files and is compared both ways; the rail is
415
+ computed, never eleven.** `references/progress.md` defines the block and
416
+ `references/stages.md` restates it — learned.md rule 20's shape, and the drift is silent
417
+ because each copy reads complete alone. Both directions, because they are different
418
+ failures: a field in the doctrine and not the stage list is a reader who never meets it;
419
+ a field on the stage list and not in the doctrine is a number with no home. The rail's
420
+ stage set comes from the project's own `pipeline.json`, and the doctrine is required to
421
+ say so — the eleven in `pipeline.example.json` are an example, and a bar reading
422
+ `gates 5/11` in a six-stage project is wrong in the one place a run is read at a glance.
423
+ Every glyph printed is in the legend, one direction and deliberately: a legend row for an
424
+ unused glyph is vocabulary, not a defect.
425
+ *(guard: `one block, two copies, already drifted` and `carries no stage count of its own`
426
+ and `the legend does not define it`)*
427
+
428
+ **49. The run ledger's line shapes are declared, shown, and read.** `templates/run.md`
429
+ declares three under `## Lines` and works them under `## Log`; the two enumerations are
430
+ compared **both ways**, because a shape declared and never shown is a rule with no
431
+ example and a shape shown and never declared is an example teaching an unowned format.
432
+ Third check: every declared shape is named by `references/progress.md` or
433
+ `references/loop-guard.md` — a ledger shape nothing reads is a shape nothing writes,
434
+ which is exactly what this file was for the whole time `loop-guard.md` called its own
435
+ detection mechanical and no run had created the file.
436
+ *(guard: `declared under` and `shown in` and `a ledger shape with no reader`)*
437
+
438
+ **50. The review loop has a stated cap, and the cap is one number in two files.** It is
439
+ computed from `references/loop-guard.md`, which owns the caps, and required verbatim in
440
+ the stage that runs the loop; both must name `run.review.maxRounds`, because a default
441
+ nobody can change is a default everybody overrides in their head. The cap is a
442
+ **decision point, not a stop** — at it the run prints new findings against
443
+ self-inflicted ones, per round. A flat ceiling would be the wrong rule: the runs that
444
+ went ten rounds were still finding real defects on round nine.
445
+ *(guard: `no review-round cap` and `the review cap is stated with no config key`)*
446
+
447
+ **51. The short path is proposed, printed and glyphed; the exposure example is computed
448
+ from its own print.** A stage skipped by the triage is marked with a glyph
449
+ `references/progress.md`'s legend defines — a skip nobody can see is indistinguishable
450
+ from a stage never entered. And the worked exposure line carries **no digits**: its
451
+ vocabulary is derived from the print statement at check time, because the previous
452
+ example disagreed with the code in both directions at once and hardcoded a live count.
453
+ *(guard: `and references/progress.md's legend does not define it`
454
+ and `the worked example carries a digit`)*
455
+
456
+ **52. A companion the matrix points at a stage is named by that stage, and stage 3's
457
+ three tracks each name their owner.** The matrix's *"needed for"* cell says which stage
458
+ needs a companion; nothing checked the stage had ever heard of it, which is how
459
+ `sheleg-design` reached one mention in the whole bundle and super-ux's copy half reached
460
+ none while the table read complete on its own. On the commit that added it, this guard
461
+ found `chrome-devtools` pointed at stages 5–6 with stage 5 silent since the day it was
462
+ added. A second, deliberately narrow check covers the three stage-3 tracks — UX, COPY,
463
+ VISUAL — each with its owning skill, because the first reads matrix **row names** and
464
+ the copy half lives inside super-ux's own cell, exactly where it was invisible.
465
+ *(guard: `has not heard of it` and `names no owner`)*
466
+
467
+ **53. Publishing a retro insight is opt-in, enumerated, and its own example obeys its
468
+ own rules.** `retro.publish` is off when absent — opening an issue in another repository
469
+ is an outward act, and a generic flag is not a specific authorization. The redaction
470
+ rules are a **numbered enumeration whose count is computed from the items** and required
471
+ in the sentence that introduces them, because an enumeration counted in prose is the
472
+ class this repository spent six review rounds on. The doctrine's own worked issue body
473
+ is checked against those rules: no absolute path, nothing that reads as a commit, no
474
+ repository slug but the skill's. And the key must exist in `pipeline.schema.json` **and**
475
+ be named by a stage — a step described in the retro's doctrine and in no stage never
476
+ runs.
477
+ *(guard: `does not say` and `rule 1 of the list it is printed beside`
478
+ and `no stage names`)*
479
+
414
480
  ## Adding or changing doctrine
415
481
 
416
482
  - **Change one idea per PR.** These files are read by agents under load; a PR that
package/README.md CHANGED
@@ -128,6 +128,7 @@ until it is installed.
128
128
  | 10 Acceptance | [`acceptance.md`](plugins/task-pipeline/skills/task-pipeline/references/acceptance.md) — REQ coverage table, evidence rules, the closing question |
129
129
  | 10 + any audit | [`audit.md`](plugins/task-pipeline/skills/task-pipeline/references/audit.md) — the L0→L7 ladder and its seams, axis rotation, ratchets, proven checks |
130
130
  | any loop | [`loop-guard.md`](plugins/task-pipeline/skills/task-pipeline/references/loop-guard.md) — churn detection, caps, the break protocol |
131
+ | run-wide reporting | [`progress.md`](plugins/task-pipeline/skills/task-pipeline/references/progress.md) — the header block at task start and the one-line iteration close: the stage rail computed from the project's own `pipeline.json`, every number borrowed from the gate that measured it |
131
132
  | 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
133
  | the board between runs | [`backlog.md`](plugins/task-pipeline/skills/task-pipeline/references/backlog.md) — the work-list that outlives a run: seeded at stage 0 or picked up, priority **computed** from three stated inputs rather than assigned, and the seam where the carry-over ledger's `backlog` pointer finally resolves |
133
134
  | what a human confirmed | [`verification.md`](plugins/task-pipeline/skills/task-pipeline/references/verification.md) — one row per shipped REQ and the one column a machine may not fill: the date somebody **looked**, or `never`. No floor, no target — `never` is a fact, and a count driven down is a column that has started lying |
@@ -614,6 +615,17 @@ GATE 10 acceptance: PASS — 14/14 REQ verified
614
615
  abstained: 1 (1 cannot-verify) · unlooked: 0
615
616
  ```
616
617
 
618
+ **And a lesson about the pipeline itself can leave the project.** A defect in the
619
+ *skill* — a gate that loops, a doctrine promising what nothing enforces — was
620
+ rediscovered independently in every repository that ran it and fixed in none. Set
621
+ `retro.publish` in `pipeline.json` and stage 10 opens the insight as an issue on the
622
+ skill's own repository, **printing the whole body first**; the printed string and the
623
+ sent string are one string. Five numbered rules govern what leaves — no host paths, no
624
+ host identifiers, no code or config or data, no names, and a title stating the class
625
+ rather than the incident. **Absent the key, nothing is published and nothing is asked:**
626
+ an issue in someone else's repository is an outward act, and a generic flag is not a
627
+ specific authorization.
628
+
617
629
  Stage 0 reads those standing instructions **in full** on the next run — which is
618
630
  the whole reason the cap exists and the prune is a gate criterion instead of a good
619
631
  intention. A rule nobody reads to the end is worse than no rule: everyone believes
@@ -633,6 +645,17 @@ The spec stage runs it **before any plan is written**: `/ux` (setup check) →
633
645
  stages served, applicable UX patterns — and the plan's UI tasks carry scenario IDs
634
646
  in their DoD. Scenarios come before interface.
635
647
 
648
+ **Two more tracks run beside it, and they answer different questions.** super-ux
649
+ decides what the interface must *do*; its own `copywriting` decides how it *sounds*
650
+ (every user-facing string, against the brand pack — `/brand-init` before the first
651
+ string, never after); and [sheleg-design](https://github.com/ssheleg/sheleg-design)
652
+ decides how it *looks* (tokens and themes, typography and rhythm, motion and its rest
653
+ state). Until v1.36.0 this stage named only the first, so a run designed a flow and
654
+ then wrote its strings by taste and picked its values at the keyboard, with every gate
655
+ green over both. Either optional track can be declined — *"as is"*, *"draft"* — and
656
+ the refusal is **recorded**, because a track skipped in silence and a track that ran
657
+ are the same thing in a transcript.
658
+
636
659
  ```
637
660
  /plugin marketplace add ssheleg/super-ux
638
661
  /plugin install super-ux@super-ux
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.33.0 |
15
+ | **Version** | 1.37.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` |
@@ -381,7 +381,14 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
381
381
  grade — **mechanical check > standing instruction (with its retire-when written
382
382
  at birth) > a note that expires in two runs** — and the check that catches it
383
383
  the first time from now on. A lesson true in any repository belongs upstream in
384
- the skill's own doctrine, not in one project's file.
384
+ the skill's own doctrine, not in one project's file — and where the project has
385
+ opted in (`retro.publish` in its pipeline config, OFF when absent), that lesson
386
+ is opened as an issue on the skill's own repository. The body is printed in full
387
+ before it is sent and the printed string is the sent string; five rules govern
388
+ what may leave — no host paths, no host identifiers, no code or config or data,
389
+ no names, and a title stating the class rather than the incident. Nothing is
390
+ published without that opt-in: an issue in someone else's repository is an
391
+ outward act, and a generic flag is not a specific authorization.
385
392
  A retro left empty after a messy run is the failure it exists to stop. Phase 1
386
393
  of the next run reads those standing instructions **in full**, which is why the
387
394
  cap is not negotiable and the prune is a gate item, not a good intention.
@@ -569,14 +576,32 @@ than the last five run stamps **move** to an append-only archive that is *querie
569
576
  by the task's nouns rather than read — which keeps the in-force file short enough to
570
577
  read in full, and makes pruning cost no knowledge.
571
578
 
572
- ## super-ux for user-facing tasks (recommended)
573
-
574
- If the task touches any UI (web/mobile/CLI/TUI), the WHY→UI→scenario chain comes
575
- BEFORE interface code. If super-ux is available, use it: foundation (personas,
576
- JTBD, customer journey maps, user stories) → flows + screens → scenarios (the
577
- source of truth) run its linter. Otherwise still design that chain, get it
578
- approved, and trace every user-facing requirement to a scenario before building.
579
- Install (Cursor/Claude/others): `npx skills add ssheleg/super-ux`.
579
+ ## Three tracks for user-facing tasks (stage 3)
580
+
581
+ Three questions, three owners, and none substitutes for another: what the
582
+ interface must **do**, how it **sounds**, how it **looks**.
583
+
584
+ 1. **UX track super-ux (recommended).** If the task touches any UI
585
+ (web/mobile/CLI/TUI), the WHY→UI→scenario chain comes BEFORE interface code:
586
+ foundation (personas, JTBD, customer journey maps, user stories) flows +
587
+ screens → scenarios (the source of truth) → run its linter. Without the skill,
588
+ still design that chain, get it approved, and trace every user-facing
589
+ requirement to a scenario before building.
590
+ Install: `npx skills add ssheleg/super-ux`.
591
+ 2. **COPY track — copywriting (super-ux ships it).** Every string a product's
592
+ user reads goes through it, against the brand pack; no pack means running
593
+ brand-init BEFORE the first string, not after. Not through it: commit
594
+ messages, PR text, code comments, developer READMEs, internal docs.
595
+ 3. **VISUAL track — sheleg-design (recommended).** Tokens and themes,
596
+ typography and rhythm, motion and how it degrades to rest, the Figma boundary
597
+ (tokens as variables, never raw values carried across). Not through it: a
598
+ purely structural change, text, a backend, an internal script.
599
+ Install: `npx skills add ssheleg/sheleg-design`.
600
+
601
+ **A refusal is a sentence, never a silence.** "as is" ends the visual track and
602
+ "draft" ends the copy track; either is the operator's call and costs nothing, but
603
+ it is recorded and said out loud in the close-out. A track skipped silently and a
604
+ track that ran look identical afterwards.
580
605
 
581
606
  ## Routing — when this applies at all
582
607
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.33.0",
3
+ "version": "1.37.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.33.0",
5
+ "version": "1.37.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -67,6 +67,7 @@ gate stops until it is installed.
67
67
  | **first run · the entry audit** (offered once) | [`references/setup.md`](references/setup.md) |
68
68
  | **what travels with the bundle vs stays in a project** | [`references/portability.md`](references/portability.md) |
69
69
  | any repeating loop | [`references/loop-guard.md`](references/loop-guard.md) |
70
+ | run-wide · what the run **prints about itself** — the rail, the iteration line | [`references/progress.md`](references/progress.md) |
70
71
  | run-wide · how a run keeps going (the loop mode + the context budget) | [`references/continuity.md`](references/continuity.md) |
71
72
  | run-wide · the work-list **between** runs, and how its priority is computed | [`references/backlog.md`](references/backlog.md) |
72
73
  | run-wide · whether a **human** ever confirmed what shipped, and when | [`references/verification.md`](references/verification.md) |