@milehimikey/em 1.19.7 → 1.21.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 (206) hide show
  1. package/.claude/skills/event-modeling/SKILL.md +1 -1
  2. package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
  3. package/.claude/skills/event-modeling-conform/reference/conform.md +29 -1
  4. package/.claude/skills/event-modeling-design/SKILL.md +33 -7
  5. package/.claude/skills/event-modeling-discover/SKILL.md +2 -2
  6. package/.claude/skills/event-modeling-discover/reference/extract.md +12 -0
  7. package/.claude/skills/event-modeling-engagement/SKILL.md +1 -1
  8. package/.claude/skills/event-modeling-implement/SKILL.md +7 -2
  9. package/.claude/skills/event-modeling-implement/reference/implement.md +73 -6
  10. package/.claude/skills/event-modeling-review/SKILL.md +19 -7
  11. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +57 -5
  12. package/.claude/skills/event-modeling-shared/reference/methodology.md +51 -2
  13. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +2 -1
  14. package/.claude/skills/event-modeling-shared/templates/model-readme.md +10 -2
  15. package/.claude/skills/event-modeling-shared/templates/slice.md +12 -1
  16. package/.claude-plugin/marketplace.json +2 -2
  17. package/dist/catalog/build.js +6 -5
  18. package/dist/catalog/build.js.map +1 -1
  19. package/dist/catalog/coverage.d.ts +3 -0
  20. package/dist/catalog/coverage.js +12 -0
  21. package/dist/catalog/coverage.js.map +1 -1
  22. package/dist/catalog/docBadge.d.ts +16 -0
  23. package/dist/catalog/docBadge.js +50 -0
  24. package/dist/catalog/docBadge.js.map +1 -0
  25. package/dist/catalog/docLocate.d.ts +17 -0
  26. package/dist/catalog/docLocate.js +97 -0
  27. package/dist/catalog/docLocate.js.map +1 -0
  28. package/dist/catalog/docModelConsistencyValidate.js +9 -2
  29. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  30. package/dist/catalog/frontmatterCoherenceValidate.js +16 -1
  31. package/dist/catalog/frontmatterCoherenceValidate.js.map +1 -1
  32. package/dist/catalog/invTokens.d.ts +49 -0
  33. package/dist/catalog/invTokens.js +94 -0
  34. package/dist/catalog/invTokens.js.map +1 -0
  35. package/dist/catalog/orphanedSliceDocValidate.js +15 -10
  36. package/dist/catalog/orphanedSliceDocValidate.js.map +1 -1
  37. package/dist/catalog/pages.js +48 -1
  38. package/dist/catalog/pages.js.map +1 -1
  39. package/dist/catalog/readSliceDoc.js +5 -4
  40. package/dist/catalog/readSliceDoc.js.map +1 -1
  41. package/dist/catalog/scenarioQualityValidate.js +2 -2
  42. package/dist/catalog/scenarioQualityValidate.js.map +1 -1
  43. package/dist/catalog/scenarios.d.ts +4 -0
  44. package/dist/catalog/scenarios.js +4 -1
  45. package/dist/catalog/scenarios.js.map +1 -1
  46. package/dist/catalog/sliceDoc.d.ts +54 -1
  47. package/dist/catalog/sliceDoc.js +99 -2
  48. package/dist/catalog/sliceDoc.js.map +1 -1
  49. package/dist/catalog/sliceDocRender.d.ts +3 -0
  50. package/dist/catalog/sliceDocRender.js +295 -0
  51. package/dist/catalog/sliceDocRender.js.map +1 -0
  52. package/dist/catalog/sliceSections.d.ts +18 -1
  53. package/dist/catalog/sliceSections.js +38 -4
  54. package/dist/catalog/sliceSections.js.map +1 -1
  55. package/dist/cli/coverage.d.ts +13 -23
  56. package/dist/cli/coverage.js +51 -91
  57. package/dist/cli/coverage.js.map +1 -1
  58. package/dist/cli/defer.js +3 -2
  59. package/dist/cli/defer.js.map +1 -1
  60. package/dist/cli/ledgerCheck.js +11 -8
  61. package/dist/cli/ledgerCheck.js.map +1 -1
  62. package/dist/cli/markImplemented.js +2 -2
  63. package/dist/cli/markImplemented.js.map +1 -1
  64. package/dist/cli/ratify.js +2 -2
  65. package/dist/cli/ratify.js.map +1 -1
  66. package/dist/cli/refsCheck.d.ts +52 -0
  67. package/dist/cli/refsCheck.js +129 -2
  68. package/dist/cli/refsCheck.js.map +1 -1
  69. package/dist/cli/render-inputs.d.ts +1 -1
  70. package/dist/cli/render-inputs.js +3 -2
  71. package/dist/cli/render-inputs.js.map +1 -1
  72. package/dist/cli/review.js +2 -2
  73. package/dist/cli/review.js.map +1 -1
  74. package/dist/cli/revise.js +2 -2
  75. package/dist/cli/revise.js.map +1 -1
  76. package/dist/cli/skillDirs.d.ts +22 -0
  77. package/dist/cli/skillDirs.js +24 -0
  78. package/dist/cli/skillDirs.js.map +1 -1
  79. package/dist/cli/sliceConform.d.ts +57 -1
  80. package/dist/cli/sliceConform.js +111 -10
  81. package/dist/cli/sliceConform.js.map +1 -1
  82. package/dist/cli/sliceIndex.d.ts +19 -3
  83. package/dist/cli/sliceIndex.js +81 -17
  84. package/dist/cli/sliceIndex.js.map +1 -1
  85. package/dist/cli/sliceNew.js +2 -0
  86. package/dist/cli/sliceNew.js.map +1 -1
  87. package/dist/cli/sliceStubAll.js +7 -2
  88. package/dist/cli/sliceStubAll.js.map +1 -1
  89. package/dist/cli/sliceSync.d.ts +12 -0
  90. package/dist/cli/sliceSync.js +42 -4
  91. package/dist/cli/sliceSync.js.map +1 -1
  92. package/dist/cli/status.d.ts +3 -4
  93. package/dist/cli/status.js +5 -4
  94. package/dist/cli/status.js.map +1 -1
  95. package/dist/cli/storylineSplit.d.ts +18 -0
  96. package/dist/cli/storylineSplit.js +110 -0
  97. package/dist/cli/storylineSplit.js.map +1 -0
  98. package/dist/cli/upgrade.js +39 -14
  99. package/dist/cli/upgrade.js.map +1 -1
  100. package/dist/cli/watchStoryline.d.ts +33 -0
  101. package/dist/cli/watchStoryline.js +65 -0
  102. package/dist/cli/watchStoryline.js.map +1 -0
  103. package/dist/cli.js +423 -71
  104. package/dist/cli.js.map +1 -1
  105. package/dist/emit/docJson.d.ts +99 -0
  106. package/dist/emit/docJson.js +197 -0
  107. package/dist/emit/docJson.js.map +1 -0
  108. package/dist/emit/json.d.ts +22 -1
  109. package/dist/emit/json.js +12 -1
  110. package/dist/emit/json.js.map +1 -1
  111. package/dist/emit/refsJson.d.ts +5 -3
  112. package/dist/emit/refsJson.js +5 -2
  113. package/dist/emit/refsJson.js.map +1 -1
  114. package/dist/mcp/server.js +43 -9
  115. package/dist/mcp/server.js.map +1 -1
  116. package/dist/model/continuation.d.ts +9 -0
  117. package/dist/model/continuation.js +30 -0
  118. package/dist/model/continuation.js.map +1 -1
  119. package/dist/model/edges.d.ts +1 -1
  120. package/dist/model/edges.js +8 -1
  121. package/dist/model/edges.js.map +1 -1
  122. package/dist/model/loadModel.d.ts +38 -0
  123. package/dist/model/loadModel.js +122 -0
  124. package/dist/model/loadModel.js.map +1 -0
  125. package/dist/model/model.d.ts +9 -4
  126. package/dist/model/model.js +4 -0
  127. package/dist/model/model.js.map +1 -1
  128. package/dist/model/rules.d.ts +31 -0
  129. package/dist/model/rules.js +31 -0
  130. package/dist/model/rules.js.map +1 -1
  131. package/dist/model/shapeLint.js +143 -0
  132. package/dist/model/shapeLint.js.map +1 -1
  133. package/dist/model/sliceDocIndex.js +13 -5
  134. package/dist/model/sliceDocIndex.js.map +1 -1
  135. package/dist/model/sliceDocPath.d.ts +19 -0
  136. package/dist/model/sliceDocPath.js +49 -0
  137. package/dist/model/sliceDocPath.js.map +1 -0
  138. package/dist/model/storylineMap.d.ts +20 -0
  139. package/dist/model/storylineMap.js +55 -0
  140. package/dist/model/storylineMap.js.map +1 -0
  141. package/dist/model/validate.d.ts +7 -0
  142. package/dist/model/validate.js +127 -0
  143. package/dist/model/validate.js.map +1 -1
  144. package/dist/parser/ast.d.ts +27 -0
  145. package/dist/parser/parser.d.ts +17 -1
  146. package/dist/parser/parser.js +142 -3
  147. package/dist/parser/parser.js.map +1 -1
  148. package/dist/pipeline.d.ts +16 -0
  149. package/dist/pipeline.js +19 -2
  150. package/dist/pipeline.js.map +1 -1
  151. package/dist/render/drawEdges.d.ts +5 -1
  152. package/dist/render/drawEdges.js +57 -4
  153. package/dist/render/drawEdges.js.map +1 -1
  154. package/dist/render/drawNotes.d.ts +4 -1
  155. package/dist/render/drawNotes.js +40 -10
  156. package/dist/render/drawNotes.js.map +1 -1
  157. package/dist/render/render.d.ts +11 -0
  158. package/dist/render/render.js +93 -10
  159. package/dist/render/render.js.map +1 -1
  160. package/dist/render/serve.d.ts +5 -0
  161. package/dist/render/serve.js +18 -2
  162. package/dist/render/serve.js.map +1 -1
  163. package/dist/render/sliceDiagram.js +3 -0
  164. package/dist/render/sliceDiagram.js.map +1 -1
  165. package/dist/render/sliceOverlay.d.ts +5 -1
  166. package/dist/render/sliceOverlay.js +24 -2
  167. package/dist/render/sliceOverlay.js.map +1 -1
  168. package/dist/render/sliceStatus.d.ts +8 -0
  169. package/dist/render/sliceStatus.js +22 -15
  170. package/dist/render/sliceStatus.js.map +1 -1
  171. package/dist/render/storylineBands.d.ts +0 -3
  172. package/dist/render/storylineBands.js +2 -22
  173. package/dist/render/storylineBands.js.map +1 -1
  174. package/dist/render/storylineDiagram.js +17 -69
  175. package/dist/render/storylineDiagram.js.map +1 -1
  176. package/dist/render/storylineMap.d.ts +18 -0
  177. package/dist/render/storylineMap.js +263 -0
  178. package/dist/render/storylineMap.js.map +1 -0
  179. package/dist/render/storylinePicker.d.ts +9 -0
  180. package/dist/render/storylinePicker.js +17 -0
  181. package/dist/render/storylinePicker.js.map +1 -0
  182. package/dist/render/svgGeometry.d.ts +9 -0
  183. package/dist/render/svgGeometry.js +16 -0
  184. package/dist/render/svgGeometry.js.map +1 -1
  185. package/dist/render/viewerHtml.js +1 -1
  186. package/dist/render/viewerHtml.js.map +1 -1
  187. package/dist/templates.d.ts +1 -1
  188. package/dist/templates.js +10 -2
  189. package/dist/templates.js.map +1 -1
  190. package/package.json +1 -1
  191. package/plugin/.claude-plugin/plugin.json +2 -2
  192. package/plugin/shared/reference/em-dsl.md +57 -5
  193. package/plugin/shared/reference/methodology.md +51 -2
  194. package/plugin/shared/reference/slice-doc-schema.md +2 -1
  195. package/plugin/shared/templates/model-readme.md +10 -2
  196. package/plugin/shared/templates/slice.md +12 -1
  197. package/plugin/skills/conform/SKILL.md +1 -1
  198. package/plugin/skills/conform/reference/conform.md +29 -1
  199. package/plugin/skills/design/SKILL.md +33 -7
  200. package/plugin/skills/discover/SKILL.md +2 -2
  201. package/plugin/skills/discover/reference/extract.md +12 -0
  202. package/plugin/skills/engagement/SKILL.md +1 -1
  203. package/plugin/skills/event-modeling/SKILL.md +1 -1
  204. package/plugin/skills/implement/SKILL.md +7 -2
  205. package/plugin/skills/implement/reference/implement.md +73 -6
  206. package/plugin/skills/review/SKILL.md +19 -7
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: discover
3
- em-version: 1.19.7
3
+ em-version: 1.21.0
4
4
  description: >-
5
5
  Use when starting a brand-new event model from scratch — greenfield discovery: brainstorming
6
6
  past-tense events, storyboarding the happy path, finding the commands and read models — or when
@@ -69,7 +69,7 @@ Goal: a draft model of events, storyboard, commands, and views. Loose is OK; str
69
69
  **Close the loop before leaving this step:** every event from step 3 must be read by at least one
70
70
  read model. Walk the event list and ask, for each one, *"who looks at this, and what do they do
71
71
  with it?"* An event with no answer is either missing its read model or shouldn't be recorded —
72
- both are worth raising with the user rather than leaving dangling.
72
+ both are worth raising with the user rather than leaving dangling. Keep the draft in one file with inline `storyline` blocks; the design phase splits it into one file per story (`em storyline split`) once the names are settled.
73
73
 
74
74
  End of phase: write/refresh the `.em`, render it, update `.event-modeling.md` (steps done,
75
75
  decisions, open questions — run `em state set-phase model` rather than hand-editing `Current
@@ -97,6 +97,18 @@ it is fine to finish a round with `# TBD`s still parked.
97
97
  read model* warnings: real systems do record fire-and-forget events. In an as-is model that is
98
98
  a **finding about the system**, not a modelling mistake — never invent a reader to silence it
99
99
  (that would be desired state). Park it in the Decisions log and carry the warning.
100
+ **Expect lookup-style sources too.** A lifted model will faithfully reproduce the projection's
101
+ lookup joins — a view wired to `from "Order Created"` only because the current query joins the
102
+ orders table to get `customerName`, not because this view owns any row that event changes. Wire
103
+ it as-is (current-state-only stance: that join is how the system behaves today); don't fix it
104
+ here, that would be inventing desired state. Note it as a finding in the Decisions log the same
105
+ way as an unread event, and leave it for `model`/`slice` to apply the views-as-lookups rule
106
+ (`../../../shared/reference/methodology.md`, "Views as lookups") once the as-is
107
+ model is agreed. **Housekeeping handlers are `updates from`, as-is:** when the projection code
108
+ handles an event only to update or delete a row it already holds (a status flip, a due date
109
+ moved, an address changed, a row removed), write that event in `updates from "…"`, not `from` —
110
+ that is what the code does today, it keeps the field tracing complete, and the as-is render then
111
+ shows the one line that puts work on the list instead of every handler.
100
112
  - **R5 — Boundaries & reactions.** Current automations and integrations as-is: schedulers,
101
113
  listeners, outbound syncs, inbound webhooks. Model each as a reaction sharing its slice with
102
114
  the `command` + `event` it triggers (`reaction → command → event`, per `em-dsl.md`) — the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: engagement
3
- em-version: 1.19.7
3
+ em-version: 1.21.0
4
4
  description: >-
5
5
  Use when leading an engagement: building a named set of ratified event-modeling slices
6
6
  (`em engagement`) into one independent PR per slice, each against main, by dispatching the
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: event-modeling
3
- em-version: 1.19.7
3
+ em-version: 1.21.0
4
4
  description: >-
5
5
  Use when the user runs `/em:event-modeling` (with or without a phase name), or wants to resume an
6
6
  event-modeling session without specifying which part of the process applies. Reads the model's
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: implement
3
- em-version: 1.19.7
3
+ em-version: 1.21.0
4
4
  description: >-
5
5
  Use when building a single ratified event-modeling slice (status: ready-to-implement) into
6
6
  merged, tested code — the one phase where the agent builds rather than facilitates. Gates on
@@ -53,7 +53,12 @@ routing table (§7) is what names the skill set for each pattern.
53
53
  Preconditions (tool check, model location) are the same as every other phase — see
54
54
  `${CLAUDE_PLUGIN_ROOT}/shared/reference/operating-principles.md` — but this phase additionally
55
55
  requires the target slice to already be ratified; if it isn't, stop and say so rather than
56
- starting on unratified work.
56
+ starting on unratified work. The one documented exception is **inline ratification** (GH #399,
57
+ `reference/implement.md` §1a): for an internal (non-public-touching, non-engagement) slice whose
58
+ doc is already `reviewed`, drafting code on the same branch ahead of the human's `em slice
59
+ ratify` is sanctioned — provided you never flip the gate yourself and re-confirm
60
+ `--slice-ready` reads `true` before treating the slice as done. `em:engagement` is
61
+ unchanged by this: it still requires every dispatched slice ratified before its branch is cut.
57
62
 
58
63
  End of phase: PR merged, slice doc flipped to `status: implemented` with `implementedIn`
59
64
  filled, `em slice index <model-name>.em` run to refresh `README.md`'s Slices table. Implement
@@ -47,15 +47,82 @@ A warning whose code is in this list blocks; any other warning never does — `c
47
47
 
48
48
  Because of that list, `ready` can be `false` with every `gates` entry `true` (a `both-ends-of-a-flow/*` warning on one of the slice's own elements, say). Don't work it out from `gates`: read **`blockedBy`** (schema `1.5`, GH #377), the codes that flipped `ready`, `[]` exactly when it is `true`, and report those codes with the `false` gates when you hand the slice back.
49
49
 
50
- **`ready: false` means stop** — with one named exception: a slice already `status: implemented`
51
- with `driftSignal: in-sync` or `uncertified` (MIL-214) also reads `ready: false` (its
52
- `statusReady` gate fails because nothing is newly ratified), and that specific case is
53
- re-implementation/repair, not a blocker — see §3's third mode before treating it as one. For
50
+ **`ready: false` means stop** — with two named exceptions. First: a slice already `status:
51
+ implemented` with `driftSignal: in-sync` or `uncertified` (MIL-214) also reads `ready: false`
52
+ (its `statusReady` gate fails because nothing is newly ratified), and that specific case is
53
+ re-implementation/repair, not a blocker — see §3's third mode before treating it as one. Second:
54
+ under **inline ratification** (§1a) a slice doc that's only `status: reviewed` — not yet
55
+ `ready-to-implement` — is a sanctioned starting point for drafting code on the SAME branch, with
56
+ the explicit, non-negotiable condition that you treat nothing as actually ratified, and open
57
+ nothing for merge, until a human has run `em slice ratify` and `--slice-ready` reads `true` for
58
+ real; §1a names exactly which slices qualify and what that condition requires in practice. For
54
59
  every other `false`, report which `gates`
55
60
  entries are `false` and what `blockedBy` names (and any `diagnostics` entries concerning this
56
61
  slice) and hand the slice back to the humans. Never make the gate pass yourself — checking an open-question box, flipping
57
- `status`, or editing frontmatter are ratification decisions, and ratification happens in a
58
- facilitated session, not in an implementation branch.
62
+ `status`, or editing frontmatter are ratification decisions, made by a human in a ratification
63
+ session, never by you running `em slice ratify` on their behalf. That session is usually a
64
+ separate doc-only PR, merged before an implementation branch is even cut — but it doesn't have
65
+ to be: **inline ratification** (GH #399, §1a below) lets the session be the PR review of the
66
+ very branch you're implementing on, for internal slices. Either shape, the rule here is the
67
+ same: you never flip the gate yourself, whatever branch you're on.
68
+
69
+ ### 1a. The inline variant: ratifying on the implementation branch
70
+
71
+ Most of this document assumes the ordinary shape — a slice is already `ready-to-implement` when
72
+ you start, ratified in its own prior PR, and §1's gate reads `true` before you write a line of
73
+ code. **Inline ratification** is the documented alternative
74
+ (`docs/process.md`'s
75
+ ["Inline ratification" section](https://github.com/milehimikey/em/blob/main/docs/process.md#inline-ratification-approval-as-the-ratification-session)):
76
+ draft the slice doc *and* build it on the same branch, spec commits first, and let the human's
77
+ review of that one PR be the ratification session — which means you are, deliberately and
78
+ sanctioned, building for most of that branch's life against a doc that reads `ready: false`.
79
+ What doesn't change: you still never flip `status` yourself, never run `em slice ratify` on the
80
+ human's behalf, and never write a word of the ratification record — see §1's second named
81
+ exception for the precise condition this depends on. What's different is sequencing and tiering:
82
+
83
+ - **Draft the doc first, then build on the same branch.** Commit the slice doc (through the
84
+ normal `slice` phase), get it reviewed (`em slice review --by`, flipping it to `status:
85
+ reviewed` — a human has to do this part too, same as always) before any implementation code,
86
+ even though doc and code will both live on one branch and merge in one PR. Writing code before
87
+ the doc exists, or before a human has looked at it, is retrofit — the exact failure mode inline
88
+ mode is named after avoiding — whether or not anyone ever checks for it.
89
+ - **You may keep building past a `reviewed`-but-not-yet-`ready-to-implement` doc, but nothing is
90
+ ratified until `em slice ratify` actually runs.** `--slice-ready` keeps reading `false` the
91
+ whole time you're building — that's expected, not a signal to stop, as long as the doc's
92
+ `status` is `reviewed` (not `draft`: an un-reviewed doc is never a valid base, inline or not).
93
+ On an inline branch the human typically runs `em slice ratify --no-ref` as part of approving
94
+ the PR (`--no-ref` because the branch is headed for a squash/rebase merge) — not something you
95
+ do for them, and not something you should expect to have happened before the PR is up for
96
+ review. Before you report the slice done, or treat §6's merge-time flip as legitimate,
97
+ re-check `--slice-ready` yourself and confirm it now reads `true` with `ratifiedBy:` set — if
98
+ it still doesn't, the slice isn't ratified yet and you say so instead of proceeding.
99
+ - **A post-signature doc edit still trips the hash check.** `ratifiedHash` doesn't know or care
100
+ which branch it was computed on — if something changes the doc's body after the human has
101
+ signed it (a gap surfaces, §4), `--slice-ready` and `em slice ratify` both refuse the stale
102
+ signature exactly as they would across two PRs. Route it through `em slice revise --withdraw`,
103
+ review, re-ratify (§4) — inline doesn't shortcut that loop, it just means the re-sign happens
104
+ on the branch you're already on instead of a fresh one.
105
+ - **Not every slice is a candidate.** A slice owning a `public` command, event or view
106
+ (`isPublicTouchingSlice`) keeps the separate doc PR — the contract is a promise to consumers
107
+ who never see your implementation diff, and `em slice ratify` already refuses a public-touching
108
+ slice without `--meaning-unchanged`/`--contract-change` regardless of which branch it runs on.
109
+ An engagement-dispatched slice is never inline either — engagements structurally need every
110
+ contract frozen before any implementer branch is cut, so the engagement skill never offers you
111
+ this shape (it is explicitly unchanged by GH #399 — this is a note for your own judgment
112
+ outside an engagement, not something to apply inside one).
113
+ - **Pre-ship advisory conform is the loop's natural checkpoint.** Before the PR merges, a human
114
+ (or you, if asked) can run `em slice conform <model>.em <key> --at <rev> --preview` — the
115
+ pre-ship, non-certifying mode (GH #400): same doc-resolution and findings-check read as a real
116
+ certification, legal before the slice has shipped, never writes `conformedVersion:`/
117
+ `conformedAt:`/`conformedOn:`. It's advisory and ephemeral by default (nothing written unless
118
+ `--write-findings` is passed) — a cheap "did I just drift from the doc I signed" look before
119
+ asking for the PR review that will also be the ratification.
120
+ - **The ordering advisory is informational, not yours to act on.** `em refs --check-order`
121
+ (GH #399) can report whether a commit on this branch touched code before the doc's
122
+ `ratifiedRef` — a retrofit smoke signal for the human reviewing the PR. It's advisory, never a
123
+ gate, and nothing in this skill asks you to run it or react to its output; if a human shows you
124
+ a `code-before-ratification` result, treat it the same as any other gap raised against your
125
+ work (§4), not as something to silence.
59
126
 
60
127
  ## 2. Read the spec
61
128
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: review
3
- em-version: 1.19.7
3
+ em-version: 1.21.0
4
4
  description: >-
5
5
  Use when starting em's live browser viewer (`em watch --serve`) so a team can watch a model
6
6
  update in real time, or facilitating a SCHEDULED stakeholder walkthrough that steps through
@@ -16,8 +16,16 @@ description: >-
16
16
  Start the watcher with `--serve` in the background:
17
17
  `em watch <model-name>.em -o <model-name>.svg --serve` (run_in_background). It re-renders on every
18
18
  save and pushes an instant reload to the browser over Server-Sent Events. Tell the user to open the
19
- URL it prints (e.g. `http://localhost:5173/?svg=<model-name>.svg`) and share their screen — updates
20
- appear the moment you save, with no polling and no idle churn between edits.
19
+ URL it prints and share their screen — updates appear the moment you save, with no polling and no
20
+ idle churn between edits.
21
+
22
+ What that URL opens depends on the model. A model that declares storylines opens on the
23
+ **storyline canvas** (`http://localhost:5173/map`): every storyline's own diagram in a draggable
24
+ frame, the flow between storylines drawn between frames, reloaded live on every save with the
25
+ layout kept. A frame's **open ›** drills into that storyline — the viewer on its own slices and
26
+ nothing from outside it — and **‹ Storylines** in the header returns to the canvas. A model
27
+ without storylines opens on the timeline (`http://localhost:5173/?svg=<model-name>.svg`). Never
28
+ send a room to the full timeline of a storyline model; the storyline is the unit people read.
21
29
 
22
30
  The viewer navigates like a map — drag to pan, scroll/pinch to zoom, **Fit** to reset — and its
23
31
  **Review mode** steps through slices one at a time (see the `review` phase below). A save that
@@ -35,10 +43,14 @@ speculation.** Don't propose this phase proactively; it exists for facilitated r
35
43
  non-engineer stakeholders in the room, not routine model editing.
36
44
 
37
45
  Start the same live server as `watch`: `em watch <model-name>.em -o <model-name>.svg --serve`
38
- (run_in_background). Open the printed URL, click **Review mode** in the header, and share the
39
- screen. Use Prev/Next (or the left/right arrow keys) to step through slices in declaration
40
- order — each one pans/zooms into view with everything else dimmed, so the room's attention
41
- tracks one slice at a time.
46
+ (run_in_background). Open the printed URL and share the screen. With storylines, review one
47
+ storyline at a time: open it from the canvas (or start inside it with `--storyline "<name>"`),
48
+ then click **Review mode** in the header — Prev/Next walk that storyline's slices only. Between
49
+ storylines, **‹ Storylines** returns to the canvas, where the arrows between frames are the
50
+ order to take them in. Without storylines, click **Review mode** on the timeline. Use Prev/Next
51
+ (or the left/right arrow keys) to step through slices in declaration order — each one
52
+ pans/zooms into view with everything else dimmed, so the room's attention tracks one slice at
53
+ a time.
42
54
 
43
55
  **When a State View slice is on screen, ask who reads it (MIL-215):** a person or client in the
44
56
  room → the `ui` should draw it; another system → `public`; only an automation → nothing, it's