@tacuchi/agent-workflow-cli 21.6.0 → 21.7.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.
Files changed (97) hide show
  1. package/dist/application/artifacts-service.js +10 -0
  2. package/dist/application/artifacts-service.js.map +1 -1
  3. package/dist/application/capability/design-handler.js +224 -12
  4. package/dist/application/capability/design-handler.js.map +1 -1
  5. package/dist/application/capability/dispatcher.js +20 -6
  6. package/dist/application/capability/dispatcher.js.map +1 -1
  7. package/dist/application/capability/durable-effect.js +23 -157
  8. package/dist/application/capability/durable-effect.js.map +1 -1
  9. package/dist/application/checkpoint-service.js +49 -3
  10. package/dist/application/checkpoint-service.js.map +1 -1
  11. package/dist/application/checkpoint-write-service.js +5 -0
  12. package/dist/application/checkpoint-write-service.js.map +1 -1
  13. package/dist/application/design/design-gate-service.js +18 -0
  14. package/dist/application/design/design-gate-service.js.map +1 -1
  15. package/dist/application/design/design-index-service.js +2 -0
  16. package/dist/application/design/design-index-service.js.map +1 -1
  17. package/dist/application/design/design-resolver-service.js +18 -1
  18. package/dist/application/design/design-resolver-service.js.map +1 -1
  19. package/dist/application/design/design-simple-service.js +217 -0
  20. package/dist/application/design/design-simple-service.js.map +1 -0
  21. package/dist/application/flow/advance.js +96 -11
  22. package/dist/application/flow/advance.js.map +1 -1
  23. package/dist/application/flow/flow-service.js +12 -1
  24. package/dist/application/flow/flow-service.js.map +1 -1
  25. package/dist/application/flow/internal-actions.js +221 -0
  26. package/dist/application/flow/internal-actions.js.map +1 -0
  27. package/dist/application/flow/internal-drive.js +293 -0
  28. package/dist/application/flow/internal-drive.js.map +1 -0
  29. package/dist/application/flow/submit.js +242 -84
  30. package/dist/application/flow/submit.js.map +1 -1
  31. package/dist/application/local-proposal.js +171 -0
  32. package/dist/application/local-proposal.js.map +1 -0
  33. package/dist/application/parsers/decisiones.js +13 -0
  34. package/dist/application/parsers/decisiones.js.map +1 -1
  35. package/dist/application/paths-service.js +11 -1
  36. package/dist/application/paths-service.js.map +1 -1
  37. package/dist/application/resume-service.js +22 -26
  38. package/dist/application/resume-service.js.map +1 -1
  39. package/dist/application/semantic-operation/protocol.js +10 -2
  40. package/dist/application/semantic-operation/protocol.js.map +1 -1
  41. package/dist/application/session-artifacts.js +53 -0
  42. package/dist/application/session-artifacts.js.map +1 -1
  43. package/dist/application/session-close-service.js +5 -0
  44. package/dist/application/session-close-service.js.map +1 -1
  45. package/dist/application/session-narrative.js +294 -0
  46. package/dist/application/session-narrative.js.map +1 -0
  47. package/dist/application/status-service.js +1 -0
  48. package/dist/application/status-service.js.map +1 -1
  49. package/dist/application/workline-index-service.js +2 -0
  50. package/dist/application/workline-index-service.js.map +1 -1
  51. package/dist/cli/commands/capability.js +1 -1
  52. package/dist/cli/commands/capability.js.map +1 -1
  53. package/dist/cli/commands/designs.js +4 -1
  54. package/dist/cli/commands/designs.js.map +1 -1
  55. package/dist/cli/commands/flow.js +14 -0
  56. package/dist/cli/commands/flow.js.map +1 -1
  57. package/dist/cli/commands/session-artifacts.js +55 -2
  58. package/dist/cli/commands/session-artifacts.js.map +1 -1
  59. package/dist/domain/design/capability.js +35 -4
  60. package/dist/domain/design/capability.js.map +1 -1
  61. package/dist/domain/design/direct.js.map +1 -1
  62. package/dist/domain/design/expansion.js +137 -0
  63. package/dist/domain/design/expansion.js.map +1 -0
  64. package/dist/domain/design/manifest.js +61 -8
  65. package/dist/domain/design/manifest.js.map +1 -1
  66. package/dist/domain/design/reference.js +57 -10
  67. package/dist/domain/design/reference.js.map +1 -1
  68. package/dist/domain/design/simple.js +164 -0
  69. package/dist/domain/design/simple.js.map +1 -0
  70. package/dist/domain/flow/answer.js +90 -12
  71. package/dist/domain/flow/answer.js.map +1 -1
  72. package/dist/domain/flow/authority.js +266 -60
  73. package/dist/domain/flow/authority.js.map +1 -1
  74. package/dist/domain/flow/authorization.js +36 -15
  75. package/dist/domain/flow/authorization.js.map +1 -1
  76. package/dist/domain/flow/directive.js +10 -6
  77. package/dist/domain/flow/directive.js.map +1 -1
  78. package/dist/domain/flow/execution-result.js +72 -0
  79. package/dist/domain/flow/execution-result.js.map +1 -0
  80. package/dist/domain/flow/run-state.js +165 -13
  81. package/dist/domain/flow/run-state.js.map +1 -1
  82. package/dist/domain/host-verification.js +8 -8
  83. package/dist/domain/host-verification.js.map +1 -1
  84. package/dist/domain/proposal.js +91 -0
  85. package/dist/domain/proposal.js.map +1 -0
  86. package/dist/domain/session/narrative.js +126 -0
  87. package/dist/domain/session/narrative.js.map +1 -0
  88. package/package.json +1 -1
  89. package/skills/w/SKILL.md +1 -1
  90. package/skills/w/loops/CHASSIS.md +1 -1
  91. package/skills/w/loops/plan-new-loop/LOOP.md +5 -6
  92. package/skills/w/loops/plan-refine-loop/LOOP.md +7 -7
  93. package/skills/w/loops/spec-refine-loop/LOOP.md +6 -4
  94. package/skills/w/modules/DESIGN-REFERENCES.md +50 -56
  95. package/skills/w/roles/design/CONTRACT.md +73 -6
  96. package/skills/w/roles/design/ROLE.md +21 -3
  97. package/skills/w/schemas/design/design-manifest.v1.schema.json +4 -0
@@ -46,7 +46,7 @@ Closing *every* gap turns the spec into a premature plan. Close what changes **w
46
46
  **Adopt, do not repeat.** `spec-new`'s **facts** are reused; its **assumptions** are re-validated **only when one blocks a gap**; its `Open questions` are re-classified by destination; its one-vs-many hypothesis is re-judged at the *Change-shape gate*. The shallow sweep is never re-run wholesale. Keep the labels distinct — a spec that blurs them cannot be gated: **fact** (backed by repo, data or docs) · **inference** (unproven) · **user decision** · **deferred decision** (owner declared) · **open question** (can still move the contract).
47
47
 
48
48
  ## Writes
49
- Updates `docs/specs/NNN-spec-<slug>.md` **in place** (when the user picks `Guardar especificación refinada`): completes sections, **adds** `## Decisions`, closes `Open questions` as they get resolved, and stamps the frontmatter `status: ready-for-plan`. Since it overwrites an existing doc, it asks the user's **confirmation**.
49
+ Updates `docs/specs/NNN-spec-<slug>.md` **in place** (when the user picks `Aprobar y guardar`): completes sections, **adds** `## Decisions`, closes `Open questions` as they get resolved, and stamps the frontmatter `status: ready-for-plan`. The stamp travels **inside the proposed bytes** — it is a projection of the same save, not a second write to authorize afterwards. Since it overwrites an existing doc, the preview says so and the person approves it **once**.
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
 
@@ -203,9 +203,11 @@ spec-refine-loop(spec):
203
203
  ideation offer declined → mark that gap exhausted # anti re-fire; on-demand entry stays open
204
204
  # no BLOCKING gaps → the CLI evaluates the ready-for-plan gate over the run's
205
205
  # Success criteria and asks for their real state; whatever fails comes back as a gap.
206
- Guardar → edit_in_place_with_confirm(spec) + stamp status: ready-for-plan ; goto finalize
207
- # split branch → also mint + write the extracted siblings as status: draft
208
- Preguntar algo más continue
206
+ hand the CLI the exact bytes of the refined spec, with status: ready-for-plan already stamped in them
207
+ # split branch → the same bytes carry the extracted siblings as status: draft
208
+ the CLI seals them into ONE proposal and shows its preview: destination, weight, what it replaces
209
+ Aprobar y guardar → the CLI writes every file of the preview, together or not at all ; goto finalize
210
+ Refinar → nothing is written and the refinement stays open
209
211
  flow Compactar/Cerrar → handle the same way
210
212
  finalize:
211
213
  write CHECKPOINT (refine_session) # always persisted
@@ -6,6 +6,13 @@ The **UI unspecified** gap is resolved by the [`design`](../roles/design/ROLE.md
6
6
  capability over the **UI Design Package v1**. A spec and a plan **reference** a
7
7
  design; neither contains one. The block below is all they carry.
8
8
 
9
+ A design is **simple** — one authored `DESIGN.md`, everything else derived — by
10
+ default, or an expanded **package** with a declared cause; that vocabulary and the
11
+ authoring contract live in
12
+ [`../roles/design/CONTRACT.md`](../roles/design/CONTRACT.md), and `aw designs`
13
+ prints each mode. Only two consequences reach a citing document: the block is
14
+ identical for both, and the mode decides which task-pin form is legal.
15
+
9
16
  ## The reference block
10
17
 
11
18
  ```markdown
@@ -16,44 +23,32 @@ design; neither contains one. The block below is all they carry.
16
23
  digest: `sha256:<64 hex>`
17
24
  ```
18
25
 
26
+ A simple design's hint is its `DESIGN.md`.
27
+
19
28
  - `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.
29
+ `DES-001` or a title are rejected: each answers a different question next year.
22
30
  - `baseline_hint` is a **location hint**, never the identity. A renamed dossier
23
31
  keeps the reference valid and reports the hint as stale.
24
32
  - `digest` seals the exact bytes; one that no longer matches never resolves
25
33
  quietly.
26
- - Several packages are several blocks. A package named in prose **without being
27
- pinned** is reported, not ignored.
34
+ - Several designs are several blocks. One named in prose **without being pinned**
35
+ is reported, not ignored.
28
36
 
29
37
  **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
38
+ region or component tables, mockups, embedded images. Those live at their own
39
+ revision carrying them makes a design that cannot be superseded without editing
40
+ its consumer. Publishing is the loop writing a composed deliverable through the
35
41
  CLI, not graduating a session artifact (chassis § *docs/ boundary*).
36
42
 
37
- ## Evidence and lifecycle
38
-
39
- `trace` marks each criterion `visual`, `interaction` or `not_visual`. Preview
40
- only visual acceptance; interaction relies on states, semantics and implementation
41
- proof, never a storyboard merely to satisfy format.
42
-
43
- The CLI marks a delta **compact** only with an existing surface, ≤2 screens, and
44
- no journey, rule, token, asset, external dependency, blocker or adaptation.
45
- Compact publishes one `handoff` for PLAN to reuse. Otherwise it is **expanded**:
46
- SPEC keeps `outline`; PLAN promotes only its consumed closure. The model authors
47
- content, not this routing.
48
-
49
43
  ## SPEC — close the requirement at `outline`
50
44
 
51
45
  1. **Reuse before minting.** `aw designs` lists what the workspace already has; a
52
46
  compatible baseline is reused rather than given a second identity.
53
- 2. **Classify the lifecycle.** Compact publishes `handoff` now; otherwise open
54
- `outline`, which may hold unknowns until PLAN promotes its implemented roots.
55
- 3. **Publish, then reference.** Citing a baseline that was never published is the
56
- dangling reference this contract removes.
47
+ 2. **Classify the lifecycle.** Compact publishes one `handoff` for PLAN to reuse;
48
+ otherwise open `outline`, which may hold unknowns until PLAN promotes its
49
+ implemented roots.
50
+ 3. **Publish, then reference.** Citing a baseline never published is the dangling
51
+ reference this contract removes.
57
52
 
58
53
  `spec-new` only **records the need**; it mints nothing. The section sits right
59
54
  before `## Decisions`.
@@ -61,55 +56,54 @@ before `## Decisions`.
61
56
  ## PLAN — promote the closure, pin the roots
62
57
 
63
58
  1. **Read the spec's `## Design references`.** No section and a plan with screens
64
- means the spec never closed its design — a gap back to `spec-refine`, not
65
- something PLAN invents.
66
- 2. **Express what this plan implements as exact roots** — the flows, screens and
67
- screen states its phases will build.
59
+ means the spec never closed its design — a gap back to `spec-refine`.
60
+ 2. **Express what this plan implements as exact roots.**
68
61
  3. **Compute the closure**: a flow reaches its nodes, a screen its flows, and both
69
62
  reach the rules, tokens and assets they depend on. It stops there. `flow_refs`
70
- is *not* followed — it is the inverse relation, and following it drags in
71
- designs the plan never consumes.
72
- 4. **Reuse a valid `handoff`, or promote exactly the missing closure.** A compact
73
- handoff from SPEC is already the plan's baseline, not work to repeat.
74
- 5. **Publish the revision**, then write the roots.
63
+ is *not* followed — the inverse relation drags in designs nobody consumes.
64
+ 4. **Reuse a valid `handoff`, or promote exactly the missing closure**, then
65
+ publish the revision and write the roots.
75
66
 
76
67
  The plan declares its own `## Design references` — same block — after
77
- `## Dependencies`, before `## Tasks`. **Its own, not a copy of the spec's**: that
78
- is what lets a refine move this plan to `@r5` while a sibling stays on `@r4`. A
79
- plan whose task pins a baseline it never declared resolves against nothing, and
80
- says so.
81
-
82
- Then each phase or task pins the exact roots it consumes:
68
+ `## Dependencies`, before `## Tasks`, never a copy of the spec's: that is what
69
+ lets a refine move it to `@r5` while a sibling stays on `@r4`. A task pinning a
70
+ baseline its plan never declared resolves against nothing, and says so.
83
71
 
84
72
  ```markdown
85
73
  - [ ] T3.2 — Alta de familia desde el formulario · DES-001@r4 / SCR-002@r2#empty
74
+ - [ ] T3.3 — Aviso de duplicado · DES-007@r1
86
75
  ```
87
76
 
88
- `<package>@rN / <artifact>@rN[#state]`. Both revisions are mandatory; the anchor
89
- is optional and only a screen has one. A phase whose tasks share one root may pin
90
- it once at phase level. Never acceptable: naming `DES-001` without a revision
91
- `plan-exec` reports it instead of guessing. And a rendition never answers for a
92
- root: an approved image is not the current semantics, nor a conformance claim.
77
+ `<package>@rN / <artifact>@rN[#state]` pins inside a **package**: both revisions
78
+ mandatory, the anchor optional and only on a screen, and a phase whose tasks share
79
+ one root may pin it once at phase level. `<package>@rN` alone pins the **root**
80
+ the only form a **simple** design has, since there is nothing to point inside.
81
+ Asking a simple design for an artifact blocks and sends you to its root; a package
82
+ task pinning a whole revision is legitimate. A root pin walks no closure and
83
+ reaches no maturity, and still resolves identity, revision and digest, refuses a
84
+ revoked revision, and fails closed when the bytes moved. A rendition never answers
85
+ for a root: an approved image is not the current semantics, nor a conformance
86
+ claim.
93
87
 
94
88
  ## quick — read it, never rewrite it
95
89
 
96
90
  `quick` **reads and validates** (`aw designs`, `aw designs --plan`); it changes
97
- nothing a baseline seals — normative content, a maturity, an approval. A visual
98
- tweak that turns out to need a new state or a redrawn journey **escalates with the
99
- evidence it gathered**: `plan-refine` for the package, `spec-refine` when behavior
100
- or acceptance moves. Editing it silently moves the revision while every consumer
101
- stays pinned to the old digest.
91
+ nothing a baseline seals — normative content, a maturity, an approval. A tweak
92
+ that needs a new state or a redrawn journey **escalates with the evidence it
93
+ gathered**: `plan-refine` for the package, `spec-refine` when behavior or
94
+ acceptance moves. Editing silently moves the revision while every consumer stays
95
+ pinned to the old digest.
102
96
 
103
97
  ## plan-refine — the delta, and only the delta
104
98
 
105
99
  - **New revisions only for the artifacts the refine actually affects.** An
106
100
  untouched screen keeps its revision, maturity and digest.
107
101
  - **Never re-point another consumer.** Two plans may pin the same baseline;
108
- publishing `@rN+1` for one leaves the other's reference exactly as it was.
102
+ publishing `@rN+1` for one leaves the other's reference as it was.
109
103
  - **Re-point only this plan** — its `## Design references` and the tasks whose
110
- artifacts moved. The spec's section is not touched: it records the baseline the
111
- *requirement* closed on.
104
+ artifacts moved. The spec's section records the baseline the *requirement*
105
+ closed on and is not touched.
112
106
  - **Behavior or acceptance changed → `spec-refine` first.** Redrawing a journey,
113
- adding a state the requirement never described or moving an acceptance criterion
114
- is a functional change. Closing it here leaves the spec and the package
115
- disagreeing with no way to tell which is right.
107
+ adding an undescribed state or moving an acceptance criterion is functional;
108
+ closing it here leaves the spec and the design disagreeing with no way to tell
109
+ which is right.
@@ -22,6 +22,70 @@ envelope. Every attempt returns `outcome`, `output` and `receipt`. A
22
22
  `needs_input` is answered with `continue`, which builds the NEXT attempt of the
23
23
  same `invocation_id` — it never reuses the previous request.
24
24
 
25
+ ## What a person actually sees
26
+
27
+ Four stages is the machinery. The **visible** journey is four moments and exactly
28
+ one decision:
29
+
30
+ ```
31
+ comprender fuentes → redactar y organizar → vista previa → Aprobar y guardar | Refinar
32
+ ```
33
+
34
+ `prepare` publishes what a valid answer must contain and where it may land;
35
+ `validate` seals the exact bytes and returns the preview; the person decides once.
36
+ `Aprobar y guardar` runs `apply` with that digest and covers the whole proposal —
37
+ document, manifest, index and derived state — in one atomic write. `Refinar`
38
+ produces no effect at all and the proposal is written again. An identical retry
39
+ reuses the approval; any change of content, destination, base, scope or effect
40
+ class invalidates it and shows a new preview.
41
+
42
+ Discovery, classification, numbering, digests, validation, publication and indexes
43
+ never become questions of their own. What keeps its OWN boundary: sensitive
44
+ sources, network, execution, destruction, external effects, and any scope the
45
+ preview did not show.
46
+
47
+ ## Two shapes, one contract
48
+
49
+ `create` and `update` publish a **simple** design by default: one authored
50
+ `DESIGN.md` (`## Objetivo`, `## Diseño propuesto`, `## Validación`, plus
51
+ `## Recorrido`, `## Decisiones` or `## Abiertos` only when they say something).
52
+ The CLI derives the identity, the folder, the revision, the digest and a minimal
53
+ manifest — the caller administers none of it, and `maturity` answers null because
54
+ one document has no ladder to climb.
55
+
56
+ The full **UI Design Package v1** appears only with a cause, and the vocabulary is
57
+ closed to five — one is enough:
58
+
59
+ | Signal | Means | Who says it |
60
+ |---|---|---|
61
+ | `design.independent-outcomes` | two or more results each worth delivering | agent |
62
+ | `design.functional-blocking` | an unclosed functional decision blocks the design | agent |
63
+ | `design.clarity-lost` | one document would stop being readable | agent |
64
+ | `design.governance-or-system-reuse` | the package already carries governance or several revisions | **CLI derives** |
65
+ | `design.special-source-or-effect` | a sensitive source, an external transmission, or a declared source that did not contribute | **CLI derives** |
66
+
67
+ Recognizing a semantic signal is judgment and travels as `--input expansion=<id>`;
68
+ the two structural ones are facts about the invocation, so declaring one is
69
+ refused rather than believed. The receipt carries the mode, the signals that fired
70
+ and the one-line cause — every artifact beyond the simple document traces back to
71
+ the need it covers. `render` and `record` are package operations regardless.
72
+
73
+ Publishing a second simple revision archives the outgoing bytes inside the same
74
+ approved proposal, so a reference pinned to `@r1` keeps resolving after `@r2`
75
+ lands: a published revision is never taken away by the next one.
76
+
77
+ ## Evidence and lifecycle inside a package
78
+
79
+ `trace` marks each criterion `visual`, `interaction` or `not_visual`. Preview only
80
+ visual acceptance; interaction relies on states, semantics and implementation
81
+ proof, never a storyboard to satisfy format.
82
+
83
+ The CLI marks a delta **compact** only with an existing surface, ≤2 screens, and
84
+ no journey, rule, token, asset, external dependency, blocker or adaptation.
85
+ Compact publishes one `handoff` for PLAN to reuse; otherwise SPEC keeps `outline`
86
+ and PLAN promotes only its consumed closure. The model authors content, not this
87
+ routing — the same split the simple route applies to expansion.
88
+
25
89
  ## What each caller may invoke
26
90
 
27
91
  | Caller | Operations | Then |
@@ -59,12 +123,15 @@ never when they are sensitive.
59
123
 
60
124
  ## Where the output lands
61
125
 
62
- Inside a workspace the package defaults to `docs/designs/` and is discoverable
63
- by the index — which is what lets a spec or a plan reference it later without it
64
- ever having had a relationship with those flows. Outside a workspace the caller
65
- must name an explicit root; the result is still a conformant, portable package,
66
- and it is simply not indexed. What never happens is a guess: no root declared,
67
- nothing written.
126
+ Inside a workspace the design defaults to `docs/designs/` and is discoverable by
127
+ the index — which is what lets a spec or a plan reference it later without it ever
128
+ having had a relationship with those flows. On the simple route the exact folder
129
+ is derived from the title (`docs/designs/NNN-design-<slug>/`) and travels back as
130
+ the one allowed destination, so `target` is optional and naming it only narrows
131
+ the default. Outside a workspace the caller MUST name an explicit root; the result
132
+ is still a conformant, portable package — and it takes the expanded route, because
133
+ a simple design derives its identity from an index that is not there. What never
134
+ happens is a guess: no root declared outside a workspace, nothing written.
68
135
 
69
136
  ## What the direct route does not do
70
137
 
@@ -32,11 +32,20 @@ Resolution: built-in default → `~/.workflow/skills.toml` (global) →
32
32
  ## Purpose
33
33
 
34
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,
35
+ surfaces into something that outlives the session that produced it: durable,
36
36
  versioned, referenceable by digest, and complete enough that an implementation
37
37
  can be planned against it without reopening the design conversation.
38
38
 
39
- The package is the deliverable. A spec **references** it; it never contains it.
39
+ The **default deliverable is one readable `DESIGN.md`** `## Objetivo`,
40
+ `## Diseño propuesto`, `## Validación`, plus `## Recorrido`, `## Decisiones` or
41
+ `## Abiertos` only when they say something. The CLI derives its identity,
42
+ revision, digest and minimal manifest; nobody authoring a design administers any
43
+ of that. The full package below is the **expanded** shape, and it appears only
44
+ with a declared or derived cause — the closed vocabulary lives in
45
+ [`CONTRACT.md`](CONTRACT.md) § *Two shapes, one contract*.
46
+
47
+ Whichever shape it takes, the design is the deliverable. A spec **references**
48
+ it; it never contains it.
40
49
 
41
50
  ## Composed by
42
51
 
@@ -56,7 +65,16 @@ and the curation. This skill contributes what a correct package looks like.
56
65
 
57
66
  ## Knowledge
58
67
 
59
- ### Package layout
68
+ ### Simple layout — the default
69
+
70
+ ```
71
+ docs/designs/NNN-design-<slug>/
72
+ DESIGN.md the ONLY authored file
73
+ design-manifest.json derived: mode simple, one baseline, empty catalog
74
+ revisions/DESIGN-rNNN.md the exact bytes of a revision a newer one superseded
75
+ ```
76
+
77
+ ### Package layout — the expanded shape
60
78
 
61
79
  ```
62
80
  docs/designs/NNN-design-<slug>/
@@ -28,6 +28,10 @@
28
28
  "type": "string",
29
29
  "pattern": "^DES-(?:[0-9]{3}|[1-9][0-9]{3,})$"
30
30
  },
31
+ "mode": {
32
+ "description": "Which shape this package is. `simple` publishes one authored DESIGN.md and catalogs nothing; `package` is the full dossier of flows, screens, rules, tokens and renditions. Optional, and absent means `package` — every dossier published before the simple route stays readable without a migration.",
33
+ "enum": ["simple", "package"]
34
+ },
31
35
  "title": {
32
36
  "description": "Human name of the package.",
33
37
  "type": "string",