@milehimikey/em 1.18.0 → 1.19.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/.claude/agents/em-implementer.md +7 -4
- package/.claude/agents/em-validator.md +2 -2
- package/.claude/skills/event-modeling/SKILL.md +1 -1
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +5 -2
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-discover/reference/prd-rubric.md +1 -1
- package/.claude/skills/event-modeling-discover/reference/prd-spec-path.md +1 -1
- package/.claude/skills/event-modeling-engagement/SKILL.md +15 -8
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +10 -0
- package/.claude/skills/event-modeling-review/SKILL.md +4 -2
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +14 -8
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +14 -2
- package/.claude-plugin/marketplace.json +2 -2
- package/dist/catalog/docJoin.d.ts +2 -1
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +17 -1
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/signedBodyValidate.js.map +1 -1
- package/dist/catalog/sliceDoc.d.ts +47 -15
- package/dist/catalog/sliceDoc.js +82 -22
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +3 -2
- package/dist/catalog/sliceReadyValidate.js +30 -2
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +9 -0
- package/dist/catalog/sliceSections.js +29 -3
- package/dist/catalog/sliceSections.js.map +1 -1
- package/dist/cli/ciInit.d.ts +17 -0
- package/dist/cli/ciInit.js +47 -3
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/defer.d.ts +1 -1
- package/dist/cli/defer.js +5 -4
- package/dist/cli/defer.js.map +1 -1
- package/dist/cli/engagement.d.ts +15 -1
- package/dist/cli/engagement.js +84 -5
- package/dist/cli/engagement.js.map +1 -1
- package/dist/cli/engagementFile.d.ts +2 -0
- package/dist/cli/engagementFile.js +3 -1
- package/dist/cli/engagementFile.js.map +1 -1
- package/dist/cli/prdTriage.js +15 -0
- package/dist/cli/prdTriage.js.map +1 -1
- package/dist/cli/review.d.ts +17 -2
- package/dist/cli/review.js +39 -10
- package/dist/cli/review.js.map +1 -1
- package/dist/cli/sliceSync.d.ts +37 -0
- package/dist/cli/sliceSync.js +84 -4
- package/dist/cli/sliceSync.js.map +1 -1
- package/dist/cli/upgrade.d.ts +2 -2
- package/dist/cli/upgrade.js +169 -38
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli.js +51 -17
- package/dist/cli.js.map +1 -1
- package/dist/emit/engagementJson.d.ts +4 -3
- package/dist/emit/engagementJson.js +9 -4
- package/dist/emit/engagementJson.js.map +1 -1
- package/dist/emit/validateJson.d.ts +4 -3
- package/dist/emit/validateJson.js +4 -3
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/model/model.d.ts +5 -0
- package/dist/model/model.js +15 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/rules.d.ts +8 -1
- package/dist/model/rules.js +8 -1
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.js +46 -31
- package/dist/model/validate.js.map +1 -1
- package/dist/query/verbs.js +4 -4
- package/dist/query/verbs.js.map +1 -1
- package/package.json +1 -1
- package/plugin/.claude-plugin/plugin.json +2 -2
- package/plugin/agents/em-implementer.md +7 -4
- package/plugin/agents/em-validator.md +2 -2
- package/plugin/shared/reference/em-dsl.md +14 -8
- package/plugin/shared/reference/slice-doc-schema.md +14 -2
- package/plugin/skills/conform/SKILL.md +1 -1
- package/plugin/skills/design/SKILL.md +5 -2
- package/plugin/skills/discover/SKILL.md +1 -1
- package/plugin/skills/discover/reference/prd-rubric.md +1 -1
- package/plugin/skills/discover/reference/prd-spec-path.md +1 -1
- package/plugin/skills/engagement/SKILL.md +15 -8
- package/plugin/skills/event-modeling/SKILL.md +1 -1
- package/plugin/skills/implement/SKILL.md +1 -1
- package/plugin/skills/implement/reference/implement.md +10 -0
- package/plugin/skills/review/SKILL.md +4 -2
|
@@ -69,7 +69,7 @@ to decide `frontmatter-invalid` without re-deriving frontmatter-shape rules of i
|
|
|
69
69
|
| `ratifiedBy` | string | free text (typically a person's name) | written only by `em slice ratify` (MIL-165 — see [cli.md](https://github.com/milehimikey/em/blob/main/docs/cli.md#em-slice-ratify-file-slice-key---by-name)); joined into `em export`'s `slice.doc.ratifiedBy` (schema `1.8`) and `em slice index`'s Ratified by column |
|
|
70
70
|
| `ratifiedOn` | string | `YYYY-MM-DD` | written only by `em slice ratify` (MIL-165); joined into `em export`'s `slice.doc.ratifiedOn` (schema `1.8`) |
|
|
71
71
|
| `ratifiedRef` | string | full commit sha | written only by `em slice ratify` (MIL-284 — see [cli.md](https://github.com/milehimikey/em/blob/main/docs/cli.md#em-slice-ratify-file-slice-key---by-name)) when the model directory is inside a git repository: `HEAD` at ratification, the commit whose tree holds the body that was signed (ratify refuses a doc with uncommitted changes so this holds). Absent when ratified before 1.15, outside git, or with `em slice ratify --no-ref` (GH #255 — for a repo whose squash/rebase merges would leave the commit unreachable from the target branch; `--no-ref` also removes a line already present). **An address, not the identity:** valid only while the commit stays reachable; `ratifiedHash` is what identifies the signed content. Cleared by `em slice revise`. Joined into `em export`'s `slice.doc.ratifiedRef` (schema `1.16`). Not a target-repo revision: `em slice conform --at` still names that itself |
|
|
72
|
-
| `ratifiedHash` | string | `sha256:<64 hex>` | written only by `em slice ratify` (MIL-284): `sha256` over the doc body (everything after the frontmatter fence, EOLs normalised)
|
|
72
|
+
| `ratifiedHash` | string | `sha256:<64 hex>` | written only by `em slice ratify` (MIL-284): `sha256` over the **authored text** of the doc body (everything after the frontmatter fence, EOLs normalised). Since 1.19.0 (GH #347) the text strictly between each [generated region](#generated-regions-and-authored-sections)'s two marker lines is left out (the marker lines themselves stay in), so `em slice sync` can refresh a ratified or shipped doc's regions without moving the hash — the regions restate the model, whose contract changes surface through model validation and its pin (`model-versions/v<N>.json`); a doc whose markers don't balance has nothing left out. Since 1.17.0 (GH #253) the doc also leaves out **what describes a later version**: inside `## Open Questions` the heading line, blank lines and every `deferred to v<n>` item, then trailing whitespace is trimmed — so `em slice defer` can record a question on a ratified or shipped doc without moving the hash. Answered `- [x]` history, any `- [ ]`, the region marker lines and every other section stay signed. The signed content's identity without git. A hash in an older scope whose body is intact is still read as intact — recorded by 1.17.0–1.18.x (generated regions inside) or before 1.17.0 (whole body); `em upgrade`'s `ratified-hash-scope` step re-stamps it, and so do `em slice sync` and `em slice defer` when they first write to the doc. Cleared by `em slice revise`. Read by `em validate --slice-ready` (`slice-ready-body-changed-since-ratification`) and by `ratify`'s same-sign-off re-run; joined into `em export`'s `slice.doc.ratifiedHash` (schema `1.16`) |
|
|
73
73
|
| `shippedVersion` | integer | positive integer | written only by `em slice mark-implemented` (MIL-284): the doc's `version:` when the merge was recorded. With `shippedRef`/`shippedOn`/`implementedIn`, joined into `em export`'s `slice.doc.shipped` (schema `1.16`). Additive in 1.15 — `status`/`implementedIn` still carry the lifecycle for every reader |
|
|
74
74
|
| `shippedRef` | string | full commit sha | written only by `em slice mark-implemented` (MIL-284): the doc's `ratifiedRef` at merge time, i.e. the ref the shipped version was signed at; absent when the doc had none (ratified before 1.15, outside git, or with `--no-ref`, GH #255). Same caveat as `ratifiedRef`: an address, valid while reachable — `ratifiedHash` identifies the content |
|
|
75
75
|
| `shippedOn` | string | `YYYY-MM-DD` | written only by `em slice mark-implemented` (MIL-284): the local date of the merge record, or `--on <date>` |
|
|
@@ -474,7 +474,7 @@ re-run `em slice sync`.
|
|
|
474
474
|
| Region | Section | Body |
|
|
475
475
|
|---|---|---|
|
|
476
476
|
| `em-slice-command` | `## Command / Input` | `**Command:** \`Name\`` + `\| Field \| Type \| Required \| Rules / Validation \|` (Required is `no` for a `name?: Type` field) |
|
|
477
|
-
| `em-slice-event` | `## Event(s) Emitted` | `**Event:** \`Name\` → context \`Ctx\`` + `\| Field \| Type \| Immutable Fact? \| Source / Notes \|` (Source: the same-slice command field it is copied from, `assigned` for a system-assigned field, else `{{ }}`) |
|
|
477
|
+
| `em-slice-event` | `## Event(s) Emitted` | `**Event:** \`Name\` → context \`Ctx\`` + `\| Field \| Type \| Immutable Fact? \| Source / Notes \|` (Source: the same-slice command field it is copied from; failing that, the command from another slice that also records the event, written `from command \`A\` (slice "Create")` (GH #344, the same union `fields-completeness/event-field-no-source` checks); `assigned` for a system-assigned field, else `{{ }}`) |
|
|
478
478
|
| `em-slice-view` | `## Read Model / View` | `- **View:** \`Name\` built from events: …` (the union across the originating and every `again` instance; each later event is annotated `(via "<slice>")` with the slice of the instance that adds it) + `\| Field \| Type \| Source / Notes \|` (Source: the source event, from that union, carrying the field, `Derived` for a `derived` field, `Collection of \`T\`, fed by …` for a `T[] derived from …` field — followed by one neutral Given/Then scenario stub per named event under the table, to copy into `## Scenarios` and complete there (the region itself stays read-only) — else `{{ }}`) |
|
|
479
479
|
| `em-slice-invariants` | `## Invariants / Business Rules` | one `- **INV-X** — rule` line per model-declared invariant of the slice's commands and events |
|
|
480
480
|
|
|
@@ -506,6 +506,18 @@ generated list never trips `invariants/declared-in-both`. Elaborate each ID belo
|
|
|
506
506
|
Dependencies, Open Questions. `em` never writes them; `em slice sync` leaves every byte outside
|
|
507
507
|
the region markers untouched (CRLF included).
|
|
508
508
|
|
|
509
|
+
**Regions and the signature (GH #347, 1.19.0).** `ratifiedHash` covers the authored sections and
|
|
510
|
+
the marker lines, not what sits between the markers. So `em slice sync` runs on a ratified or
|
|
511
|
+
shipped doc like any other and keeps its signature: it rewrites the regions, leaves `ratifiedHash`
|
|
512
|
+
and `ratifiedRef` alone, and prints a `note:` saying so. A hash still in an older scope (1.17.0–1.18.x,
|
|
513
|
+
or pre-1.17 whole-body) whose body is intact is re-stamped in the current scope in the same write —
|
|
514
|
+
same authored text, not a re-signing. A doc whose authored text already fails its hash is synced
|
|
515
|
+
too, with nothing re-stamped (`em validate --check-signed-bodies` still reports it). A scenario
|
|
516
|
+
stub or `{{ }}` Source cell that sync writes into a signed doc's region is reported by `em validate`
|
|
517
|
+
as `slice-doc/generated-region-placeholder` (warning; see
|
|
518
|
+
[validation.md](https://github.com/milehimikey/em/blob/main/docs/validation.md#generated-region-placeholders)): fill the model gap and re-sync, or
|
|
519
|
+
write the scenario in `## Scenarios`, which on a signed doc is the next version (`em slice revise`).
|
|
520
|
+
|
|
509
521
|
**Scenario grammar (authored, constrained).** Inside `## Scenarios (Given / When / Then)`, each
|
|
510
522
|
case is a block:
|
|
511
523
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: conform
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.0
|
|
4
4
|
description: >-
|
|
5
5
|
Use when checking a ratified event model (and its slice docs) for drift against the codebase
|
|
6
6
|
that implements it — advisory only, never a gate, never an unprompted edit — or when walking
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: design
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.0
|
|
4
4
|
description: >-
|
|
5
5
|
Use when structuring a draft event model into swimlanes and the four patterns (State Change,
|
|
6
6
|
State View, Automation, Translation), evaluating a model's structural completeness, or writing
|
|
@@ -245,7 +245,10 @@ For each slice:
|
|
|
245
245
|
**never hand-edit a generated region.** To change a field, a type, or an invariant, edit the
|
|
246
246
|
`.em`, then **after any model edit run `em slice sync <model>.em`**, which rewrites every
|
|
247
247
|
region in place and leaves everything else byte-for-byte (`em slice sync <model>.em --check`
|
|
248
|
-
reports a stale doc without writing).
|
|
248
|
+
reports a stale doc without writing). That includes a ratified or shipped doc: `ratifiedHash`
|
|
249
|
+
covers the authored text only (since em 1.19.0), so sync rewrites its regions, keeps the
|
|
250
|
+
signature and says so — never `em slice revise` a doc just to sync it; revise only when an
|
|
251
|
+
authored section has to change. **Edit authored sections only**: Intent, Trigger &
|
|
249
252
|
Actor, `Triggered by`/`Read by`/`Consumed by`, the invariant elaborations below the generated
|
|
250
253
|
list, Scenarios, Alternate & Error Flows, NFRs, Dependencies, Open Questions. Scenarios use the
|
|
251
254
|
constrained shape `em` reads back: a `### Scenario: <title>` heading, then `- **Given:**`,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: discover
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.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
|
|
@@ -63,7 +63,7 @@ All of these are checked by `em discover triage-check`; write the record so they
|
|
|
63
63
|
group** has only `reference` statements and **no storyline**: `storyline: null` on the group and
|
|
64
64
|
on its statements. It never joins a walkthrough storyline. The report lists reference-only
|
|
65
65
|
groups outside every storyline — operations no walkthrough touches; check these are not CRUD fill.
|
|
66
|
-
8. **One statement per claim.** A statement's normalised quote may not equal, contain
|
|
66
|
+
8. **One statement per claim.** A statement's normalised quote may not equal, contain, be contained in, or partially overlap (by character range in the normalised source) another statement's quote; the error names both. Ranges are taken at a quote's first occurrence in the normalised source, so a sentence repeated in the PRD can hide or produce an overlap.
|
|
67
67
|
9. **Quotes are verbatim** (Markdown emphasis marks, smart quotes and whitespace aside) and at
|
|
68
68
|
least 12 characters. A storyline `quote` is the **full** walkthrough span, start to finish.
|
|
69
69
|
|
|
@@ -85,7 +85,7 @@ event share one slice.
|
|
|
85
85
|
built only from `reference` statements (operations no walkthrough touches) is reference-only:
|
|
86
86
|
`storyline: null` on the group and on its statements. It never joins a walkthrough storyline,
|
|
87
87
|
and the report lists it outside every storyline for the human to inspect.
|
|
88
|
-
- A claim is quoted once: no statement's quote may equal, contain
|
|
88
|
+
- A claim is quoted once: no statement's quote may equal, contain, be contained in, or partially overlap by character range in the normalised source another's. Only `modeled`/`rewritten` walkthrough statements anchor a group; a `question` never does.
|
|
89
89
|
|
|
90
90
|
## Step 4 — Rewrite, don't drop
|
|
91
91
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: engagement
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.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
|
|
@@ -70,9 +70,13 @@ Run the shared preconditions first (tool check, bundle currency, locate the mode
|
|
|
70
70
|
fails, STOP and ask the human to add `.claude/worktrees/` to `.gitignore` in its own commit
|
|
71
71
|
on `main`.
|
|
72
72
|
5. **The engagement exists.** `em engagement status <model>.em <slug>`. If there is no such
|
|
73
|
-
engagement, ask the human which slices it covers (a list, a context, or "everything
|
|
73
|
+
engagement, ask the human which slices it covers (a list, a context, a storyline, or "everything
|
|
74
74
|
downstream of X") and run `em engagement new <model>.em <slug> --slices a,b,c` (or
|
|
75
|
-
`--context <C>`, or `--downstream-of <ref>`) `--by "<their name>"`.
|
|
75
|
+
`--context <C>`, `--storyline <name>`, or `--downstream-of <ref>`) `--by "<their name>"`. First check the host
|
|
76
|
+
repo's PR-title convention (a commitlint config, a PR-title workflow, or the last few merged
|
|
77
|
+
PR titles) and pass `--pr-title "<template>"` when it differs from the default
|
|
78
|
+
`<key>: <slice name>`; placeholders are `{key}`, `{slice}` (display name) and `{sliceKey}`
|
|
79
|
+
(kebab key, usually what a lint wants). When `new` warns that the
|
|
76
80
|
selection has several unconnected components, relay its suggestion (one engagement each)
|
|
77
81
|
and let the human decide before going on.
|
|
78
82
|
|
|
@@ -118,10 +122,13 @@ For each slice the plan lists as not held:
|
|
|
118
122
|
4. Record it:
|
|
119
123
|
`em engagement set <model>.em <slug> <key> --state building --branch impl/<key> --base <base>`
|
|
120
124
|
5. Dispatch `em-implementer` (`em:em-implementer` under the plugin) on the implementer model.
|
|
121
|
-
Its prompt is ONLY the slice key, the absolute worktree path
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
+
Its prompt is ONLY the slice key, the absolute worktree path, the exact pull-request title
|
|
126
|
+
and, when there is one, the tracking key. The title is the slice's `prTitle` from
|
|
127
|
+
`em engagement plan --json` (GH #334), already resolved from the engagement's `--pr-title`
|
|
128
|
+
template or the default: pass it verbatim and never compose one. The tracking key is the
|
|
129
|
+
plan's `tracking` (GH #241), already resolved: the slice doc's own `tracking:` wins over the
|
|
130
|
+
engagement's `--tracking`, and it is `null` when neither is set (then say nothing about
|
|
131
|
+
tracking). Surface any `pr-title-fallback` pre-flight entry to the human. It reads
|
|
125
132
|
its own spec, the constitution and the implement contract. Give it no plan, no other slice,
|
|
126
133
|
and no merge instructions.
|
|
127
134
|
|
|
@@ -133,7 +140,7 @@ When the implementer returns a PR URL (and a per-invariant test map):
|
|
|
133
140
|
base: `gh pr view <url> --json baseRefName` must be `main`. If not, fix it with
|
|
134
141
|
`gh pr edit <url> --base main`. That is a lead step; the implementer never changes a base.
|
|
135
142
|
2. Dispatch `em-validator` (`em:em-validator`) with the slice key, the worktree path and the same
|
|
136
|
-
tracking key (when the slice has one)
|
|
143
|
+
tracking key (when the slice has one) and the same `prTitle`. It
|
|
137
144
|
returns one PASS/FAIL line per check and `OVERALL: PASS` or a failure.
|
|
138
145
|
3. On `OVERALL: PASS`: `em engagement set <model>.em <slug> <key> --state review`. Dispatch
|
|
139
146
|
`em-reviewer` (`em:em-reviewer`) with the slice key and the PR URL. Dispatch `em-critic`
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: event-modeling
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.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.
|
|
3
|
+
em-version: 1.19.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
|
|
@@ -35,6 +35,16 @@ every `## Open Questions` checkbox is checked, and no status/version/link incohe
|
|
|
35
35
|
— `gates` names each of those 4 conditions individually (`docBound`/`frontmatterUsable`/
|
|
36
36
|
`statusReady`/`noUncheckedOpenQuestions`) if you need to say which one is blocking.
|
|
37
37
|
|
|
38
|
+
`ready` is the named gates, plus error-severity diagnostics scoped to the slice, plus these warning-severity codes:
|
|
39
|
+
|
|
40
|
+
- `slice-ready-no-doc-bound`, `slice-ready-status-not-ready`, `slice-ready-open-questions-unchecked`: the gates themselves.
|
|
41
|
+
- `binding-missing-file`, `frontmatter-invalid`: the `frontmatterUsable` gate.
|
|
42
|
+
- `both-ends-of-a-flow/*`: a dangling slice is not a complete pattern.
|
|
43
|
+
- `fields-completeness/event-field-no-source`: the `assigned` marker contract (MIL-148).
|
|
44
|
+
- `invariants/public-command-without-invariants`: the API-first readiness requirement (`docs/process.md`).
|
|
45
|
+
|
|
46
|
+
A warning whose code is in this list blocks; any other warning never does (it stays in `diagnostics`; don't treat it as a blocker). `--strict` promotes advisory rules only.
|
|
47
|
+
|
|
38
48
|
**`ready: false` means stop** — with one named exception: a slice already `status: implemented`
|
|
39
49
|
with `driftSignal: in-sync` or `uncertified` (MIL-214) also reads `ready: false` (its
|
|
40
50
|
`statusReady` gate fails because nothing is newly ratified), and that specific case is
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: review
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.19.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
|
|
@@ -66,7 +66,9 @@ review:` marker (mirrors `Last conformance:`).
|
|
|
66
66
|
|
|
67
67
|
Then, and only then: a slice with nothing left `- [ ]` and no open `issue` →
|
|
68
68
|
`em slice review <model>.em <key> --by <name>` (flips its doc to `status: reviewed` and records
|
|
69
|
-
`reviewedBy:`/`reviewedOn:`).
|
|
69
|
+
`reviewedBy:`/`reviewedOn:`). `em slice review` itself exits 1 on an unchecked Open Question
|
|
70
|
+
(`--allow-open` records a deliberately partial walk; `--again` re-records a review after a body edit).
|
|
71
|
+
Anything still open stays `draft` — the walkthrough doesn't decide
|
|
70
72
|
it, the next session or the open-questions list does.
|
|
71
73
|
|
|
72
74
|
**The facilitator never ratifies, never offers to ratify, and never suggests ratification in a
|