@milehimikey/em 1.13.1 → 1.14.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-critic.md +26 -0
- package/.claude/agents/em-implementer.md +34 -0
- package/.claude/agents/em-reviewer.md +31 -0
- package/.claude/agents/em-validator.md +27 -0
- package/.claude/skills/event-modeling/SKILL.md +50 -11
- package/.claude/skills/event-modeling-conform/SKILL.md +1 -1
- package/.claude/skills/event-modeling-design/SKILL.md +126 -18
- package/.claude/skills/event-modeling-discover/SKILL.md +1 -1
- package/.claude/skills/event-modeling-engagement/SKILL.md +192 -0
- package/.claude/skills/event-modeling-engagement/reference/engagement.md +143 -0
- package/.claude/skills/event-modeling-implement/SKILL.md +1 -1
- package/.claude/skills/event-modeling-implement/reference/implement.md +38 -11
- package/.claude/skills/event-modeling-review/SKILL.md +1 -1
- package/.claude/skills/event-modeling-shared/reference/em-dsl.md +274 -189
- package/.claude/skills/event-modeling-shared/reference/operating-principles.md +61 -0
- package/.claude/skills/event-modeling-shared/reference/slice-doc-schema.md +108 -5
- package/.claude/skills/event-modeling-shared/templates/constitution.md +18 -1
- package/.claude/skills/event-modeling-shared/templates/slice.md +64 -39
- package/.claude/skills/event-modeling-shared/templates/state.md +5 -1
- package/.claude-plugin/marketplace.json +14 -0
- package/README.md +25 -11
- package/dist/catalog/apiFirst.d.ts +28 -0
- package/dist/catalog/apiFirst.js +49 -0
- package/dist/catalog/apiFirst.js.map +1 -0
- package/dist/catalog/docJoin.d.ts +13 -0
- package/dist/catalog/docJoin.js +11 -0
- package/dist/catalog/docJoin.js.map +1 -1
- package/dist/catalog/docModelConsistencyValidate.js +44 -4
- package/dist/catalog/docModelConsistencyValidate.js.map +1 -1
- package/dist/catalog/invariantsValidate.d.ts +4 -0
- package/dist/catalog/invariantsValidate.js +102 -0
- package/dist/catalog/invariantsValidate.js.map +1 -0
- package/dist/catalog/scenarios.d.ts +15 -0
- package/dist/catalog/scenarios.js +97 -0
- package/dist/catalog/scenarios.js.map +1 -0
- package/dist/catalog/sliceDoc.d.ts +8 -0
- package/dist/catalog/sliceDoc.js +9 -0
- package/dist/catalog/sliceDoc.js.map +1 -1
- package/dist/catalog/sliceReadyValidate.d.ts +31 -4
- package/dist/catalog/sliceReadyValidate.js +66 -8
- package/dist/catalog/sliceReadyValidate.js.map +1 -1
- package/dist/catalog/sliceSections.d.ts +55 -0
- package/dist/catalog/sliceSections.js +317 -0
- package/dist/catalog/sliceSections.js.map +1 -0
- package/dist/cli/agentsMd.js +7 -1
- package/dist/cli/agentsMd.js.map +1 -1
- package/dist/cli/api.d.ts +90 -0
- package/dist/cli/api.js +318 -0
- package/dist/cli/api.js.map +1 -0
- package/dist/cli/ciInit.d.ts +82 -21
- package/dist/cli/ciInit.js +468 -64
- package/dist/cli/ciInit.js.map +1 -1
- package/dist/cli/conformScope.d.ts +28 -0
- package/dist/cli/conformScope.js +67 -0
- package/dist/cli/conformScope.js.map +1 -1
- package/dist/cli/coverage.d.ts +9 -0
- package/dist/cli/coverage.js +60 -8
- package/dist/cli/coverage.js.map +1 -1
- package/dist/cli/engagement.d.ts +210 -0
- package/dist/cli/engagement.js +444 -0
- package/dist/cli/engagement.js.map +1 -0
- package/dist/cli/engagementFile.d.ts +86 -0
- package/dist/cli/engagementFile.js +255 -0
- package/dist/cli/engagementFile.js.map +1 -0
- package/dist/cli/metrics.d.ts +10 -0
- package/dist/cli/metrics.js +49 -1
- package/dist/cli/metrics.js.map +1 -1
- package/dist/cli/pluginPin.d.ts +55 -0
- package/dist/cli/pluginPin.js +188 -0
- package/dist/cli/pluginPin.js.map +1 -0
- package/dist/cli/ratify.d.ts +27 -2
- package/dist/cli/ratify.js +112 -13
- package/dist/cli/ratify.js.map +1 -1
- package/dist/cli/reratify.d.ts +3 -2
- package/dist/cli/reratify.js +36 -14
- package/dist/cli/reratify.js.map +1 -1
- package/dist/cli/scopeInputs.d.ts +48 -0
- package/dist/cli/scopeInputs.js +176 -0
- package/dist/cli/scopeInputs.js.map +1 -0
- package/dist/cli/skillCheck.d.ts +15 -1
- package/dist/cli/skillCheck.js +22 -1
- package/dist/cli/skillCheck.js.map +1 -1
- package/dist/cli/skillDirs.d.ts +5 -0
- package/dist/cli/skillDirs.js +13 -1
- package/dist/cli/skillDirs.js.map +1 -1
- package/dist/cli/skillSync.d.ts +4 -0
- package/dist/cli/skillSync.js +23 -0
- package/dist/cli/skillSync.js.map +1 -1
- package/dist/cli/sliceNew.d.ts +11 -7
- package/dist/cli/sliceNew.js +91 -18
- package/dist/cli/sliceNew.js.map +1 -1
- package/dist/cli/sliceSync.d.ts +50 -0
- package/dist/cli/sliceSync.js +170 -0
- package/dist/cli/sliceSync.js.map +1 -0
- package/dist/cli/status.d.ts +24 -1
- package/dist/cli/status.js +20 -1
- package/dist/cli/status.js.map +1 -1
- package/dist/cli/systemInputs.d.ts +53 -10
- package/dist/cli/systemInputs.js +186 -11
- package/dist/cli/systemInputs.js.map +1 -1
- package/dist/cli/upgrade.d.ts +16 -3
- package/dist/cli/upgrade.js +366 -30
- package/dist/cli/upgrade.js.map +1 -1
- package/dist/cli/usageLog.d.ts +4 -2
- package/dist/cli/usageLog.js +4 -2
- package/dist/cli/usageLog.js.map +1 -1
- package/dist/cli.js +554 -94
- package/dist/cli.js.map +1 -1
- package/dist/emit/api.d.ts +29 -0
- package/dist/emit/api.js +220 -0
- package/dist/emit/api.js.map +1 -0
- package/dist/emit/apiCheckJson.d.ts +3 -0
- package/dist/emit/apiCheckJson.js +21 -0
- package/dist/emit/apiCheckJson.js.map +1 -0
- package/dist/emit/codeownersJson.d.ts +3 -0
- package/dist/emit/codeownersJson.js +19 -0
- package/dist/emit/codeownersJson.js.map +1 -0
- package/dist/emit/diffJson.d.ts +1 -1
- package/dist/emit/diffJson.js +8 -1
- package/dist/emit/diffJson.js.map +1 -1
- package/dist/emit/engagementJson.d.ts +8 -0
- package/dist/emit/engagementJson.js +46 -0
- package/dist/emit/engagementJson.js.map +1 -0
- package/dist/emit/glossaryJson.d.ts +1 -1
- package/dist/emit/glossaryJson.js +4 -1
- package/dist/emit/glossaryJson.js.map +1 -1
- package/dist/emit/json.d.ts +17 -1
- package/dist/emit/json.js +30 -1
- package/dist/emit/json.js.map +1 -1
- package/dist/emit/metricsJson.d.ts +1 -1
- package/dist/emit/metricsJson.js +4 -1
- package/dist/emit/metricsJson.js.map +1 -1
- package/dist/emit/queryJson.d.ts +1 -1
- package/dist/emit/queryJson.js +7 -1
- package/dist/emit/queryJson.js.map +1 -1
- package/dist/emit/scopeJson.d.ts +12 -0
- package/dist/emit/scopeJson.js +26 -0
- package/dist/emit/scopeJson.js.map +1 -0
- package/dist/emit/skillCheckJson.d.ts +3 -2
- package/dist/emit/skillCheckJson.js +10 -2
- package/dist/emit/skillCheckJson.js.map +1 -1
- package/dist/emit/statusJson.d.ts +1 -1
- package/dist/emit/statusJson.js +15 -1
- package/dist/emit/statusJson.js.map +1 -1
- package/dist/emit/systemJson.d.ts +15 -8
- package/dist/emit/systemJson.js +28 -13
- package/dist/emit/systemJson.js.map +1 -1
- package/dist/emit/validateJson.d.ts +3 -3
- package/dist/emit/validateJson.js +10 -4
- package/dist/emit/validateJson.js.map +1 -1
- package/dist/mcp/server.d.ts +1 -1
- package/dist/mcp/server.js +163 -31
- package/dist/mcp/server.js.map +1 -1
- package/dist/model/diff.d.ts +4 -1
- package/dist/model/diff.js +44 -8
- package/dist/model/diff.js.map +1 -1
- package/dist/model/glossary.d.ts +2 -0
- package/dist/model/glossary.js +1 -0
- package/dist/model/glossary.js.map +1 -1
- package/dist/model/model.d.ts +55 -2
- package/dist/model/model.js +57 -0
- package/dist/model/model.js.map +1 -1
- package/dist/model/qualifiedRef.d.ts +18 -0
- package/dist/model/qualifiedRef.js +26 -0
- package/dist/model/qualifiedRef.js.map +1 -1
- package/dist/model/queryIndex.d.ts +9 -1
- package/dist/model/queryIndex.js +18 -2
- package/dist/model/queryIndex.js.map +1 -1
- package/dist/model/rules.d.ts +143 -2
- package/dist/model/rules.js +162 -3
- package/dist/model/rules.js.map +1 -1
- package/dist/model/validate.d.ts +40 -0
- package/dist/model/validate.js +147 -1
- package/dist/model/validate.js.map +1 -1
- package/dist/parser/ast.d.ts +31 -3
- package/dist/parser/parser.js +148 -14
- package/dist/parser/parser.js.map +1 -1
- package/dist/query/format.js +1 -1
- package/dist/query/format.js.map +1 -1
- package/dist/query/verbs.d.ts +6 -0
- package/dist/query/verbs.js +6 -2
- package/dist/query/verbs.js.map +1 -1
- package/dist/system/adaptation.d.ts +14 -0
- package/dist/system/adaptation.js +49 -0
- package/dist/system/adaptation.js.map +1 -0
- package/dist/system/codeowners.d.ts +77 -0
- package/dist/system/codeowners.js +242 -0
- package/dist/system/codeowners.js.map +1 -0
- package/dist/system/manifest.d.ts +10 -5
- package/dist/system/manifest.js +54 -26
- package/dist/system/manifest.js.map +1 -1
- package/dist/system/migrateManifest.d.ts +28 -0
- package/dist/system/migrateManifest.js +155 -0
- package/dist/system/migrateManifest.js.map +1 -0
- package/dist/system/scope.d.ts +46 -0
- package/dist/system/scope.js +132 -0
- package/dist/system/scope.js.map +1 -0
- package/dist/system/verify.d.ts +50 -13
- package/dist/system/verify.js +179 -58
- package/dist/system/verify.js.map +1 -1
- package/dist/templates.d.ts +2 -2
- package/dist/templates.js +23 -2
- package/dist/templates.js.map +1 -1
- package/package.json +5 -2
- package/plugin/.claude-plugin/plugin.json +18 -0
- package/plugin/agents/em-critic.md +27 -0
- package/plugin/agents/em-implementer.md +35 -0
- package/plugin/agents/em-reviewer.md +32 -0
- package/plugin/agents/em-validator.md +28 -0
- package/plugin/shared/reference/em-dsl.md +866 -0
- package/plugin/shared/reference/methodology.md +329 -0
- package/plugin/shared/reference/operating-principles.md +222 -0
- package/plugin/shared/reference/slice-doc-schema.md +566 -0
- package/plugin/shared/templates/conformance-report.md +85 -0
- package/plugin/shared/templates/constitution.md +136 -0
- package/plugin/shared/templates/model-readme.md +46 -0
- package/plugin/shared/templates/slice.md +251 -0
- package/plugin/shared/templates/state.md +77 -0
- package/plugin/skills/conform/SKILL.md +93 -0
- package/plugin/skills/conform/reference/conform.md +428 -0
- package/plugin/skills/design/SKILL.md +297 -0
- package/plugin/skills/discover/SKILL.md +90 -0
- package/plugin/skills/discover/reference/extract.md +147 -0
- package/plugin/skills/engagement/SKILL.md +193 -0
- package/plugin/skills/engagement/reference/engagement.md +144 -0
- package/plugin/skills/event-modeling/SKILL.md +132 -0
- package/plugin/skills/implement/SKILL.md +61 -0
- package/plugin/skills/implement/reference/implement.md +439 -0
- package/plugin/skills/review/SKILL.md +74 -0
- package/dist/emit/typespec.d.ts +0 -26
- package/dist/emit/typespec.js +0 -356
- package/dist/emit/typespec.js.map +0 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: em-critic
|
|
3
|
+
description: Gives an independent second review of a slice's pull request in fresh context on a different model and returns a findings list; the engagement skill dispatches it after the reviewer and never shares the reviewer's findings with it.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
<!-- managed by em — `em skill sync` overwrites; `Bash` cannot be partially allowed, so read-only agents rely on their instructions for Bash -->
|
|
7
|
+
|
|
8
|
+
You are the em critic. You are an independent second opinion. You run in fresh context, on a different model from the implementer, and you must not be shown the reviewer's findings. If any reviewer findings appear in your input, say so in your first line and ignore them.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
Inputs: the slice doc, the project constitution, and the pull request. Review the same three things the reviewer does: spec fidelity, slice isolation, constitution conformance. Use Bash only for read-only commands such as `gh pr diff <pr>` and `git diff`. Do not write, edit, create, delete, commit, or push anything.
|
|
13
|
+
|
|
14
|
+
## Hard lines
|
|
15
|
+
|
|
16
|
+
- Every finding cites a slice doc line or section, or a constitution rule. Drop anything you cannot cite.
|
|
17
|
+
- No edits. No patches beyond one sentence saying what is wrong.
|
|
18
|
+
- Form your own view first. Where the orchestrator later reports that your view differs from the reviewer's, that disagreement is itself a finding; do not soften your findings to match.
|
|
19
|
+
|
|
20
|
+
## Output
|
|
21
|
+
|
|
22
|
+
A findings list, one per line, in exactly this shape:
|
|
23
|
+
|
|
24
|
+
`- [<severity>] <file:line or doc §> — <finding>`
|
|
25
|
+
|
|
26
|
+
Severity is `blocker`, `major`, or `minor`. If there are no findings, reply `NO FINDINGS` and name what you checked.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: em-implementer
|
|
3
|
+
description: Implements exactly one ratified event-modeling slice in an assigned worktree and branch and opens its pull request; the engagement skill dispatches it once per slice with only the slice key and the worktree path.
|
|
4
|
+
tools: Read, Write, Edit, Bash, Grep, Glob, Skill
|
|
5
|
+
---
|
|
6
|
+
<!-- managed by em — `em skill sync` overwrites; `Bash` cannot be partially allowed, so read-only agents rely on their instructions for Bash -->
|
|
7
|
+
|
|
8
|
+
You are the em implementer. You build one slice, in one worktree, on one branch, and you stop.
|
|
9
|
+
|
|
10
|
+
## Load first
|
|
11
|
+
|
|
12
|
+
1. Load the `event-modeling-implement` skill (`/em:implement` under the plugin) and follow it. The slice doc is your read-only spec.
|
|
13
|
+
2. Read the project constitution (`constitution.md` beside the model, or `.specify/memory/constitution.md`). Its routing table maps the slice's `Pattern:` to the pattern skills you load next; load those too.
|
|
14
|
+
|
|
15
|
+
## Scope
|
|
16
|
+
|
|
17
|
+
- Exactly one slice: the key you were given. Work only in the worktree path you were given, on the branch that is already checked out there.
|
|
18
|
+
- Write code and tests inside that slice's package, as the constitution's layout rule describes it.
|
|
19
|
+
- Every invariant and scenario in the slice doc gets a test that cites its `INV-*` id.
|
|
20
|
+
|
|
21
|
+
## Hard lines
|
|
22
|
+
|
|
23
|
+
- Never edit the slice doc, the `.em` model, another slice's package, shared infrastructure, or the engagement file.
|
|
24
|
+
- Never merge. Never rebase onto anything. Never change the branch's base.
|
|
25
|
+
- If the slice doc is wrong, incomplete, or contradicts the constitution, stop and report the gap. Do not decide it silently and do not edit the doc to fit your code.
|
|
26
|
+
- Do not dispatch other agents.
|
|
27
|
+
|
|
28
|
+
## Output
|
|
29
|
+
|
|
30
|
+
Reply with:
|
|
31
|
+
|
|
32
|
+
- The pull request URL.
|
|
33
|
+
- A per-invariant test map: one line per `INV-*` id, `INV-<id> -> <test file>::<test name>`.
|
|
34
|
+
- Any gap you stopped on, stated as the doc line and the question.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: em-reviewer
|
|
3
|
+
description: Reviews a slice's pull request for spec fidelity, slice isolation and constitution conformance and returns a findings list; the engagement skill dispatches it after the validator passes.
|
|
4
|
+
tools: Read, Grep, Glob, Bash
|
|
5
|
+
---
|
|
6
|
+
<!-- managed by em — `em skill sync` overwrites; `Bash` cannot be partially allowed, so read-only agents rely on their instructions for Bash -->
|
|
7
|
+
|
|
8
|
+
You are the em reviewer. You read; you never edit.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
Inputs: the slice doc, the project constitution, and the pull request. Use Bash only for read-only commands such as `gh pr diff <pr>` and `git diff`. Do not write, edit, create, delete, commit, or push anything.
|
|
13
|
+
|
|
14
|
+
Review three things:
|
|
15
|
+
|
|
16
|
+
- Spec fidelity: the code and tests do what each field, invariant, and scenario in the slice doc says, and nothing the doc does not say.
|
|
17
|
+
- Slice isolation: nothing outside this slice's package changed; no reach into another slice or shared infrastructure.
|
|
18
|
+
- Constitution conformance: layout, naming, testing, and branch norms.
|
|
19
|
+
|
|
20
|
+
## Hard lines
|
|
21
|
+
|
|
22
|
+
- Every finding cites a slice doc line or section, or a constitution rule. A finding you cannot cite is not a finding; drop it.
|
|
23
|
+
- Make no edits and propose no patches beyond one sentence saying what is wrong.
|
|
24
|
+
|
|
25
|
+
## Output
|
|
26
|
+
|
|
27
|
+
A findings list, one per line, in exactly this shape:
|
|
28
|
+
|
|
29
|
+
`- [<severity>] <file:line or doc §> — <finding>`
|
|
30
|
+
|
|
31
|
+
Severity is `blocker`, `major`, or `minor`. If there are no findings, reply `NO FINDINGS` and name what you checked.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: em-validator
|
|
3
|
+
description: Runs the mechanical checks on a slice's pull request and reports pass or fail per check; the engagement skill dispatches it after the implementer opens the PR and before review.
|
|
4
|
+
tools: Read, Bash, Grep, Glob
|
|
5
|
+
---
|
|
6
|
+
<!-- managed by em — `em skill sync` overwrites; `Bash` cannot be partially allowed, so read-only agents rely on their instructions for Bash -->
|
|
7
|
+
|
|
8
|
+
You are the em validator. You run checks and report what they say. You make no judgment beyond "the check says".
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
You were given a slice key and the worktree path of its pull request. You read output; you never change anything. Use Bash only to run the checks below and read-only git or `gh` commands. Do not write, edit, create, delete, commit, or push anything.
|
|
13
|
+
|
|
14
|
+
## Checks
|
|
15
|
+
|
|
16
|
+
Run each one and record pass or fail:
|
|
17
|
+
|
|
18
|
+
1. `em validate <model.em> --slice-ready <key>` passes.
|
|
19
|
+
2. `em coverage <model.em> --slice <key> --tests <test dir> --strict` passes (take the test directory from the constitution's layout rule).
|
|
20
|
+
3. The project test command. Read the constitution's line `- **Test command:** \`<cmd>\`` under "Testing norms" and run exactly that command. If the line is absent, report "no test command in the constitution", skip this check, and still run the others.
|
|
21
|
+
4. Diff footprint: every changed path sits inside the slice's package, as the constitution's layout rule describes it. This is a judgment against that rule; quote the rule and list any path outside it.
|
|
22
|
+
5. No diff under `slices/**`, `*.em`, `constitution.md`, or `engagements/`. Use `git diff --name-only <base>...HEAD`.
|
|
23
|
+
6. The pull request body cites the slice doc.
|
|
24
|
+
|
|
25
|
+
## Output
|
|
26
|
+
|
|
27
|
+
One line per check, `PASS` or `FAIL`, with the command run and, for a failure, the first lines of its output or the offending paths. End with `OVERALL: PASS` only if every check that ran passed.
|
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: event-modeling
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.14.0
|
|
4
4
|
description: >-
|
|
5
5
|
Use when the user runs `/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
|
|
7
7
|
`.event-modeling.md` state (or the given phase name) and routes to the right focused skill —
|
|
8
8
|
event-modeling-discover, event-modeling-design, event-modeling-implement, event-modeling-conform,
|
|
9
|
-
or event-modeling-review
|
|
10
|
-
|
|
11
|
-
|
|
9
|
+
or event-modeling-review — or, for building a planned set of ready slices through scoped
|
|
10
|
+
sub-agents to a stack of PRs (an `em engagement`), event-modeling-engagement. If you already
|
|
11
|
+
know which of those applies — starting a new model, extracting from existing code,
|
|
12
|
+
slicing/writing specs, implementing a ratified slice, leading an engagement, checking drift, or
|
|
13
|
+
running a live/stakeholder view — invoke that skill directly instead of this one.
|
|
12
14
|
---
|
|
13
15
|
|
|
14
16
|
# Event Modeling with `em` — resume / route
|
|
15
17
|
|
|
16
|
-
`em` drives Event Modeling through
|
|
17
|
-
conform, watch, review, validate` — split across
|
|
18
|
-
process. This router skill is the single entry point for `/event-modeling`: it figures out
|
|
19
|
-
phase applies and hands off, so you never need to remember which of the
|
|
18
|
+
`em` drives Event Modeling through ten phases — `discover, extract, model, slice, implement,
|
|
19
|
+
conform, watch, review, validate, engagement` — split across six focused skills, one per stage of
|
|
20
|
+
the process. This router skill is the single entry point for `/event-modeling`: it figures out
|
|
21
|
+
which phase applies and hands off, so you never need to remember which of the six skills a given
|
|
20
22
|
phase lives in.
|
|
21
23
|
|
|
22
24
|
| These phases... | ...live in this skill |
|
|
@@ -26,6 +28,7 @@ phase lives in.
|
|
|
26
28
|
| `implement` | `event-modeling-implement` — building one ratified slice into merged, tested code |
|
|
27
29
|
| `conform`, `validate` | `event-modeling-conform` — drift-checking a model against its codebase, walking validation diagnostics |
|
|
28
30
|
| `watch`, `review` | `event-modeling-review` — the live browser viewer, facilitated stakeholder walkthroughs |
|
|
31
|
+
| `engagement` | `event-modeling-engagement` — build a planned set of ready slices through scoped sub-agents to a stack of PRs |
|
|
29
32
|
|
|
30
33
|
## Routing logic
|
|
31
34
|
|
|
@@ -36,7 +39,7 @@ phase lives in.
|
|
|
36
39
|
gap proceeds normally.
|
|
37
40
|
2. Parse `$ARGUMENTS` for a phase name.
|
|
38
41
|
- **A recognized phase name** (`discover`, `extract`, `model`, `slice`, `implement`,
|
|
39
|
-
`conform`, `validate`, `watch`, `review`): look it up in the table above and invoke that
|
|
42
|
+
`conform`, `validate`, `watch`, `review`, `engagement`): look it up in the table above and invoke that
|
|
40
43
|
skill directly (via the `Skill` tool), passing the phase name along so it knows exactly
|
|
41
44
|
where to start. Don't re-derive state first — the target skill's own preconditions handle
|
|
42
45
|
that.
|
|
@@ -50,10 +53,44 @@ phase lives in.
|
|
|
50
53
|
extract from (`event-modeling-discover`, `extract`), then invoke that skill.
|
|
51
54
|
- **An unrecognized argument:** treat it as free-text intent and pick the best-matching skill
|
|
52
55
|
from the table's description, same as you would if the user had asked in plain language.
|
|
53
|
-
3.
|
|
56
|
+
3. **Steer late work to `event-modeling-review` (MIL-236).** When the phase resolves to `slice`
|
|
57
|
+
(recorded or requested), run `em status <model>.em --json` before handing off. Recommend
|
|
58
|
+
`event-modeling-review` to the user instead of `event-modeling-design` when either holds:
|
|
59
|
+
- no slice doc is left to write or deepen: `slices.byStatus.draft === 0`,
|
|
60
|
+
`slices.byStatus.noDoc === 0`, and `slices.byStatus.reviewed +
|
|
61
|
+
slices.byStatus.readyToImplement > 0`;
|
|
62
|
+
- the state file's `## Open questions / parking lot` section has an unchecked `- [ ]` item.
|
|
63
|
+
Say why: closing open questions and walking slices to the review gate is the review skill's
|
|
64
|
+
job, not broad consistency work. Invoke `event-modeling-review` when the user agrees;
|
|
65
|
+
otherwise hand off to `event-modeling-design` as the table says.
|
|
66
|
+
4. **Never do the phase work here.** Recommend the focused skill by name and hand off. Never run
|
|
67
|
+
a cross-cutting "make everything consistent" pass from this skill: no sweeping edits across
|
|
68
|
+
slice docs, no regenerating or hand-editing derived artifacts, no reading implementation code
|
|
69
|
+
to settle a modeling question. The design-session write scope below applies to anything
|
|
70
|
+
started from here.
|
|
71
|
+
5. Once you've handed off, this skill's job is done for the session — the target skill owns the
|
|
54
72
|
conversation from there, including re-invoking `event-modeling` (this skill) itself at the end
|
|
55
73
|
if the user wants to stop and resume later.
|
|
56
74
|
|
|
75
|
+
## Design-session write scope (MIL-236)
|
|
76
|
+
|
|
77
|
+
These rules bind every `discover`/`model`/`slice` session, whichever skill runs it. The full
|
|
78
|
+
text is in `../event-modeling-shared/reference/operating-principles.md` ("Write scope and
|
|
79
|
+
evidence").
|
|
80
|
+
|
|
81
|
+
- **Bound to one model directory.** The session is bound to the model directory it started in
|
|
82
|
+
(`dirname(<model>.em)`). Never write under another model's directory or to its contract file.
|
|
83
|
+
A question that needs another model's `public` element changed becomes a **seam change
|
|
84
|
+
request**: a dated Decisions-log bullet in THIS model's `.event-modeling.md`, and the question
|
|
85
|
+
stays open as blocked-on-upstream.
|
|
86
|
+
- **Out of scope during design — never write:** generated contract artifacts
|
|
87
|
+
(`contracts/*.tsp`, any OpenAPI or JSON-schema output); SDD/spec artifacts (`specs/`,
|
|
88
|
+
`.specify/` — the constitution may be read, never written); implementation source (`src/`,
|
|
89
|
+
the model's `Code roots:`); `plugin/`; a draft slice doc's `version:`.
|
|
90
|
+
- **Evidence rule.** The `.em` model and the slice docs are the evidence for modeling
|
|
91
|
+
decisions. Code is consulted only in `extract` (`event-modeling-discover`) and `conform`
|
|
92
|
+
(`event-modeling-conform`).
|
|
93
|
+
|
|
57
94
|
## Shared reference material
|
|
58
95
|
|
|
59
96
|
Every phase skill (and this one) points back to the same shared resources rather than
|
|
@@ -89,4 +126,6 @@ em watch <name>.em -o <name>.svg --serve # + the live browser viewer: instant
|
|
|
89
126
|
Always finish a working session by: re-rendering, running `em validate`, and updating
|
|
90
127
|
`.event-modeling.md` — `em state set-phase <phase> [--step <n>]` for the current phase/step,
|
|
91
128
|
decisions and open questions by hand, and `em state log-usage <model>.em --phases <phases>` for
|
|
92
|
-
the Usage log entry.
|
|
129
|
+
the Usage log entry. Before committing a design session, stage the files and run the pre-commit
|
|
130
|
+
check in `../event-modeling-shared/reference/operating-principles.md` ("Write scope and
|
|
131
|
+
evidence"): `em system scope --staged` plus `git diff --cached --name-only`; STOP on any finding.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: event-modeling-conform
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.14.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: event-modeling-design
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.14.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
|
|
@@ -23,6 +23,44 @@ layout, the Socratic/validation discipline every phase follows) and
|
|
|
23
23
|
work — they are the source of truth. Run the preconditions there first: this phase expects a
|
|
24
24
|
draft model already exists (from `event-modeling-discover`'s `discover` or `extract` phase).
|
|
25
25
|
|
|
26
|
+
## Write scope, evidence, versions (MIL-236) — read before any edit
|
|
27
|
+
|
|
28
|
+
Full rules: `../event-modeling-shared/reference/operating-principles.md` ("Write scope and
|
|
29
|
+
evidence"). In short:
|
|
30
|
+
|
|
31
|
+
- **Bound to this model's directory.** The session is bound to the model directory it started
|
|
32
|
+
in (`dirname(<model>.em)`). Never write under another model's directory or to its contract
|
|
33
|
+
file. Read a neighbour only through its public surface (`public: true` elements in
|
|
34
|
+
`em export <neighbour>.em`, or its committed contract), read-only.
|
|
35
|
+
- **Seam change request, never a cross-model edit.** When an open question needs another
|
|
36
|
+
model's `public` element changed, add one dated bullet to THIS model's `.event-modeling.md`
|
|
37
|
+
`## Decisions log`:
|
|
38
|
+
`- YYYY-MM-DD: seam change request → <producerKey>:<kind>.<slug> — <what> — <why>`.
|
|
39
|
+
Keep the question open, `blocked on:` the producer's owners. Never edit the other side.
|
|
40
|
+
- **Out of scope during design — never write:** generated contract artifacts
|
|
41
|
+
(`contracts/*.tsp`, any OpenAPI or JSON-schema output), SDD/spec artifacts (`specs/`,
|
|
42
|
+
`.specify/` — read the constitution, never write it), implementation source (`src/`, the
|
|
43
|
+
model's `Code roots:`), `plugin/`, and a draft slice doc's `version:`. Exception: after
|
|
44
|
+
marking an element `public` or changing a field of a `public` element, run
|
|
45
|
+
`em api generate <model>.em` and commit the regenerated contract with the model edit — the
|
|
46
|
+
API-first gate (`em validate --slice-ready`) refuses a public-touching slice whose contract
|
|
47
|
+
is missing or stale. Never hand-edit the contract.
|
|
48
|
+
- **Slice docs: edit authored sections only.** Never hand-edit a generated region
|
|
49
|
+
(`<!-- GENERATED:em-slice-…:start -->` … `:end -->`: field tables, the Invariants list); after
|
|
50
|
+
any model edit run `em slice sync <model>.em` (see **Generated vs authored sections** below).
|
|
51
|
+
- **Evidence rule.** The `.em` model and the slice docs are the evidence for modeling
|
|
52
|
+
decisions. Never read implementation source, generated contracts or `specs/` to decide a
|
|
53
|
+
modeling question — ask the user. Code is read only in `extract` and `conform`.
|
|
54
|
+
- **Version rule.** Never bump a draft's `version:` on edit. Before any `em slice reratify`,
|
|
55
|
+
run `em status <model>.em --json`: pre-release = the model's `modelVersion` entry has
|
|
56
|
+
`design: null` **and** `slices.byStatus.implemented === 0`. Pre-release → never run
|
|
57
|
+
`reratify`; edit `draft`/`reviewed` docs in place. Released → the re-ratification path in
|
|
58
|
+
the `slice` phase below.
|
|
59
|
+
- **Pre-commit check.** Stage the session's files, run `em system scope --staged` (STOP on any
|
|
60
|
+
`seam-crossing`), then `git diff --cached --name-only` (STOP on any path outside this model's
|
|
61
|
+
directory, any out-of-scope path above, or a changed `version:` line on a draft doc).
|
|
62
|
+
Unstage the offending path and tell the user why.
|
|
63
|
+
|
|
26
64
|
## Phase: `model` — steps 5-7
|
|
27
65
|
|
|
28
66
|
Goal: a structurally complete, **validated** model with correct patterns and swimlanes.
|
|
@@ -45,7 +83,8 @@ Goal: a structurally complete, **validated** model with correct patterns and swi
|
|
|
45
83
|
`--wire` refuses it and names the originating slice holding `X`'s first declaration; its
|
|
46
84
|
scenarios go into that doc instead. Then, for each freshly scaffolded doc, hold a first-pass
|
|
47
85
|
Socratic pass and write the happy-path Given/When/Then into
|
|
48
|
-
its `## Scenarios (Given / When / Then)` section
|
|
86
|
+
its `## Scenarios (Given / When / Then)` section (as `### Scenario:` blocks — see **Generated
|
|
87
|
+
vs authored sections** in the `slice` phase below) and the obvious invariants known so far into
|
|
49
88
|
its `## Invariants / Business Rules` section — **into the doc, never into the state file.**
|
|
50
89
|
Keep this pass shallow (no field tables, alternate/error flows, or NFRs yet — that's the full
|
|
51
90
|
deep-dive in the `slice` phase below); the docs are the home for everything collected from
|
|
@@ -71,6 +110,19 @@ Goal: a structurally complete, **validated** model with correct patterns and swi
|
|
|
71
110
|
that reads it; another model/system reads it → mark it `public`; only an automation reads
|
|
72
111
|
it → nothing, it's internal by design. No new keyword — reachability is already what `ui` and
|
|
73
112
|
`public` mean.
|
|
113
|
+
**Per translation fed from another model, declare what it consumes (MIL-235):** write
|
|
114
|
+
`translation Order Intake consumes checkout:event.order-submitted`. The ref is
|
|
115
|
+
`<modelKey>:<kind>.<slug>`, where kind is `event` or `view` and the target is marked `public`
|
|
116
|
+
in its own model. The consumer declares the seam; the producer never lists its consumers, and
|
|
117
|
+
the ref carries no version and no slice. Only a `translation` may carry `consumes`. If a
|
|
118
|
+
reaction reads another model, it is a translation. `em validate` checks only the ref's
|
|
119
|
+
grammar. Run `em system` from the repository (or on its `system.yaml`) to resolve it, and fix
|
|
120
|
+
any `consumes-unknown-model`/`consumes-unknown-element` error. Never edit the other model to
|
|
121
|
+
make a ref resolve. Ask its owner to publish the element instead, and record that ask as a
|
|
122
|
+
seam change request (see **Write scope** above).
|
|
123
|
+
**When you mark an element `public` here**, run `em api generate <model>.em` in the same
|
|
124
|
+
session and stage `contracts/<model key>.tsp` with the model edit — the one derived artifact
|
|
125
|
+
a design session produces, always by the command, never by hand.
|
|
74
126
|
|
|
75
127
|
End of phase: render, update state (`em state set-phase slice` — the mechanical marker the state
|
|
76
128
|
machine expects), and stop. Every slice already has a draft doc ready to receive the deep spec,
|
|
@@ -95,8 +147,14 @@ phases is the starting point, not the finished event set. **Every new event need
|
|
|
95
147
|
real (someone has to see that the request was declined).
|
|
96
148
|
|
|
97
149
|
For each slice:
|
|
98
|
-
0. **Check for re-ratification first.**
|
|
99
|
-
|
|
150
|
+
0. **Check for re-ratification first.** A `draft` or `reviewed` doc is never re-ratified: edit
|
|
151
|
+
it in place and leave its `version:` alone. If `slices/<slice-name>.md` already exists with
|
|
152
|
+
`status: implemented` (or is ratified and needs a change), run `em status <model>.em --json`
|
|
153
|
+
first. **Pre-release** (the model's `modelVersion` entry has `design: null` and
|
|
154
|
+
`slices.byStatus.implemented === 0`): never run `em slice reratify`; a ratified doc holds a
|
|
155
|
+
human sign-off, so STOP, park the change as an open question, and let the ratifier decide.
|
|
156
|
+
**Released** (either condition false): a doc with `status: implemented` is a
|
|
157
|
+
re-ratification, not fresh authoring: hold a Socratic
|
|
100
158
|
deep-dive on what changed (same rigor as step 1, scoped to the delta), update whichever
|
|
101
159
|
sections actually changed, then express the change as the `## Delta` section — fixed heading,
|
|
102
160
|
`### Added`/`Modified`/`Removed`/`Renamed` Requirement blocks each carrying its own scenarios
|
|
@@ -108,14 +166,18 @@ For each slice:
|
|
|
108
166
|
schema doc). Otherwise, this is first-time authoring: continue at step 1.
|
|
109
167
|
1. Hold a Socratic deep-dive to fill every section of `../event-modeling-shared/templates/slice.md`:
|
|
110
168
|
intent, trigger/actor,
|
|
111
|
-
command
|
|
112
|
-
|
|
169
|
+
command fields (types & rules), event(s) + payload (mark immutable facts) — field names and
|
|
170
|
+
types go into the `.em`, the doc's tables are generated from it — invariants
|
|
171
|
+
(give each a stable ID — see **Invariants live in the model** below), Given/When/Then scenarios (happy path + rule boundaries + edge cases),
|
|
113
172
|
alternate/error flows (retries, idempotency, compensations), non-functional requirements
|
|
114
173
|
(security/authz, PII/compliance, performance/SLA), read models affected, open questions. Park
|
|
115
|
-
anything unresolved rather than guessing.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
174
|
+
anything unresolved rather than guessing. Before finalizing field names/types or invariants,
|
|
175
|
+
check whether the shape is already defined in **this model** (`.em` and its slice docs) or in
|
|
176
|
+
a neighbour's public surface (read-only) — don't guess a shape that's already defined there.
|
|
177
|
+
Never Grep or Read implementation source, OpenAPI files, DB migrations or `specs/` to settle
|
|
178
|
+
it (evidence rule): if the user says the existing code is the source of truth, ask them for
|
|
179
|
+
the shape, or park the question for an `extract` or `conform` session. Before finalizing an
|
|
180
|
+
invariant, also compare it with the slices in
|
|
119
181
|
**this same model** — never another `.em` model — that make the same kind of change (other
|
|
120
182
|
`Archive*` or `Create*` state changes on different entities, say). If one of them already
|
|
121
183
|
states an analogous rule, either state the same rule here — written out in this doc under
|
|
@@ -125,6 +187,30 @@ For each slice:
|
|
|
125
187
|
re-ratification, never as a side effect of this slice. Repeating a rule across slice docs is
|
|
126
188
|
correct: each doc is a self-contained spec, and whether the code behind those rules is shared
|
|
127
189
|
is the constitution's call, not this doc's.
|
|
190
|
+
**Invariants live in the model.** Write every NEW invariant into the `.em` as a standalone
|
|
191
|
+
`invariant INV-<MNEMONIC>-<n> "rule sentence"` line directly after the command (or event) it
|
|
192
|
+
guards — always with the rule sentence — then cite that ID in the doc's Invariants section as a
|
|
193
|
+
plain mention and elaborate there (`- INV-CHK-1 — why, edge cases, the error returned`); never
|
|
194
|
+
restate it as a `**INV-CHK-1:**` rule (`em validate` flags that as
|
|
195
|
+
`invariants/declared-in-both`). A `public` command needs at least one invariant
|
|
196
|
+
(`invariants/public-command-without-invariants`). A doc that already declares its own
|
|
197
|
+
invariants keeps working; migrate one only when you are editing that slice anyway — move the
|
|
198
|
+
ID and rule into the model, keep the doc's elaboration. Run `em validate` after the edit:
|
|
199
|
+
`invariants/malformed-id` and `invariants/duplicate-id` are errors.
|
|
200
|
+
**Generated vs authored sections.** A doc `em slice new` wrote has two kinds of section. The
|
|
201
|
+
GENERATED regions — each command's, event's and read model's field table and the Invariants
|
|
202
|
+
list, between `<!-- GENERATED:em-slice-…:start -->` / `:end -->` markers — restate the model:
|
|
203
|
+
**never hand-edit a generated region.** To change a field, a type, or an invariant, edit the
|
|
204
|
+
`.em`, then **after any model edit run `em slice sync <model>.em`**, which rewrites every
|
|
205
|
+
region in place and leaves everything else byte-for-byte (`em slice sync <model>.em --check`
|
|
206
|
+
reports a stale doc without writing). **Edit authored sections only**: Intent, Trigger &
|
|
207
|
+
Actor, `Triggered by`/`Read by`/`Consumed by`, the invariant elaborations below the generated
|
|
208
|
+
list, Scenarios, Alternate & Error Flows, NFRs, Dependencies, Open Questions. Scenarios use the
|
|
209
|
+
constrained shape `em` reads back: a `### Scenario: <title>` heading, then `- **Given:**`,
|
|
210
|
+
`- **When:**`, `- **Then:**` bullets with nested ` - ` items — all three in every block
|
|
211
|
+
(`em validate` flags a block missing one as `slice-doc/structured-section-malformed`, and
|
|
212
|
+
`--slice-ready` refuses it). A doc written before em 1.14 has no markers; leave it as it is
|
|
213
|
+
unless you are re-creating it (`em slice new … --wire --force`, carrying the prose across).
|
|
128
214
|
2. **First-time authoring:** scaffold the doc mechanically rather than hand-writing the
|
|
129
215
|
frontmatter — `em slice new "<slice name>" --pattern <state-change|state-view|automation|
|
|
130
216
|
translation> --swimlane "<Persona> → <Context>" --wire <model>.em` writes `slices/<slice-name>.md`
|
|
@@ -140,15 +226,19 @@ For each slice:
|
|
|
140
226
|
declaration — write this slice's scenarios into that doc instead of scaffolding a new one.
|
|
141
227
|
Both `--pattern` and `--swimlane` are required; an invalid `--pattern` is refused with the
|
|
142
228
|
valid choices listed. Never hand-type this block, and never fall back to a placeholder
|
|
143
|
-
pattern/swimlane to dodge the flags.
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
229
|
+
pattern/swimlane to dodge the flags. It also writes every template section: the generated
|
|
230
|
+
regions already filled from the model (field tables, Invariants list), the authored sections
|
|
231
|
+
as placeholders. Then fill in the authored sections from step 1 (Intent, Trigger & Actor,
|
|
232
|
+
invariant elaborations, Scenarios, ...) — those stay hand-authored; the generated regions
|
|
233
|
+
follow the model through `em slice sync`. Record the originating need (ticket/conversation
|
|
234
|
+
link) in the Intent section when one exists. When this doc exists because of a split, merge, or rename, add the matching
|
|
148
235
|
lineage key(s) by hand (`split-from`/`merged-from`/`superseded-by`, `<slice-key>@v<N>` grammar
|
|
149
236
|
— see `../event-modeling-shared/reference/slice-doc-schema.md` for the full schema; `em validate` catches a malformed one
|
|
150
237
|
after the fact, see the `lineage-*` rules below).
|
|
151
|
-
**Re-ratification (step 0)
|
|
238
|
+
**Re-ratification (step 0) — released models only.** Confirm the model is released first
|
|
239
|
+
(`em status <model>.em --json`: the `modelVersion` entry's `design` is not `null`, or
|
|
240
|
+
`slices.byStatus.implemented > 0`); on a pre-release model never run `reratify`. The doc
|
|
241
|
+
already exists, so `em slice new` doesn't apply here
|
|
152
242
|
(it refuses to overwrite an existing file without `--force`, and forcing would blow away the
|
|
153
243
|
doc's authored body) — run `em slice reratify <model>.em <slice-key>` instead: it bumps
|
|
154
244
|
`version` and flips `status` back to `ready-to-implement` in the existing frontmatter,
|
|
@@ -158,7 +248,20 @@ For each slice:
|
|
|
158
248
|
gap answered mid-build, MIL-258): it bumps `version` and clears the sign-off but leaves
|
|
159
249
|
`status` alone. Either way the doc is not ratified until `em slice ratify --by <name>` records
|
|
160
250
|
the new sign-off. A `ready-to-implement` doc with no `ratifiedBy` is already awaiting that
|
|
161
|
-
sign-off and refuses a second `reratify`; a `draft`/`reviewed` doc is simply edited
|
|
251
|
+
sign-off and refuses a second `reratify`; a `draft`/`reviewed` doc is simply edited, and its
|
|
252
|
+
`version:` never moves.
|
|
253
|
+
**Public-touching slices (MIL-238).** On a slice that owns a `public` command, event or view,
|
|
254
|
+
`em slice ratify --by <name>` and `em slice reratify` refuse without one of two flags: pass
|
|
255
|
+
`--meaning-unchanged` when this version does not change what the public contract means, or
|
|
256
|
+
`--contract-change "<why>"` when a consumer must read the change differently. Without
|
|
257
|
+
either, both refuse with `slice "<key>" touches the public surface — pass
|
|
258
|
+
--meaning-unchanged, or --contract-change "<why>" if a consumer must read this change
|
|
259
|
+
differently`; passing both refuses too. Run
|
|
260
|
+
`em api generate <model>.em` first, so `em validate --slice-ready` sees a current contract
|
|
261
|
+
(otherwise it blocks with `slice-ready-contract-stale`).
|
|
262
|
+
Which flag applies is the ratifier's call, not yours: ask, never pick one to make the
|
|
263
|
+
command pass. Ratification itself stays a human gate outside this session; a review session
|
|
264
|
+
never ratifies (see `event-modeling-review`).
|
|
162
265
|
3. Render the slice's own diagram: `em render <model>.em --slice "<slice name>" -o
|
|
163
266
|
slices/<slice-name>.svg` (kebab-case, matching the doc's filename and the `![Diagram]` stub
|
|
164
267
|
`em slice new` already wrote) — redraws just this slice in its own canonical pattern shape.
|
|
@@ -172,7 +275,12 @@ For each slice:
|
|
|
172
275
|
5. Run `em slice index <model-name>.em` to regenerate `README.md`'s Slices table — the one
|
|
173
276
|
canonical slice index — from the model and the doc frontmatter you just wrote (status,
|
|
174
277
|
`implementedIn` once shipped). Never hand-edit the table; it's a generated block.
|
|
175
|
-
6. Re-render
|
|
278
|
+
6. Re-render, run `em slice sync <model-name>.em --check` (it must print `ok:` for every doc you
|
|
279
|
+
touched), and `em validate`.
|
|
280
|
+
7. Before committing, stage the session's files and run the pre-commit check: `em system scope
|
|
281
|
+
--staged`, then `git diff --cached --name-only`. STOP on any `seam-crossing`, any path outside
|
|
282
|
+
this model's directory, any out-of-scope path (see **Write scope** above), or a changed
|
|
283
|
+
`version:` line on a draft doc.
|
|
176
284
|
|
|
177
285
|
A finished draft doesn't become implementable here: it goes through the review gate and then the
|
|
178
286
|
ratification gate, both human, both outside this phase — see
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: event-modeling-discover
|
|
3
|
-
em-version: 1.
|
|
3
|
+
em-version: 1.14.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
|