@tacuchi/agent-workflow-cli 20.26.0 → 21.0.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/README.md +1 -1
- package/dist/adapters/node-file-system.js +3 -0
- package/dist/adapters/node-file-system.js.map +1 -1
- package/dist/application/design/design-gate-service.js +246 -0
- package/dist/application/design/design-gate-service.js.map +1 -0
- package/dist/application/design/design-graph-service.js +85 -0
- package/dist/application/design/design-graph-service.js.map +1 -0
- package/dist/application/design/design-index-service.js +132 -0
- package/dist/application/design/design-index-service.js.map +1 -0
- package/dist/application/design/design-publish-service.js +488 -0
- package/dist/application/design/design-publish-service.js.map +1 -0
- package/dist/application/design/design-resolver-service.js +165 -0
- package/dist/application/design/design-resolver-service.js.map +1 -0
- package/dist/application/resume-service.js +23 -4
- package/dist/application/resume-service.js.map +1 -1
- package/dist/application/semantic-operation/protocol.js +18 -12
- package/dist/application/semantic-operation/protocol.js.map +1 -1
- package/dist/application/semantic-operation/publish.js +56 -9
- package/dist/application/semantic-operation/publish.js.map +1 -1
- package/dist/application/skills-resolver-service.js +19 -4
- package/dist/application/skills-resolver-service.js.map +1 -1
- package/dist/application/status-service.js +1 -0
- package/dist/application/status-service.js.map +1 -1
- package/dist/application/workline-index-service.js +6 -0
- package/dist/application/workline-index-service.js.map +1 -1
- package/dist/application/workspace-init-service.js +9 -1
- package/dist/application/workspace-init-service.js.map +1 -1
- package/dist/cli/commands/designs.js +110 -0
- package/dist/cli/commands/designs.js.map +1 -0
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/resume.js +8 -0
- package/dist/cli/commands/resume.js.map +1 -1
- package/dist/cli/commands/status.js +45 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/help-groups.js +3 -0
- package/dist/cli/help-groups.js.map +1 -1
- package/dist/cli/parser.js +1 -0
- package/dist/cli/parser.js.map +1 -1
- package/dist/domain/design/artifact-body.js +223 -0
- package/dist/domain/design/artifact-body.js.map +1 -0
- package/dist/domain/design/artifact.js +606 -0
- package/dist/domain/design/artifact.js.map +1 -0
- package/dist/domain/design/baseline.js +359 -0
- package/dist/domain/design/baseline.js.map +1 -0
- package/dist/domain/design/capability.js +51 -0
- package/dist/domain/design/capability.js.map +1 -0
- package/dist/domain/design/closure.js +161 -0
- package/dist/domain/design/closure.js.map +1 -0
- package/dist/domain/design/governance.js +298 -0
- package/dist/domain/design/governance.js.map +1 -0
- package/dist/domain/design/identity.js +145 -0
- package/dist/domain/design/identity.js.map +1 -0
- package/dist/domain/design/manifest.js +552 -0
- package/dist/domain/design/manifest.js.map +1 -0
- package/dist/domain/design/maturity.js +234 -0
- package/dist/domain/design/maturity.js.map +1 -0
- package/dist/domain/design/naming.js +117 -0
- package/dist/domain/design/naming.js.map +1 -0
- package/dist/domain/design/projections.js +165 -0
- package/dist/domain/design/projections.js.map +1 -0
- package/dist/domain/design/reference.js +234 -0
- package/dist/domain/design/reference.js.map +1 -0
- package/dist/domain/design/retired.js +61 -0
- package/dist/domain/design/retired.js.map +1 -0
- package/dist/domain/design/revision.js +219 -0
- package/dist/domain/design/revision.js.map +1 -0
- package/dist/domain/design/secrets.js +86 -0
- package/dist/domain/design/secrets.js.map +1 -0
- package/dist/domain/design/validation.js +75 -0
- package/dist/domain/design/validation.js.map +1 -0
- package/dist/domain/design/yaml-subset.js +390 -0
- package/dist/domain/design/yaml-subset.js.map +1 -0
- package/dist/domain/safe-path.js +23 -0
- package/dist/domain/safe-path.js.map +1 -0
- package/dist/domain/skills.js +27 -3
- package/dist/domain/skills.js.map +1 -1
- package/package.json +1 -1
- package/skills/w/SKILL.md +10 -8
- package/skills/w/artifacts/README.md +3 -4
- package/skills/w/artifacts/artifacts-core/CHECKPOINT.md +2 -2
- package/skills/w/commands/plan-exec.md +11 -5
- package/skills/w/commands/plan-new.md +6 -2
- package/skills/w/commands/plan-refine.md +6 -3
- package/skills/w/commands/quick.md +2 -2
- package/skills/w/commands/spec-new.md +2 -2
- package/skills/w/commands/spec-refine.md +1 -0
- package/skills/w/context/MANIFEST.json +19 -8
- package/skills/w/loops/CHASSIS.md +2 -2
- package/skills/w/loops/CODE-POLICIES.md +22 -7
- package/skills/w/loops/README.md +1 -1
- package/skills/w/loops/plan-exec-loop/LOOP.md +127 -61
- package/skills/w/loops/plan-new-loop/LOOP.md +66 -70
- package/skills/w/loops/plan-refine-loop/LOOP.md +15 -7
- package/skills/w/loops/spec-refine-loop/LOOP.md +14 -12
- package/skills/w/modules/DESIGN-REFERENCES.md +109 -0
- package/skills/w/modules/PERSIST-ROUTING.md +1 -0
- package/skills/w/modules/PLAN-EXECUTION-BATCHES.md +84 -0
- package/skills/w/roles/README.md +7 -5
- package/skills/w/roles/design/ROLE.md +217 -0
- package/skills/w/schemas/design/design-baseline.v1.schema.json +71 -0
- package/skills/w/schemas/design/design-manifest.v1.schema.json +322 -0
- package/skills/w/schemas/design/design-review.v1.schema.json +72 -0
- package/skills/w/schemas/design/design-revocation.v1.schema.json +54 -0
- package/skills/w/schemas/design/ui-flow.v1.schema.json +211 -0
- package/skills/w/schemas/design/ui-screen.v1.schema.json +214 -0
- package/skills/w/artifacts/artifacts-design/SPEC.md +0 -42
- package/skills/w/modules/PLAN-DESIGN-SPECS.md +0 -12
- package/skills/w/modules/PLAN-REFINE-DESIGN-SPECS.md +0 -7
- package/skills/w/roles/ui-spec/ROLE.md +0 -147
|
@@ -6,7 +6,7 @@ description: >-
|
|
|
6
6
|
(loops/CHASSIS.md). Deltas: functional journey map, phases re-shaped by
|
|
7
7
|
verifiable state (contract in plan-new-loop), simulation lifecycle,
|
|
8
8
|
evidence by behavior, executability gate, replanning of partially executed
|
|
9
|
-
plans, and design
|
|
9
|
+
plans, and design revisions scoped to the delta on UI changes. Started by
|
|
10
10
|
/w:plan-refine — also the return path when plan-exec stops on a structural
|
|
11
11
|
deviation; resumable and re-runnable on demand.
|
|
12
12
|
---
|
|
@@ -31,6 +31,11 @@ This loop turns a plan into a sequence of **verifiable states of the system**. E
|
|
|
31
31
|
|
|
32
32
|
The phase contract is defined **once** in [`plan-new-loop`](../plan-new-loop/LOOP.md) § *Phase contract (canonical)* — this loop **applies** it and never redefines it: a `### Fn` block is a state the system reaches, with its `> Estado:` line, its work, its evidence and its exit condition.
|
|
33
33
|
|
|
34
|
+
The plan's execution-unit interface is likewise defined once in
|
|
35
|
+
[`PLAN-EXECUTION-BATCHES`](../../modules/PLAN-EXECUTION-BATCHES.md). This loop re-infers and
|
|
36
|
+
writes its complete phase partition; it never asks the human to choose an optimization the repo
|
|
37
|
+
can establish.
|
|
38
|
+
|
|
34
39
|
## Auxiliary / NOT mandatory
|
|
35
40
|
`plan-exec` runs **any** plan that is already executable, refined or not — there is **no** gate requiring plan-refine. This loop exists to incorporate changes (new requirements, scope adjustments, deps/risks spotted on re-read) **before** executing, and to give an unexecutable plan the shape its execution needs, without regenerating it from scratch.
|
|
36
41
|
|
|
@@ -41,7 +46,7 @@ The phase contract is defined **once** in [`plan-new-loop`](../plan-new-loop/LOO
|
|
|
41
46
|
`docs/plans/PPP-plan-*.md` (glob — locates the plan by number; or the exact path from the command argument). **Always the plan itself**: this loop edits it in place; there is no separate "refined" file. Provenance is irrelevant — generated by `plan-new`, **hand-written, or adopted** from a host planner (`plan-new` mode 4 / `persist`); existence is the only requirement.
|
|
42
47
|
|
|
43
48
|
## Writes
|
|
44
|
-
Updates `docs/plans/PPP-plan-<slug>.md` **in place** (when the user picks `Guardar plan refinado`): completes/adjusts sections and **adds** `## Refinement decisions`. Since it overwrites an existing doc, it asks the user's **confirmation**. On an accepted split (§ *Split gate — refine semantics*) it also **creates** the extracted sibling plans (newly minted `docs/plans` files). It writes
|
|
49
|
+
Updates `docs/plans/PPP-plan-<slug>.md` **in place** (when the user picks `Guardar plan refinado`): completes/adjusts sections and **adds** `## Refinement decisions`. Since it overwrites an existing doc, it asks the user's **confirmation**. On an accepted split (§ *Split gate — refine semantics*) it also **creates** the extracted sibling plans (newly minted `docs/plans` files). It writes `docs/plans` and, when the refine **touches UI**, the **revision it publishes** — scoped to the artifacts the delta actually affects — of the design package under `docs/designs` (chassis § *docs/ boundary*; see [`DESIGN-REFERENCES.md`](../../modules/DESIGN-REFERENCES.md)). It never graduates/exports anything else to `docs/` — that is separate `export-*` work.
|
|
45
50
|
|
|
46
51
|
## Inherits
|
|
47
52
|
|
|
@@ -57,7 +62,8 @@ Full doctrine in the chassis (§ *Internal sessions* + *Numbering*). This loop's
|
|
|
57
62
|
|
|
58
63
|
## Delta 1 — Deliverable: the PLAN, edited in place
|
|
59
64
|
|
|
60
|
-
The plan uses the **same skeleton** [`plan-new-loop`](../plan-new-loop/LOOP.md) produces
|
|
65
|
+
The plan uses the **same skeleton** [`plan-new-loop`](../plan-new-loop/LOOP.md) produces, including
|
|
66
|
+
the core `## Execution batches` section. plan-refine completes it in place and adds one trace:
|
|
61
67
|
|
|
62
68
|
```markdown
|
|
63
69
|
## Refinement decisions ← NEW (ADDED) — the run's single trace
|
|
@@ -123,6 +129,7 @@ This loop's instance of the chassis convergence gate — the same one `plan-exec
|
|
|
123
129
|
- **Phases** — each leaves a verifiable state with its exit condition, none is a list of layers or files, the order allows early integration, deferrals are explicit.
|
|
124
130
|
- **Simulation** *(only when the change carries one)* — initial boundary identified, every displacement foreseen, one phase owns the retirement, nothing can stay active by accident. No temporary behavior → the check does not apply, and no empty `Límite de simulación` is required.
|
|
125
131
|
- **Evidence** — every phase declares its primary proof, per-layer tests are justified, the same scenario is not duplicated by default, declared risks have evidence or an explicit deferral.
|
|
132
|
+
- **Execution batches** — every phase appears once; maximal continuous ranges cross no decision, proof, handoff, irreversible action or required recovery boundary.
|
|
126
133
|
- **Resumability** — tasks legible enough for a `CHECKPOINT`, intermediate states stable, pending work distinguishable from work already `validada`.
|
|
127
134
|
|
|
128
135
|
## Sequence
|
|
@@ -135,17 +142,18 @@ plan-refine-loop(plan):
|
|
|
135
142
|
work = read(plan) (+ the spec if realignment is needed; + checkpoint/exec history if resuming or returning from plan-exec)
|
|
136
143
|
journey = map(observable contract, technical journey, incremental strategy, evidence) # bounded research
|
|
137
144
|
work = phases grouped by verifiable state (phase contract) + simulation lifecycle if any + primary proof each
|
|
145
|
+
work.Execution batches = infer maximal phase partition (PLAN-EXECUTION-BATCHES)
|
|
138
146
|
keep validated phases and their completed tasks; redesign ONLY pending work
|
|
139
147
|
repeat: # chassis engine
|
|
140
148
|
gaps = detect_gaps(work) (plan-new taxonomy + plan↔spec drift) minus the exhausted ones
|
|
141
149
|
if gaps == ∅: break
|
|
142
150
|
batch ≤3 → seed CHECKPOINT.Pending/Next → resolve each gap:
|
|
143
151
|
research (scoped to the delta — Delta 3) · human (structured-choice) · probe (chassis) ·
|
|
144
|
-
|
|
152
|
+
design (revisions only for the artifacts this refine affects; behavior/acceptance → spec-refine first)
|
|
145
153
|
integrate + update CHECKPOINT # artifact-first cycle
|
|
146
154
|
executability gate (read-only) = Success criteria green:
|
|
147
|
-
- contract · journey · phases · simulation · evidence · resumability (§ Executability gate)
|
|
148
|
-
- plan-new checklist (criterion→task · Final behavior block of Solution · deps · Impacted↔Solution · UI→
|
|
155
|
+
- contract · journey · phases · simulation · evidence · execution batches · resumability (§ Executability gate)
|
|
156
|
+
- plan-new checklist (criterion→task · Final behavior block of Solution · deps · Impacted↔Solution · UI→exact roots · minimality)
|
|
149
157
|
# spec-less plan (adopted/hand-written): criteria anchor to the plan's own Final behavior block/Validations (see Delta 2)
|
|
150
158
|
- re-refine's own check: the plan is REALIGNED with what changed
|
|
151
159
|
whatever fails → comes back as a gap
|
|
@@ -169,7 +177,7 @@ finalize: CHECKPOINT persisted (+ BACKLOG only if something is deferred) + close
|
|
|
169
177
|
|
|
170
178
|
## Conditional modules
|
|
171
179
|
|
|
172
|
-
- `ui` — design
|
|
180
|
+
- `ui` — the design closure, the roots, and this loop's delta rule → `../../modules/DESIGN-REFERENCES.md`
|
|
173
181
|
- `simulation` — the life of temporary behavior → `../../modules/SIMULATION-LIFECYCLE.md`
|
|
174
182
|
- `replan` — replanning executed work → `../../modules/REPLANNING.md`
|
|
175
183
|
- `split` — splitting a plan in place → `../../modules/PLAN-REFINE-SPLIT.md`
|
|
@@ -5,8 +5,8 @@ description: >-
|
|
|
5
5
|
until PLAN can design without inventing behavior, scope or product
|
|
6
6
|
decisions. Heir of the chassis (loops/CHASSIS.md). Deltas: current-behavior
|
|
7
7
|
baseline, change-shape gate, gap taxonomy classified by destination,
|
|
8
|
-
conditional ideation gate, ##
|
|
9
|
-
ready-for-plan gate that stamps the status frontmatter plan-new reads.
|
|
8
|
+
conditional ideation gate, ## Design references via the design capability, and
|
|
9
|
+
the ready-for-plan gate that stamps the status frontmatter plan-new reads.
|
|
10
10
|
Started by /w:spec-refine (or the live escalation from quick-loop);
|
|
11
11
|
resumable via CHECKPOINT and re-runnable on demand.
|
|
12
12
|
---
|
|
@@ -50,7 +50,7 @@ Updates `docs/specs/NNN-spec-<slug>.md` **in place** (when the user picks `Guard
|
|
|
50
50
|
|
|
51
51
|
> **Not every shape decision creates a file** (§ *Change-shape gate*). An accepted **split** writes the reduced original **and** the extracted sibling specs; a replacement by **`Crear una nueva spec`** writes one new file and leaves this one untouched; **`Reformular esta spec`** creates nothing — it edits this same file, same number, same path. Every write, new or overwriting, is confirmed first.
|
|
52
52
|
|
|
53
|
-
> **Boundary invariant:** this loop writes **only** into `docs/specs
|
|
53
|
+
> **Boundary invariant:** this loop writes **only** into `docs/specs` and, when the requirement involves UI, the **design package** it composes under `docs/designs` (chassis § *docs/ boundary* — the package is the capability's own deliverable, not a graduated artifact). It never graduates/exports anything else to `docs/` — that is separate `export-*` work.
|
|
54
54
|
|
|
55
55
|
## Internal sessions — SPEC instance
|
|
56
56
|
|
|
@@ -66,9 +66,9 @@ Full doctrine in the chassis (§ *Internal sessions* + *Numbering*). This loop's
|
|
|
66
66
|
|
|
67
67
|
## Composes
|
|
68
68
|
|
|
69
|
-
The **UI unspecified** gap (when the requirement involves UI; see *Gap taxonomy*) is resolved by
|
|
69
|
+
The **UI unspecified** gap (when the requirement involves UI; see *Gap taxonomy*) is resolved by the composed **`design`** capability ([`../../roles/design/ROLE.md`](../../roles/design/ROLE.md)) over the **UI Design Package v1**: reuse a compatible baseline or open an `outline` revision, publish it through the CLI, and leave in the spec **only** its `## Design references` — package, baseline hint and digest. The loop contributes iteration/Q&A (design system, theme, variants, disambiguation) **via the same structured-choice**; the capability contributes what a correct package looks like. Full rule: [`DESIGN-REFERENCES.md`](../../modules/DESIGN-REFERENCES.md).
|
|
70
70
|
|
|
71
|
-
> **Two levels of the same capability:** here (SPEC)
|
|
71
|
+
> **Two levels of the same capability:** here (SPEC) the design closes at `outline` and the spec keeps its exact reference; in PLAN the plan loops promote to `handoff` exactly the closure they implement and pin the exact roots (see [`DESIGN-REFERENCES.md`](../../modules/DESIGN-REFERENCES.md)). One package, two questions — never two formats.
|
|
72
72
|
|
|
73
73
|
Other transversal capabilities the engine always uses: `research` (**inline** — chassis § *Research*), `sql` (DB rule inside research — chassis). All resolved by config; `off` → the loop continues without the capability and, if it was needed, says so or asks. The spec's **prose** follows the **ambient** writing conventions (the host auto-applies an installed writing skill if present), not a composed role.
|
|
74
74
|
|
|
@@ -106,8 +106,8 @@ status: ready-for-plan ← stamped on Guardar (vocabulary: draft | refining |
|
|
|
106
106
|
does not capture — NEVER a 1:1 restatement of a criterion)
|
|
107
107
|
## Assumptions (declared)
|
|
108
108
|
|
|
109
|
-
##
|
|
110
|
-
|
|
109
|
+
## Design references (opt. — if UI is involved; via the composed design capability)
|
|
110
|
+
The exact package, baseline hint and digest — never the design itself. See [`design`](../../roles/design/ROLE.md).
|
|
111
111
|
|
|
112
112
|
## Decisions ← ADDED — the material decisions, NOT the run's history
|
|
113
113
|
The choices a reader needs in order to interpret the contract, each with its why.
|
|
@@ -140,7 +140,7 @@ The choices a reader needs in order to interpret the contract, each with its why
|
|
|
140
140
|
| Hidden assumptions | the spec assumes unstated things | **research** validates / **human** confirms | SPEC |
|
|
141
141
|
| Over-specified requirement | scope/criteria gold-plated — beyond the actual need (chassis § *Minimality*) | **human** (AI proposes the cut, human ratifies) | SPEC |
|
|
142
142
|
| Unexplored solution space *(conditional)* | the spec settles on the first conceivable approach **and** a trigger fires (see *Ideation gate*) | **human consents** → **ideation** | SPEC — only on a trigger |
|
|
143
|
-
| UI unspecified *(if it applies)* | the requirement involves UI but `##
|
|
143
|
+
| UI unspecified *(if it applies)* | the requirement involves UI but `## Design references` is missing | composed **`design`** capability | SPEC |
|
|
144
144
|
| Architecture | how to distribute technical responsibilities | — | **`PLAN`** — declare, never close here |
|
|
145
145
|
| Implementation | library, class, method, pattern, folder layout | — | **`PLAN`** / `EXEC` — outside the spec |
|
|
146
146
|
| Executable technical risk | whether an integration really works | — | **`PLAN`** (probe), unless the answer changes the contract |
|
|
@@ -180,9 +180,10 @@ spec-refine-loop(spec):
|
|
|
180
180
|
batch = top ≤3 blocking ; pending_human = [] # gap questions ONLY — the shape was resolved above
|
|
181
181
|
seed CHECKPOINT.Pending/Next = batch (refine_session) # BEFORE: seed the intent (artifact-first)
|
|
182
182
|
for each gap in batch:
|
|
183
|
-
if gap = UI (requirement involves UI, ##
|
|
184
|
-
compose
|
|
185
|
-
|
|
183
|
+
if gap = UI (requirement involves UI, ## Design references missing):
|
|
184
|
+
compose design → reuse a compatible baseline OR publish an `outline` revision
|
|
185
|
+
# design-system/theme via structured-choice (counts in the batch)
|
|
186
|
+
work = integrate(work, design) # → ## Design references (package + hint + digest)
|
|
186
187
|
else if gap = Unexplored solution space and a trigger fires:
|
|
187
188
|
pending_human.push("ideation offer") # `Explorar ideas` | `Seguir sin ideación`
|
|
188
189
|
else if factual(gap) and attempts[gap] < MAX:
|
|
@@ -234,12 +235,13 @@ finalize:
|
|
|
234
235
|
- **Inline research** → the fact lands in `## Context` / `## Behavioral changes`; if it settles a choice, the choice goes to `## Decisions` (+ ref to the session's `CONCLUSIONS`).
|
|
235
236
|
- **Ideation** → per verdict (§ *Ideation gate*): `Adoptar` → the spec's sections + `## Decisions` · `Descartar` → `CONCLUSIONS` · `Aparcar` → `## Open questions`.
|
|
236
237
|
- **Human** → `## Decisions`, as the decision plus its why. **Not** a `Q:` transcript: the question-by-question trace stays in the session.
|
|
237
|
-
-
|
|
238
|
+
- **Composed `design`** (UI gap) → the package under `docs/designs/` (published through the CLI) + the spec's `## Design references` section, and nothing else in the spec.
|
|
238
239
|
- **Owned by `PLAN` or deferred** → `## Open questions` with its destination, and nothing else in the spec.
|
|
239
240
|
- **Inconclusive or unresolved research** → `## Open questions` (deferred) + the refine session's `BACKLOG.md` (only if something is deferred).
|
|
240
241
|
|
|
241
242
|
## Conditional modules
|
|
242
243
|
|
|
243
244
|
- `shape` — the change-shape gate and its split / replace branches → `../../modules/SPEC-CHANGE-SHAPE.md`
|
|
245
|
+
- `ui` — what the spec keeps when the requirement involves UI → `../../modules/DESIGN-REFERENCES.md`
|
|
244
246
|
- `web` — the conditional ideation gate, its triggers and verdicts → `../../modules/IDEATION-GATE.md`
|
|
245
247
|
- `resume` — the SPEC keys of compact / resume → `../../modules/SPEC-REFINE-KEYS.md`
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# DESIGN-REFERENCES — how a spec and a plan cite design instead of carrying it
|
|
2
|
+
|
|
3
|
+
Loaded when the run involves UI (signal `ui`).
|
|
4
|
+
|
|
5
|
+
The **UI unspecified** gap is resolved by the [`design`](../roles/design/ROLE.md)
|
|
6
|
+
capability over the **UI Design Package v1**. A spec and a plan **reference** a
|
|
7
|
+
design; neither contains one. The block below is all they carry.
|
|
8
|
+
|
|
9
|
+
## The reference block
|
|
10
|
+
|
|
11
|
+
```markdown
|
|
12
|
+
## Design references
|
|
13
|
+
|
|
14
|
+
- package: `DES-001@r4`
|
|
15
|
+
baseline_hint: `docs/designs/007-design-alta-familia/baselines/DES-001-r004.json`
|
|
16
|
+
digest: `sha256:<64 hex>`
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
- `package` pins **identity and revision**. `latest`, a folder slug, a bare
|
|
20
|
+
`DES-001` or a title are rejected: each answers a different question next year
|
|
21
|
+
than it does today.
|
|
22
|
+
- `baseline_hint` is a **location hint**, never the identity. A renamed dossier
|
|
23
|
+
keeps the reference valid and reports the hint as stale.
|
|
24
|
+
- `digest` seals the exact bytes; one that no longer matches never resolves
|
|
25
|
+
quietly.
|
|
26
|
+
- Several packages are several blocks. A package named in prose **without being
|
|
27
|
+
pinned** is reported, not ignored.
|
|
28
|
+
|
|
29
|
+
**Never in the document**: Screen Specifications, flow graphs, state inventories,
|
|
30
|
+
region or component tables, mockups, embedded images. Those live in the package,
|
|
31
|
+
at their own revision — a document carrying them is a document whose design
|
|
32
|
+
cannot be superseded without editing it.
|
|
33
|
+
|
|
34
|
+
Publishing the package is the loop writing a composed deliverable through the
|
|
35
|
+
CLI, not graduating a session artifact (chassis § *docs/ boundary*).
|
|
36
|
+
|
|
37
|
+
## SPEC — close the requirement at `outline`
|
|
38
|
+
|
|
39
|
+
1. **Reuse before minting.** `aw designs` lists what the workspace already has; a
|
|
40
|
+
compatible baseline is reused rather than given a second identity.
|
|
41
|
+
2. **Otherwise open an `outline` revision.** Not a shortcut: the spec closes *what*
|
|
42
|
+
the interface must accomplish and legitimately still holds unknowns. `handoff`
|
|
43
|
+
is PLAN's call — PLAN knows what will actually be implemented.
|
|
44
|
+
3. **Publish, then reference.** Citing a baseline that was never published is the
|
|
45
|
+
dangling reference this contract removes.
|
|
46
|
+
|
|
47
|
+
`spec-new` only **records the need**; it mints nothing. Design-system, theme and
|
|
48
|
+
surface ambiguities are resolved like any other SPEC gap — *structured-choice*,
|
|
49
|
+
counting inside the same ≤3 batch. The section sits where `## UI spec` used to,
|
|
50
|
+
right before `## Decisions`.
|
|
51
|
+
|
|
52
|
+
## PLAN — promote the closure, pin the roots
|
|
53
|
+
|
|
54
|
+
1. **Read the spec's `## Design references`.** No section and a plan with screens
|
|
55
|
+
means the spec never closed its design — a gap back to `spec-refine`, not
|
|
56
|
+
something PLAN invents.
|
|
57
|
+
2. **Express what this plan implements as exact roots** — the flows, screens and
|
|
58
|
+
screen states its phases will build.
|
|
59
|
+
3. **Compute the closure**: a flow reaches its nodes, a screen its flows, and both
|
|
60
|
+
reach the rules, tokens and assets they depend on. It stops there. `flow_refs`
|
|
61
|
+
is *not* followed — it records which flows visit a screen, so following it drags
|
|
62
|
+
in designs the plan never consumes.
|
|
63
|
+
4. **Promote exactly that closure to `handoff`**, nothing else. Ten screens in
|
|
64
|
+
`outline` and three promoted is a package's normal shape; promoting it wholesale
|
|
65
|
+
because one task needed one screen makes maturity meaningless.
|
|
66
|
+
5. **Publish the revision**, then write the roots.
|
|
67
|
+
|
|
68
|
+
The plan declares its own `## Design references` — same block — after
|
|
69
|
+
`## Dependencies`, before `## Tasks`. **Its own, not a copy of the spec's**: that
|
|
70
|
+
is what lets a refine move this plan to `@r5` while a sibling stays on `@r4`. A
|
|
71
|
+
plan whose task pins a baseline it never declared resolves against nothing, and
|
|
72
|
+
says so.
|
|
73
|
+
|
|
74
|
+
Then each phase or task pins the exact roots it consumes:
|
|
75
|
+
|
|
76
|
+
```markdown
|
|
77
|
+
- [ ] T3.2 — Alta de familia desde el formulario · DES-001@r4 / SCR-002@r2#empty
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`<package>@rN / <artifact>@rN[#state]`. Both revisions are mandatory; the anchor
|
|
81
|
+
is optional and only a screen has one. A phase whose tasks share one root may pin
|
|
82
|
+
it once at phase level. Never acceptable: naming `DES-001` without a revision —
|
|
83
|
+
`plan-exec` reports it instead of guessing. And a rendition never answers for a
|
|
84
|
+
root: an approved image is not the current semantics, nor a conformance claim.
|
|
85
|
+
|
|
86
|
+
## quick — read it, never rewrite it
|
|
87
|
+
|
|
88
|
+
`quick` **reads and validates** (`aw designs`, `aw designs --plan`); it changes
|
|
89
|
+
nothing a baseline seals — normative content, a maturity, an approval. A visual
|
|
90
|
+
tweak that turns out to need a new state or a redrawn journey **escalates with the
|
|
91
|
+
evidence it gathered**: `plan-refine` for the package, `spec-refine` when behavior
|
|
92
|
+
or acceptance moves. Editing it silently moves the revision with nobody's approval
|
|
93
|
+
while every consumer stays pinned to the old digest.
|
|
94
|
+
|
|
95
|
+
## plan-refine — the delta, and only the delta
|
|
96
|
+
|
|
97
|
+
- **New revisions only for the artifacts the refine actually affects.** An
|
|
98
|
+
untouched screen keeps its revision, maturity and digest.
|
|
99
|
+
- **Never re-point another consumer.** Two plans may pin the same baseline;
|
|
100
|
+
publishing `@rN+1` for one leaves the other's reference exactly as it was —
|
|
101
|
+
that is what makes a published revision immutable rather than merely
|
|
102
|
+
discouraged from changing.
|
|
103
|
+
- **Re-point only this plan** — its `## Design references` and the tasks whose
|
|
104
|
+
artifacts moved. The spec's section is not touched: it records the baseline the
|
|
105
|
+
*requirement* closed on.
|
|
106
|
+
- **Behavior or acceptance changed → `spec-refine` first.** Redrawing a journey,
|
|
107
|
+
adding a state the requirement never described or moving an acceptance criterion
|
|
108
|
+
is a functional change. Closing it here leaves the spec and the package
|
|
109
|
+
disagreeing with no way to tell which is right.
|
|
@@ -7,6 +7,7 @@ Loaded when classifying what to persist (signal `classification`).
|
|
|
7
7
|
| **Analysis / conclusions / design notes** | findings, comparisons, diagnoses, adjudications, recommendations | `research` → `docs/research/NNN-research-<slug>.md` |
|
|
8
8
|
| **Requirement** | describes a *wish*: what should exist/change, acceptance criteria derivable | `spec` → `docs/specs/NNN-spec-<slug>.md`, born `status: draft`, `## Origin` = "adopted from host conversation" → offer `/w:spec-refine` |
|
|
9
9
|
| **Plan** | already answers the *how*: phases/tasks/solution — e.g. the host plan-mode output | `plan` → `docs/plans/NNN-plan-<slug>.md` (adoption) → offer `/w:plan-refine` / `/w:plan-exec` |
|
|
10
|
+
| **Durable UI idea** | screens, flows, states meant to last | `spec` **first**, then the design in the package it identifies ([`DESIGN-REFERENCES.md`](DESIGN-REFERENCES.md)); never a Screen Specification *instead of* the Requirement, and `persist` writes no package |
|
|
10
11
|
| Mixed / ambiguous | e.g. analysis that ends in a requirement | one `persist` per document, each confirmed; a research doc plus a spec draft that cites it is a valid split |
|
|
11
12
|
|
|
12
13
|
## `docs/research/` — the analysis home (owned by this command)
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# PLAN execution batches
|
|
2
|
+
|
|
3
|
+
This module is the single contract for grouping PLAN phases into execution units. `plan-new`
|
|
4
|
+
and `plan-refine` declare the intended units; `plan-exec` infers them again from live state.
|
|
5
|
+
|
|
6
|
+
## Plan interface
|
|
7
|
+
|
|
8
|
+
Every new or refined plan carries this core section after `## Tasks`:
|
|
9
|
+
|
|
10
|
+
```markdown
|
|
11
|
+
## Execution batches
|
|
12
|
+
|
|
13
|
+
- B1 · continuous · F1-F3
|
|
14
|
+
- B2 · isolated · F4
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Rows use sequential `B1..Bn` ids and form a complete, disjoint phase partition in order. A batch
|
|
18
|
+
contains consecutive phases and uses one of two exact modes:
|
|
19
|
+
|
|
20
|
+
- `continuous` — implement every phase first; validate and review the combined diff at batch
|
|
21
|
+
close; then create one commit per changed Git source.
|
|
22
|
+
- `isolated` — the traditional cycle for one phase. It is still a batch, so the same state,
|
|
23
|
+
validation, review and Git rules apply at its close.
|
|
24
|
+
|
|
25
|
+
The phase contracts, dependencies, risks and open questions are the reproducible evidence.
|
|
26
|
+
|
|
27
|
+
## Inference
|
|
28
|
+
|
|
29
|
+
Choose the maximal consecutive `continuous` ranges. A range is eligible only when all of these
|
|
30
|
+
are true:
|
|
31
|
+
|
|
32
|
+
1. Every dependency is already satisfied or is an earlier phase in the same range.
|
|
33
|
+
2. No phase result, proof, probe or human decision determines how a later phase must be built.
|
|
34
|
+
3. There is no unresolved question, live blocker, operative handoff or irreversible external
|
|
35
|
+
action between its phases.
|
|
36
|
+
4. No intermediate commit, release, review or deployment is a required recovery boundary.
|
|
37
|
+
5. The combined change is coherent, recoverable and reviewable as one unit.
|
|
38
|
+
|
|
39
|
+
Anything else is `isolated`. If every phase is eligible, the whole plan is one batch. This is an
|
|
40
|
+
AI inference from observable facts, not a preference question; planning writes it without asking.
|
|
41
|
+
The PLAN gate fails when a phase is missing, duplicated, reordered or grouped across an
|
|
42
|
+
ineligible boundary.
|
|
43
|
+
|
|
44
|
+
## Runtime authority
|
|
45
|
+
|
|
46
|
+
Before editing, `plan-exec` repeats the inference over pending phases using the plan plus live
|
|
47
|
+
dependencies, branches, working trees, blockers and risks.
|
|
48
|
+
It may merge or split the declared batches without asking: current evidence wins.
|
|
49
|
+
The declared section remains planning structure;
|
|
50
|
+
the effective batches and any difference are recorded in `CHECKPOINT`.
|
|
51
|
+
|
|
52
|
+
A legacy plan without `## Execution batches` is valid. Execution infers effective batches and
|
|
53
|
+
records them in `CHECKPOINT`; it does not normalize the plan merely to add the section.
|
|
54
|
+
|
|
55
|
+
## Continuous cycle
|
|
56
|
+
|
|
57
|
+
For one effective batch:
|
|
58
|
+
|
|
59
|
+
1. Verify every affected source and seed one batch intent before editing.
|
|
60
|
+
2. Implement its phases in order. Mark local tasks done and set reached phases to `en ejecución`,
|
|
61
|
+
but run no phase proof, test runner, build, lint or closing review between them.
|
|
62
|
+
3. After all implementation is written, run every phase proof in order, then the justified
|
|
63
|
+
focused/risk checks and applicable cross-cutting validations. The last pending batch also runs
|
|
64
|
+
the plan's final validation here, before Git.
|
|
65
|
+
4. Fix failures autonomously and rerun the affected checks. Review the whole batch diff once.
|
|
66
|
+
5. Only when every check, exit condition and review is green, flip all batch phases to `validada`,
|
|
67
|
+
update `CHECKPOINT`, and enter the Git step.
|
|
68
|
+
|
|
69
|
+
This is the narrow exception to the chassis' per-phase artifact beat and clean-tree rule: the
|
|
70
|
+
batch is the execution boundary. Task checkboxes and phase states keep it resumable.
|
|
71
|
+
|
|
72
|
+
A real blocker or structural/functional deviation stops immediately. No unproven phase becomes
|
|
73
|
+
`validada`; the combined changes remain uncommitted and the actual states plus the unblocking
|
|
74
|
+
action go to `CHECKPOINT`.
|
|
75
|
+
|
|
76
|
+
## Git authorization
|
|
77
|
+
|
|
78
|
+
A green batch produces exactly one proposed commit per affected source. One consolidated approval
|
|
79
|
+
covers all of those commits. If the user explicitly pre-authorized commits conditional on every
|
|
80
|
+
batch check passing, record that authorization before editing and commit without another question.
|
|
81
|
+
A failed or unrun check never satisfies the condition and never creates a commit. For the last
|
|
82
|
+
pending batch, the same authorization also marks the fully validated plan `done` before committing,
|
|
83
|
+
so that final plan write is included in the source's single commit; there is no second completion
|
|
84
|
+
question or commit.
|
package/skills/w/roles/README.md
CHANGED
|
@@ -12,7 +12,7 @@ All 6 roles, their built-in defaults, their tier, and which loops/exports compos
|
|
|
12
12
|
|
|
13
13
|
| Role | Default built-in | Tier | Composed by |
|
|
14
14
|
|---|---|---|---|
|
|
15
|
-
| `
|
|
15
|
+
| `design` | [`design`](design/ROLE.md) | must | `spec-refine-loop` (when requirement involves UI) · `plan-new-loop` / `plan-refine-loop` · `plan-exec-loop` (reads, never redesigns) |
|
|
16
16
|
| `sql` | `sql` | must | inline research · `plan-exec-loop` · `quick-loop` · `export-scripts` |
|
|
17
17
|
| `git` | `git` | must | `plan-exec-loop` · `quick-loop` |
|
|
18
18
|
| `research` | [`research`](research/ROLE.md) | should | all loops (on-demand investigation) |
|
|
@@ -25,6 +25,8 @@ All 6 roles, their built-in defaults, their tier, and which loops/exports compos
|
|
|
25
25
|
|
|
26
26
|
> **Ambient conventions (not roles).** Code, testing and writing standards **and tool authoring** (`creating-tools`, which writes `docs/tools`) are **not Workline roles** and are never bound: they are **standalone skills the host auto-discovers by `description`** and applies when relevant. Workline is **indifferent** (it neither reads nor looks for them). Useful families live in marketplace plugins (`dev-conventions`, `tool-builder`), but Workline does **not depend** on them.
|
|
27
27
|
>
|
|
28
|
+
> **`ui-design` and `ui-spec` are retired names.** The design slot is [`design`](design/ROLE.md), whose only output is the UI Design Package v1. Neither retired name is a role, a binding, an alias or an implementation: they are **rejected**, because two names for one capability are two contracts in disguise. There is no alias, no dual-read, no importer and no migration — a binding that names one is reported as `retired/unsupported`, and a design that is still needed is recreated over the package.
|
|
29
|
+
>
|
|
28
30
|
> **The closing review is not a role either** (deliberate decision — a `conventions`/`rules`/`review` role was evaluated and discarded): the pre-commit **closing review gate** of `plan-exec-loop`/`quick-loop` is a **loop step**; the loop creates the **moment** and the installed ambient conventions fill it. A role that "points at the marketplace skills" would re-couple what this extraction decoupled. The **minimality / anti-over-engineering** lens is **not a role either**: it is a built-in property of the convergence gate (chassis § *Minimality*), owed with no external skill and merely *raised* by whatever ambient review skills are installed — internal essence without the coupling a role would reintroduce.
|
|
29
31
|
|
|
30
32
|
---
|
|
@@ -56,7 +58,7 @@ built-in default
|
|
|
56
58
|
```toml
|
|
57
59
|
[skills]
|
|
58
60
|
# Built-in defaults (no entry needed — listed here for reference only)
|
|
59
|
-
#
|
|
61
|
+
# design = "design"
|
|
60
62
|
# sql = "sql"
|
|
61
63
|
# git = "git"
|
|
62
64
|
# research = "research"
|
|
@@ -64,7 +66,7 @@ built-in default
|
|
|
64
66
|
# overview = "w"
|
|
65
67
|
|
|
66
68
|
# Override examples:
|
|
67
|
-
|
|
69
|
+
design = "acme/figma-spec" # third-party skill installed via skills.sh
|
|
68
70
|
diagrams = "mermaid-only" # custom built installed locally
|
|
69
71
|
sql = "off" # disable the sql capability
|
|
70
72
|
```
|
|
@@ -73,7 +75,7 @@ sql = "off" # disable the sql capability
|
|
|
73
75
|
|
|
74
76
|
```toml
|
|
75
77
|
[skills]
|
|
76
|
-
|
|
78
|
+
design = "acme/figma-spec"
|
|
77
79
|
```
|
|
78
80
|
|
|
79
81
|
`acme/figma-spec` must be installed on the host (e.g. via `skills.sh install acme/figma-spec`). The binding is **advisory**: the resolver emits the name as-is — it does **not** verify the skill is installed and does **not** auto-fall-back to the built-in default. A typo'd name silently leaves the role bound to a skill that does not exist. Verify the resolution with `aw skills`, which warns when a bound skill is not found in the standard skill roots.
|
|
@@ -111,7 +113,7 @@ Example output:
|
|
|
111
113
|
```
|
|
112
114
|
Role Resolved skill Source
|
|
113
115
|
----------------- ----------------------- -----------
|
|
114
|
-
|
|
116
|
+
design design built-in
|
|
115
117
|
sql sql built-in
|
|
116
118
|
git git built-in
|
|
117
119
|
research research built-in
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: design
|
|
3
|
+
description: >-
|
|
4
|
+
UI design authoring over the **UI Design Package v1** — the durable dossier
|
|
5
|
+
under `docs/designs/NNN-design-<slug>/` that a spec references and a plan
|
|
6
|
+
implements against. Authors **flows** (the journey: nodes, edges, actors) and
|
|
7
|
+
**screens** (the surface: states, structure, data, accessibility) as Markdown
|
|
8
|
+
with versioned YAML frontmatter, plus the rules, tokens, renditions and
|
|
9
|
+
governance records around them. Knows the package layout, the six canonical
|
|
10
|
+
schemas, the maturity ladder (`outline` → `handoff`), the reference grammar
|
|
11
|
+
`DES-NNN/SCR-NNN@rN#anchor`, and what a document must close before an
|
|
12
|
+
implementation may be planned against it. Use when a loop refines a spec,
|
|
13
|
+
builds or refines a plan, or executes one that involves screens, forms,
|
|
14
|
+
dashboards, modals or any UI surface.
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
# design — UI design over the UI Design Package v1
|
|
18
|
+
|
|
19
|
+
## Role
|
|
20
|
+
|
|
21
|
+
`design` — this is its **built-in default implementation**, and `design` is the
|
|
22
|
+
**only public identity** of this capability. `ui-design` (the role this
|
|
23
|
+
replaces) and `ui-spec` (the skill that used to fill it) are **not** aliases,
|
|
24
|
+
**not** alternative implementations and **not** accepted names: a second name
|
|
25
|
+
for one capability is a second contract in disguise, and the day the two
|
|
26
|
+
disagree there is no way to say which one the package obeys.
|
|
27
|
+
|
|
28
|
+
Rebindable in `.workflow/skills.toml` to a third-party skill or `off`.
|
|
29
|
+
Resolution: built-in default → `~/.workflow/skills.toml` (global) →
|
|
30
|
+
`.workflow/skills.toml` (workspace). See [`../README.md`](../README.md).
|
|
31
|
+
|
|
32
|
+
## Purpose
|
|
33
|
+
|
|
34
|
+
Given a UI requirement, author the **semantic** design of its journeys and
|
|
35
|
+
surfaces into a package that outlives the session that produced it: durable,
|
|
36
|
+
versioned, referenceable by digest, and complete enough that an implementation
|
|
37
|
+
can be planned against it without reopening the design conversation.
|
|
38
|
+
|
|
39
|
+
The package is the deliverable. A spec **references** it; it never contains it.
|
|
40
|
+
|
|
41
|
+
## Composed by
|
|
42
|
+
|
|
43
|
+
- **`spec-refine-loop`** — the requirement involves UI: reuse a compatible
|
|
44
|
+
baseline or open an `outline` revision, and leave only `## Design references`
|
|
45
|
+
in the spec document.
|
|
46
|
+
- **`plan-new-loop` · `plan-refine-loop`** — the plan consumes UI: promote to
|
|
47
|
+
`handoff` exactly the closure the plan consumes, and write the exact roots
|
|
48
|
+
into each phase or task.
|
|
49
|
+
- **`plan-exec-loop`** — reads and validates; **never redesigns**. A design that
|
|
50
|
+
turns out wrong stops execution and goes back to the refining loop.
|
|
51
|
+
|
|
52
|
+
In all of them the composing loop contributes the human questions
|
|
53
|
+
(*structured-choice*, chassis § *Structured-choice*), the gap-driven iteration
|
|
54
|
+
and the curation. This skill contributes what a correct package looks like.
|
|
55
|
+
|
|
56
|
+
## Knowledge
|
|
57
|
+
|
|
58
|
+
### Package layout
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
docs/designs/NNN-design-<slug>/
|
|
62
|
+
design-manifest.json mutable index — catalog, governance, currentness
|
|
63
|
+
baselines/DES-NNN-rNNN.json immutable: what the package IS at that revision
|
|
64
|
+
flows/FLW-NNN-rNNN-<slug>.md
|
|
65
|
+
screens/SCR-NNN-rNNN-<slug>.md
|
|
66
|
+
design-system/rules/RUL-NNN-rNNN-<slug>.md
|
|
67
|
+
tokens/TOK-NNN-rNNN-<slug>.tokens.json
|
|
68
|
+
renditions/VIS-NNN-rNNN-<slug>/rendition.json
|
|
69
|
+
assets/<digest>-<name>.<ext>
|
|
70
|
+
governance/reviews/REV-NNN.json
|
|
71
|
+
governance/revocations/RVK-NNN.json
|
|
72
|
+
PACKAGE.md · design-system/DESIGN.md regenerable projections, never sealed
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
The revision is **in the file name**, so publishing `@r2` writes a new file and
|
|
76
|
+
*cannot* overwrite `@r1` — not by policy, by path. An asset carries the digest
|
|
77
|
+
of its own bytes, so different content can never occupy the same name.
|
|
78
|
+
|
|
79
|
+
### The two documents this skill authors
|
|
80
|
+
|
|
81
|
+
Both are Markdown: versioned YAML frontmatter (identity, relations, trace,
|
|
82
|
+
unknowns) plus a **fixed list of `##` sections**, once each, in order, none
|
|
83
|
+
empty. A section that genuinely does not apply is declared in
|
|
84
|
+
`not_applicable: {key: reason}` — silence is not closure, and the **essential**
|
|
85
|
+
sections admit no such claim.
|
|
86
|
+
|
|
87
|
+
| | `flow` (`workline.ui-flow/v1`) | `screen` (`workline.ui-screen/v1`) |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| Answers | how the journey runs | what one surface is |
|
|
90
|
+
| Frontmatter core | `actors`, `entry`, `nodes`, `edges` | `default_state`, `states[]`, `flow_refs`, `dependencies` |
|
|
91
|
+
| Sections | Goal and outcome · Preconditions and entry · Main journey · Alternatives and recovery · Permissions and privacy · Traceability | Purpose and context · Structure and content · Components and design-system deltas · Data, permissions and validation · States and transitions · Interaction and navigation · Responsive and adaptation · Localization · Accessibility · Edge cases and degradation · Traceability |
|
|
92
|
+
| Essential (no waiver) | Goal and outcome · Main journey · Traceability | Purpose and context · Structure and content · States and transitions · Interaction and navigation · Accessibility · Traceability |
|
|
93
|
+
|
|
94
|
+
### Reference grammar
|
|
95
|
+
|
|
96
|
+
`DES-001/SCR-001@r2#error` — package / artifact @ revision # state anchor. A
|
|
97
|
+
reference always pins the revision: **a later revision never invalidates a
|
|
98
|
+
reference already fixed**. Baselines are cited as `DES-001@r2` plus the digest
|
|
99
|
+
that seals them.
|
|
100
|
+
|
|
101
|
+
### Maturity: `outline` → `handoff`
|
|
102
|
+
|
|
103
|
+
`outline` is a legitimate state, not a failure — it exists precisely to hold
|
|
104
|
+
what is not yet decided. A document may declare `handoff` only when:
|
|
105
|
+
|
|
106
|
+
- its **applicable completeness** is closed (every section says something or is
|
|
107
|
+
waived with a reason);
|
|
108
|
+
- it carries **no blocking unknown** (`unknowns[].blocking: true`);
|
|
109
|
+
- a flow **resolves its graph** — nodes with no edges are not a journey;
|
|
110
|
+
- every reference to **another package** is pinned in `external[]` by provider,
|
|
111
|
+
revision and digest;
|
|
112
|
+
- no essential section answers with a **rendition and nothing else**: an
|
|
113
|
+
approved image is not the current semantics and is not a WCAG conformance.
|
|
114
|
+
|
|
115
|
+
### Governance: four independent dimensions
|
|
116
|
+
|
|
117
|
+
**Maturity** (`outline`/`handoff`), **review** (a `REV-*.json` that approves or
|
|
118
|
+
rejects an exact baseline *by digest*), **currentness** (derived from
|
|
119
|
+
`supersedes` — superseded warns and still executes) and **execution policy**
|
|
120
|
+
(whether the workspace demands approval) move **separately**. An approval is
|
|
121
|
+
never inherited: a new revision returns to `proposed`, and the only way to
|
|
122
|
+
forbid an intact revision is an explicit, audited revocation.
|
|
123
|
+
|
|
124
|
+
## Operations
|
|
125
|
+
|
|
126
|
+
Five semantic operations, all over the **same** package. `create` and `update`
|
|
127
|
+
are one route with a different compare-and-swap base, not two formats.
|
|
128
|
+
|
|
129
|
+
| Operation | Does | Writes |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `create` | first revision of a package | manifest, baseline, artifacts, projections |
|
|
132
|
+
| `update` | next revision of an existing package | idem, over a declared base |
|
|
133
|
+
| `validate` | judges without writing: schemas, naming, references, maturity, closure | nothing |
|
|
134
|
+
| `render` | regenerates the projections | `PACKAGE.md`, `design-system/DESIGN.md` — never sealed |
|
|
135
|
+
| `record` | seals a governance decision about a revision that exists | `governance/reviews/` · `governance/revocations/` |
|
|
136
|
+
|
|
137
|
+
None of them may invent a layout or a schema of its own. There is no «direct
|
|
138
|
+
package», no parallel Markdown render and no side JSON: **one format, one
|
|
139
|
+
authority**.
|
|
140
|
+
|
|
141
|
+
## Canonical authority
|
|
142
|
+
|
|
143
|
+
The normative contract is the six published JSON Schemas under
|
|
144
|
+
[`../../schemas/design/`](../../schemas/design/) — manifest, baseline, flow,
|
|
145
|
+
screen, review, revocation — and the validators that implement them. The
|
|
146
|
+
built-in floor and **every** improvement bound to this role validate their
|
|
147
|
+
output against exactly those, with the same gates.
|
|
148
|
+
|
|
149
|
+
- A missing external improvement **never blocks the floor**: with nothing bound,
|
|
150
|
+
the role resolves to this skill and the capability keeps working.
|
|
151
|
+
- A contributor extends the domain by **adding fields to a schema**, never by
|
|
152
|
+
declaring a format of their own. Nobody redefines the canonical authority —
|
|
153
|
+
not a bound skill, not a host, not a workspace.
|
|
154
|
+
|
|
155
|
+
## Boundary with Spec 014
|
|
156
|
+
|
|
157
|
+
The **transversal capability lifecycle belongs to Spec 014 and is not
|
|
158
|
+
reimplemented here**: skill descriptor, enable/disable lifecycle, the
|
|
159
|
+
`request` / `outcome` / `receipt` envelope, routing between direct and composed
|
|
160
|
+
paths, `off`, effects, and host-native projection are governed there.
|
|
161
|
+
|
|
162
|
+
This contract adds **only** what is proper to the design domain: fields,
|
|
163
|
+
validators and completeness. Where the two meet, Spec 014 decides the envelope
|
|
164
|
+
and this one decides the payload. Duplicating either side is the failure mode
|
|
165
|
+
being avoided.
|
|
166
|
+
|
|
167
|
+
## CLI ↔ agent split
|
|
168
|
+
|
|
169
|
+
Explicit, and it is the whole point of the handshake:
|
|
170
|
+
|
|
171
|
+
- **The CLI owns** inventory, numbering, digests, validation, authorization and
|
|
172
|
+
**writing**. It is the only thing that touches the filesystem.
|
|
173
|
+
- **The agent owns** exactly one step: authoring the **semantic content**. Its
|
|
174
|
+
answer is *data to be validated*, never an instruction to be trusted.
|
|
175
|
+
|
|
176
|
+
Three stages, and only the third writes: `prepare` (what was read, where writing
|
|
177
|
+
is allowed, and an `input_digest` sealing the state seen) → `validate` (parse the
|
|
178
|
+
answer against that request; on survival, a preview and an `approval_digest`
|
|
179
|
+
over the exact bytes proposed) → `apply` (recompute the input digest, check the
|
|
180
|
+
approval still matches, publish all-or-nothing).
|
|
181
|
+
|
|
182
|
+
## Output
|
|
183
|
+
|
|
184
|
+
The package itself — new artifact files plus the revision that seals them. The
|
|
185
|
+
**loop** writes (through the CLI), never this skill on its own.
|
|
186
|
+
|
|
187
|
+
What this skill does **not** produce: design inside a spec or a plan document.
|
|
188
|
+
A spec carries `## Design references` (package, baseline, digest, path hint); a
|
|
189
|
+
plan carries the exact roots each phase or task consumes. Embedding the design
|
|
190
|
+
in the document is what the package exists to end.
|
|
191
|
+
|
|
192
|
+
## Retired path — `retired/unsupported`, and nothing else
|
|
193
|
+
|
|
194
|
+
The legacy path is **gone**: the `ui-design` binding, the `ui-spec` skill, the
|
|
195
|
+
spec's `## UI spec` section and the per-screen design SPECs that PLAN sessions
|
|
196
|
+
carried. `design` is the only identity and the package above the only format.
|
|
197
|
+
|
|
198
|
+
Presenting any of it — a binding or invocation naming a retired name, a `## UI
|
|
199
|
+
spec` section, a session design SPEC, an output of `ui-spec-generator` — is
|
|
200
|
+
reported **`retired/unsupported`**. It is never read as a contract, and never
|
|
201
|
+
satisfies a gate as evidence. There is **no alias, no dual-read, no importer, no
|
|
202
|
+
conversion, no migrate-on-touch and no bulk migration**: a design that is still
|
|
203
|
+
needed is **recreated** over the package from current sources.
|
|
204
|
+
|
|
205
|
+
What retirement does not do is destroy: every document already written stays
|
|
206
|
+
exactly where it is, byte for byte, readable by whoever opens it. Retiring an
|
|
207
|
+
input is not the same as deleting a record.
|
|
208
|
+
|
|
209
|
+
**`ui-spec-generator` is outside this topology.** It is not a dependency, not an
|
|
210
|
+
adapter and not a source of truth for anything here; nothing in Workline reads,
|
|
211
|
+
invokes or imports it. Whatever becomes of that repository is its own business —
|
|
212
|
+
cleaning it up is explicitly not part of this contract.
|
|
213
|
+
|
|
214
|
+
## Source
|
|
215
|
+
|
|
216
|
+
Requirement: `docs/specs/013-spec-estandarizar-ui-spec.md`. Contract and
|
|
217
|
+
rationale: the six schemas under [`../../schemas/design/`](../../schemas/design/).
|