@cratis/pi 7.21.0 → 7.22.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 (69) hide show
  1. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +19 -12
  2. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +4 -3
  3. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +13 -15
  4. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +4 -4
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +21 -0
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +4 -2
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +7 -4
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/verification.json +4 -4
  9. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +38 -36
  10. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +1 -1
  11. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +84 -0
  12. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/refusals-and-redelivery.md +102 -0
  13. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +4 -2
  14. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/verification.json +1 -1
  15. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +28 -16
  16. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +9 -0
  17. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +15 -13
  18. package/package/corpus/skills/cratis-screenplay-command-surface/references/operations.md +80 -0
  19. package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md +23 -1
  20. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +2 -2
  21. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +9 -6
  22. package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +6 -5
  23. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +7 -5
  24. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +6 -5
  25. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +39 -49
  26. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +5 -3
  27. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +48 -8
  28. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +44 -42
  29. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +46 -9
  30. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +35 -11
  31. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +118 -13
  32. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -3
  33. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +11 -6
  34. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  35. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -2
  36. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +10 -0
  37. package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +79 -0
  38. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +9 -7
  39. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -3
  40. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/verification.json +2 -2
  41. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -2
  42. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +13 -2
  43. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -2
  44. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +3 -2
  45. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +40 -0
  46. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +24 -16
  47. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +103 -0
  48. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +5 -6
  49. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -4
  50. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +4 -2
  51. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/verification.json +2 -2
  52. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +34 -32
  53. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +1 -1
  54. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
  55. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +57 -9
  56. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +6 -1
  57. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -10
  58. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +4 -2
  59. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -1
  60. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +90 -27
  61. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +10 -6
  62. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +29 -12
  63. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +91 -136
  64. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -5
  65. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +20 -0
  66. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +9 -5
  67. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +8 -1
  68. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
  69. package/package.json +1 -1
@@ -23,25 +23,13 @@ contract is in `cratis-screenplay-ui-composition`.
23
23
 
24
24
  ## Verified product sources
25
25
 
26
- | Package | Version | Purpose |
27
- | --- | --- | --- |
28
- | `Cratis.Screenplay` / `Cratis.Screenplay.Tool` | `4.68.0` (`79801bf`) | Current compiler; admits ESM v7 (generated values and responses, decision 0026); examples compiled with `--warnaserror` and their specifications run |
29
- | `Cratis.Screenplay` / `Cratis.Screenplay.Tool` | `4.66.0` (`c89198b`) | MCP (29/30 tools), roots fix; the MCP behaviour below was probed on it |
30
- | `Cratis.Screenplay` | main `fd18129` | Inline events, repairs, rename/extraction and `optional` |
31
- | `Cratis.Screenplay` | `4.31.0` | Original compiler, ESM and workspace evidence |
32
- | `cratis` CLI | `3.28.3` | Bundles Screenplay 4.66.0 (no ESM v7) and Stage 4.24.2 (3.28.2 bundled 4.24.1; before 3.28.2: 4.60.1, ESM v5 at most, roots bug) |
33
-
34
- Facts about the MCP connection, source-map, `whenAppendedEvent`, identity
35
- persistence and the syntax-only constructs were read at tag `v4.66.0`
36
- (`Documentation/screenplay/mcp/{reference,install,edit}.md`,
37
- `Source/DotNET/Screenplay.Mcp/`) and probed against the 4.66.0 tool (persona,
38
- trigger, `@pii`, generated values, operations, streams, automation binding).
39
- Repair and refactoring guidance follows main `fd18129` (`commands.md`,
40
- `events.md`, `types.md`, `diagnostics.md`, `mcp/authoring-tools.md`, `vscode.md`,
41
- decision 0023); the `v4.31.0` documents (`ast-authoring`, `mcp`, `mcp-authoring`,
42
- `printing`, `file-references`, `diagnostics`) and release notes v4.17.0 to v4.31.0
43
- established the original baseline. When checking compiler, CLI or MCP compatibility, read the full version table in
44
- `cratis-screenplay-toolchain` (`references/versions.md`).
26
+ Current authoring/MCP guidance follows Screenplay v4.125.0
27
+ `Documentation/screenplay/mcp/`, `ast-authoring.md`, `folders.md`, `vscode.md`.
28
+ Discover installed tools and schemas; CLI bundles can differ from the standalone
29
+ tool. Pins are in `cratis-screenplay-toolchain` `references/versions.md`.
30
+ Historical connection/binding probes below remain labeled 4.66.0; the complete
31
+ registration example was compiled/tested at 4.68.0, not reclassified as a current
32
+ execution probe. Earlier source attribution is in `references/provenance.md`.
45
33
 
46
34
  ## Locate and connect
47
35
 
@@ -54,17 +42,16 @@ directory when it holds `.play` files). Only when it answers that no root was gi
54
42
  or that several roots are offered, pass `path`: the folder holding the project's `.play` files, otherwise the
55
43
  folder the user names. Without a project, the server works in `Documents/Screenplay`
56
44
  in the user's home folder, so do not invent a location. A root fixed at launch
57
- cannot be switched: another `path` returns `RootChangeRefused`.
45
+ can switch only to the corresponding model folder in a registered Git worktree
46
+ of the same repository. Pass the worktree checkout or exact model directory as
47
+ `path`; unrelated roots return `RootChangeRefused`. Switching clears proposals
48
+ and uses the destination's own identity state and journal; nothing migrates.
49
+ Submodules and `--separate-git-dir` checkouts require another connection.
58
50
 
59
- **Prefer a fixed root.** Screenplay up to 4.63.1 (so Cratis CLI before 3.28.2; fixed in
60
- 4.63.2, so not in CLI 3.28.2 or later, probed) fails a
61
- dynamic-root server right after `notifications/initialized` when the client
62
- advertises roots; real hosts then drop the connection, and `open-workspace.path`
63
- cannot prevent it. Start `screenplay mcp <model-folder>` or `cratis screenplay mcp`
64
- in a project (it locates the model: the project's `.play` files, else `Source/` or `src/`, else `Screenplay/`).
65
- Send `initialize` and `notifications/initialized` before any tool call;
66
- `tools/list` returns 29 tools (30 on MCP-Apps hosts). Read `references/mcp-loop.md` when connecting, coordinating connection ownership, or handling proposal and recovery failures. Details:
67
- [MCP loop](references/mcp-loop.md).
51
+ Prefer a fixed root; the historical dynamic-roots bug and connection procedure
52
+ are in [MCP loop](references/mcp-loop.md). Send `initialize` and
53
+ `notifications/initialized` before any tool call, then discover `tools/list`
54
+ schemas rather than relying on a remembered count.
68
55
 
69
56
 
70
57
  Look first for the project's existing `.play` files: the folder holding them is the
@@ -100,10 +87,14 @@ can keep that entry point; use the project's supported installation channel.
100
87
  of `.play` files is one application, not independent files.
101
88
  2. Use `search-declarations`, `declaration-details`, `find-references` and
102
89
  `dependencies` to locate the owning declaration and affected references.
103
- 3. Read diagnostics and coverage limitations. Unknown or ambiguous bindings are
104
- not an empty, successful dependency graph.
105
- 4. Use `find-fixtures` for value occurrences and `find-assertion-gaps` for authored
106
- assertion gaps. These tools do not execute specifications or prove coverage.
90
+ 3. Read diagnostics and coverage limitations. Use `dependency-graph` for container
91
+ edges, declared-dependency coverage, cycles and advisory order; the board's
92
+ dependency-map toggle exposes this evidence visually. Unknown or ambiguous
93
+ bindings are not an empty, successful dependency graph.
94
+ 4. Use `find-fixtures` for value occurrences (including example/override origins
95
+ and event routes) and `find-assertion-gaps` for authored assertion gaps. Neither
96
+ executes specifications. `diagnostics` accepts `scope` and opt-in `checks`;
97
+ skipped completeness checks are not passes. Details: `references/mcp-tools.md`.
107
98
  5. Echo `sourceRevision` on subsequent pages. Restart the query after drift;
108
99
  never combine pages from different snapshots.
109
100
  6. For screens, also discover the template, form, toolbar, package/icon and
@@ -193,9 +184,15 @@ Read `read-workspace` with `view: "diagnostics"`, then `view: "repairs"` at the
193
184
  same revision. Pass the returned `diagnosticCode`, `subject`, required formatting
194
185
  and both revisions to `propose-repair`; preview with `read-proposal`, then `apply`.
195
186
  Only verified repairs are listed, and the selected repair gets a fresh transaction.
187
+ For PLAY0166/PLAY0478, use the evidence-pinned loop in `references/mcp-tools.md`:
188
+ `pinRepairEvidence` plus `expectedRepairEvidenceRevision` prevent attachment drift
189
+ from silently changing the reviewed candidate.
196
190
 
197
191
  - `PLAY0166` declares a missing produced event; `PLAY0478` is a routing decision
198
- (identifier destination); `PLAY0471` removes a redundant name-equal event pin.
192
+ (identifier destination, never fix-all); `PLAY0471` removes a redundant name-equal event pin.
193
+ - `PLAY0516` repairs presentation order by moving a sibling or import, or pinning
194
+ a producer before a glob. It preserves semantics/identities and introduces no
195
+ new timeline findings; evidence pinning is unsupported for this repair.
199
196
  - `PLAY0469` removes an inline identifier payload copy: it **changes the event
200
197
  contract**, refuses consumer/opaque impact, has no fix-all, and the catalog does
201
198
  not prove events were persisted, so ask about stored contracts first.
@@ -226,9 +223,10 @@ module and its features, each feature importing its folder
226
223
  (`import "Orders/*.play"`); a slice file holds only its `slice`, because the
227
224
  import places it in its feature. When you write or reorganize files yourself,
228
225
  do not restate `module`/`feature` in a slice file, and do not leave a barrel
229
- that declares a scope but imports nothing. `expand-layout` still writes that
230
- older merge-only layout; it compiles as a folder, and you can compose it with
231
- imports afterwards. When choosing file placement, read the
226
+ that declares a scope but imports nothing. At 4.125.0 `expand-layout` writes
227
+ import barrels and slice-only leaves, preserving sibling and interleaved member
228
+ order. It refuses a proposal that would change that order; without an ordering
229
+ root its review discloses the path-order fallback. When choosing file placement, read the
232
230
  [language reference](references/language-reference.md) for placement rules.
233
231
 
234
232
  Parent scaffolding carries no duplicated module forms or contributions. Compile
@@ -243,6 +241,11 @@ a model only ever text-edited has none. A restart must not silently mint new IDs
243
241
  do not delete or overwrite conflicting identity state to get a green result, and do
244
242
  not text-rename identity-affecting declarations in a model that has it.
245
243
 
244
+ Default root discovery preserves ancestor identity state and journals. Inspect
245
+ `rootBindingConflict` in `open-workspace`/`workspace-state` when several state roots
246
+ compete; do not delete state or mint replacement identities. To recover a competing
247
+ journal, first open that root explicitly, then inspect its operation ID.
248
+
246
249
  A pending journal blocks normal work. Inspect `workspace-state`; invoke
247
250
  `recover-workspace` only for the identified interrupted operation within the
248
251
  requested recovery scope. Unexpected external edits block rollback. Preserve
@@ -278,10 +281,9 @@ that the code compiles or behaves. Read `references/mcp-tools.md#code-attachment
278
281
  it defines them and maps them onto V1 to V5. `screenplay --warnaserror` checks
279
282
  syntax plus the consistency rules (`PLAY0282`-`PLAY0294`) but never binds, so a
280
283
  clean run is not a bound or executable result.
281
- - Personas are report-only, operations and event sources/streams are authorable but
282
- not executable (not admitted by any supported ESM version), and `generated`/`returns`
283
- bind only from standalone 4.68.0 (ESM v7; not on the cratis 3.28.x bundle, not rendered by
284
- Stage 4.24.2): none is a reason to drop or stub the construct.
284
+ - Operations/exact numbers remain unadmitted; source/stream routes bind as ESM v8,
285
+ and generated values/responses as v7. CLI 3.41.0 render passes v7 to Stage but
286
+ refuses newer versions. A source contract is never dropped or stubbed to bind.
285
287
  - Distinguish authoring acceptance from `executableReady`; unsupported backend
286
288
  capabilities are not a reason to drop source constructs or invent stubs.
287
289
  - If execution is intended, validate with the owning downstream runtime as well.
@@ -301,7 +303,7 @@ a generated app that silently drops authored UI. Use the Screenplay-owned canoni
301
303
  corpus fixture path when it exists instead of copying `.play` examples into this
302
304
  repository.
303
305
 
304
- Repair and refactoring guidance follows Screenplay main `fd18129`. The Cratis
306
+ Repair and refactoring guidance follows Screenplay v4.125.0. The Cratis
305
307
  CLI bundles its own Screenplay version, so check the installed `tools/list`
306
308
  schemas before relying on a view or argument named here (for example
307
309
  `dropped-comments` or `implementation-requirements`). Do not invent a command,
@@ -6,6 +6,7 @@
6
6
  ## Contents
7
7
 
8
8
  - Accepted constructs
9
+ - Container dependencies and exact numbers
9
10
  - Complete model
10
11
  - Source validity is not execution
11
12
  - Not in the language yet
@@ -21,7 +22,7 @@ repository is the full list; this page is the authoring summary.
21
22
 
22
23
  **Top level:** `domain`, `import`, `concept`, `type`, `policy`, `persona`,
23
24
  `authentication`, `trigger`, `theme`, `layout`, `ui profile`, `behavior`,
24
- `module`, `seed`, and the syntax-only `system` and `eventsource` (with its `stream`s).
25
+ `module`, `seed`, authoring-only `system`, and admitted `eventsource` with its `stream`s (ESM v8).
25
26
 
26
27
  **Inside a module:** `description`, `authorize`, `import "<glob>"`,
27
28
  `screen`/`dialog` templates, `form`, `contribute`, `on`/`uses` behavior
@@ -65,6 +66,35 @@ tagged fence (` ```csharp `); the older language-line form still parses with
65
66
  warning `PLAY0397`. Query the MCP's `syntax-schema` instead of inventing JSON
66
67
  members or translating names from memory.
67
68
 
69
+ ## Container dependencies and exact numbers
70
+
71
+ At Screenplay 4.125.0, modules and features accept `depends on <Name>`, one
72
+ per line. Bare targets resolve inside out (siblings, ancestor siblings, root
73
+ modules); qualified targets match an unambiguous trailing address. Merged files
74
+ accumulate each owner's declarations in file-path order; imports affect board
75
+ order, not accumulation. Dependencies are optional authoring metadata, not runtime
76
+ or implementation order. See `cratis-screenplay-slice-design` `references/slicing.md`
77
+ for coverage diagnostics and MCP `dependency-graph` `declarations` evidence.
78
+
79
+ A top-level `numbers exact` preamble opts each file into bounded decimal source
80
+ literals without Double rounding. All files/import barrels must agree on mode
81
+ (PLAY0508–PLAY0513 diagnose directive/range/mode errors). Exact mode is authorable,
82
+ not admitted by any supported ESM version (`PLAY0268`). Do not confuse this with
83
+ ESM v7 generated values and responses.
84
+
85
+ Typed roots (`ApplicationSyntax`, `ProjectionSyntax`, `CaptureSyntax`,
86
+ `SpecificationSyntax`) carry `sourceOptions: {"numericMode":"exact"}`. Missing
87
+ options default independently to Legacy, including nested roots; null/unknown
88
+ options and conflicting modes reject. Exact literal slots use
89
+ `{"literalType":"ExactNumber","value":"9007199254740993"}`: a canonical fixed-point
90
+ string, not a JSON number/JavaScript Number. Plain numbers, legacy envelopes and
91
+ noncanonical/out-of-range strings reject in Exact trees. An ExactNumber tag does
92
+ not opt a Legacy root in. Change mode as a whole-tree edit (leaves and all root
93
+ options), not just a flag; fragment printing keeps the owner's mode without a
94
+ nested preamble.
95
+
96
+ Sources: v4.125.0 `slices.md`, `folders.md`, `ast-authoring.md`, `grammar.md`.
97
+
68
98
  ## Complete model
69
99
 
70
100
  This registration model uses an inline event and context identity rather than
@@ -121,13 +151,20 @@ module Projects
121
151
 
122
152
  ## Source validity is not execution
123
153
 
154
+ The table and binding inventory below retain their historical 4.66.0/4.68.0
155
+ probe labels; do not use them as current tool admission evidence. At 4.125.0,
156
+ `screenplay test` and MCP `run-specifications` expose reference execution,
157
+ and sources/streams/routes bind as ESM v8. Operations and exact numeric mode
158
+ still refuse binding. Use the installed tool and the version table in
159
+ `cratis-screenplay-toolchain` for current verdicts, not an older negative probe.
160
+
124
161
  A construct can be in one of four states. Say which one you checked.
125
162
 
126
163
  | State | What establishes it | What it does not prove |
127
164
  | --- | --- | --- |
128
165
  | **Parsed** | `screenplay <folder> --warnaserror` or MCP authoring diagnostics: syntax plus the model-consistency checks (`PLAY0282`-`PLAY0294`, for example a specification event that no producer can emit, `PLAY0285`) | Binding, execution, or anything about attached code. It never binds, so it cannot report `PLAY0268`, and the tool never reads `file` attachments |
129
166
  | **Bound** | Semantic binding to the executable semantic model (ESM): MCP `executableReady`, executable diagnostics | That the reference execution plan admits the model, or that any specification passes |
130
- | **Reference-executed** | The reference runner passes the specification (library only: no MCP tool and no `screenplay` command runs it) | Target behavior; opaque code never runs here |
167
+ | **Reference-executed** | `screenplay test` or MCP `run-specifications` passes the selected specification | Target behavior; opaque code and external services never run here |
131
168
  | **Target-executed** | Stage or a rendered application runs it with the implementations supplied | Nothing further in Screenplay |
132
169
 
133
170
  Map the states onto the verdicts of `cratis-screenplay-modeling-lifecycle`:
@@ -185,12 +222,13 @@ Screenplay 4.66.0 (before 3.28.2, Screenplay 4.60.1, differ where stated).
185
222
  | --- | --- |
186
223
  | Binds and runs in the reference runner | `StateChange`/`StateView` slices; `produces` including `when` conditions over command properties and literal tags; the portable validation rules, `matches email`, quoted `matches` patterns and `require` over command properties; declarative policies and `authorize` on modules, features, commands and keyed queries; `unique` constraints; projections as Chronicle lowers them, including variants, except the projection constructs in the next row; specifications, including `given caller`, `then denied` and `when append` |
187
224
  | Binds, but the reference execution plan refuses it | A projection-level `remove via join`; `all` beside removals, `children` or `nested`; a `join`, `children` or `remove via join` inside `nested`; any event-context value other than the event source identity in a projection mapping or key, such as `$eventContext.occurred`, `$eventContext.sequenceNumber` or `$eventContext.causedBy.subject` (`$eventSourceId` and `$eventContext.eventSourceId` run) |
188
- | Binds as ESM v6 on Screenplay 4.66.0, standalone and Cratis CLI 3.28.2 (probed); `PLAY0268` on Cratis CLI before 3.28.2 | `Automation` and `Translate` slices, reactions that produce or invoke, captures, top-level `trigger`, clock, trigger and capture specifications. The library reference runner evaluates them (v6 actions); no `screenplay` command or MCP tool runs it, and Stage 4.24.2 renders none of them (the whole automation is gap-fill) |
225
+ | Binds as ESM v6 on Screenplay 4.66.0, standalone and Cratis CLI 3.28.2 (probed); `PLAY0268` on Cratis CLI before 3.28.2 | `Automation` and `Translate` slices, reactions that produce or invoke, captures, top-level `trigger`, clock, trigger and capture specifications. The current standalone `screenplay test`/MCP reference route evaluates admitted v6 actions; the historical Stage 4.24.2 probe rendered none of them (the whole automation is gap-fill) |
189
226
  | Reaction with trigger `reads` | Direct-producing (or code-bodied) reaction with `reads`: `PLAY0268` ("ESM v6 cannot protect that decision dependency", decision 0006), non-executable. Invokes-only reaction with `reads`: information only; the invoked command must declare and protect its own decision reads. Keep the `reads`; never remove them to obtain binding |
190
227
  | Binds as opaque code (v3); reference runner reports unsupported | Bodied reducers, bodied named rules, fenced `validate` blocks, code or file policies. A pure reducer body is the only attachment Stage 4.24.0 admits |
191
228
  | Information only, never blocks (probed) | `persona` (report-only: `PLAY0270`, the policies it lists must exist), `authentication`, `domain`, `seed`, descriptions and `file` provenance. A persona does not block binding and does not change behavior, so state persona scope in a description or a policy the model uses |
192
229
  | Binds as ESM v7 on standalone Screenplay 4.68.0 (source and release notes; `PLAY0268` on the 4.66.0 in Cratis CLI 3.28.x, probed) | `generated` properties and `returns` responses, generated fixtures and `then returns`: bound and executed by the reference runner; a policy, rule or requirement that references a generated value is `PLAY0273`, and a generated property on a concept with validation rules is `PLAY0268`. Stage 4.24.2 does not render them (`STAGE-ESM-016`, tracked in Stage#201): gap-fill |
193
- | Authorable, not executable (`PLAY0268`, probed) | `system` and `operation`, `eventsource` and `stream` (not admitted by any supported ESM version; see `cratis-screenplay-toolchain` `references/sources-and-streams.md`). The MCP reads and edits them (`declaration-details`, `find-fixtures`, `read-workspace` views `event-sources`/`event-streams`/`command-routes`) with `executionAvailable: false`. Keep them in the model as intent; do not strip them to make the model bind, and do not call the model executable |
230
+ | Authorable, not executable (PLAY0268) | Systems/operations, exact numbers and refusal/redelivery remain unadmitted |
231
+ | Current routing and actor admission | Sources/streams and command/specification routes bind and reference-execute as v8; reaction `runs as system role` supplies the invocation actor as v10 on 4.125.0. Whole-workspace binding determines executable availability; CLI/Stage realization remains separate |
194
232
  | Blocks binding (`PLAY0268`) | `@pii`/`@sensitive` concepts (probed: "compliance attributes require portable data-subject semantics"), command `handler` (never binds; a command cannot declare both `produces` and `handler`, `PLAY0035`), bare `rule <Name>`, `require` or conditions over read-model paths, dates and `today` in comparisons, `$context.tenant`/claims/roles/causation in `produces`, `$env` conditions, `file` constraints, unquoted `import` of an external contract, a read model whose keyed queries in its own slice do not share one `by` property (none, or two different properties; several queries over the same property bind), any query other than `=> <ReadModel> optional` with one caller-supplied `by` argument (so also observable, filtered, scoped and performer-backed queries), `$causedBy` and templates in projections |
195
233
  | Blocks binding (`PLAY0271`, legacy meaning) | Command `reads` and `concurrency` |
196
234
  | Deferred (`PLAY0269`, information) | Screens, layouts, templates, forms, contributions, UI profiles, themes, behaviors and `on`/`uses` |
@@ -220,11 +258,10 @@ full historical shapes, not deployed-schema immutability or a working migrator.
220
258
  Code attachment/source-map support likewise does not prove code round-trip
221
259
  execution equivalence.
222
260
 
223
- Decision 0023's operations and named event sources/streams are **authorable** at
224
- v4.68.0 (syntax only, see the table above and `operations.md`, `event-sources.md` in
225
- the Screenplay documentation): write them, but binding reports `PLAY0268` and nothing
226
- executes them, because no supported ESM version admits them (a number is assigned only
227
- at a release-ready admission, decision 0025). Do not drop them for the sake of a green bind.
261
+ Operations remain authorable/unadmitted (PLAY0268). Named event sources/streams
262
+ and routes bind and reference-execute as v8 on 4.125.0; reaction identity as v10.
263
+ Use standalone `screenplay test` or MCP `run-specifications` for a reference
264
+ verdict, and independently check CLI/Stage admission. Never drop a contract to bind.
228
265
  Generated values and `returns` are no longer in this group: they bind from 4.68.0 (ESM v7).
229
266
  Protected reads and `derive`/`provide` (not admitted by any supported ESM version) have no documented
230
267
  syntax at v4.68.0: do not teach or invent one. Affected-instance declarations, per-event data
@@ -35,12 +35,17 @@ Cratis CLI before 3.28.2 bundled 4.60.1, whose tool set and views differ: read `
35
35
  notifications/initialized before using tools".
36
36
  3. Pass a physical path. Symbolic links and reparse points are refused, including
37
37
  `.screenplay` metadata.
38
- 4. `tools/list` returns **29 tools**, or **30 on hosts that advertise the MCP-Apps
39
- UI extension** (the extra tool is `visualize-model`). Read the schemas once per
40
- connection; never hard-code a count or an argument list.
41
- 5. A root given at startup is fixed for the connection: `open-workspace.path` may
42
- name the same directory, anything else returns `RootChangeRefused`. Start a
43
- separately authorized connection to model another application.
38
+ 4. Read `tools/list` schemas once per connection; never hard-code counts or
39
+ argument lists. MCP-Apps hosts also expose `visualize-model`.
40
+ 5. At 4.125.0 a startup root may switch to the same relative model folder in a
41
+ registered Git worktree of its repository. `open-workspace.path` accepts the
42
+ checkout or exact model folder. Shared Git directory and registration
43
+ back-pointer must agree physically; unrelated/malformed/unregistered roots,
44
+ submodules and `--separate-git-dir` checkouts refuse (`RootChangeRefused`).
45
+ Switching clears proposals and cached state, then uses that worktree's own
46
+ identities/journal. A pending journal blocks only its root. If an opened
47
+ worktree is removed, explicitly return to the startup root; if the startup
48
+ root is removed, start a new connection. No simultaneous named workspaces.
44
49
 
45
50
  ### Roots bug and the workaround
46
51
 
@@ -93,7 +98,9 @@ the server sends `roots/list` and serves `tools/list` after the reply).
93
98
 
94
99
  1. `tools/list` once per connection.
95
100
  2. Orient cheaply: `describe-application` summary, `diagnostics`, then scoped
96
- `search-declarations`, `declaration-details`, `dependencies`. Paging with
101
+ `search-declarations`, `declaration-details`, `dependencies`/`dependency-graph`.
102
+ Diagnostics `scope` includes descendants and direct dependents; `checks` opts
103
+ into completeness warnings (skipped on whole-source errors). Paging with
97
104
  `offset > 0` requires `expectedSourceRevision`.
98
105
  3. `open-workspace` and keep `revision` and `catalogRevision`. Opening writes
99
106
  nothing. With `identityPersistence: "root-local-on-apply"` the identities file
@@ -111,8 +118,8 @@ the server sends `roots/list` and serves `tools/list` after the reply).
111
118
  Proposed, and its `sketch` argument previews a what-if of whole documents
112
119
  without writing. An
113
120
  unintended executable regression is discarded (`discard-proposal`) and
114
- re-proposed. Intent the user has accepted that does not run yet (`system`/`operation`, `eventsource`/`stream`, and `generated`/
115
- `returns` on a tool older than 4.68.0; `PLAY0268` by design)
121
+ re-proposed. Intent the user has accepted that does not run yet (operations,
122
+ exact numbers or refusal/redelivery; PLAY0268 by design)
116
123
  may be applied from a reviewed `Authoring` proposal: disclose the new
117
124
  diagnostics, report V3 as not binding-ready, and never drop or stub the
118
125
  construct. The server's own guidance is to apply such a proposal only when
@@ -154,10 +161,11 @@ the server sends `roots/list` and serves `tools/list` after the reply).
154
161
  | --- | --- | --- |
155
162
  | Address-preserving | descriptions; bodies of rules and expressions; mappings between members that already exist; any edit that adds, removes or renames no addressed element. Also every edit in a model with no `.screenplay/identities.json` except persisted names | bounded text edit of the `.play` file, then compile the folder; or `propose-ast` |
156
163
  | Catalog-changing (identity file present) | add, remove or rename a declaration (slice, command, event, read model, projection, ...), a property of a command, event, read model, composite type or trigger, a query, a query argument or a specification; create, delete, rename or move a mapped `.play` document (McpState refuses reopening with `IdentityMappingConflict`; use document operations in `propose-ast`); rename, remove or move an event, command, read model, constraint, module, feature or slice; move declarations between files; contract evolution of a persisted event (new generation, property added, removed or retyped) | `propose-rename` or a reviewed `propose-ast`; never a blind text rename. Renaming a constraint resets its uniqueness index: ask first unless the request names it, then report the reset. A persisted event rename needs `id "OldName"` (added by default) |
157
- | Repair | `PLAY0166`, `0478`, `0469`, `0471`, `0479` (and recipe-only `0397`) | `propose-repair` with `formatting` |
164
+ | Repair | `PLAY0166`, `0478`, `0469`, `0471`, `0479`, `0516` (and recipe-only `0397`) | `propose-repair` with `formatting`; PLAY0166/0478 may pin attachment evidence (`pinRepairEvidence` and `expectedRepairEvidenceRevision`), never fix-all PLAY0478 |
158
165
  | Inline event extraction | `produces event ...` to a declared event | `propose-extract-inline-event` |
159
166
  | Parser-invalid document | no editable handles | `propose-ast` `replace-document` with a whole typed document, or fix the text |
160
- | Syntax-only constructs | `system`/`operation`, `eventsource`/`stream` (and `generated`/`returns` before 4.68.0) | typed `propose-ast` edits; no automatic rename or routing repair exists |
167
+ | Unadmitted constructs | systems/operations, exact numbers, refusal/redelivery | reviewed Authoring `propose-ast`; preserve intent and report PLAY0268 |
168
+ | Admitted source/stream routing | ESM v8 at 4.125.0 | typed `propose-ast`; `propose-rename` repairs proven route references; target admission separate |
161
169
 
162
170
  ## Identity state (`.screenplay/identities.json`)
163
171
 
@@ -175,6 +183,22 @@ the server sends `roots/list` and serves `tools/list` after the reply).
175
183
  "semantics"` returns identity assignments, not a model summary.
176
184
  - See "Make one coherent proposal" in SKILL.md for the exclusive-write prerequisite of `apply`.
177
185
 
186
+ ### Root discovery conflicts
187
+
188
+ At Screenplay 4.125.0 default discovery preserves `.screenplay/identities.json`
189
+ or `pending.json` on the ancestor-or-self path from the offered project to the
190
+ discovered model. Empty metadata folders/backups do not count. With several
191
+ state roots, the nearest the offered project wins. `rootBindingConflict` in
192
+ `open-workspace`/`workspace-state` contains `kind: "WorkspaceRootConflict"`,
193
+ `boundRoot`, ordered `stateRoots` and `pendingRoots`; it is omitted without a
194
+ conflict. A journal anywhere on that path blocks bound-root reads/writes too.
195
+
196
+ To recover a competing journal, explicitly `open-workspace` on its root (which
197
+ may return `PendingOperation`), inspect `workspace-state` there, then recover
198
+ that operation within the approved scope. Recovery at the outer root cannot
199
+ recover a nested journal. Never delete metadata, migrate identities implicitly
200
+ or create a fallback folder to bypass the conflict.
201
+
178
202
  ## Read-only views worth knowing
179
203
 
180
204
  - **`source-map`** (`read-workspace`): the compiler's semantic entries ordered by
@@ -8,6 +8,10 @@
8
8
  - Tool groups
9
9
  - Diagnostic repairs and refactorings
10
10
  - Syntax-only constructs through the MCP
11
+ - Evidence-pinned production repairs
12
+ - Scoped diagnostics and completeness
13
+ - Dependencies and intent inventories
14
+ - Semantic revision comparison
11
15
  - Source map and appended-event fixtures
12
16
  - Revision and ownership rules
13
17
  - Refusals are useful information
@@ -27,16 +31,17 @@ report unsupported adapters or drift.
27
31
 
28
32
  ## Tool groups
29
33
 
30
- `tools/list` returns 29 tools (30 on MCP-Apps hosts, which add `visualize-model`),
31
- after `initialize` and `notifications/initialized`. Discover current argument
32
- schemas with `tools/list`; do not infer arguments from these short descriptions.
34
+ After `initialize` and `notifications/initialized`, discover current tools and
35
+ argument schemas with `tools/list`; do not hard-code counts or infer arguments
36
+ from these short descriptions. The additions below follow Screenplay v4.125.0's
37
+ `Documentation/screenplay/mcp/reference.md`.
33
38
  The connection procedure, edit routes, identity state and failure handling are in
34
39
  the [MCP loop](mcp-loop.md).
35
40
 
36
41
  | Group | Tools | Intent |
37
42
  | --- | --- | --- |
38
43
  | Understanding | `describe-application`, `search-declarations`, `find-declaration`, `declaration-details` | Navigate logical hierarchy and inspect bounded details |
39
- | References and examples | `find-references`, `dependencies`, `find-fixtures`, `find-assertion-gaps` | Inspect declared relationships and authored examples, not executed coverage |
44
+ | References and examples | `find-references`, `dependencies`, `dependency-graph`, `find-fixtures`, `find-assertion-gaps`, `semantic-diff` | Inspect declared relationships and authored examples, not executed coverage |
40
45
  | Source and validation | `diagnostics`, `read-document`, `merged-document`, `syntax-schema` | Read exact source or typed structure and diagnose problems |
41
46
  | Workspace inspection | `open-workspace`, `read-workspace`, `read-ast`, `workspace-state`, `export-workspace`, `repair-capabilities` | Obtain current identities, handles, readiness, code attachment requirements, source-map locations, durable-state status and the repair catalog |
42
47
  | Visual (MCP-Apps hosts only) | `visualize-model` | Draw the board for the model or a `proposalId`; its `sketch` argument previews a what-if of whole documents. Reads only |
@@ -58,10 +63,11 @@ with `view: "diagnostics"`, then `view: "repairs"` at the current revision.
58
63
  | Code | Offered repair and boundary |
59
64
  | --- | --- |
60
65
  | `PLAY0166` | Declare a missing command-produced event in its slice. Infer known command-path types (retaining concepts) or `$context.occurred` as `DateTime`; refuse uncertain/conflicting shapes, imports, existing declarations, cross-file producers and parser-invalid workspaces. |
61
- | `PLAY0478` | Add `for <identifier>` to a plain production. Both models must be executable; refuse a version change or retargeting another production. Accept only if the identifier, not allocation, is intended. |
66
+ | `PLAY0478` | Add `for <identifier>` to a plain production. Both models must be executable; refuse a version change or retargeting another production. This changes routing: accept only if the identifier, not allocation, is intended; `canFixAll: false`. |
62
67
  | `PLAY0471` | Remove a redundant event id only with unchanged executable model, catalog and comments. |
63
68
  | `PLAY0469` | Remove an inline same-source identifier property and mapping, retiring its semantic address. This changes the contract; `canFixAll` is false. Refuse other consumers, opaque impact, changed routing or comment loss. Plain contracts get guidance only. |
64
69
  | `PLAY0479` | Migrate one optional type spelling, or all in a document, preserving syntax and trivia. Exclude `query Q => observable?`. |
70
+ | `PLAY0516` | Move a producing sibling declaration/import before its consumer, or pin an already placed file before a retained glob. Preserve catalogs, comments, placement and executable readiness; introduce no timeline findings. Own-sub-feature edges, cycles, unranked members and mixed/different-parent boundaries have no repair. Rediscover after each move; pinned evidence is unsupported. |
65
71
 
66
72
  These discoveries verify acceptance before listing a repair. Only compact
67
73
  acceptance/conflict verdicts are cached on the immutable snapshot, not diagnostics,
@@ -98,22 +104,37 @@ pin, but retains a pin for a different earlier name. Contradictory generation pi
98
104
  refuse the rename. Do not promise a generation-2 payload-removal repair or a
99
105
  `PLAY0470` repair: neither is available.
100
106
 
101
- VS Code and Monaco provide local optionality quick fixes without .NET; they do
102
- not host these production-repair transactions. Use MCP for production repairs.
107
+ VS Code and Monaco provide local PLAY0479 optionality and PLAY0471 redundant-id
108
+ fixes without .NET. PLAY0471 removes the whole id line; a trailing comment blocks
109
+ it. VS Code also has an experimental opt-in trusted C# bridge for PLAY0166/PLAY0478:
110
+ configure the executable/root in User settings, preview source and identity changes,
111
+ then explicitly confirm Apply. Dirty/untitled buffers and evidence drift refuse;
112
+ uncertain Apply outcomes are never retried. Restricted Mode cannot launch it.
113
+ Monaco has no production-repair host bridge. See v4.125.0 `vscode.md`.
103
114
 
104
115
  ## Syntax-only constructs through the MCP
105
116
 
106
- `system`/`operation` and `eventsource`/`stream` are authorable but not executable (`PLAY0268`; not admitted
107
- by any supported ESM version: `cratis-screenplay-toolchain` `references/sources-and-streams.md`).
117
+ The 4.66.0/4.68.0 negative probes below are historical. At 4.125.0,
118
+ sources/streams and command/specification routes bind as ESM v8 and have
119
+ catalog identities; `executionAvailable` still requires whole-workspace binding.
120
+ Source/stream `propose-rename` repairs bound route references. Operations and
121
+ exact numeric mode remain unadmitted. Check installed schemas, especially when
122
+ the CLI bundle predates the standalone tool.
123
+
124
+ Systems/operations remain authoring-only (PLAY0268). Sources/streams and their
125
+ routes are admitted v8, not syntax-only; see toolchain `references/sources-and-streams.md`.
108
126
  `generated` properties and `returns` responses are admitted as ESM v7 by Screenplay 4.68.0 and bind
109
127
  there (`PLAY0268` on the 4.66.0 in the cratis 3.28.x bundle). The server reads and edits them: `declaration-details` exposes `isGenerated`
110
128
  and a command `response` view, `route` and `streams` views; `read-workspace` offers
111
129
  the views `event-sources`, `event-streams`, `event-source-details`,
112
130
  `event-stream-details`, `command-routes` and `event-source-diagnostics` (detail
113
- views need the exact `authoringKey` from the inventory). Each discloses
114
- `executionAvailable: false`. Discover the node kinds with `syntax-schema` and edit
115
- through typed `propose-ast`; there is no automatic source or stream rename and no
116
- routing repair. Inline-event extraction refuses response-bearing commands.
131
+ views need the exact `authoringKey` from the inventory). Executable availability
132
+ requires successful whole-workspace binding, not just an inventoried source node.
133
+ Discover `syntax-schema` and edit through typed `propose-ast`; source/stream rename
134
+ can repair proven route references on the current compiler. At 4.125.0, inline-event extraction
135
+ admits response-bearing commands when it proves byte-identical canonical ESM,
136
+ unchanged catalog assignments and exact comment preservation; responses are not
137
+ an automatic refusal.
117
138
 
118
139
  For `generated`/`returns` on 4.68.0 (`mcp/reference.md` at `v4.68.0`): `propose-ast` accepts
119
140
  `validation: "Executable"` for the admitted subset (use `"Authoring"` for full-language syntax); a
@@ -123,6 +144,85 @@ unadmitted feature. Null readiness does not prove the whole application binds or
123
144
  fixture exists. Canonical `executable-model` pages include `generated`, `response`, `generatedValues`
124
145
  and `thenReturns` when present. Form response scopes and a renderer response type remain downstream work.
125
146
 
147
+ ## Evidence-pinned production repairs
148
+
149
+ For PLAY0166/PLAY0478, read `repair-capabilities` before opting in. Read workspace
150
+ `diagnostics` and `repairs`, retain their `repairEvidenceRevision`, and send
151
+ `pinRepairEvidence: true` with `expectedRepairEvidenceRevision` on `propose-repair`,
152
+ alongside workspace/catalog revisions, subject and formatting. Both evidence fields
153
+ are required together. The proposal retains `repairEvidence.beforeRevision` and
154
+ `candidateRevision`; preview every document and identity-state change. Echo the
155
+ before revision on `read-proposal`/`apply` if supplied; the retained pin is enforced
156
+ even when omitted there.
157
+
158
+ Evidence covers authoritative base/candidate attachment text and load/refusal
159
+ states, including missing files, not unreferenced files or implementation locks.
160
+ Changed inputs or loading diagnostics return `RepairEvidenceDrift`, not refreshed
161
+ readiness. Attachment inputs overlapping source/state/recovery writes return
162
+ `RepairEvidenceWriteConflict`; uncertain aliases fail closed. Never bypass these
163
+ refusals with text edits. A pin is a reviewed snapshot, not a crash-atomic write.
164
+
165
+ ## Scoped diagnostics and completeness
166
+
167
+ `diagnostics` accepts an exact case-sensitive module/feature/slice `scope` and
168
+ optional `checks` (comma-separated names/codes or `all`). Unknown/ambiguous scopes
169
+ or check names refuse. Whole-application compilation still resolves references;
170
+ selection includes descendants and direct dependents, not transitive impact.
171
+ `success`/severity counts describe the selected set before document filtering and
172
+ paging; `wholeApplicationSuccess` retains the full verdict. Check `affectedScopes`
173
+ and coverage rather than claiming full application validity from a scoped page.
174
+
175
+ The six core structural families are `data-bindings`, `input-surfaces`,
176
+ `field-origins`, `query-keys`, `event-consumers`, `navigation` (PLAY0530–PLAY0537).
177
+ The current nine-family catalog also includes `personas`, `purposes` and
178
+ `privilege` (PLAY0652); discover names/codes from released `CompletenessChecks.cs`.
179
+ They opt into findings, not execution proof. Whole-source errors skip them; report
180
+ `completenessStatus` as skipped, never passed. `completenessCoverage` states their
181
+ limits. Continue with `expectedSourceRevision`.
182
+
183
+ ## Dependencies and intent inventories
184
+
185
+ `dependency-graph` edges point consumer → producer. Views: `edges`, `cycles`,
186
+ `order`, `unresolved`, `declarations`; `from`/`to` select slice/feature/module
187
+ aggregation (`to` also accepts context). `scope`, `direction`, `kinds` and
188
+ `includeTestOnly` filter inferred views. Test-only `verifiedWith` edges are excluded
189
+ by default. Other kinds: `usesFactsFrom`, `reactsTo`, `decidesFrom`, `asks`, `shows`,
190
+ `outsideTheModel`. Code, expressions and property paths are not inferred.
191
+
192
+ `declarations` checks each opted-in container's own `depends on` inventory,
193
+ including descendant consumers. Rows retain declared/provisional/undeclared
194
+ coverage and declaration status used/provisional/unused/invalid. Ambiguous owners
195
+ are always provisional, never undeclared proof. Kind/direction/level filters do
196
+ not narrow this check. `evidenceLimit` (0–20, default 3) limits evidence, not counts
197
+ or checking. Pages default to 50, maximum 200; pin `expectedSourceRevision` on
198
+ continuation. Failed compilation may leave a partial graph.
199
+
200
+ Cycles and suggested order use only `usesFactsFrom`, `reactsTo`, `decidesFrom`.
201
+ Mixed-level cycles return no groups. Order puts producers first after removing
202
+ internal cycle edges, with authored ties and cycle-member order retained. It is
203
+ advisory, never an edit or runtime order. MCP App and VS Code boards can toggle to
204
+ a dependency map, with story-shaping edges by default and filters for other kinds;
205
+ select an edge to inspect slice pairs and reference evidence (VS Code opens source).
206
+
207
+ Workspace views `named-rule-intents`/`named-rule-intent-details` cover CommandNamedRule
208
+ only, including pending hints without a requirement ID. Details select either
209
+ `subject` or attached `requirementId`, not both. `handler-intents` and
210
+ `handler-intent-details` cover CommandHandler only; handler details select
211
+ `requirementId`. All page ordered hints, not implementation correctness. Continue
212
+ with `expectedRevision` and `expectedCatalogRevision`; provisional owner IDs are
213
+ not authoritative. Edit hints through reviewed `propose-ast`.
214
+
215
+ ## Semantic revision comparison
216
+
217
+ `semantic-diff` takes `beforeWorkspaceJson` and `afterWorkspaceJson`: decoded,
218
+ reassembled canonical `export-workspace` JSON, not Git refs or raw source. Exports
219
+ must share the application identity and authoritative catalogs; the tool never
220
+ guesses rename continuity. Invalid exports return `UnreadableRevision`, different
221
+ applications `IncompatibleRevisions`. It does not open/replace the active workspace
222
+ or write state. Inspect incomplete sections and exclusions: structure comparison
223
+ is not executed behavior. Echo the ordered-pair `sourceRevision` on continuation.
224
+ Use `read-proposal` `view: "semantic-diff"` for an uninstalled proposal instead.
225
+
126
226
  ## Source map and appended-event fixtures
127
227
 
128
228
  `read-workspace` `view: "source-map"` pages the compiler's semantic entries (ordered
@@ -132,6 +232,11 @@ span. Compilation must have succeeded for entries to exist (`available`).
132
232
  `whenAppendedEventDestination` and `thenEvent` (and others for commands and
133
233
  queries): a `when append` payload is labeled `whenAppendedEvent`, not `thenEvent`,
134
234
  in `declaration-details`, `find-fixtures`, references and dependencies.
235
+ Event roles also have `…Stream`, `…StreamId` and `…NoStream` rows (`property`
236
+ respectively `stream`, `streamId`, `no stream`). Effective fixture values expose
237
+ `origin` (authored/example/override), example name and replaced value where present.
238
+ A whole-route replacement records `overriddenValue` once on its stream/no-stream
239
+ row; route parts retain their individual lineage. These are source facts, not execution.
135
240
 
136
241
  ## Revision and ownership rules
137
242
 
@@ -5,7 +5,7 @@
5
5
  "assertions": [
6
6
  {
7
7
  "kind": "skill-contains",
8
- "value": "main `fd18129`"
8
+ "value": "Screenplay v4.125.0"
9
9
  },
10
10
  {
11
11
  "kind": "skill-contains",
@@ -105,11 +105,11 @@
105
105
  },
106
106
  {
107
107
  "kind": "skill-contains",
108
- "value": "**Prefer a fixed root.**"
108
+ "value": "registered Git worktree"
109
109
  },
110
110
  {
111
111
  "kind": "skill-contains",
112
- "value": "29 tools (30 on MCP-Apps hosts)"
112
+ "value": "schemas rather than relying on a remembered count"
113
113
  },
114
114
  {
115
115
  "kind": "skill-contains",
@@ -62,7 +62,11 @@ model's behalf.
62
62
  `read-workspace view=executable-diagnostics` when the mode needs them; `describe-application
63
63
  view=summary`, `find-assertion-gaps` (slices with no assertion; authored, not executed) and
64
64
  `dependencies direction=incoming` for orphans. The verdict lines are independent: a V1 pass is
65
- necessary, never sufficient. Any line without evidence is "not run: reason".
65
+ necessary, never sufficient. Opt into completeness with `--check` or MCP
66
+ `checks` for bindings, input surfaces, field origins, query keys, event consumers
67
+ and navigation; whole-source errors skip these checks. Record selected families,
68
+ skipped status and coverage limits, never a vacuous pass. Any line without
69
+ evidence is "not run: reason".
66
70
  3. **Element sweep** (phase 1, mechanical, before any judgement). One line per gated element, event,
67
71
  name, command, event property and slice; `references/checklist.md` S1-S7 gives each line's
68
72
  format. Each `NONE` and each form name is its own finding naming that element. A repeated
@@ -164,11 +168,12 @@ labelled as such. The user decides whether it is enough (the user is sufficient
164
168
  never blocked as a matter of authority.
165
169
 
166
170
  ## Rules
167
- - Compiler contracts (defects when the mode needs them): V1 must pass with warnings as errors;
168
- PLAY0029 means a construct was silently dropped. Missing projection targets and undeclared
169
- events in `remove with` or capture `append` pass V1 and are reported at V3 (PLAY0273); check
170
- by hand only unresolved-name warnings and declared properties that nothing maps. Binding
171
- codes appear only in V3.
171
+ - Compiler contracts (defects when the mode needs them): V1 must pass with warnings
172
+ as errors; PLAY0029 means a construct was silently dropped. Current source checks
173
+ warn on missing projection targets (PLAY0514) and removal/capture events
174
+ (PLAY0166). Opt-in field-origin warnings (PLAY0534) do not replace a manual
175
+ lineage walk when coverage is unknown. PLAY0516/0517 are presentation-only
176
+ information, not broken execution or a reason to fail warnings-as-errors.
172
177
  - Modeling defaults (deviation needs a recorded reason, otherwise a finding): one business
173
178
  decision, one event by default; one view per screen component; one command per `StateChange`
174
179
  (renderable: required); facts carry decided or supplied data and running figures belong in
@@ -62,7 +62,7 @@ the problem, the checks it violates, the fix, all pinned to one declaration.
62
62
  | Missing `for` | an event production (`produces <Event>` or `produces event`) without `for`. Not operation productions: they are authorable design intent, belong to commands, and take no event `for`, tags or routing | runtimes disagree on the destination | C (executable) / D | `for <identifier>` |
63
63
  | Unbuilt read-model field | field no projection maps and AutoMap cannot fill | always empty; not reported by the compiler | D | map it or remove it |
64
64
  | Undeclared removal/append event | `remove with` or capture `append` names an undeclared event | passes V1, fails binding (V2/V3, PLAY0273) | C (executable) / D | declare or fix the name; run V3 |
65
- | Gated command invoked by a reaction | reaction `invokes` a command under a caller policy | invocations carry no caller: rejected at run time | D (major) | record a trusted-path decision (ungated internal command or service actor) - never just delete the gate |
65
+ | Gated command invoked by a reaction without a declared actor | reaction `invokes` a command under a caller policy and has no `runs as system role "<Role>"` that satisfies the gate | the invocation carries no caller: rejected at run time | D (major) | declare `runs as system role "<Role>"` with the least-privilege role the gate admits (ESM v10, Screenplay 4.125.0; CLI 3.41.0 cannot render it yet, so gap-fill) or record another trusted-path decision - never just delete the gate. A matching `runs as system role` is the admitted trusted path, not a defect |
66
66
  | `reads` + `produces` reaction | reaction both reads a view and produces | fails binding | C (executable) | invoke a command, or produce without reads |
67
67
  | `reads` treated as protection | rule "checked" because the command or reaction `reads` a view | `reads` enforces nothing | D (major) | keep or introduce `reads <View>` + `require ... message` as stated intent, mark it NOT enforced in the slice `description`, name the target (`[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB, or a constraint where it fits); checklist E3 |
68
68
  | Caller-supplied state rule | `require currentStatus == "open"` where the caller sends `currentStatus` | the caller decides its own permission | D (major) | read the stored state with `reads`; keep or introduce `reads <View>` + `require ... message` as stated intent, mark it NOT enforced in the slice `description`, name the target (`[ProtectedDecision]` + `DecisionRead<T>`, Chronicle DCB, or a constraint where it fits); checklist E3 |