task-pipeline-skill 1.47.1 → 1.48.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,95 @@
1
1
  # Changelog
2
2
 
3
+ ## v1.48.0 — a screen is the frame implemented, and four mechanisms this project owed itself
4
+
5
+ **A screen is the frame, implemented.** Until now Figma was an address and a link: the
6
+ brief recorded which file, `screens.md` carried frame URLs, the linter checked they were
7
+ not stale. Nothing said the screen is **built from** it. Now the order of authority is
8
+ fixed — `super-ux` says what the screen does, the **frame** says what it is made of, and
9
+ `sheleg-design` says how it looks and moves **where the frame is silent**, after the file
10
+ and never instead of it.
11
+
12
+ Made concrete rather than aspirational: the composition is compared against the node
13
+ tree, not recalled; layout is read from `get_design_context`, because from a screenshot
14
+ it is recovered approximately and approximate is indistinguishable from exact in a
15
+ report; a node with a Code Connect mapping is used, not reimplemented, since a rewrite
16
+ is a silent fork of the design system; and a raw hex where a variable exists is a token
17
+ that has quietly split in two.
18
+
19
+ With the honest boundary that keeps it followable: **a frame is one width.** Behaviour
20
+ at other breakpoints, and states the frame never draws — error, empty, loading — are
21
+ decisions that get **recorded**, not guessed. Without that line the rule is broken on
22
+ day one and then ignored entirely.
23
+
24
+ **No frame for a screen: build it, name it, offer to draw it, mark what gets drawn.**
25
+ Figma stays a recommendation whose absence is named and never blocks. The screen comes
26
+ from the style pack, the spec says so screen by screen, and the run offers to draw the
27
+ missing frames into the file the brief already named — which screens, where, from what,
28
+ so the size is visible before anyone says go. Drawing happens only on an explicit go,
29
+ and whatever is drawn is marked as coming from implementation. **A designer must be able
30
+ to tell a decision from a generation**; an unmarked generated frame is the same false
31
+ confidence as an unproven green.
32
+
33
+ **Another agent may be in this repository right now.** Isolation used to mean *your*
34
+ passes not colliding with each other. It now also means someone else's: a worktree per
35
+ agent, always, because sharing a checkout is what turns two independent changes into one
36
+ corrupted state — a copy taken mid-write, an edit staged into another commit, a branch
37
+ switched under a running test. And a lease before any shared register where the project
38
+ carries `.claude/agent-sync.json`, because a worktree separates files and answers nothing
39
+ about who may edit the board.
40
+
41
+ With the asymmetry that keeps the rule from becoming a licence: **on finding the other
42
+ agent mid-run, leave their work alone.** Their uncommitted edits are not yours to stage,
43
+ revert or stash. Put a ref on your own committed work so a branch reset cannot lose it,
44
+ and continue in a worktree of your own — ending someone else's work to unblock yours is
45
+ what `residue.md` refuses, one layer up.
46
+
47
+ This is measured, not feared. One session produced four version collisions, a `files[]`
48
+ entry dropped silently by a merge and caught only by the validator, and a test run that
49
+ failed because a probe copied the tree while another agent was writing to it. This
50
+ repository now carries the coordination config it was telling every other project to keep.
51
+
52
+ **Four mechanisms this project had decided on and never built.**
53
+
54
+ `DEC-0001` ruled that `SURFACED: 0` is checked against what the run filed — a run that
55
+ opened a board row and reports nothing surfaced contradicts its own artefacts, and the
56
+ `Source` column makes that computable. The decision was recorded and nothing implemented
57
+ it, which is R-006's own subject applied to a decision instead of a finding. It is a
58
+ check now, and it carries its residual in the same breath: it kills the silent zero, not
59
+ the blind spot.
60
+
61
+ `R-006` has been in force for four releases because nothing could read the distinction
62
+ it draws. Stage 10 now records, per finding, **one of two words** — `behaviour` or
63
+ `reporting`. A row saying `reporting` stays open on the board; only `behaviour` closes it.
64
+
65
+ **The release path now runs the suite it advertises.** Two releases shipped over a red
66
+ suite because the negatives ran on the PR and never on the tag. A tag is not evidence.
67
+
68
+ **And a version number already spoken for now fails at the commit rather than at the
69
+ merge.** Four collisions in one session, each costing a renumber of a whole branch.
70
+
71
+ Guards: 294 → **309**.
72
+
73
+ ## v1.47.2 — the body stopped retelling its own references
74
+
75
+ `Prerequisites` was 2585 of the body's 6585 tokens, and most of it was a second
76
+ telling: super-ux, the bridge, the grill, the harvest, the documentation gate and the
77
+ retrospective each have a reference that carries them in full. The body now keeps what
78
+ a reference cannot — the traps, and the one hard requirement — and points at the rest.
79
+
80
+ What stayed inline, deliberately: **the stage-3 spec gate stops** on a UI task with no
81
+ super-ux; the grill's single sanctioned bypass; **the retro is read two ways** and the
82
+ difference matters (standing instructions in full because they bind and are bounded,
83
+ the recent log queried because nothing caps it); a stale code graph is a false premise
84
+ **carrying the authority of a machine**, since a wrong doc gets argued with and a wrong
85
+ graph gets believed; and the operator outranks any document **only out loud**.
86
+
87
+ ~6585 → ~6180 tokens against a 5000 budget. **Still over, and the rest is not a trim.**
88
+ What remains is `How to run` and `Stages` — the operating instructions themselves —
89
+ and moving those out is a decision about what a reader must have in hand before the
90
+ first stage, not a compression exercise. It is coupled to the description question the
91
+ v1.47.0 entry recorded: both are about what this one file is obliged to carry.
92
+
3
93
  ## v1.47.1 — the fixes a reader found, which three releases shipped without
4
94
 
5
95
  v1.46.0 was tagged and published from a commit that carried this branch's doctrine and
package/HOW-IT-WORKS.md CHANGED
@@ -5,7 +5,7 @@ explains the machine — what routes a request into it, what each stage refuses
5
5
  let past, and what makes any claim it prints believable. The README sells it and
6
6
  tells you how to install it; this file tells you how it thinks.
7
7
 
8
- > **Version 1.47.1.** The "What changed" section at the bottom carries the last
8
+ > **Version 1.48.0.** The "What changed" section at the bottom carries the last
9
9
  > few releases. Everything above it describes the pipeline as it is *now*, not as
10
10
  > it was designed.
11
11
 
@@ -238,7 +238,7 @@ This is the part most pipelines skip, and it is the reason this one is trustwort
238
238
  rather than merely tidy.
239
239
 
240
240
  **Every guard is proven against a planted defect.** `npm run test:all` breaks the
241
- thing each of the **294** checks is about, and requires that check to reject it. A
241
+ thing each of the **309** checks is about, and requires that check to reject it. A
242
242
  guard that has never been watched failing is not a guard; it is a comment.
243
243
 
244
244
  **The neighbour probe.** A check has a *subject* — the rule it is about — and
@@ -291,6 +291,17 @@ a run diverges → retro entry → retro.publish → upstream issue
291
291
 
292
292
  ## What changed, by version
293
293
 
294
+ ### v1.48.0 — a screen is the frame implemented, and four mechanisms this project owed itself
295
+ Figma stops being an address and becomes the source: composition compared against the
296
+ node tree, layout read rather than eyeballed, Code Connect used rather than rewritten,
297
+ tokens naming their variables — with the honest boundary that a frame is one width, and
298
+ a no-frame branch that builds, names, offers to draw, and marks what it drew.
299
+ Plus a worktree per agent and a lease before any shared
300
+ register — measured at four version collisions in one session — the
301
+ SURFACED contradiction check DEC-0001 decided and nobody built, R-006 made readable, a
302
+ release path that runs its own suite, and a version guard that fails at the commit
303
+ rather than at the merge. Guards: 294 → 309.
304
+
294
305
  ### v1.47.1 — the fixes a reader found, which three releases shipped without
295
306
  Three releases went out from another session while this branch was reviewed, and
296
307
  each carried the same defects forward: the doc map forbidding the decisions register
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.47.1 |
15
+ | **Version** | 1.48.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` |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-pipeline-skill",
3
- "version": "1.47.1",
3
+ "version": "1.48.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 closes with evidence, a work board and a verification ledger that outlive a run, an exposure line naming what shipped unconfirmed, a progress rail computed from the project's own config, a loop guard whose review ceiling measures rather than stops, and stage-3 tracks for what a product does, how it sounds and how it looks. Two modes need no task: `checkup` (what is unverified) and `setup` (audit existing docs). Retro insights can publish upstream as issues, opt-in and redacted.",
5
- "version": "1.47.1",
5
+ "version": "1.48.0",
6
6
  "author": {
7
7
  "name": "ssheleg",
8
8
  "url": "https://x.com/sshlg93"
@@ -74,98 +74,66 @@ gate stops until it is installed.
74
74
  | run-wide · whether a **human** ever confirmed what shipped, and when | `references/verification.md` |
75
75
  | run-wide · how much unconfirmed work has piled up, and what to look at first | `references/exposure.md` |
76
76
 
77
- **Optional bridge.** If the operator already runs an equivalent skill set (e.g.
77
+ **Optional bridge.** An equivalent skill set the operator already runs (e.g.
78
78
  `superpowers:brainstorming` / `writing-plans` / `subagent-driven-development` /
79
- `using-git-worktrees` / `test-driven-development`), it can be mapped onto stages
80
- 2/4/5/6 in `pipeline.json` → `skills[]`. That is a **substitution, never a
81
- requirement**: the built-in doctrine is normative, the gates in
82
- `references/stages.md` still govern, and nothing detects, recommends or waits for
83
- an external provider.
84
-
85
- **super-ux recommended for ANY user-facing task.** The moment a task implies a
86
- user interface (web / mobile / CLI / TUI — a screen, a command, a visible
87
- behavior; the stage-0 grill detects this early), super-ux is the recommended
88
- workflow for the WHY→UI→scenario chain (`/ux`, `ux-foundation`, `ux-flows`,
89
- `ux-scenarios`, `/ux-lint`).
90
- - **Already installed?** (does `/ux` or `super-ux:ux-foundation` resolve) **use
91
- it**: `/ux` at intake, then the stage-3 UX track walks its traced chain —
92
- `ux-foundation` (personas, JTBD, CJM, stories) → `ux-flows` (user flows +
93
- `screens.md`, Figma frames when on) `ux-scenarios` (traced scenarios) the
94
- `/ux-lint` linter (`docs/ux/lint.py`) must pass. Wire that linter into the host
95
- CI/pre-commit so UX drift can't merge.
96
- - **Not installed?** recommend it and give the install line right away:
97
- ```
98
- /plugin marketplace add ssheleg/super-ux
99
- /plugin install super-ux@super-ux
100
- ```
101
- (or `npx skills add ssheleg/super-ux`). For UI tasks the spec gate **requires**
102
- it install before stage 3, otherwise stop and ask the operator to install.
103
-
104
- **The grill is built in no companion skill, nothing to install.** Stage 0 ships
105
- with this skill: the full doctrine lives in `references/grill.md`
106
- (interview loop, domain awareness, autonomy sweep, output). It is **mandatory**
107
- no "clear enough task" exemption, no starting stage 1 without a committed,
108
- operator-confirmed brief. The one sanctioned bypass is the entry-from-super-ux
109
- short-circuit, and even that demands a scope confirmation.
110
-
111
- It also produces the **REQ spine**: the request as an addressable list of
112
- requirements, each naming how it will be verified. Stages 3–5 trace to those ids,
113
- stage 4's gate is a mechanical set-comparison against them, and **stage 10 accounts
114
- for every one** — which is what turns the pipeline from a funnel into a circle.
115
-
116
- **Harvest before you ask.** Stage 0 opens with a **knowledge harvest**
117
- (`references/knowledge-sources.md`), not a
118
- question: pull what the project already knows about this task from the code, the
119
- **code graph** if one is built
120
- (`references/knowledge-graph.md` — graphify;
121
- recommended, never required),
122
- `CLAUDE.md`, `CONTEXT.md`/ADRs, **the decision register**, `docs/` + `docs/ux/`,
123
- past pipeline briefs, **the retro's standing instructions and run stamps** —
124
- `docs/superpowers/retro.md`, read in full because they *bind* this run and are
125
- bounded by construction (ten rows; one line per run), while its **recent log** and the
126
- archive under `docs/superpowers/retro/` are **queried** by the task's nouns
127
- (`references/retrospective.md`) —
128
- the **knowledge wiki** if one is installed
129
- ([obsidian-wiki](https://github.com/ar9av/obsidian-wiki) — recommended, never
130
- required) and any **other repo or hosted doc system the project names as its
131
- docs**. Write the source ledger into the brief, then interview *against* it: every
132
- answer that touches a source is checked against that source, and the operator
133
- outranks any document — but only out loud, so an override is a recorded decision
134
- instead of an undetected divergence. The same ledger is stage 9's work list.
79
+ `using-git-worktrees` / `test-driven-development`) can be mapped onto stages 2/4/5/6
80
+ in `pipeline.json` → `skills[]`. That is a **substitution, never a requirement**: the
81
+ built-in doctrine is normative, the gates in `references/stages.md` still govern, and
82
+ nothing detects, recommends or waits for an external provider.
83
+
84
+ **super-ux — recommended for ANY user-facing task**, and the one thing that can stop a
85
+ gate. The moment a task implies an interface (web / mobile / CLI / TUI — the stage-0
86
+ grill detects it early), the WHY→UI→scenario chain runs through `/ux`,
87
+ `ux-foundation`, `ux-flows`, `ux-scenarios` and the `/ux-lint` linter, which belongs in
88
+ the host's CI so UX drift cannot merge. **Not installed on a UI task? The stage-3 spec
89
+ gate stops** — offer `/plugin marketplace add ssheleg/super-ux` and
90
+ `/plugin install super-ux@super-ux` (or `npx skills add ssheleg/super-ux`) and wait.
91
+ Details: `references/companion-skills.md`.
92
+
93
+ **The grill is built in and mandatory** (`references/grill.md`). No "clear enough task"
94
+ exemption, no stage 1 without a committed, operator-confirmed brief; the one sanctioned
95
+ bypass is the entry-from-super-ux short-circuit, and even that demands a scope
96
+ confirmation. It produces the **REQ spine** the request as an addressable list, each
97
+ row naming how it is verified. Stages 3–5 trace to those ids, stage 4's gate is a
98
+ mechanical set-comparison against them, and **stage 10 accounts for every one**, which
99
+ is what turns the pipeline from a funnel into a circle.
100
+
101
+ **Harvest before you ask** (`references/knowledge-sources.md`). Stage 0 opens by
102
+ pulling what the project already knows about *this* task the code and its graph,
103
+ `CLAUDE.md`, `CONTEXT.md`/ADRs, the decision register, `docs/` and `docs/ux/`, past
104
+ briefs, the wiki, and whatever else the project names as its docs. **The retro is read
105
+ two ways and the difference matters:** its standing instructions and run stamps are
106
+ read **in full** because they bind this run and are bounded by construction; its recent
107
+ log and archive are **queried** by the task's nouns, because nothing caps them
108
+ (`references/retrospective.md`). Write the source ledger into the brief and interview
109
+ *against* it: every answer touching a source is checked against it, and the operator
110
+ outranks any document — **but only out loud**, so an override is a recorded decision
111
+ rather than an undetected divergence. That ledger is also stage 9's work list.
135
112
 
136
113
  **Three artifacts close a run, not two.** Stage 9 syncs the docs, the wiki **and the
137
- code graph** (`/graphify . --update`) the graph is what the *next* run's harvest
138
- queries first, so a stale one is a false premise carrying the authority of a
139
- machine. Refreshing it also buys the **graph↔docs divergence check**: a hub no
140
- document names, an edge the docs deny, a doc naming a module the graph no longer
141
- has. Doc-side findings are fixed at stage 9; absences become REQ rows at stage 10
142
- (`references/knowledge-graph.md`,
143
- `references/audit.md`).
144
-
145
- **Documentation is a deliverable, and it has a gate**
146
- (`references/documentation.md`). Stage 0's harvest
147
- reads what the project knows; a second phase asks the four questions that make it a
148
- *system* where settled things live, what each fact's single home is, what a change
149
- of type X obliges, and what proves it and writes them to `docs/DOCMAP.md`. From
150
- then on the **Doc Loop** fires whenever anything is settled, at **any** stage, not
151
- only at stage 9; the stage-9 sweep walks the **propagation matrix** (the harvest
152
- ledger names what you *read*, the matrix names what you *owe*); and *"docs in sync"*
153
- stops being an assertion and becomes a command with an exit code. Governance is a
154
- by-product: the run already produces decisions, so recording one is transcription
155
- plus a stable id, never a second act of thinking.
156
-
157
- **The run teaches the next run and the list stays short.** Every gate is good at
158
- *this* run and blind across runs, so the same class of failure can be caught, fixed
159
- and forgotten five times with nothing noticing it is the same one. The last act of
160
- stage 10 is therefore the **retrospective**
161
- (`references/retrospective.md`, written to
162
- `docs/superpowers/retro.md`): **stamp the run first** — one line, and the only thing
163
- that makes the next step computable — **then prune**, every standing instruction
164
- checked against its retirement triggers (it became a check · its surface is gone · it
165
- hasn't fired in five run stamps **or in sixty days** — the calendar is the unit that
166
- still moves when the stamp counter has stopped), the list held to a hard cap of **ten**, every
167
- deletion logged, then write an entry **only if the run diverged** (symptom, the
168
- stage that *owned* it, root cause, fix, and the check that catches it next time).
114
+ code graph** (`/graphify . --update`). The graph is what the next run's harvest queries
115
+ first, so a stale one is a false premise **carrying the authority of a machine** —
116
+ a wrong doc gets argued with, a wrong graph gets believed. Refreshing it buys the
117
+ graph↔docs divergence check; doc-side findings are fixed at stage 9, absences become
118
+ REQ rows at stage 10 (`references/knowledge-graph.md`, `references/audit.md`).
119
+
120
+ **Documentation is a deliverable, and it has a gate** (`references/documentation.md`).
121
+ A second stage-0 phase asks the four questions that make docs a *system* — where
122
+ settled things live, each fact's single home, what a change of type X obliges, what
123
+ proves it — and writes them to `docs/DOCMAP.md`. From then the **Doc Loop** fires
124
+ whenever anything is settled, at **any** stage rather than only at stage 9; the stage-9
125
+ sweep walks the **propagation matrix** (the harvest ledger names what you *read*, the
126
+ matrix names what you *owe*); and *"docs in sync"* becomes a command with an exit code.
127
+
128
+ **The run teaches the next run, and the list stays short**
129
+ (`references/retrospective.md`). Every gate is good at *this* run and blind across
130
+ runs, so one class of failure can be caught, fixed and forgotten five times with
131
+ nothing noticing it is the same one. Stage 10's last act: **stamp the run first** — the
132
+ only thing that makes the next step computable **then prune** every standing
133
+ instruction against its retirement triggers, hold the list to a hard cap of **ten**,
134
+ log every deletion, and write an entry **only if the run diverged** (symptom, the stage
135
+ that *owned* it, root cause, fix, and the check that catches it next time).
136
+
169
137
  Stage 0 reads those standing instructions in full, which is exactly why the prune is
170
138
  a gate criterion and not a good intention: a rule nobody reads to the end is worse
171
139
  than no rule, because everyone believes it is covered. **The order is load-bearing,
@@ -311,6 +311,11 @@ table substitute for that answer.
311
311
  its four registers with their ids. A run that cannot say what happened has not
312
312
  finished; it has stopped. This file is the one stage 10 opens, and it carried every
313
313
  other criterion while omitting this one for a release.
314
+ 12a. **Every finding closed in this run records which changed — the behaviour or
315
+ only the reporting.** One of two words per finding, `behaviour` or `reporting`,
316
+ beside its id. Reporting a gap honestly is not fixing it, and the two have
317
+ looked identical in every close-out that did not say which. A finding whose row
318
+ says `reporting` stays open on the board with its id; only `behaviour` closes it.
314
319
  13. **The run has given the environment back** ([`residue.md`](residue.md)) — all
315
320
  eight classes enumerated **by class, never by one tool**, everything this run
316
321
  started ended in dependency order, each teardown verified by **re-enumerating
@@ -41,9 +41,11 @@ reviewer's.
41
41
  ## Contents
42
42
 
43
43
  - 1. Isolation
44
+ - 1a. Another agent may be in this repository right now
44
45
  - 2. Workspace and ledger
45
46
  - 3. Models
46
47
  - 4. The task loop
48
+ - 4a. A screen is the frame, implemented
47
49
  - 5. Final whole-branch review
48
50
  - 6. Integrate, then finish
49
51
  - GATE (auto)
@@ -93,6 +95,36 @@ download`), then run the test command from the brief's autonomy sweep. A dirty
93
95
  baseline makes every later failure ambiguous: report failures and let the operator
94
96
  decide whether to proceed.
95
97
 
98
+ ## 1a. Another agent may be in this repository right now
99
+
100
+ Isolation above is about *your* passes not colliding with each other. This is about
101
+ someone else's.
102
+
103
+ **Check before you start, and check by looking rather than by assuming.** A second
104
+ agent leaves traces: uncommitted changes you did not make, a branch that moved under
105
+ you, a version number that was free an hour ago and is taken now. The cost is not
106
+ hypothetical — one session measured four version collisions, a `files[]` entry dropped
107
+ silently by a merge, and a test run that failed because a probe copied the tree while
108
+ someone else was writing to it.
109
+
110
+ **Two mechanisms, and they answer different questions.**
111
+
112
+ 1. **A worktree per agent, always.** Sharing a checkout is what turns two independent
113
+ changes into one corrupted state: a copy taken mid-write, an edit staged into
114
+ somebody else's commit, a branch switched under a running test. `git worktree add`
115
+ costs nothing and removes the class outright. Never work in a tree another agent is
116
+ editing, even briefly, even to "just check something".
117
+ 2. **A lease before any shared register.** Where the project has
118
+ `.claude/agent-sync.json`, the board, the decisions register, the open questions and
119
+ the roadmap are claimed before they are edited — that is what the file is for. Where
120
+ it does not exist, say so in the brief rather than discovering it at merge time.
121
+
122
+ **What to do when you find the other agent mid-run:** stop, name what you found, and
123
+ leave their work alone. Their uncommitted edits are not yours to stage, revert or
124
+ stash. Your own committed work is safe; put a ref on it so a branch reset cannot lose
125
+ it, and continue in a worktree of your own. Ending someone else's work to unblock
126
+ yourself is the same asymmetry `residue.md` refuses, one layer up.
127
+
96
128
  ## 2. Workspace and ledger
97
129
 
98
130
  Conversation memory does not survive compaction. A controller that lost its place
@@ -392,6 +424,60 @@ When the review is clean — or every open finding is parked with a ruling at th
392
424
  Mark the todo complete, move on. Never start the next task while Critical/Important
393
425
  findings are neither fixed nor parked-with-ruling at the cap.
394
426
 
427
+ ## 4a. A screen is the frame, implemented
428
+
429
+ When Figma is connected, a screen is not *informed by* the design file — it **is** the
430
+ frame, in code. Values, structure and composition all come from the file, and the order
431
+ of authority is fixed:
432
+
433
+ | Question | Answer comes from |
434
+ |---|---|
435
+ | what the screen **does** — states, errors, empties | `super-ux`'s scenarios |
436
+ | what it is **made of** — elements, hierarchy, layout, tokens | **the frame** |
437
+ | how it **looks and moves** where the frame is silent | `sheleg-design` |
438
+
439
+ `sheleg-design` runs **after** the file, never instead of it. It owns rhythm, motion and
440
+ motion's degradation to stillness — the things a frame does not carry. Put it first and
441
+ it invents what was already decided.
442
+
443
+ **Five things this makes concrete.**
444
+
445
+ 1. **The composition is compared, not recalled.** A frame has a node tree
446
+ (`get_metadata`). Every node has a counterpart in the screen, and nothing is present
447
+ that the frame does not have. A missing element is incomplete; an invented one is a
448
+ divergence, not an improvement.
449
+ 2. **Layout is read, not eyeballed.** Auto-layout direction, gaps, padding and
450
+ constraints come from `get_design_context`. From a screenshot they are recovered
451
+ approximately, and approximate is indistinguishable from exact in a report.
452
+ 3. **A component with a Code Connect mapping is not rewritten.** If
453
+ `get_code_connect_map` names a code component for that node, the screen uses it.
454
+ Reimplementing it is a silent fork of the design system.
455
+ 4. **A token names its variable.** A raw hex or px where the file has a variable is a
456
+ token that has quietly split in two. `get_variable_defs` is the canon; a screenshot
457
+ is a way to *look*, never a way to *know*.
458
+ 5. **The frame is a contract at its own width.** It is one width and said nothing about
459
+ the others, so behaviour at other breakpoints — and states the frame does not draw,
460
+ like error, empty and loading — is a **decision that gets recorded**, not guessed.
461
+ Without this the rule is either unfollowable or vacuous.
462
+
463
+ **When there is no frame for a screen — build it, name it, offer to draw it.**
464
+
465
+ Figma is a recommendation like the graph and the wiki: its absence is named and never
466
+ blocks. So the screen is built from `sheleg-design`'s style pack, the spec records
467
+ *"no frame — source: sheleg-design"*, and the run **offers to draw the missing screens**
468
+ into the file the brief already named. Concretely: which screens, where they land, what
469
+ they are drawn from — so the operator sees the size before saying go.
470
+
471
+ Drawing happens **only on an explicit go**, into the recorded destination, never into a
472
+ new file. And whatever is drawn is **marked as coming from implementation** — its own
473
+ page or a naming convention that says so. A designer opening the file must be able to
474
+ tell what a person decided from what a run generated; an unmarked generated frame is the
475
+ same false confidence as an unproven green.
476
+
477
+ **Deviation is a line, not a silence.** Where the implementation must differ — a
478
+ platform constraint, an accessibility floor, a breakpoint — write what and why.
479
+ Otherwise *"built from the frame"* and *"built to look like it"* read identically.
480
+
395
481
  ## 5. Final whole-branch review
396
482
 
397
483
  After the last task: build a package over `MERGE_BASE`..`HEAD`
@@ -303,6 +303,12 @@ Three things make the line worth writing rather than a habit:
303
303
  - **It records how many classes were enumerated.** `8/8` and `7/8, unlooked:
304
304
  containers` are different facts, and a run without container tooling must print
305
305
  the second rather than a clean zero it did not earn.
306
+ - **`SURFACED: 0` is checked against what the run filed.** A run that opened a board
307
+ row, a carry-over row, an open question or a retro entry has provably surfaced
308
+ something; reporting zero contradicts its own artefacts, and that disagreement is
309
+ computable from the `Source` column every board row carries. The residual belongs
310
+ in the same sentence: a run can surface something, file it nowhere, report zero,
311
+ and **nothing will notice** — this check kills the silent zero, not the blind spot.
306
312
  - **It is a disclosure, never a ratchet.** No floor, no direction, no target. A
307
313
  build stage legitimately holding a worktree and a database prints `2` and
308
314
  passes; a run that tears its database down to make the number tidy and brings
@@ -54,6 +54,13 @@ give the install line and stop; don't improvise a half-chain.
54
54
  5. **Run the linter** (`/ux-lint`, i.e. `python3 docs/ux/lint.py`). It must pass:
55
55
  no drift, no orphans, no broken traces, no stale Figma links.
56
56
 
57
+ **The screen's source of truth is recorded here, not assumed.** Figma on → the frame
58
+ supplies composition, layout and tokens, and `sheleg-design` supplies only what the
59
+ frame is silent about. Figma off, or no frame for this screen → the style pack is the
60
+ source and the spec says so, screen by screen. A screen whose values were taken from a
61
+ screenshot is named as such: *sighted* and *read from the file* are different claims
62
+ ([`build.md`](build.md) → *A screen is the frame, implemented*).
63
+
57
64
  These skills are **idempotent** — extend the existing `docs/ux/` layers, never
58
65
  rebuild them. If the chain already exists and is validated (typically when the run
59
66
  entered from super-ux), verify it and embed it; build only what's missing.