@cratis/pi 7.20.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 (73) hide show
  1. package/package/corpus/rules/concepts.md +10 -2
  2. package/package/corpus/rules/vertical-slices.md +4 -2
  3. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +58 -5
  4. package/package/corpus/skills/cratis-fundamentals-concept/verification.json +4 -1
  5. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +19 -12
  6. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/audit-format.md +4 -3
  7. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +13 -15
  8. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +4 -4
  9. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/effects-and-idempotency.md +21 -0
  10. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/provenance.md +4 -2
  11. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +7 -4
  12. package/package/corpus/skills/cratis-screenplay-automations-and-translations/verification.json +4 -4
  13. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +38 -36
  14. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +1 -1
  15. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +84 -0
  16. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/refusals-and-redelivery.md +102 -0
  17. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/specifying-triggers-and-clock.md +4 -2
  18. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/verification.json +1 -1
  19. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +28 -16
  20. package/package/corpus/skills/cratis-screenplay-command-surface/references/context.md +9 -0
  21. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +15 -13
  22. package/package/corpus/skills/cratis-screenplay-command-surface/references/operations.md +80 -0
  23. package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md +23 -1
  24. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +2 -2
  25. package/package/corpus/skills/cratis-screenplay-discovery/SKILL.md +9 -6
  26. package/package/corpus/skills/cratis-screenplay-discovery/references/storming-loop.md +6 -5
  27. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +7 -5
  28. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +6 -5
  29. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +39 -49
  30. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +5 -3
  31. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +48 -8
  32. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +44 -42
  33. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +46 -9
  34. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +35 -11
  35. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +118 -13
  36. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -3
  37. package/package/corpus/skills/cratis-screenplay-model-review/SKILL.md +11 -6
  38. package/package/corpus/skills/cratis-screenplay-model-review/references/anti-patterns.md +1 -1
  39. package/package/corpus/skills/cratis-screenplay-model-review/references/checklist.md +11 -2
  40. package/package/corpus/skills/cratis-screenplay-read-surface/SKILL.md +10 -0
  41. package/package/corpus/skills/cratis-screenplay-read-surface/references/guarded-actions.md +79 -0
  42. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +9 -7
  43. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -3
  44. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/verification.json +2 -2
  45. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -2
  46. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +13 -2
  47. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +3 -2
  48. package/package/corpus/skills/cratis-screenplay-slice-design/references/command-inventory.md +3 -2
  49. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +40 -0
  50. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +24 -16
  51. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +103 -0
  52. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +5 -6
  53. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -4
  54. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/stream-patterns.md +4 -2
  55. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/verification.json +2 -2
  56. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +34 -32
  57. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +1 -1
  58. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +47 -2
  59. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +57 -9
  60. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +6 -1
  61. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +19 -10
  62. package/package/corpus/skills/cratis-screenplay-toolchain/references/provenance.md +4 -2
  63. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -1
  64. package/package/corpus/skills/cratis-screenplay-toolchain/references/sources-and-streams.md +90 -27
  65. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +10 -6
  66. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +29 -12
  67. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +91 -136
  68. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +7 -5
  69. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +20 -0
  70. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +9 -5
  71. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +8 -1
  72. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +2 -2
  73. package/package.json +1 -1
@@ -1,63 +1,53 @@
1
1
  # Parsed is not runnable: ESM versions and dispositions
2
2
 
3
- Facts read at Screenplay `v4.68.0` (`79801bf`; the persona, operation and stream rows were first read at `v4.66.0`): `Source/DotNET/Screenplay/Semantics/Versions.cs`,
4
- `SemanticModelBinder.cs` (`ReportTopLevelDispositions`), `SemanticModelBinder.CommandProductions.cs`,
5
- `Documentation/screenplay/{commands,operations,event-sources}.md` and decisions 0025 and 0026. Tool versions and which tool
6
- reports what: `cratis-screenplay-toolchain` `references/versions.md`.
3
+ Current evidence: Screenplay v4.125.0 `SemanticModelBinder.cs`, `Versions.cs`,
4
+ `Documentation/screenplay/{commands,operations,event-sources,reactions,tool}.md`.
5
+ The binder selects v8 for event routes and v10 for declared reaction identity.
6
+ Pins and consumer boundaries: toolchain `references/versions.md`.
7
7
 
8
8
  ## Which ESM version a model needs
9
9
 
10
- - **v1** by default.
11
- - **v2** for typed event-source facts: `produces ... for <identifier>` when the event does not
12
- repeat the identifier, `for` values in specifications, and `$context.occurred` or caller
13
- identity in `produces`.
14
- - **v3** for code the model hands off: bodied reducers, code validation, code policies. Code
15
- binds as an opaque requirement; the reference runner reports any specification that needs it
16
- as unsupported. A command `handler` (including `implementation` and `hint`) never binds
17
- (`PLAY0268`).
18
- - **v4** for event-contract lineage (multiple event generations) and **v5** for keyed read-model
19
- absence assertions (`then no readmodel`).
20
- - **v6** for reactions, captures, application triggers and the clock (and so `Automation` and
21
- `Translate` slices).
22
- - **v7** for generated command properties, `returns` responses, generated fixtures and `then returns`
23
- expectations, and only when one is used (standalone 4.68.0 or later; decision 0026).
24
- - Operations, event sources and streams, decision reads and exact numbers are **not admitted by any
25
- supported ESM version**; they have no number until a release-ready admission (decision 0025).
10
+ - v1 by default; v2 for typed event-source facts and admitted occurrence/audit mappings.
11
+ - v3 for opaque code requirements. Reference execution cannot execute their bodies.
12
+ - v4 for event-contract lineage; v5 for keyed read-model absence assertions.
13
+ - v6 for admitted reactions, captures, application triggers and clock.
14
+ - v7 for generated command values, responses, fixtures/return assertions and policy negation.
15
+ - v8 for sources/streams and command/specification routes.
16
+ - v9 for public-event contracts; v10 for reaction `runs as system` identity.
17
+ - Operations/systems, exact numeric mode and refusal/redelivery remain unadmitted
18
+ (PLAY0268). Version allocation is not inferred from an older planning decision.
26
19
 
27
20
  ## Dispositions to keep apart
28
21
 
29
- | Construct | Authoring | Binding at 4.68.0 |
30
- | --- | --- | --- |
31
- | `persona` | accepted | information `PLAY0270` ("authoring metadata and is not part of ESM v1 behavior"). Never blocks; an unknown policy on a persona is an error |
32
- | `domain`, `authentication` | accepted | report-only information (`PLAY0270`) |
33
- | `@pii`, `@sensitive` on a concept | accepted | `PLAY0268`, blocks binding and rendering |
34
- | `reads`, `concurrency` on a command | accepted | `PLAY0271` |
35
- | `reads` under a reaction trigger that only `invokes` | accepted | information `PLAY0270`: report-only intent, the model does not consult the view |
36
- | `reads` under a reaction trigger that `produces` directly | accepted | `PLAY0268` |
37
- | Generated properties, `returns` responses | authorable | binds and runs as ESM v7 on standalone 4.68.0; `PLAY0268` on the 4.66.0 in `cratis` 3.28.x; not rendered (Stage 4.24.2: `STAGE-ESM-016`, tracked in Stage#201) |
38
- | A policy, rule or requirement that references a generated value | accepted | `PLAY0273`; a generated property on a concept with validation rules: `PLAY0268` |
39
- | `system`, `operation` | authorable, syntax-only | `PLAY0268`; not admitted by any supported ESM version |
40
- | `eventsource`, `stream` | authorable, authoring-only | `PLAY0268`; not admitted by any supported ESM version (`cratis-screenplay-toolchain` `references/sources-and-streams.md`) |
41
- | UI constructs | accepted | information `PLAY0269` |
42
-
43
- A model that carries one of the blocked constructs is still a valid design model. Never remove
44
- the construct to make a tool pass; record the gap against its address
45
- (`cratis-screenplay-modeling-lifecycle`).
22
+ | Construct | Current standalone disposition |
23
+ | --- | --- |
24
+ | `persona`, domain/authentication metadata | Report-only; unknown named policies remain source defects |
25
+ | Compliance concepts | Preserve protection; portable binding gaps are not permission to remove it |
26
+ | Command reads/concurrency | Legacy unprotected decisions, PLAY0271 |
27
+ | Invokes-only trigger reads | Report-only, not protected state; direct production with reads refuses |
28
+ | Generated values/responses | v7 binding/reference execution; Stage 4.51.3 member refusals STAGE-ESM-028/029 |
29
+ | Sources/streams and command/specification routes | v8 binding/reference execution; CLI 3.41.0 render boundary is v7 |
30
+ | Declared reaction invocation actor | v10 binding/reference execution; older CLI parser PLAY0137; Stage planner refuses v10 |
31
+ | Operations/systems, exact numbers, refusal/redelivery | Source accepted; whole binding refuses PLAY0268 |
32
+ | UI | Authoring/deferred metadata; runtime support is a separate consumer contract |
33
+
34
+ Run standalone `screenplay test` or MCP `run-specifications` for V4. Compile
35
+ success alone is not execution; unbound/unsupported is not passed. Preserve
36
+ source that a narrower renderer cannot realize and report the addressed gap.
37
+ Routing and actor checked examples: toolchain `references/sources-and-streams.md`
38
+ and captures-and-reactions `references/invocation-identity.md`.
46
39
 
47
40
  ## The Step 7 clock example
48
41
 
49
- The complete example in [nine-steps.md](nine-steps.md) (Step 7) compiled with
50
- `screenplay <folder> --warnaserror` 4.66.0 (0 errors, 0 warnings) and opened through
51
- `screenplay mcp <folder>` with `executableReady: true` and five `PLAY0270` information
52
- diagnostics. It binds as a scheduled invocation; its `reads` is intent only, so the overdue
53
- decision is not executed by the model. The `cratis` 3.28.2 bundle (Screenplay 4.66.0) binds it the same way (probed); the 3.27.1 bundle
54
- (Screenplay 4.60.1, ESM v1 to v5) compiled it but rejected the Automation slice at binding. Report reaction
55
- specifications as authored, not as run, unless a V4 run says otherwise.
42
+ The complete example in [nine-steps.md](nine-steps.md) (Step 7) had historical
43
+ 4.66.0 compile/binding evidence (zero errors/warnings, executableReady true).
44
+ Its invokes-only reads still record intent rather than execute the overdue
45
+ selection. Run its admitted specifications with the current reference route
46
+ before claiming a V4 pass; no overdue-selection proof follows from binding.
56
47
 
57
48
  ## Decision 0006 and shipped generations
58
49
 
59
- Decision 0006 shipped in Screenplay 4.31.0: a reaction trigger can declare the
60
- views it decides from with `reads` (see `cratis-screenplay-captures-and-reactions`),
61
- but nothing enforces them yet. Event generations and typed repairs now ship;
62
- generations do not supply deployed migrations. Do not treat every accepted
63
- decision as implemented: check the construct's own page and the versions table.
50
+ Trigger reads do not enforce decision consistency. Event generations and typed repairs now ship,
51
+ but historical schemas do not supply deployed migrations.
52
+ Check actual binder, runner and consumer admission instead of equating an
53
+ accepted decision or parsed node with a running application.
@@ -44,7 +44,7 @@ v19.32.0): `cratis-screenplay-toolchain` `references/versions.md`. Checked at th
44
44
  | `prologue start` is an interactive wizard that writes `cratis-prologue.json`; `interpret` resolves its language model from the Prologue file, then the global CLI configuration (cli#241 open) | cli `v3.28.2:Source/Cli/Commands/Prologue/{StartPrologueCommand,LlmOptionsResolver}.cs`, `Documentation/reference/prologue.md` |
45
45
  | Extractor effects (CDC enable, publication and replication slot), POST/PUT/DELETE only, 2 s correlation window, interpret payload (uncapped model outline and names, observed lists capped at 50, schema tables capped per schema observation), existing slot/publication reused; cleanup missing (Prologue#37) | Prologue `ad4bbe7:Source/Extractor/Sources/**`, `Source/Configuration/*`, `Source/Interpretation/EvidenceFormatter.cs` |
46
46
  | `then error`, `then denied`, `unique ... released by` | Screenplay `v4.66.0:Documentation/screenplay/{specifications,constraints}.md` |
47
- | No semantic diff or equivalence check exists (Screenplay#387 open) | `gh issue view 387 --repo Cratis/Screenplay` |
47
+ | MCP semantic-diff compares canonical workspace exports; structural comparison is not execution equivalence | Screenplay `v4.125.0:Documentation/screenplay/mcp/reference.md` |
48
48
 
49
49
  Every complete `screenplay` fence here compiles with the standalone compiler 4.68.0 (`--warnaserror`) and
50
50
  `cratis screenplay validate --warnings-as-errors` 3.28.2.
@@ -191,8 +191,10 @@ handoff packet appended, first line `Outcome:`; no prose reports in the model ro
191
191
  ask again only when target or consequence expands): capture setup and Extractor runs, traffic
192
192
  re-routing, load or scenario runs that write data, cleanup DDL, hosted language-model use.
193
193
  Production needs DBA sign-off (`rules/capability-is-not-authority.md`).
194
- - No claims of equivalence: Screenplay has no semantic diff or equivalence check yet
195
- (Screenplay#387).
194
+ - No claims of execution equivalence from structure. MCP `semantic-diff` compares
195
+ same-application canonical exports with authoritative catalogs; it does not guess
196
+ rename continuity, run specifications or prove recovered behavior. Inspect
197
+ incomplete sections and exclusions before using the result in the loss report.
196
198
  - Never weaken protection (authorization, `@pii`, rules) to make the candidate compile.
197
199
 
198
200
  ## Gate
@@ -1,5 +1,14 @@
1
1
  # `cratis screenplay generate` notes
2
2
 
3
+ ## Contents
4
+
5
+ - Command
6
+ - Preconditions
7
+ - Coverage (what a provider reads)
8
+ - Diagnostics are the loss list
9
+ - Arc recovery and authoring-only options
10
+ - Reading the output cheaply
11
+
3
12
  Flags verified with `cratis screenplay generate --help` on the version recorded in
4
13
  cratis-screenplay-toolchain `references/versions.md`; behaviour from the cratis CLI
5
14
  (`v3.28.2:Source/Cli/Commands/Screenplay/`; the generate files are unchanged since `v3.27.1`), Arc `v22.50.5`
@@ -8,6 +17,12 @@ cratis-screenplay-toolchain `references/versions.md`; behaviour from the cratis
8
17
  Screenplay.CritterStack `v0.24.0`. Version-specific capability facts belong in cratis-screenplay-toolchain
9
18
  `references/versions.md`.
10
19
 
20
+ Current CLI is 3.41.0, with Arc.Screenplay 22.54.0 (`references/versions.md` in
21
+ the toolchain). Current option/admission evidence: CLI released
22
+ `GenerateScreenplaySettings.cs`, `ArcScreenplayGeneration.cs`, v7 planning specs
23
+ and `Documentation/reference/screenplay.md`; older diagnostic probes below keep
24
+ their original labels. Arc#3054 and CLI#270 describe the recovered-source expansion.
25
+
11
26
  ## Command
12
27
  ```
13
28
  cratis screenplay generate <solution|project|folder> \
@@ -56,14 +71,39 @@ cratis screenplay generate <solution|project|folder> \
56
71
  persistence, stream ownership or authorization.
57
72
  - "Success" only means no error diagnostic was produced. Read warnings and information too.
58
73
 
59
- ## Known lag
60
- The generators are built against older Screenplay packages than the CLI's compiler. Expect
61
- no event generations, no `when append` specifications, and no absence assertions in
62
- generated output, even when the code has them. Reactors are emitted as file-backed
63
- reactions with one named event trigger per observed event (a reactor observing no events
64
- is dropped with a warning), but their bodies and declarative effects are not recovered.
65
- Application triggers (clock, application-defined) are not generated. Record these as
66
- losses, then read the code for them.
74
+ ## Arc recovery and authoring-only options
75
+
76
+ `--authoring-only-constructs` maps to `ScreenplayOptions.AuthoringOnlyConstructs`
77
+ in the Arc adapter (false by default). It includes operations/systems, source and
78
+ stream declarations/routes, and reads/requirements recovered from Provide/Handle.
79
+ Other providers warn CLI0014 and do not apply it. Added syntax does not realize
80
+ code or waive admission: operations refuse PLAY0268 and legacy reads PLAY0271.
81
+ Source/stream routes themselves bind as v8 on the current standalone compiler;
82
+ older blanket authoring-only route caveats are not its current disposition.
83
+
84
+ The expanded Arc recovery surface includes:
85
+ - Proven command identifiers and event `for` destinations.
86
+ - Inline events where one unconditional complete production uniquely owns them.
87
+ - Event description/documentation and generation-1 stored-name rename pins.
88
+ - Unconditional named Must(Method) rules with implementation-file provenance,
89
+ where no specification exercises the command.
90
+ - Event scenarios as `when append`, and event-source-faithful `for` fixtures.
91
+ Scenarios whose sources cannot be stated faithfully are omitted with SP0039;
92
+ record the omission as a loss, never fabricate identities to retain a scenario.
93
+ - Supported generated UUID command values and scalar/record responses by default,
94
+ without the authoring-only flag, for commands without successful scenarios.
95
+ Commands with successful scenarios retain the legacy representation until
96
+ deterministic generation fixtures and response expectations can be recovered.
97
+ Unsupported shapes/pre-generation protection remain code with SP0052.
98
+
99
+ Generated values/responses select ESM v7. CLI 3.41.0 admits v7 to planning, but
100
+ Stage refuses those members with STAGE-ESM-028/029. CLI#261 is closed; do not say
101
+ the compiler or CLI version gate universally refuses v7. Above v7 remains
102
+ CLI-RENDER-004. A generated source model is evidence, not guaranteed render output.
103
+
104
+ Handler/reaction bodies, unresolved conditions and unproven origins still need
105
+ source review. Do not infer generation/evolution/absence-assertion coverage from
106
+ a package upgrade; read diagnostics and reconcile each recovered scenario.
67
107
 
68
108
  ## Reading the output cheaply
69
109
  1. V1 on `.ai-work/screenplay/<model-slug>/legacy/static` (folder mode) with the tool and
@@ -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