@milehimikey/em 1.14.2 → 1.16.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 (125) hide show
  1. package/.claude/agents/em-implementer.md +12 -2
  2. package/.claude/agents/em-validator.md +2 -1
  3. package/.claude/skills/event-modeling/SKILL.md +3 -3
  4. package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
  5. package/.claude/skills/event-modeling-design/SKILL.md +29 -18
  6. package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
  7. package/.claude/skills/event-modeling-engagement/SKILL.md +60 -56
  8. package/.claude/skills/event-modeling-engagement/reference/engagement.md +13 -19
  9. package/.claude/skills/event-modeling-implement/SKILL.md +3 -3
  10. package/.claude/skills/event-modeling-implement/reference/implement.md +40 -27
  11. package/.claude/skills/event-modeling-review/SKILL.md +13 -3
  12. package/.claude/skills/event-modeling-shared/reference/em-dsl.md +234 -228
  13. package/.claude/skills/event-modeling-shared/reference/operating-principles.md +3 -3
  14. package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +69 -27
  15. package/.claude/skills/event-modeling-shared/templates/constitution.md +5 -7
  16. package/.claude-plugin/marketplace.json +2 -2
  17. package/dist/catalog/deferQueue.d.ts +20 -0
  18. package/dist/catalog/deferQueue.js +63 -0
  19. package/dist/catalog/deferQueue.js.map +1 -0
  20. package/dist/catalog/docJoin.d.ts +22 -1
  21. package/dist/catalog/docJoin.js +13 -4
  22. package/dist/catalog/docJoin.js.map +1 -1
  23. package/dist/catalog/docModelConsistencyValidate.js +4 -8
  24. package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
  25. package/dist/catalog/driftSignal.d.ts +16 -12
  26. package/dist/catalog/driftSignal.js +14 -9
  27. package/dist/catalog/driftSignal.js.map +1 -1
  28. package/dist/catalog/sliceDoc.d.ts +51 -0
  29. package/dist/catalog/sliceDoc.js +47 -0
  30. package/dist/catalog/sliceDoc.js.map +1 -1
  31. package/dist/catalog/sliceReadyValidate.js +19 -1
  32. package/dist/catalog/sliceReadyValidate.js.map +1 -1
  33. package/dist/catalog/sliceSections.d.ts +5 -0
  34. package/dist/catalog/sliceSections.js +11 -2
  35. package/dist/catalog/sliceSections.js.map +1 -1
  36. package/dist/cli/conformScope.d.ts +4 -0
  37. package/dist/cli/conformScope.js +2 -2
  38. package/dist/cli/conformScope.js.map +1 -1
  39. package/dist/cli/coverage.js +7 -3
  40. package/dist/cli/coverage.js.map +1 -1
  41. package/dist/cli/defer.d.ts +106 -2
  42. package/dist/cli/defer.js +357 -24
  43. package/dist/cli/defer.js.map +1 -1
  44. package/dist/cli/engagement.d.ts +26 -5
  45. package/dist/cli/engagement.js +55 -28
  46. package/dist/cli/engagement.js.map +1 -1
  47. package/dist/cli/engagementFile.d.ts +2 -0
  48. package/dist/cli/engagementFile.js +5 -3
  49. package/dist/cli/engagementFile.js.map +1 -1
  50. package/dist/cli/findings.d.ts +2 -2
  51. package/dist/cli/findings.js +2 -2
  52. package/dist/cli/frontmatterSurgery.d.ts +3 -3
  53. package/dist/cli/frontmatterSurgery.js +3 -3
  54. package/dist/cli/frontmatterSurgery.js.map +1 -1
  55. package/dist/cli/markImplemented.d.ts +23 -18
  56. package/dist/cli/markImplemented.js +99 -15
  57. package/dist/cli/markImplemented.js.map +1 -1
  58. package/dist/cli/ratify.d.ts +36 -6
  59. package/dist/cli/ratify.js +130 -35
  60. package/dist/cli/ratify.js.map +1 -1
  61. package/dist/cli/review.js +3 -3
  62. package/dist/cli/review.js.map +1 -1
  63. package/dist/cli/revise.d.ts +67 -0
  64. package/dist/cli/revise.js +229 -0
  65. package/dist/cli/revise.js.map +1 -0
  66. package/dist/cli/sliceConform.d.ts +4 -3
  67. package/dist/cli/sliceConform.js +29 -12
  68. package/dist/cli/sliceConform.js.map +1 -1
  69. package/dist/cli/status.d.ts +30 -6
  70. package/dist/cli/status.js +59 -19
  71. package/dist/cli/status.js.map +1 -1
  72. package/dist/cli/upgrade.js +17 -12
  73. package/dist/cli/upgrade.js.map +1 -1
  74. package/dist/cli.js +173 -85
  75. package/dist/cli.js.map +1 -1
  76. package/dist/emit/engagementJson.d.ts +7 -4
  77. package/dist/emit/engagementJson.js +11 -4
  78. package/dist/emit/engagementJson.js.map +1 -1
  79. package/dist/emit/json.d.ts +1 -1
  80. package/dist/emit/json.js +18 -5
  81. package/dist/emit/json.js.map +1 -1
  82. package/dist/emit/statusJson.d.ts +1 -1
  83. package/dist/emit/statusJson.js +6 -1
  84. package/dist/emit/statusJson.js.map +1 -1
  85. package/dist/mcp/server.js +5 -5
  86. package/dist/mcp/server.js.map +1 -1
  87. package/dist/model/continuation.d.ts +11 -1
  88. package/dist/model/continuation.js +29 -0
  89. package/dist/model/continuation.js.map +1 -1
  90. package/dist/model/resolveSlice.d.ts +19 -0
  91. package/dist/model/resolveSlice.js +69 -0
  92. package/dist/model/resolveSlice.js.map +1 -0
  93. package/dist/model/rules.d.ts +8 -0
  94. package/dist/model/rules.js +8 -0
  95. package/dist/model/rules.js.map +1 -1
  96. package/dist/model/sliceDocIndex.d.ts +5 -0
  97. package/dist/model/sliceDocIndex.js +6 -4
  98. package/dist/model/sliceDocIndex.js.map +1 -1
  99. package/dist/model/validate.js +5 -2
  100. package/dist/model/validate.js.map +1 -1
  101. package/dist/parser/parser.js +55 -1
  102. package/dist/parser/parser.js.map +1 -1
  103. package/dist/templates.d.ts +1 -1
  104. package/dist/templates.js +5 -7
  105. package/dist/templates.js.map +1 -1
  106. package/package.json +1 -1
  107. package/plugin/.claude-plugin/plugin.json +2 -2
  108. package/plugin/agents/em-implementer.md +12 -2
  109. package/plugin/agents/em-validator.md +2 -1
  110. package/plugin/shared/reference/em-dsl.md +234 -228
  111. package/plugin/shared/reference/operating-principles.md +3 -3
  112. package/plugin/shared/reference/slice-doc-schema.md +69 -27
  113. package/plugin/shared/templates/constitution.md +5 -7
  114. package/plugin/skills/conform/SKILL.md +1 -1
  115. package/plugin/skills/design/SKILL.md +29 -18
  116. package/plugin/skills/discover/SKILL.md +1 -1
  117. package/plugin/skills/engagement/SKILL.md +60 -56
  118. package/plugin/skills/engagement/reference/engagement.md +13 -19
  119. package/plugin/skills/event-modeling/SKILL.md +3 -3
  120. package/plugin/skills/implement/SKILL.md +3 -3
  121. package/plugin/skills/implement/reference/implement.md +40 -27
  122. package/plugin/skills/review/SKILL.md +13 -3
  123. package/dist/cli/reratify.d.ts +0 -58
  124. package/dist/cli/reratify.js +0 -238
  125. package/dist/cli/reratify.js.map +0 -1
@@ -0,0 +1,229 @@
1
+ // SPDX-License-Identifier: MIT
2
+ // `em slice revise` (MIL-283): open the next version of a slice doc as a real `draft`. This is
3
+ // what `em slice reratify` (MIL-161/258, now a deprecated alias) always meant but never did: it
4
+ // bumped `version:` and left the doc at `status: ready-to-implement` with the sign-off cleared —
5
+ // a status that lied (unsigned), which MIL-258/259 then had to special-case everywhere. Since
6
+ // 1.15.0 the shipped version lives in the shipped record (`shippedVersion:`/`shippedRef:`/
7
+ // `shippedOn:` + `implementedIn:`, MIL-284 — `shippedRecordOf` in catalog/sliceDoc.ts), so
8
+ // `status` is free to say what the WORKING copy is: a draft of v<N+1>, which then takes the same
9
+ // two human gates v1 took (`em slice review --by`, `em slice ratify --by`). The MIL-201 carve-out
10
+ // that a reratified doc "needs no fresh review session" is gone with the state that needed it.
11
+ //
12
+ // Three starting states, one target (`status: draft`):
13
+ // - `shipped` — `status: implemented` (or any status with a shipped record): bump `version:`,
14
+ // materialise the shipped record if the doc predates 1.15 (so flipping the status
15
+ // away from `implemented` does not lose the fact that v<N> shipped), clear the
16
+ // sign-off, re-open the questions deferred to the new version.
17
+ // - `unshipped` — `status: ready-to-implement` WITH `ratifiedBy:` (ratified, never shipped — the
18
+ // implementer hit a gap, the doc must change): bump `version:`, clear the
19
+ // sign-off. The ratification of v<N> is withdrawn; v<N> never shipped.
20
+ // - `unsigned` — `status: ready-to-implement` with NO `ratifiedBy:`: the 1.13.1–1.14.x reratify
21
+ // leftover. Nothing was signed at this version, so `version:` stays and only the
22
+ // status moves — the exit path for a doc stuck in a state that no longer exists.
23
+ // - `draft`/`reviewed` refuse: the next version is already open; just edit it.
24
+ //
25
+ // Sign-off keys cleared: `ratifiedBy`/`ratifiedOn`/`ratifiedRef`/`ratifiedHash` (MIL-165/284),
26
+ // `reviewedBy`/`reviewedOn` (MIL-201), `meaningConfirmed`/`contractChange` (MIL-238) — every one
27
+ // describes the version being left behind. `implementedIn:`, the `shipped*` keys and the
28
+ // `conformed*` keys stay: they describe the version that shipped, which is still the version in
29
+ // production. The API-first confirmation (MIL-238) is no longer taken here — it belongs to the
30
+ // ratification of the new version, where `em slice ratify` already requires it on a
31
+ // public-touching slice. Never touches the body except to re-open deferred questions (MIL-275).
32
+ //
33
+ // `em slice mark-implemented` reuses `openNextDraft` to open v<N+1> at merge time when a question
34
+ // is deferred to it (MIL-283's "the draft is ready for continued work"), and only then — a
35
+ // merged slice with nothing deferred stays `implemented` until someone runs this command.
36
+ //
37
+ // GH #236: `unshipped` refuses without `--withdraw` — it ends the ratification of the only
38
+ // implementable version. A question found mid-build is queued by `em slice defer` instead
39
+ // (cli/defer.ts), and every queued question for v<N+1> is injected into the draft this opens
40
+ // (here and in `mark-implemented`'s auto-open), then cleared from the state file.
41
+ //
42
+ // Write strategy: surgical splices over the frontmatter text (frontmatterSurgery.ts), same as
43
+ // every other lifecycle writer; the body is copied through verbatim.
44
+ import { readFileSync, writeFileSync } from "node:fs";
45
+ import { join } from "node:path";
46
+ import { continuationOf } from "../model/continuation.js";
47
+ import { resolveSliceDocJoin } from "../catalog/docJoin.js";
48
+ import { fieldLineRegex, fieldLineWithEolRegex, locateFrontmatterInner, normalizeFieldValue } from "./frontmatterSurgery.js";
49
+ import { listAllFindingsFiles, unruledFindingsInScope } from "./findings.js";
50
+ import { MEANING_CONFIRMATION_KEYS } from "./ratify.js";
51
+ import { clearQueue, injectQueuedQuestions, readQueue, reopenDeferred } from "./defer.js";
52
+ const DRAFT_STATUS = "draft";
53
+ const RATIFIED_STATUS = "ready-to-implement";
54
+ const IMPLEMENTED_STATUS = "implemented";
55
+ /** Every key that describes the version being left behind — cleared on every path that bumps. */
56
+ export const SIGN_OFF_KEYS = [
57
+ "ratifiedBy",
58
+ "ratifiedOn",
59
+ "ratifiedRef",
60
+ "ratifiedHash",
61
+ "reviewedBy",
62
+ "reviewedOn",
63
+ ...MEANING_CONFIRMATION_KEYS,
64
+ ];
65
+ /**
66
+ * Pure: the shipped → draft transition shared by `revise` and `mark-implemented`'s auto-open.
67
+ * Bumps `version:`, writes `shippedVersion:` (and `shippedRef:` from `ratifiedRef:`) when the
68
+ * doc has none yet, flips `status:` to `draft`, clears the sign-off keys and re-opens the
69
+ * questions deferred to the new version. Refuses a doc whose `version:` is not a positive
70
+ * integer. `raw` is the whole doc.
71
+ */
72
+ export function openNextDraft(raw, opts = {}) {
73
+ return applyRevise(raw, "shipped", opts);
74
+ }
75
+ /**
76
+ * Pure: classifies the doc's starting state (see module header) and applies the matching
77
+ * transition. Refuses `draft`/`reviewed` (already open) and anything unrecognised.
78
+ */
79
+ export function applyReviseFrontmatter(raw, opts = {}) {
80
+ const range = locateFrontmatterInner(raw);
81
+ if (!range)
82
+ return { ok: false, message: "no frontmatter block found" };
83
+ const inner = raw.slice(range.innerStart, range.innerEnd);
84
+ const statusMatch = fieldLineRegex("status").exec(inner);
85
+ if (!statusMatch)
86
+ return { ok: false, message: "no `status:` field found in frontmatter" };
87
+ const currentStatus = normalizeFieldValue(statusMatch[2])?.toLowerCase() ?? null;
88
+ const shippedVersionMatch = fieldLineRegex("shippedVersion").exec(inner);
89
+ const hasShipped = currentStatus === IMPLEMENTED_STATUS || (shippedVersionMatch !== null && normalizeFieldValue(shippedVersionMatch[2]) !== null);
90
+ const ratifiedByMatch = fieldLineRegex("ratifiedBy").exec(inner);
91
+ const hasRatifiedBy = ratifiedByMatch !== null && normalizeFieldValue(ratifiedByMatch[2]) !== null;
92
+ if (currentStatus === IMPLEMENTED_STATUS)
93
+ return applyRevise(raw, "shipped", opts);
94
+ if (currentStatus === RATIFIED_STATUS && hasRatifiedBy && !hasShipped && !opts.withdraw) {
95
+ // GH #236: a ratified, never-shipped doc is the ONLY implementable version of the slice;
96
+ // revising it withdraws that. A question found mid-build does not need this — it is queued.
97
+ return {
98
+ ok: false,
99
+ message: "doc is ratified and has never shipped — revising it would withdraw the ratification of the only implementable " +
100
+ "version. To record a question found mid-build, queue it instead (the ratification stays valid): " +
101
+ '`em slice defer <model> <key> "<question>" --until v<n> --decision "<what this version does>"`. ' +
102
+ "If the spec itself must change, pass --withdraw to open the next version as a draft",
103
+ };
104
+ }
105
+ if (currentStatus === RATIFIED_STATUS)
106
+ return applyRevise(raw, hasRatifiedBy ? "unshipped" : "unsigned", opts);
107
+ if (currentStatus === DRAFT_STATUS || currentStatus === "reviewed") {
108
+ return {
109
+ ok: false,
110
+ message: `doc is \`status: ${currentStatus}\` — the next version is already open${hasShipped ? " over the shipped one" : ""}; ` +
111
+ "edit it, then `em slice review --by` and `em slice ratify --by` when it is ready",
112
+ };
113
+ }
114
+ return {
115
+ ok: false,
116
+ message: `doc is \`status: ${currentStatus ?? "(empty)"}\` — revise applies to a shipped slice doc (\`status: implemented\`) ` +
117
+ "or a ratified `ready-to-implement` doc (see docs/slice-doc-schema.md#status-under-re-ratification)",
118
+ };
119
+ }
120
+ function applyRevise(raw, kind, opts = {}) {
121
+ const range = locateFrontmatterInner(raw);
122
+ if (!range)
123
+ return { ok: false, message: "no frontmatter block found" };
124
+ const inner = raw.slice(range.innerStart, range.innerEnd);
125
+ const versionMatch = fieldLineRegex("version").exec(inner);
126
+ if (!versionMatch)
127
+ return { ok: false, message: "no `version:` field found in frontmatter" };
128
+ const currentVersionRaw = normalizeFieldValue(versionMatch[2]);
129
+ const currentVersion = currentVersionRaw !== null ? Number(currentVersionRaw) : NaN;
130
+ if (!Number.isInteger(currentVersion) || currentVersion < 1) {
131
+ return {
132
+ ok: false,
133
+ message: `doc's \`version:\` value "${currentVersionRaw ?? ""}" isn't a positive integer — refusing to guess a bump`,
134
+ };
135
+ }
136
+ const newVersion = kind === "unsigned" ? currentVersion : currentVersion + 1;
137
+ // Materialise the shipped record on a pre-1.15 doc BEFORE the status leaves `implemented`,
138
+ // otherwise `shippedRecordOf`'s read-both rule would forget that v<N> shipped. Inserted right
139
+ // after `implementedIn:` when present (where mark-implemented puts it), else after `version:`.
140
+ let working = inner;
141
+ if (kind === "shipped" && !fieldLineRegex("shippedVersion").exec(working)) {
142
+ const refMatch = fieldLineRegex("ratifiedRef").exec(working);
143
+ const ref = refMatch ? normalizeFieldValue(refMatch[2]) : null;
144
+ const lines = [`shippedVersion: ${currentVersion}`, ...(ref !== null ? [`shippedRef: ${ref}`] : [])];
145
+ const anchor = fieldLineRegex("implementedIn").exec(working) ?? fieldLineRegex("version").exec(working);
146
+ const after = working.slice(anchor.index + anchor[0].length);
147
+ const eol = after.startsWith("\r\n") ? "\r\n" : "\n";
148
+ working = working.slice(0, anchor.index) + anchor[0] + eol + lines.join(eol) + after;
149
+ }
150
+ // Clear the sign-off keys (nothing to clear on the unsigned path, but harmless). Done before
151
+ // re-locating `status:`/`version:`, which these keys are disjoint from by construction.
152
+ let cleared = working;
153
+ if (kind !== "unsigned") {
154
+ for (const key of SIGN_OFF_KEYS)
155
+ cleared = cleared.replace(fieldLineWithEolRegex(key), "");
156
+ }
157
+ const clearedStatus = fieldLineRegex("status").exec(cleared);
158
+ const clearedVersion = fieldLineRegex("version").exec(cleared);
159
+ const edits = [
160
+ { index: clearedStatus.index, oldLen: clearedStatus[0].length, next: `${clearedStatus[1]}${DRAFT_STATUS}` },
161
+ { index: clearedVersion.index, oldLen: clearedVersion[0].length, next: `${clearedVersion[1]}${newVersion}` },
162
+ ].sort((a, b) => b.index - a.index);
163
+ let updatedInner = cleared;
164
+ for (const edit of edits) {
165
+ updatedInner = updatedInner.slice(0, edit.index) + edit.next + updatedInner.slice(edit.index + edit.oldLen);
166
+ }
167
+ const content = raw.slice(0, range.innerStart) + updatedInner + raw.slice(range.innerEnd);
168
+ // MIL-275: questions deferred to the version this opens come back as `- [ ]`.
169
+ const reopened = kind === "unsigned" ? { content, count: 0 } : reopenDeferred(content, newVersion);
170
+ // GH #236: questions queued while the old version was ratified/shipped join the new draft.
171
+ const injected = kind === "unsigned" || !opts.queuedFor
172
+ ? { content: reopened.content, count: 0 }
173
+ : injectQueuedQuestions(reopened.content, opts.queuedFor(newVersion));
174
+ return { ok: true, content: injected.content, newVersion, kind, reopened: reopened.count, injected: injected.count };
175
+ }
176
+ export function reviseAdvisory(baseDir, sliceKey, shippedVersion, conformedVersion) {
177
+ const neverCertified = conformedVersion === null || conformedVersion !== shippedVersion;
178
+ let unruledFindingsCount = 0;
179
+ for (const { doc } of listAllFindingsFiles(baseDir)) {
180
+ unruledFindingsCount += unruledFindingsInScope(doc.findings, new Set([sliceKey])).length;
181
+ }
182
+ return { neverCertified, unruledFindingsCount };
183
+ }
184
+ /**
185
+ * Resolves `sliceKey` to its bound doc via the same note-binding join `mark-implemented`/
186
+ * `ratify`/`--slice-ready`/`em export` use (MIL-121 cross-binding included), then reads/applies/
187
+ * writes it. `baseDir` is the `.em` file's directory.
188
+ */
189
+ export function runRevise(model, refs, baseDir, sliceKey, withdraw = false) {
190
+ const sliceIndex = refs.sliceKeys.indexOf(sliceKey);
191
+ if (sliceIndex === -1)
192
+ return { ok: false, message: `no slice with export key "${sliceKey}" in this model` };
193
+ const slice = model.slices[sliceIndex];
194
+ const { doc, continuationOf: continuationOfKey } = resolveSliceDocJoin(model, refs, slice, sliceKey, baseDir, (id) => refs.refById.get(id));
195
+ if (continuationOfKey) {
196
+ const continuation = continuationOf(model, refs, sliceIndex);
197
+ const viewName = model.byId.get(continuation.viewLogicalId).name;
198
+ return {
199
+ ok: false,
200
+ message: `"${sliceKey}" is a continuation of "${continuationOfKey}" (view "${viewName}" again) — ` +
201
+ `it has no doc of its own; revise "${continuationOfKey}" instead`,
202
+ };
203
+ }
204
+ if (doc.reason === "no-doc-bound") {
205
+ return {
206
+ ok: false,
207
+ message: `slice "${sliceKey}" has no doc bound via \`note "slices/${sliceKey}.md"\` — bind a slice doc before revising it`,
208
+ };
209
+ }
210
+ if (doc.reason === "binding-missing-file") {
211
+ return { ok: false, message: `slice "${sliceKey}" notes "${doc.path}" but no such file exists` };
212
+ }
213
+ if (doc.reason === "frontmatter-invalid") {
214
+ return { ok: false, message: `slice doc "${doc.path}" has missing or invalid frontmatter — run \`em validate\` for details` };
215
+ }
216
+ const absPath = join(baseDir, doc.path);
217
+ const raw = readFileSync(absPath, "utf8");
218
+ const result = applyReviseFrontmatter(raw, { withdraw, queuedFor: (v) => readQueue(baseDir, sliceKey, v).items });
219
+ if (!result.ok)
220
+ return { ok: false, message: `${doc.path}: ${result.message}` };
221
+ // MIL-214: "was the version we are leaving behind ever certified" — only meaningful when one
222
+ // shipped. Computed from the pre-write join.
223
+ const advisory = result.kind === "shipped" ? reviseAdvisory(baseDir, sliceKey, doc.shipped?.version ?? doc.version, doc.conformedVersion) : null;
224
+ writeFileSync(absPath, result.content, "utf8");
225
+ if (result.injected > 0)
226
+ clearQueue(baseDir, sliceKey, result.newVersion);
227
+ return { ok: true, path: doc.path, newVersion: result.newVersion, kind: result.kind, advisory, reopened: result.reopened, injected: result.injected };
228
+ }
229
+ //# sourceMappingURL=revise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revise.js","sourceRoot":"","sources":["../../src/cli/revise.ts"],"names":[],"mappings":"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"}
@@ -11,8 +11,9 @@ export type ApplyConformResult = {
11
11
  message: string;
12
12
  };
13
13
  /**
14
- * Pure text transform: reads the CURRENT `version:` value (never writes it) and writes
15
- * `conformedVersion:`/`conformedAt:`/`conformedOn:` in `raw`'s frontmatter block. See module
14
+ * Pure text transform: reads the SHIPPED version (`shippedVersion:`, else the doc's `version:`
15
+ * for a pre-1.15 `implemented` doc — the same read-both rule as `shippedRecordOf`; never writes
16
+ * either) and writes `conformedVersion:`/`conformedAt:`/`conformedOn:` in `raw`'s frontmatter block. See module
16
17
  * header for the full precondition/idempotency contract. No fs access — the caller reads/writes;
17
18
  * see `runSliceConform` below.
18
19
  */
@@ -42,7 +43,7 @@ export type RunSliceConformResult = {
42
43
  message: string;
43
44
  };
44
45
  /**
45
- * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`reratify`/
46
+ * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`revise`/
46
47
  * `mark-implemented`/`em export` use (MIL-121 cross-binding included), runs the findings-check
47
48
  * gate, then reads/applies/writes it. `baseDir` is the `.em` file's directory, same convention
48
49
  * every doc/note path in `em` uses.
@@ -6,18 +6,22 @@
6
6
  // of this doc" — the gap the whole engagement (MIL-214) exists to close. Sets exactly three
7
7
  // frontmatter fields — `conformedVersion: <doc.version>`, `conformedAt: <rev>`,
8
8
  // `conformedOn: <local date>` — on the slice doc resolved from the key via the SAME note-binding
9
- // resolution `ratify`/`reratify`/`mark-implemented`/`em export` use (catalog/docJoin.ts's
9
+ // resolution `ratify`/`revise`/`mark-implemented`/`em export` use (catalog/docJoin.ts's
10
10
  // resolveSliceDocJoin).
11
11
  //
12
12
  // Write strategy: the same surgical index-math splicing ratify.ts/markImplemented.ts use, via
13
13
  // the shared primitives in ./frontmatterSurgery.js — never a parse+re-serialize. New fields are
14
14
  // inserted directly after `implementedIn:` (the anchor this ticket's ruling names) when none of
15
15
  // the three exist yet; an existing triple is edited in place. Everything else — the body,
16
- // `version:` itself (read, never written), `status:`, lineage/`covers` keys, and (best-effort)
16
+ // `version:`/`shippedVersion:` themselves (read, never written), `status:`, lineage/`covers` keys, and (best-effort)
17
17
  // the file's own line-ending style — is copied through verbatim.
18
18
  //
19
19
  // Preconditions (the owner's ruling, MIL-214):
20
- // - Legal only for `status: implemented` — a slice that hasn't shipped has no code to certify.
20
+ // - Legal only for a SHIPPED slice — a slice that hasn't shipped has no code to certify. Since
21
+ // MIL-283 "shipped" is the shipped record, not `status`: `status: implemented`, or any status
22
+ // with a `shippedVersion:` (a `draft` of v<N+1> opened over a shipped v<N> still has v<N>'s
23
+ // code to certify — the auto-open at merge would otherwise leave it in conformance scope but
24
+ // uncertifiable). `conformedVersion:` is the SHIPPED version, never the open draft's.
21
25
  // - Refuses when there's no `implementedIn:` link at all (the OLD, pre-MIL-214
22
26
  // driftSignal-would-be-"in-sync" precondition, computed directly from status+implementedIn
23
27
  // here rather than via classifyImplementationDrift — that function is now conformedVersion-
@@ -43,8 +47,9 @@ import { fieldLineRegex, locateFrontmatterInner, normalizeFieldValue } from "./f
43
47
  import { isValidDateString } from "./stateFile.js";
44
48
  import { listAllFindingsFiles, unruledFindingsInScope } from "./findings.js";
45
49
  /**
46
- * Pure text transform: reads the CURRENT `version:` value (never writes it) and writes
47
- * `conformedVersion:`/`conformedAt:`/`conformedOn:` in `raw`'s frontmatter block. See module
50
+ * Pure text transform: reads the SHIPPED version (`shippedVersion:`, else the doc's `version:`
51
+ * for a pre-1.15 `implemented` doc — the same read-both rule as `shippedRecordOf`; never writes
52
+ * either) and writes `conformedVersion:`/`conformedAt:`/`conformedOn:` in `raw`'s frontmatter block. See module
48
53
  * header for the full precondition/idempotency contract. No fs access — the caller reads/writes;
49
54
  * see `runSliceConform` below.
50
55
  */
@@ -66,26 +71,33 @@ export function applyConformFrontmatter(raw, sliceKey, at, on) {
66
71
  if (!statusMatch)
67
72
  return { ok: false, message: "no `status:` field found in frontmatter" };
68
73
  const currentStatus = normalizeFieldValue(statusMatch[2])?.toLowerCase() ?? null;
69
- if (currentStatus !== "implemented") {
74
+ const shippedVersionMatch = fieldLineRegex("shippedVersion").exec(inner);
75
+ const shippedVersionRaw = shippedVersionMatch ? normalizeFieldValue(shippedVersionMatch[2]) : null;
76
+ const isImplemented = currentStatus === "implemented";
77
+ if (!isImplemented && shippedVersionRaw === null) {
70
78
  return {
71
79
  ok: false,
72
- message: `slice "${sliceKey}" is \`status: ${currentStatus ?? "(empty)"}\` — only a slice at ` +
73
- "`status: implemented` can be certified; run `em slice mark-implemented` first",
80
+ message: `slice "${sliceKey}" is \`status: ${currentStatus ?? "(empty)"}\` with no shipped record — only a shipped ` +
81
+ "slice (`status: implemented`, or any status with `shippedVersion:`) can be certified; run `em slice mark-implemented` first",
74
82
  };
75
83
  }
84
+ const shippedAs = isImplemented ? "`status: implemented`" : `\`shippedVersion: ${shippedVersionRaw}\``;
76
85
  const implMatch = fieldLineRegex("implementedIn").exec(inner);
77
86
  const currentImplementedIn = implMatch ? normalizeFieldValue(implMatch[2]) : null;
78
87
  if (currentImplementedIn === null) {
79
88
  return {
80
89
  ok: false,
81
- message: `slice "${sliceKey}" has \`status: implemented\` but no \`implementedIn:\` link — nothing to certify against`,
90
+ message: `slice "${sliceKey}" has ${shippedAs} but no \`implementedIn:\` link — nothing to certify against`,
82
91
  };
83
92
  }
93
+ // The shipped version: `shippedVersion:` when the record exists, else (a doc shipped before
94
+ // em 1.15) the doc's own `version:` — what `status: implemented` meant then.
84
95
  const versionMatch = fieldLineRegex("version").exec(inner);
85
- const currentVersionRaw = versionMatch ? normalizeFieldValue(versionMatch[2]) : null;
96
+ const versionKey = shippedVersionRaw !== null ? "shippedVersion" : "version";
97
+ const currentVersionRaw = shippedVersionRaw ?? (versionMatch ? normalizeFieldValue(versionMatch[2]) : null);
86
98
  const version = currentVersionRaw !== null ? Number(currentVersionRaw) : NaN;
87
99
  if (!Number.isInteger(version) || version < 1) {
88
- return { ok: false, message: `doc's \`version:\` value "${currentVersionRaw ?? ""}" isn't a positive integer — refusing to certify` };
100
+ return { ok: false, message: `doc's \`${versionKey}:\` value "${currentVersionRaw ?? ""}" isn't a positive integer — refusing to certify` };
89
101
  }
90
102
  const cvMatch = fieldLineRegex("conformedVersion").exec(inner);
91
103
  const caMatch = fieldLineRegex("conformedAt").exec(inner);
@@ -139,7 +151,7 @@ export function findLatestFindingsForRevision(baseDir, at) {
139
151
  return listAllFindingsFiles(baseDir).find((f) => f.doc.revision === at) ?? null;
140
152
  }
141
153
  /**
142
- * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`reratify`/
154
+ * Resolves `sliceKey` to its bound doc via the same note-binding join `ratify`/`revise`/
143
155
  * `mark-implemented`/`em export` use (MIL-121 cross-binding included), runs the findings-check
144
156
  * gate, then reads/applies/writes it. `baseDir` is the `.em` file's directory, same convention
145
157
  * every doc/note path in `em` uses.
@@ -176,6 +188,11 @@ export function runSliceConform(model, refs, baseDir, sliceKey, at, on, skipFind
176
188
  message: `slice doc "${doc.path}" has missing or invalid frontmatter — run \`em validate\` for details`,
177
189
  };
178
190
  }
191
+ // `--at` stays required (MIL-284 review): it is the TARGET repo's revision the sweep diffed
192
+ // against — the findings-check gate below keys on it — while `ratifiedRef`/`shippedRef` are
193
+ // the MODEL repo's commit at sign-off, before any implementation existed. Defaulting one to
194
+ // the other would certify against a tree holding no code for the slice and let the gate pass
195
+ // vacuously (no findings file for that revision).
179
196
  const found = findLatestFindingsForRevision(baseDir, at);
180
197
  let skippedFindingsCheck = null;
181
198
  if (found) {
@@ -1 +1 @@
1
- {"version":3,"file":"sliceConform.js","sourceRoot":"","sources":["../../src/cli/sliceConform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sliceConform.js","sourceRoot":"","sources":["../../src/cli/sliceConform.ts"],"names":[],"mappings":"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"}
@@ -35,6 +35,9 @@ export interface SliceStatusFact {
35
35
  * covered slice. */
36
36
  docPath: string | null;
37
37
  rawStatus: string | null;
38
+ /** MIL-283: a version of this slice has shipped (`doc.shipped`, the shipped record) — the fact
39
+ * conformance scope and `byStatus.shipped` read; `rawStatus`/`bucket` stay the WORKING status. */
40
+ shipped: boolean;
38
41
  /** The doc's own `implementedIn:` value verbatim (or null) — carried through from the same
39
42
  * `resolveSliceDocJoin` call this fact set already makes, so `resolveSlicePRsBehindHead`
40
43
  * (MIL-164) can build its `SliceDocFacts[]` input from these facts directly rather than
@@ -48,6 +51,8 @@ export interface SliceStatusFact {
48
51
  driftSignal: DriftSignalKind | null;
49
52
  openQuestionsTotal: number;
50
53
  openQuestionsUnchecked: number;
54
+ /** GH #236: questions `em slice defer` queued for this slice's next version (0 when none). */
55
+ queuedForNext: number;
51
56
  /** MIL-208: non-null when this slice is a continuation (an again-view-only slice with no
52
57
  * legacy doc of its own) — the originating slice's export key. `buildStatusReport` excludes
53
58
  * a continuation fact from every `byStatus`/`driftSignal` bucket (the originating slice's own
@@ -141,13 +146,23 @@ export interface ConstitutionEntry {
141
146
  * root. Directory existence only; nothing inside `.specify/` is read. */
142
147
  export declare function findSpecifyRoot(startDir: string): string | null;
143
148
  /**
144
- * Resolve one model's implementation constitution (MIL-202). Two project shapes, one document —
145
- * em never writes or expects a second copy:
149
+ * Every place a model's implementation constitution may live, in precedence order (MIL-202,
150
+ * MIL-287). The one locator for `em status`, `em upgrade` and anything else asking "where is it":
146
151
  *
147
- * - **spec-kit project** (a `.specify/` directory exists at or above `modelDir`): the document
148
- * IS `<root>/.specify/memory/constitution.md`, spec-kit's own slot. em defers to it.
149
- * - **anything else**: `<modelDir>/constitution.md`, beside the model — what `em scaffold`
150
- * writes.
152
+ * 1. **spec-kit slot**, when a `.specify/` directory exists at or above `modelDir`:
153
+ * `<root>/.specify/memory/constitution.md`. It wins whenever it exists — em never keeps a
154
+ * second copy beside it.
155
+ * 2. **beside the model**: `<modelDir>/constitution.md` — what `em scaffold` writes, and the
156
+ * fallback in a spec-kit repo whose own slot is empty (a repo-root constitution symlinked
157
+ * next to the model, say).
158
+ */
159
+ export declare function constitutionCandidates(modelDir: string): string[];
160
+ /** The absolute path of the model's constitution, or null when no candidate exists. */
161
+ export declare function locateConstitution(modelDir: string): string | null;
162
+ /**
163
+ * Resolve one model's implementation constitution (MIL-202, MIL-287) — see
164
+ * `constitutionCandidates` for where it looks. `path` is where it was found, else the first
165
+ * (primary) location tried; relative to `modelDir`.
151
166
  *
152
167
  * Existence only: this never opens the file, so a blank stock template and a fully answered,
153
168
  * ratified constitution are indistinguishable here by design (content judgment is a human's, and
@@ -255,7 +270,12 @@ export interface StatusSliceCounts {
255
270
  draft: number;
256
271
  reviewed: number;
257
272
  readyToImplement: number;
273
+ /** Working status `implemented` — the doc's current version is the shipped one. */
258
274
  implemented: number;
275
+ /** MIL-283: slices with a shipped record (any working status) — `implemented` plus every slice
276
+ * whose next version is open as `draft`/`reviewed`/`ready-to-implement` over a shipped one.
277
+ * Added in status schema 1.9; always >= `implemented`. */
278
+ shipped: number;
259
279
  noDoc: number;
260
280
  /** A doc IS bound (a `note` names it) but its frontmatter is missing/malformed — see
261
281
  * `StatusBucket`'s `"frontmatter-invalid"` doc comment. Kept apart from `noDoc` (nothing
@@ -296,6 +316,10 @@ export interface StatusIssueTotals {
296
316
  openIssues: number;
297
317
  openQuestionsTotal: number;
298
318
  openQuestionsUnchecked: number;
319
+ /** GH #236 (status schema 1.10): questions queued by `em slice defer` on ratified/shipped docs
320
+ * for their next version — known work the docs themselves cannot show without breaking their
321
+ * sign-off. */
322
+ queuedQuestions: number;
299
323
  }
300
324
  /** One doc-join diagnostic, tagged with the input file it came from — `em status` can aggregate
301
325
  * several models in one run, so (unlike `em export`'s single-model diagnostics) each entry