task-pipeline-skill 1.1.0 → 1.3.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,127 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.3.0 — 2026-07-29
4
+
5
+ **One design file, in a named team, decided before anything is drawn.** Left to
6
+ drawing time, "where do I put this?" is answered by whichever agent is holding the
7
+ brush, and the answer is usually *create a new file* — which is how a project
8
+ acquires three files called some variation of "Design", each with real work in it
9
+ and no way to tell which one the team actually opens.
10
+
11
+ The duplicate is **silent by construction**: the second file is internally
12
+ consistent, its frames are named correctly, and the UX linter is green. Nothing
13
+ downstream notices that half the design now lives where nobody looks.
14
+
15
+ ### Added — the design destination is a stage-0 decision
16
+ - **New sweep row `3 Design file`** (in both homes — `grill.md`'s table, which the
17
+ grill reads, and `templates/brief.md`, which records the answer): **which
18
+ team/org, by name, and which file.** Three legal answers: the file already
19
+ recorded, a URL the operator supplies, or **creation in that named team,
20
+ explicitly authorized**.
21
+ - **Creation follows the deploy-authorization floor.** *"Create the design file in
22
+ team `Acme Product`"* authorizes one creation in one place; a vague "set up Figma
23
+ for me" authorizes nothing, because deciding *where* on its own is the entire
24
+ failure. `grill.md` → **The design destination** is the new doctrine section.
25
+ - **The team is recorded, not just the file.** A file URL identifies a file; it does
26
+ not say whose workspace it lives in. super-ux runs `whoami` and asks which team
27
+ when there are several — but nothing wrote the answer down, and a design that
28
+ lands in someone's personal drafts is invisible to everyone who needs it.
29
+ - **Two rules that make it stick:** never create while a recorded file resolves;
30
+ and **if the recorded file does not resolve, stop and ask — never create a
31
+ replacement.** "I couldn't open it so I made a new one" is simultaneously the
32
+ duplicate and a hidden permissions problem that a new file does not fix.
33
+ - **Written before the first frame, not after.** A file created and then lost to a
34
+ crashed context is worse than none: it exists, it is empty, nobody knows it is
35
+ there.
36
+
37
+ ### Added — the check that catches it mechanically
38
+ - Deep links are `figma.com/design/:fileKey/…`, so **comparing every `screens.md`
39
+ frame link's key against the canonical record is a string match**, not a
40
+ judgement. A differing key *is* a second file. This is now the stage-3 gate and
41
+ the audit ladder's **`→F`** seam; if it ever fires twice, it belongs in the host's
42
+ lint, per the repeats-twice rule.
43
+
44
+ ### Changed
45
+ - **Canonical record: `docs/ux/foundation.md` → *Design tooling*** — super-ux owns
46
+ that section, it is per-project and it survives every run, which is exactly what
47
+ "the agents always know which file" requires. The brief holds the **decision and
48
+ the authorization** and points at it; it is a record, **not a second registry**,
49
+ and if the two disagree `foundation.md` wins. On a project with no `docs/ux/` the
50
+ brief is canonical instead, and **stage 9 writes the destination into the host's
51
+ own docs** (`conventions.md`) so the next run finds it without asking.
52
+ - **Creating** a shared design file joins the outward list beside *editing* one —
53
+ it is the stronger of the two, and it is the one that duplicates.
54
+
55
+ ### Validator
56
+ - The shipped intake gate must settle the design destination; a config where stage 0
57
+ never names the team or the file now fails. Proven against a planted defect and
58
+ shipped with a CI negative self-test.
59
+
60
+ ## v1.2.0 — 2026-07-29
61
+
62
+ The pipeline already knew about Figma — but only second-hand, through super-ux, and
63
+ **every one of its own promises had a Figma-shaped hole**. None of these required it
64
+ to learn Figma; super-ux owns that completely and keeps owning it.
65
+
66
+ ### Fixed — four holes in the pipeline's own promises
67
+ - **The sweep never asked about the design surface.** super-ux asks "Figma or
68
+ text-only" once per project and stores the answer — but that first ask lands
69
+ *mid-run*, in the very run the sweep exists to make uninterrupted. Worse: when the
70
+ Figma MCP is absent, super-ux correctly recommends it and then **continues
71
+ text-only on its own, never blocking**. That is a scope change nobody agreed to —
72
+ a UI feature ships "described" instead of "designed" and no gate says so. New sweep
73
+ row **`3 Design surface`**: Figma on or text-only, is the MCP connected, and *if it
74
+ isn't, ship text-only or stop and connect it?*
75
+ - **The single-preflight promise was broken for UI tasks.** `companion-skills.md`
76
+ guarantees ONE block — companions plus the model — so the operator arms the whole
77
+ run in one exchange. The Figma MCP is a companion stage 3 needs, and its check
78
+ happened later, inside the stage. It is now in the matrix and in the preflight
79
+ block, flagged only when the task is user-facing *and* the project designs
80
+ visually (read `docs/ux/foundation.md` → Design tooling first; no record means the
81
+ choice itself is a stage-0 question).
82
+ - **The audit ladder had no rung for the frame.** Added as **`F`** — deliberately
83
+ *conditional and parallel*, not a step in the sequence, so `L0→L7` keeps its
84
+ numbering. A frame is **a second statement of the same surface, made in pictures.**
85
+ super-ux's linter proves a frame link exists, is named `SCR-NN/<Screen>/<state>`
86
+ and isn't stale; **it cannot read the picture.** A frame can pass every lint there
87
+ is while promising a retention window, a credit meter or a pricing tier the spec
88
+ never described and the code never built — a rendered claim about the product,
89
+ seen by more people than the spec, and often the version stakeholders believe.
90
+ Compare frames to frames and they agree; compare specs to specs and they agree;
91
+ the defect lives in the seam. Two new seam questions: **`L2→F`** does the frame
92
+ render what the spec says, and **`F→L7`** did what shipped stay matched to it. The
93
+ spec is the contract — name the document you propose to move instead of quietly
94
+ redrawing.
95
+ - **Editing a shared design file was missing from the outward list.** Frames are
96
+ read by designers and stakeholders; drawing in one is publishing, not local work.
97
+ It now sits beside deploy, publish, repo-create and opening a PR — the list an
98
+ agent actually reads.
99
+
100
+ ### Added — validator
101
+ - **Autonomy-sweep drift guard.** The sweep lives twice: `grill.md`'s table is what
102
+ the agent *reads* while interviewing, `templates/brief.md`'s is what it *writes*.
103
+ A row added to one and not the other is a question never asked, or an answer with
104
+ nowhere to land. The validator now compares the stage numbers the two tables cover
105
+ and fails on a difference. Proven against two planted defects (a stage present
106
+ only in the grill; a stage dropped only from the brief) plus an unmodified control,
107
+ and shipped with a CI negative self-test. **Scope, stated honestly: it catches
108
+ stage-level drift, not row-level** — a row added under a stage number both tables
109
+ already mention passes.
110
+
111
+ ### Changed
112
+ - The boundary is now written down in both directions: super-ux owns *how* to design
113
+ (the choice, the MCP preflight, frame naming, the drift linter); task-pipeline owns
114
+ *when to ask, what counts as degradation, and how to check afterwards that the
115
+ picture and the product still say the same thing*.
116
+
117
+ ## v1.1.1 — 2026-07-29
118
+
119
+ Version bump only — a fresh npm artifact for the v1.1.0 content. **No changes to
120
+ the skill, the doctrine, the gates or the installers**; the tree is identical to
121
+ v1.1.0. Nothing to re-read, nothing to re-learn.
122
+
123
+ (npm versions are immutable, so re-publishing the same content needs a new number.)
124
+
3
125
  ## v1.1.0 — 2026-07-29
4
126
 
5
127
  **The pipeline could find a requirement that was named and lost. It could not find
package/README.md CHANGED
@@ -297,6 +297,20 @@ Bottom-up is not taste: a missing artefact low on the ladder makes everything ab
297
297
  it meaningless, so top-down you spend the pass polishing a surface for a contract
298
298
  that does not exist.
299
299
 
300
+ **The frame is a rung too, where the project designs visually.** super-ux owns the
301
+ frame completely — the Figma on/off choice, the MCP preflight, the
302
+ `SCR-NN/<Screen>/<state>` naming, and a linter that catches a missing, misnamed or
303
+ stale link. What no linter can check is **what the frame says.** A link can be
304
+ present, correctly named and fresh while the picture behind it promises a retention
305
+ window, a credit meter or a pricing tier the spec never described and the code
306
+ never built — a rendered claim about the product, seen by more people than the
307
+ spec, and often the version stakeholders believe. Compare frames to frames and they
308
+ agree; compare specs to specs and they agree; the defect lives in the seam. So the
309
+ walk adds two questions on UI work: *does the frame render what the spec says*, and
310
+ *does what shipped still match the frame*. The spec is the contract — say which
311
+ document you propose to move, and remember that **editing a shared design file is
312
+ outward**, like a PR or a deploy.
313
+
300
314
  Three rules keep the audit from becoming another loop:
301
315
 
302
316
  - **Every pass changes the axis, not the effort.** A searching pass doesn't
@@ -343,6 +357,34 @@ in their DoD. Scenarios come before interface.
343
357
  /plugin install super-ux@super-ux
344
358
  ```
345
359
 
360
+ **Figma is super-ux's, and the decision about it is stage 0's.** super-ux mirrors
361
+ every `SCR-` screen and state into a frame when the project designs visually, and
362
+ it handles all of it: the on/off choice, the MCP preflight, the naming contract,
363
+ the drift linter. task-pipeline only settles the part that would otherwise
364
+ interrupt a run — *is Figma on, is the MCP connected, and if it isn't, do we ship
365
+ text-only or stop and connect it?* That last clause matters: super-ux recommends
366
+ the MCP and then **continues text-only on its own, never blocking**, so an unasked
367
+ question quietly narrows the delivery from "designed" to "described". The stage-0
368
+ sweep decides it, and the preflight block flags the missing MCP in the same
369
+ exchange as everything else.
370
+
371
+ **One file, in a named team, decided before anything is drawn.** Left to drawing
372
+ time, "where do I put this?" gets answered by whichever agent is holding the brush,
373
+ and the answer is usually *create a new file* — which is how a project acquires
374
+ three files called some variation of "Design", each with real work in it. So the
375
+ sweep settles the **team or organization by name** (a file URL says which file, not
376
+ whose workspace — a design that lands in someone's personal drafts is invisible to
377
+ everyone who needs it) and **the file**: the one already recorded, a URL you supply,
378
+ or creation in that named team, explicitly authorized the same way a deploy target
379
+ is. Two rules make it stick: **never create while a recorded file resolves**, and
380
+ **if the recorded file doesn't resolve, stop and ask — never create a replacement**,
381
+ because "I couldn't open it so I made a new one" is both the duplicate and a hidden
382
+ permissions problem. The URL is written to the project's canonical record —
383
+ `docs/ux/foundation.md` → *Design tooling*, or the repo's own docs when there's no
384
+ UX chain — **before the first frame**, and the audit's `F` rung then checks it
385
+ mechanically: every `screens.md` deep link is `figma.com/design/:fileKey/…`, so a
386
+ key that differs from the recorded one is a second file, caught by a string match.
387
+
346
388
  ### Model policy — one model, confirmed once
347
389
 
348
390
  The default recommendation is *the most capable reasoning model the environment
@@ -66,7 +66,22 @@ mid-flight questions:
66
66
  in play and whether stage 9 may write to them**; UI verdict; base branch, branch policy,
67
67
  commit convention, task tracker; the test command and what "green" means; the
68
68
  lint command; the deploy target, release toggle and **deploy authorization**;
69
- where logs/health live; which docs and runbooks this change updates. Each item
69
+ where logs/health live; which docs and runbooks this change updates. For UI
70
+ tasks also: **is the design done visually (Figma) or text-only, is the Figma MCP
71
+ connected, and if it isn't — ship text-only or stop and connect it?** The UX
72
+ chain degrades to text-only on its own and never blocks, so an unasked question
73
+ there silently ships a UI feature with no mockups. **And with Figma on, settle
74
+ the destination here, never at drawing time: which team/org by name, and which
75
+ file** — the one already recorded, a URL the user gives, or *creation in that
76
+ named team, explicitly authorized*. A file URL says which file, not whose
77
+ workspace, and a design that lands in someone's personal drafts is invisible to
78
+ the people who need it. **Never create a file while a recorded one resolves; if
79
+ it doesn't resolve, stop and ask — never create a replacement**, because "I
80
+ couldn't open it so I made a new one" is how a project ends up with three design
81
+ files and hides a permissions problem at the same time. Write the URL into the
82
+ project's own record (`docs/ux/foundation.md` → Design tooling if the UX chain
83
+ exists, otherwise the repo's `CLAUDE.md`/README) **before the first frame** — a
84
+ file created and then lost to a crashed context is worse than none. Each item
70
85
  gets an answer or an explicit "stop and ask me here" — an unasked question is a
71
86
  scheduled interruption.
72
87
 
@@ -167,13 +182,25 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
167
182
  bottom-up through its rungs — recorded decision → spec section → contract *and
168
183
  its failure behavior* → plan task with a satisfiable DoD → the change in the
169
184
  tree → an **executed** named assertion → the surface a user reaches, and its
170
- docs checking the seam between each pair: does the decision reach the spec;
185
+ docs, **plus, on UI work designed visually, the frame as a second parallel
186
+ statement of the same surface** — checking the seam between each pair: does the
187
+ decision reach the spec;
171
188
  does the section say what happens when the contract fails; does every contract
172
189
  have a task; did the DoD land in the diff; would that test still pass with the
173
190
  production code deleted; can a user reach this and does a doc say so; and
174
191
  finally, does what shipped satisfy the requirement's own *statement* rather
175
- than the task's instructions. Order findings **by seam, not by file** the
176
- seam tells you which layer of your process leaks. Every absence becomes a new
192
+ than the task's instructions. **And for a frame: does it render what the spec
193
+ says, and does what shipped still match it?** A UX linter proves a frame link
194
+ exists, is named right and isn't stale — it cannot read the picture, so a frame
195
+ promising a retention window, a credit meter or a tier nobody built passes
196
+ every lint there is, while being the version stakeholders believe. The spec is
197
+ the contract: say which document you propose to move, don't quietly redraw, and
198
+ remember that editing a shared design file is outward. **Also check the file,
199
+ not just the frames:** deep links are `figma.com/design/:fileKey/…`, so
200
+ comparing each screen link's key against the recorded destination is a string
201
+ match — a differing key is a second design file with real work in it, and
202
+ nothing else notices, because that file is internally consistent and its frames
203
+ are named correctly. Order findings **by seam, not by file** — the seam tells you which layer of your process leaks. Every absence becomes a new
177
204
  REQ row with its check **before** the table is written; appending afterwards is
178
205
  how acceptance goes green over a gap. Findings owned by a lower layer go back
179
206
  there (spec → stage 3, plan → stage 4).
@@ -190,7 +217,10 @@ not authorize an outward, irreversible action — stage 7 stops and asks.
190
217
  Cross-cutting: answer from the brief's autonomy section rather than re-asking, log every deferral in the ledger, never narrow the task silently, track
191
218
  tasks, conventional commits, honest degradation (never claim a failed/skipped step
192
219
  succeeded), and get explicit go before any outward/irreversible action (deploy,
193
- publish, repo create).
220
+ publish, repo create, **editing a shared design file** — frames are read by
221
+ designers and stakeholders, so drawing in one is publishing, not local work — and
222
+ above all **creating** one, which needs a named team and never happens while a
223
+ recorded file resolves).
194
224
 
195
225
  **Loop guard — break churn instead of iterating.** Every repeating pass (a fix
196
226
  round, a re-entered stage, the next module) logs one line per touched file: the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.1.0",
3
+ "version": "1.3.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"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "task-pipeline",
3
3
  "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.",
4
- "version": "1.1.0",
4
+ "version": "1.3.0",
5
5
  "author": {
6
6
  "name": "ssheleg"
7
7
  },
@@ -23,7 +23,7 @@ applying the
23
23
  grill's **domain awareness** (challenge terms against `CONTEXT.md`, sharpen fuzzy
24
24
  language, ADRs for hard-to-reverse calls) and covering the **autonomy sweep** (what
25
25
  would otherwise stop stages 1→10: docs sources incl. doc repos and the wiki, branch/tracker
26
- policy, test and lint commands, deploy target and authorization, log locations, docs/wiki targets) —
26
+ policy, test and lint commands, deploy target and authorization, log locations, docs/wiki targets, and for UI tasks whether the design is done visually in Figma or text-only, whether the Figma MCP is connected, and — if it isn't — whether to ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; **and with Figma on, the design destination: which team/org by name and which file** — the recorded one, a URL the operator gives, or creation in that named team explicitly authorized, written into the project's canonical record before the first frame, because a destination decided at drawing time is how a project ends up with three design files and no way to tell which is real. **Never create while a recorded file resolves; if it doesn't resolve, stop and ask — never create a replacement**) —
27
27
  until the brief is locked — including the **REQ table**, the request as an addressable list where every row names how it is verified — so the rest runs autonomously and the final stage can account for all of it. The list is frozen: adding is free, removing needs the operator's agreement. Anything deferred goes into the carry-over ledger the moment it's said. For any user-facing task, recommend/use
28
28
  **super-ux**. **If the brief describes a platform rather than a change**, stage 2 also cuts it into modules (`references/decomposition.md`) — module map committed, walking skeleton first, every REQ in exactly one module — and stages 3→10 then run per module, one brick at a time. **If any loop starts undoing an earlier pass** (same file edited twice for the same reason, a closed finding returning, a third entry into one stage), stop and run the loop guard (`references/loop-guard.md`): name both shapes, escalate to the layer that owns the conflict, re-plan the check as an ordered list, then go item by item. **The closing stage opens with the ladder walk** (`references/audit.md`): the REQ table finds what was named and lost, but a comparison needs two sides and an absence has one — so walk each REQ bottom-up through its rungs (decision → spec section → contract *and its failure behavior* → task → change → executed test → surface/docs), check the seam at each step, order findings by seam rather than by file, and turn every absence into a new REQ row **before** the coverage table is written. A green from a check nobody has watched fail against a planted defect is not evidence; a finding class seen twice becomes a script rather than a third ledger row; and the carry-over ledger's counts are printed beside every gate verdict, so "green" never reads as "verified". If a searching pass starts finding mostly what the previous pass's own fixes broke, the axis is exhausted — rotate it, don't look harder. Honor every stage gate by its type (`auto` = verify yourself;
29
29
  `manual` = wait for explicit go). Confirm the **model once at preflight** —
@@ -170,7 +170,10 @@ Three things the grill does beyond clarifying the request:
170
170
  tracker + conventional commits per host conventions; worktree isolation for the
171
171
  build, integrated back per the brief's branch policy before stage 7; honest
172
172
  degradation (never claim a failed/skipped step succeeded);
173
- outward/irreversible actions (deploy, publish, repo create, opening a PR) need explicit
173
+ outward/irreversible actions (deploy, publish, repo create, opening a PR,
174
+ **editing a shared design file — frames are read by designers and stakeholders,
175
+ so drawing in one is publishing — and above all *creating* one, which needs a
176
+ named team and never happens while a recorded file resolves**) need explicit
174
177
  operator go — or a **specific** standing authorization recorded in the brief
175
178
  (named target + preconditions; a vague "do everything" is not one).
176
179
 
@@ -15,7 +15,7 @@
15
15
  ],
16
16
  "gate": {
17
17
  "type": "manual",
18
- "check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit). PHASE 1, before the first question: harvest the knowledge sources (references/knowledge-sources.md) — code, CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, the knowledge wiki when installed (obsidian-wiki — recommended, never required; detect ~/.obsidian-wiki/config), and any other repo or hosted doc system the project names as its docs — queried by this task's own terms, with the SOURCE LEDGER written into the brief (a row per source consulted, or an explicit 'none found'). PHASE 2, the grill, built into the skill (references/grill.md) — no companion to install. Per its contract: one question at a time, a recommended answer with each, explore the codebase/docs before asking, depth-first, contradictions reconciled; EVERY answer that touches a harvested source is validated against that source — the operator outranks any document, but only out loud, and the losing side is logged for the stage-9 doc update; domain awareness applied (terms challenged against CONTEXT.md, ADRs recorded for hard-to-reverse calls). The autonomy sweep is covered — every stage 1-10 has its blockers pre-resolved (docs sources, branch/tracker policy, test + lint commands, deploy target and authorization, log/health locations, docs+wiki targets) or is explicitly marked 'stop and ask here'. UI verdict recorded (arms super-ux); model decision recorded. All of it locked into a committed task brief the operator confirms before stage 1. The REQ table is written — one row per independently verifiable deliverable, each naming how it is verified — and frozen: adding later is free, removing or narrowing needs the operator's explicit agreement. The carry-over ledger is seeded."
18
+ "check": "MANDATORY stage — never skipped (only sanctioned bypass: the entry-from-super-ux short-circuit). PHASE 1, before the first question: harvest the knowledge sources (references/knowledge-sources.md) — code, CLAUDE.md/AGENTS.md, CONTEXT.md + docs/adr, docs/ + docs/ux, past pipeline briefs and carry-over ledgers, the knowledge wiki when installed (obsidian-wiki — recommended, never required; detect ~/.obsidian-wiki/config), and any other repo or hosted doc system the project names as its docs — queried by this task's own terms, with the SOURCE LEDGER written into the brief (a row per source consulted, or an explicit 'none found'). PHASE 2, the grill, built into the skill (references/grill.md) — no companion to install. Per its contract: one question at a time, a recommended answer with each, explore the codebase/docs before asking, depth-first, contradictions reconciled; EVERY answer that touches a harvested source is validated against that source — the operator outranks any document, but only out loud, and the losing side is logged for the stage-9 doc update; domain awareness applied (terms challenged against CONTEXT.md, ADRs recorded for hard-to-reverse calls). The autonomy sweep is covered — every stage 1-10 has its blockers pre-resolved (docs sources, branch/tracker policy, test + lint commands, deploy target and authorization, log/health locations, docs+wiki targets, and for UI tasks the design surface: Figma on or text-only, is the Figma MCP connected, and if it is not — ship text-only or stop and connect it, since the UX chain degrades on its own and never blocks; plus, with Figma on, the DESIGN DESTINATION — which team/org by name and which file (the recorded one, a URL the operator gives, or creation in that named team with the creation explicitly authorized), written into the project's canonical record before the first frame, and never created while a recorded file resolves — an unreachable recorded file means stop and ask, never make a replacement) or is explicitly marked 'stop and ask here'. UI verdict recorded (arms super-ux); model decision recorded. All of it locked into a committed task brief the operator confirms before stage 1. The REQ table is written — one row per independently verifiable deliverable, each naming how it is verified — and frozen: adding later is free, removing or narrowing needs the operator's explicit agreement. The carry-over ledger is seeded."
19
19
  }
20
20
  },
21
21
  {
@@ -57,11 +57,12 @@
57
57
  "super-ux:ux-flows",
58
58
  "super-ux:ux-scenarios",
59
59
  "super-ux:ux-lint",
60
+ "figma",
60
61
  "task-pipeline:spec"
61
62
  ],
62
63
  "gate": {
63
64
  "type": "manual",
64
- "check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and user-reviewed; every user-facing requirement traces to a scenario ID. Every spec section carries covers: REQ-... and every REQ appears in at least one section."
65
+ "check": "UX track ran FIRST for user-facing tasks (/ux -> ux-foundation CJM -> ux-flows screens -> ux-scenarios -> /ux-lint green); spec committed and user-reviewed; every user-facing requirement traces to a scenario ID. Every spec section carries covers: REQ-... and every REQ appears in at least one section. With Figma on: the destination the brief named was used — the canonical record (docs/ux/foundation.md -> Design tooling) holds exactly one file, no file was created while a recorded one resolved, and every screens.md frame link carries that same :fileKey (a string match, not a judgement — a differing key means the run drew in a second file nobody will open)."
65
66
  }
66
67
  },
67
68
  {
@@ -74,6 +74,7 @@ absence findable.
74
74
  | **L5** | Change | the commits — the thing actually in the tree |
75
75
  | **L6** | Test | an **executed** assertion, by name — never "the tests pass" |
76
76
  | **L7** | Surface | what a user reaches: scenario, screen state, CLI output, runbook |
77
+ | **F** | Frame — *conditional* | UI work with Figma on: one frame per `SCR-NN/<Screen>/<state>`, **in the one file the project recorded**. Not a step in the sequence — a **second, parallel statement of the same surface**, made in pictures |
77
78
 
78
79
  **Audit the seams, not the artifacts.** Each rung is internally consistent most of
79
80
  the time — that is exactly what the horizontal pass is good at, and it has already
@@ -89,10 +90,49 @@ done it. What survives lives between rungs:
89
90
  | L5→L6 | is there an executed observable? | "tests pass"; a test that still passes with the production code deleted |
90
91
  | L6→L7 | can a user reach it, and does a doc say so? | shipped behavior with no scenario, no `--help` line, no runbook entry |
91
92
  | L7→L0 | does the shipped surface satisfy the requirement's **statement**? | it does what the task said and not what the requirement meant |
93
+ | L2→F | *(UI)* does the frame render what the spec **says**? | a frame that promises a capability, limit or number the product does not have |
94
+ | F→L7 | *(UI)* did what shipped match the frame, or did the frame become fiction? | the frame is still the design of record and no longer describes anything that exists |
95
+ | →F | *(UI)* is every frame **in the recorded file**? | a second design file nobody opens, holding real work — the check is a `:fileKey` string match, so it is a gate, not an opinion |
92
96
 
93
- The last seam is stage 10's question, expressed as a seam. When it fails, the run
97
+ The L7→L0 seam is stage 10's question, expressed as a seam. When it fails, the run
94
98
  did every instruction correctly and delivered the wrong thing.
95
99
 
100
+ ### The frame is a second claim, and nothing compares it to the first
101
+
102
+ Where the project designs in Figma, **super-ux owns the frame entirely** — the
103
+ on/off choice, the MCP preflight, the `SCR-NN/<Screen>/<state>` naming, and a
104
+ linter that catches a missing link, a broken trace or a stale one. That is a lot,
105
+ and none of it is this file's business.
106
+
107
+ What no linter can check is **what the frame says.** A frame link can be present,
108
+ correctly named, non-stale — and the picture behind it can state a retention
109
+ window, a credit meter, a pricing tier or a button whose promise the spec never
110
+ made and the code never implements. It is a *claim about the product*, rendered,
111
+ usually seen by more people than the spec, and frequently the thing a stakeholder
112
+ believes. Compare frames to frames and they are consistent; compare specs to specs
113
+ and they are consistent; the defect lives in the seam, and only a walk finds it.
114
+
115
+ So on UI work with Figma on, the walk carries one extra step in each direction:
116
+ read the frame against the spec section that covers its `SCR-` id (`L2→F`), then
117
+ against what actually shipped (`F→L7`). A mismatch is a finding like any other —
118
+ and it is usually the **frame** that must change, because the spec is the contract.
119
+ Say which one you are proposing to move, and why, rather than quietly redrawing.
120
+
121
+ **Editing someone else's Figma file is outward.** Frames live in a shared file that
122
+ designers and stakeholders read; changing one is publishing, not local work.
123
+ Propose the change, get an explicit go, and only then draw — the same rule as a PR,
124
+ a deploy, or docs in another repository. **Creating** one is stronger still: it
125
+ needs a named team and an explicit authorization recorded at intake
126
+ ([`grill.md`](grill.md) → *The design destination*).
127
+
128
+ **And check the file, not just the frames.** Every deep link is
129
+ `figma.com/design/:fileKey/…`, so comparing each `screens.md` link's key against
130
+ the canonical record (`docs/ux/foundation.md` → *Design tooling*) is a string
131
+ match. A key that differs is a **second file with real work in it** — the failure
132
+ that starts with one agent unable to open the recorded file and quietly making a
133
+ new one. Nothing else in the chain notices: the new file is internally consistent,
134
+ its frames are named correctly, and the linter is green.
135
+
96
136
  ## How one audit pass runs
97
137
 
98
138
  **Scope: one deliverable, all rungs.** One REQ, one module, one capability. Not
@@ -222,3 +262,6 @@ a script — and if it cannot be, **that is the finding: write the check.**
222
262
  | "Findings grouped by file are easier to fix" | And impossible to learn from. Group by seam; the seam names which layer of your process leaks. |
223
263
  | "The ledger has it, we won't forget" | Only if it is printed beside every verdict. Unprinted, it is a TODO, and TODOs are invisible by construction. |
224
264
  | "This is out of scope for the audit" | Then it is a carry-over row with a home, right now. An audit that silently declines findings is worse than none. |
265
+ | "The UX linter is green, the frames are fine" | It proved the links exist, are named right and aren't stale. It cannot read the picture. A frame that promises a feature nobody built passes every lint there is. |
266
+ | "The frame is wrong, I'll just redraw it" | Editing a shared design file is outward, and the spec is the contract. Say which document you are moving and get the go. |
267
+ | "I couldn't open the recorded file, so I made a new one" | That is the duplicate, and it hides a permissions problem a new file does not fix. Unreachable means stop and ask. |
@@ -30,6 +30,7 @@ better, plus one that is required only for user-facing work.
30
30
  |---|---|---|---|
31
31
  | **super-ux** (`ux-foundation`, `ux-flows`, `ux-scenarios`, `ux-audit`, `/ux`, `/ux-lint`) | stage 3 UX track | **Required for any user-facing task** | `/plugin marketplace add ssheleg/super-ux` → `/plugin install super-ux@super-ux` (or `npx skills add ssheleg/super-ux`) |
32
32
  | **context7** (MCP) | stage 1 docs study | Recommended (web-search fallback) | connect the context7 MCP server |
33
+ | **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) |
33
34
  | **[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` |
34
35
  | ~~superpowers~~ | — | **Not a dependency.** Stages 2/4/5/6 run on the built-in doctrine above. See *Optional bridge* | — |
35
36
  | ~~grill-me / grilling~~ | — | **Not a dependency.** The stage-0 grill is built in (`references/grill.md`) | — |
@@ -62,6 +63,11 @@ Pipeline companions (stage doctrine is built in — nothing to install for it):
62
63
  /plugin marketplace add ssheleg/super-ux
63
64
  /plugin install super-ux@super-ux
64
65
  ✓ context7 — ready
66
+ ✗ Figma MCP — this task is user-facing and the project designs in Figma
67
+ (docs/ux/foundation.md → Design tooling). Without it the
68
+ UX chain still runs, text-only — no mockups this run:
69
+ connect the Figma MCP via /mcp
70
+ (say "text-only is fine" and I'll record that instead)
65
71
  ✗ obsidian-wiki — recommended: stage 0 queries it before grilling you,
66
72
  stage 9 syncs back what this run learned:
67
73
  pip install obsidian-wiki
@@ -82,6 +88,17 @@ Rules:
82
88
  `wiki-query`/`wiki-update`. Present → say `✓ ready` and use it in the harvest.
83
89
  Absent → print the two install lines **once** and continue; never ask twice in a
84
90
  run and never block a stage on it ([`knowledge-sources.md`](knowledge-sources.md)).
91
+ - **Figma MCP**: flag it only when the task is user-facing **and** the project
92
+ designs visually — read `docs/ux/foundation.md` → *Design tooling* first; no
93
+ record yet means the choice itself is a stage-0 question (super-ux's default is
94
+ on). Detect the official Figma MCP tools; **how** frames get built, named and
95
+ linted is entirely super-ux's — its own `figma-integration.md` and
96
+ `figma-structure.md` own that — while this preflight only decides whether the run
97
+ has the capability
98
+ and, if not, what ships instead. That last part is the point: super-ux recommends
99
+ the MCP and then *continues text-only on its own*, so without a recorded answer
100
+ the run silently narrows from "designed" to "described". The sweep row is
101
+ `3 Design surface` ([`grill.md`](grill.md) → *The autonomy sweep*).
85
102
  - **Never gate any stage on an install** except the stage-3 UX track on a UI task.
86
103
  - Optional tools missing → state the fallback, don't block.
87
104
  - Re-detect after the operator installs; don't assume.
@@ -38,6 +38,12 @@ found, surface it and **ask** rather than guessing.
38
38
  proved stale is already listed there with what's wrong.
39
39
  - Host self-update rules (module docs, runbooks, agent-self cards, etc.) — update
40
40
  in the same change. Fix dangling links.
41
+ - **The design destination, on a project with no `docs/ux/`.** When the work uses
42
+ Figma but super-ux isn't in play, there is no `foundation.md` to hold the file, so
43
+ the brief is canonical — and a brief is per-run. Write the team and the file URL
44
+ into the host's own docs (`CLAUDE.md`, or the README) in this change, so the next
45
+ run reads the destination instead of creating a second file
46
+ ([`grill.md`](grill.md) → *The design destination*).
41
47
  - **Wiki:** [obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — the
42
48
  `wiki-update` skill (resolves the vault via `~/.obsidian-wiki/config`). Detect it
43
49
  the same way the harvest does; if absent, recommend it once
@@ -134,6 +134,8 @@ explicit "stop and ask me here":
134
134
  | 1 Docs | external libs/APIs/SDKs in play; any private ones context7 can't resolve → where their docs live |
135
135
  | 2 Decompose | is this a platform (several capabilities/surfaces) or one module? if platform: deploy cadence — per module or once at the end |
136
136
  | 2–3 Spec | UI verdict (arms super-ux); any scenario-tracing waiver |
137
+ | 3 Design surface | UI tasks only: **Figma on or text-only** (super-ux's project-level choice, default on — check `docs/ux/foundation.md` → *Design tooling* before asking); is the Figma MCP connected; **and if it isn't — ship text-only, or stop here and connect it?** super-ux degrades to text-only on its own and never blocks, which means an unasked question here silently ships a UI feature with no mockups |
138
+ | 3 Design file | Figma on only: **exactly which file, in which team/org** — the recorded one, or a URL the operator gives, or *create one in a named team* with that creation explicitly authorized. A destination decided at drawing time is how a project ends up with three "design" files and no way to tell which is real. See *The design destination* below |
137
139
  | 4–5 Dev | base branch; worktree/branch policy; is `main` off-limits; commit convention; task tracker |
138
140
  | 5 Integration | how the branch lands (merge / PR + approver / "leave it unmerged"); parallel fan-out wanted (one worktree per implementer)? |
139
141
  | 6 Tests | the test command; what "green" means here; known-red baseline; coverage expectation |
@@ -149,6 +151,58 @@ preconditions ("staging once lint and the full suite are green; production alway
149
151
  asks"). Specific and recorded → it satisfies the stage-7 manual gate. Broader,
150
152
  absent or ambiguous → stage 7 stops and asks.
151
153
 
154
+ ## The design destination — one file, decided here, never invented later
155
+
156
+ When the project designs in Figma, **the destination is a stage-0 decision, not a
157
+ stage-3 side effect.** Left to drawing time, the question "where do I put this?"
158
+ gets answered by whichever agent happens to be holding the brush, and the answer is
159
+ usually *create a new file* — which is how a project acquires three files called
160
+ some variation of "Design", each with real work in it and no way to tell which one
161
+ the team actually opens.
162
+
163
+ **Settle three things, in this order:**
164
+
165
+ 1. **Is there already a file?** Read `docs/ux/foundation.md` → *Design tooling*
166
+ first. A recorded, resolving file ends the question — record "use the recorded
167
+ file" and move on. Do not ask the operator something the project already answered.
168
+ 2. **Which team / organization**, by name. A file URL identifies a file; it does not
169
+ say whose workspace it lives in, and a design that lands in someone's personal
170
+ drafts instead of the team space is invisible to everyone who needs it. When the
171
+ operator belongs to several teams, the choice is theirs and it gets written down —
172
+ `whoami` tells you which are available, it does not tell you which is right.
173
+ 3. **Which file** — an existing URL the operator supplies, or **creation in that
174
+ named team, explicitly authorized.**
175
+
176
+ **Creating a file in a shared workspace is outward and irreversible enough to need a
177
+ named target.** It follows the same floor as deploy authorization above: *"create
178
+ the design file in team `Acme Product`"* authorizes one creation in one place. A
179
+ vague "set up Figma for me" does not — the whole failure this row prevents is an
180
+ agent deciding *where* on its own.
181
+
182
+ **Two rules that make it stick:**
183
+
184
+ - **Never create when a recorded file resolves.** Check before you create, every
185
+ time, in every run.
186
+ - **If the recorded file does not resolve** — deleted, moved, no access — **stop and
187
+ ask. Never create a replacement.** A replacement is exactly the duplicate this
188
+ section exists to prevent, and "I couldn't open it so I made a new one" is how it
189
+ always happens. An unreachable file is usually a permissions problem, which a new
190
+ file does not solve and does hide.
191
+
192
+ **Where it lives, and which copy wins.** `docs/ux/foundation.md` → *Design tooling*
193
+ is **canonical** — super-ux owns that section, it is per-project, and it survives
194
+ every run, which is exactly what "the agents always know which file" requires. The
195
+ brief records the **decision and the authorization** and points at it; it is a
196
+ record, not a second registry. If the two ever disagree, `foundation.md` wins and
197
+ the brief is the thing that was stale. On a project with no `docs/ux/` at all, the
198
+ brief is canonical instead, and **stage 9 writes the destination into the host's own
199
+ docs** (`CLAUDE.md` or the README) so the next run finds it without asking.
200
+
201
+ **Write it down before drawing, not after.** The URL goes into the canonical record
202
+ the moment the file is chosen or created — before the first frame. A file created
203
+ and then lost to a crashed context is worse than no file: it exists, it is empty,
204
+ and nobody knows it is there.
205
+
152
206
  ## The REQ spine — the grill's other hard output
153
207
 
154
208
  Prose scope is not checkable. Before the brief is confirmed, the grill must turn
@@ -21,6 +21,14 @@ Runs on **super-ux** — the one companion this pipeline recommends by name
21
21
  ([`companion-skills.md`](companion-skills.md)). If it isn't installed on a UI task,
22
22
  give the install line and stop; don't improvise a half-chain.
23
23
 
24
+ 0. **The design destination is already decided — read it, don't re-open it.** When
25
+ Figma is on, the stage-0 brief names the team/org and the file
26
+ ([`grill.md`](grill.md) → *The design destination*), and
27
+ `docs/ux/foundation.md` → *Design tooling* is the canonical record. Confirm the
28
+ recorded file **resolves** before any drawing. **Never create a file when a
29
+ recorded one resolves; if it doesn't resolve, stop and ask — never create a
30
+ replacement.** A creation happens at most once per project, in the team the
31
+ brief names, and its URL goes into the canonical record before the first frame.
24
32
  1. `/ux` — the single super-ux entry: reports which `docs/ux/` layers exist,
25
33
  repairs the skeleton, records the Figma on/off choice, recommends the next
26
34
  action. Never make the operator pick skills.
@@ -141,4 +149,11 @@ designed, validated and approved; `/ux-lint` green; every user-facing requiremen
141
149
  traced to a scenario ID — or an explicit waiver from the operator recorded in the
142
150
  spec.
143
151
 
152
+ With Figma on, one more, and it is mechanical: **the canonical record names a file,
153
+ and every frame link in `screens.md` carries that same file key.** Deep links are
154
+ `figma.com/design/:fileKey/…`, so this is a string comparison, not a judgement — a
155
+ link whose key differs points at a *second* file, which means the run drew
156
+ somewhere nobody will look. Same check at the audit's `F` rung
157
+ ([`audit.md`](audit.md)); if it ever fires twice, it belongs in the host's lint.
158
+
144
159
  No plan starts before this gate passes.
@@ -131,6 +131,13 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
131
131
  ssheleg/super-ux` → `/plugin install super-ux@super-ux`, or `npx skills add
132
132
  ssheleg/super-ux`). super-ux builds a traced chain — walk it top-down (see its
133
133
  `system-map.md`):
134
+ 0. **Destination first, when Figma is on.** The brief already names the team/org
135
+ and the file; `docs/ux/foundation.md` → *Design tooling* is the canonical
136
+ record. Confirm it **resolves** before drawing. **Never create a file while a
137
+ recorded one resolves; if it doesn't resolve, stop and ask — never create a
138
+ replacement** (that is the duplicate, and it hides a permissions problem).
139
+ A creation happens at most once, in the named team, and its URL is written to
140
+ the canonical record before the first frame.
134
141
  1. `/ux` (the only super-ux entry) — reports which `docs/ux/` layers exist,
135
142
  repairs the skeleton, records the Figma on/off choice, recommends the next
136
143
  action. Never make the operator pick skills.
@@ -162,7 +169,10 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
162
169
  additionally: the super-ux chain (foundation → flows → screens → scenarios) is
163
170
  designed, validated and approved; scenarios validated in `docs/ux/scenarios.md`;
164
171
  the linter passes; every user-facing spec requirement traces to a scenario ID
165
- (or an explicit v1-mode/tiny-project waiver by the operator). No plan (stage 4)
172
+ (or an explicit v1-mode/tiny-project waiver by the operator). **With Figma on:
173
+ the canonical record names one file, and every `screens.md` frame link carries
174
+ that same `:fileKey`** — a string match, not a judgement; a differing key means
175
+ the run drew in a second file nobody will open. No plan (stage 4)
166
176
  starts before this — the chain comes BEFORE interface.
167
177
 
168
178
  ## 4 — Plan
@@ -267,7 +277,12 @@ stages/agents/types (see SKILL.md → *Bring your own skills*).
267
277
  comparison needs two sides and an absence has one. So before the table: walk each
268
278
  REQ bottom-up through its rungs (decision → spec section → contract **and its
269
279
  failure behavior** → task → change → executed test → surface/docs), check the
270
- seam at each step, and order the findings **by seam, not by file**. An absence
280
+ seam at each step, and order the findings **by seam, not by file**. On UI work
281
+ designed visually, the frame is a **second, parallel statement of the same
282
+ surface**: read it against the spec section that covers its `SCR-` id and against
283
+ what shipped. The super-ux linter proves a frame link exists, is named right and
284
+ is not stale — it cannot read the picture, so a frame promising a limit, a meter
285
+ or a tier nobody built passes every lint there is. An absence
271
286
  becomes a **new REQ row with its check** and *then* the table is written;
272
287
  appending after the table is how acceptance goes green over a gap. Findings that
273
288
  belong to a lower layer go back to that layer (spec → stage 3, plan → stage 4).
@@ -83,6 +83,8 @@ is not neutral — it is a scheduled interruption.
83
83
  | 1 Docs | External libs/APIs/SDKs in play; any context7 can't resolve → where their docs live | … |
84
84
  | 2 Decompose | Platform (several capabilities/surfaces) or one module? If platform — deploy cadence: per module, or once at the end | … |
85
85
  | 2–3 Spec | UI verdict (arms super-ux); scenario-tracing waiver, if any | … |
86
+ | 3 Design surface | UI only: Figma on or text-only (check `docs/ux/foundation.md` → Design tooling first); Figma MCP connected? **If not — ship text-only, or stop and connect it?** | … (super-ux never blocks on a missing MCP, so an unanswered row here ships the feature without mockups) |
87
+ | 3 Design file | Figma on only: **which team/org + which file** — existing URL, or "create one in team `<name>`" **with creation authorized**. Canonical record: `docs/ux/foundation.md` → Design tooling | … (team: `<name>` · file: `<url>` \| `create in <team>, authorized` — never create when a recorded file resolves) |
86
88
  | 4–5 Dev | Base branch; worktree/branch policy; is `main` off-limits; commit convention; task tracker | … |
87
89
  | 5 Integration | How the branch lands — direct merge, PR (who approves), or "leave it, I'll merge"; is parallel fan-out (one worktree per implementer) wanted? | … |
88
90
  | 6 Tests | Test command; what "green" means; known-red baseline; coverage expectation | … |