@cratis/pi 7.128.0 → 7.130.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 (119) hide show
  1. package/package/corpus/agents/coordinator.md +1 -1
  2. package/package/corpus/agents/orchestrator.md +1 -1
  3. package/package/corpus/agents/planner.md +1 -1
  4. package/package/corpus/harnesses/copilot/instructions/csharp.instructions.md +2 -2
  5. package/package/corpus/harnesses/copilot/instructions/framework.instructions.md +1 -1
  6. package/package/corpus/harnesses/copilot/instructions/orleans.instructions.md +2 -1
  7. package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +1 -1
  8. package/package/corpus/harnesses/copilot/instructions/specs.csharp.instructions.md +1 -1
  9. package/package/corpus/harnesses/pi/agents/coordinator.md +1 -1
  10. package/package/corpus/harnesses/pi/agents/orchestrator.md +1 -1
  11. package/package/corpus/harnesses/pi/agents/planner.md +1 -1
  12. package/package/corpus/harnesses/pi/extensions/cratis-hooks/index.ts +1 -1
  13. package/package/corpus/hooks/README.md +17 -5
  14. package/package/corpus/hooks/pre-commit.md +2 -2
  15. package/package/corpus/hooks/scripts/cratis-quality-gate.sh +1 -0
  16. package/package/corpus/hooks/scripts/cratis-run-specs.sh +147 -0
  17. package/package/corpus/hooks/scripts/quality-gates.json +5 -7
  18. package/package/corpus/product-sync.json +4 -4
  19. package/package/corpus/rules/csharp.md +2 -2
  20. package/package/corpus/rules/framework.md +1 -1
  21. package/package/corpus/rules/orleans.md +2 -1
  22. package/package/corpus/rules/pull-requests.md +1 -1
  23. package/package/corpus/rules/specs.csharp.md +1 -1
  24. package/package/corpus/skills/binlog-generation/SKILL.md +1 -1
  25. package/package/corpus/skills/coverage-analysis/references/setup-discovery.md +1 -1
  26. package/package/corpus/skills/cratis-application-slice-conformance/SKILL.md +1 -1
  27. package/package/corpus/skills/cratis-application-slice-specifications/SKILL.md +1 -1
  28. package/package/corpus/skills/cratis-arc-command-execution/references/command-refusals.md +1 -1
  29. package/package/corpus/skills/cratis-arc-command-execution/references/occurrence-commands.md +1 -1
  30. package/package/corpus/skills/cratis-arc-command-operation/references/testing.md +1 -1
  31. package/package/corpus/skills/cratis-arc-command-validation/references/input-binding.md +1 -1
  32. package/package/corpus/skills/cratis-arc-command-validation/references/validation-severity.md +1 -1
  33. package/package/corpus/skills/cratis-arc-react-page/references/from-screenplay.md +5 -5
  34. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/immediate-append-refusal.md +1 -1
  35. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/occurrences.md +1 -1
  36. package/package/corpus/skills/cratis-chronicle-event-constraints/references/storage-uniqueness.md +1 -1
  37. package/package/corpus/skills/cratis-chronicle-event-specifications/SKILL.md +1 -1
  38. package/package/corpus/skills/cratis-chronicle-event-type-migration/references/explicit-migrations.md +1 -1
  39. package/package/corpus/skills/cratis-chronicle-reactor/references/starting-and-replaying.md +1 -1
  40. package/package/corpus/skills/cratis-chronicle-read-model/references/collection-observation.md +1 -1
  41. package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +1 -1
  42. package/package/corpus/skills/cratis-ci-pipeline-performance/SKILL.md +1 -1
  43. package/package/corpus/skills/cratis-ci-pipeline-performance/references/build-once-and-shard.md +7 -3
  44. package/package/corpus/skills/cratis-ci-pipeline-performance/references/flaky-and-hung-jobs.md +1 -1
  45. package/package/corpus/skills/cratis-ci-pipeline-performance/references/test-setup-cost.md +1 -1
  46. package/package/corpus/skills/cratis-commits-and-pull-requests/references/pr-labels-and-release.md +1 -1
  47. package/package/corpus/skills/cratis-engineering-ci-gates/SKILL.md +3 -2
  48. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/SKILL.md +5 -1
  49. package/package/corpus/skills/cratis-engineering-local-cross-repo-verification/references/worked-examples.md +17 -8
  50. package/package/corpus/skills/cratis-orchestration-lanes/references/context-handoff.md +1 -1
  51. package/package/corpus/skills/cratis-orchestration-lanes/references/lane-brief.md +2 -2
  52. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +6 -1
  53. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/automation-patterns.md +1 -1
  54. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/cases-to-specify.md +5 -5
  55. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/statemachines-and-workflows.md +164 -0
  56. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/todo-list-example.md +12 -15
  57. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/translate-example.md +10 -4
  58. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/complete-examples.md +2 -2
  59. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/references/invocation-identity.md +8 -2
  60. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -4
  61. package/package/corpus/skills/cratis-screenplay-command-surface/references/described-handlers.md +12 -8
  62. package/package/corpus/skills/cratis-screenplay-command-surface/references/validate-rules.md +5 -5
  63. package/package/corpus/skills/cratis-screenplay-command-surface/verification.json +1 -1
  64. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +6 -3
  65. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generated-recovery.md +4 -4
  66. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +2 -2
  67. package/package/corpus/skills/cratis-screenplay-read-surface/references/named-keys.md +3 -1
  68. package/package/corpus/skills/cratis-screenplay-read-surface/references/screen-patterns.md +2 -2
  69. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +4 -4
  70. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/delivery-protocol.md +2 -2
  71. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +6 -5
  72. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +2 -2
  73. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +0 -3
  74. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-example.md +8 -3
  75. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/scenario-examples.md +17 -9
  76. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/spec-forms-by-mode.md +4 -3
  77. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/version-skew.md +25 -14
  78. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/view-and-story-specs.md +7 -6
  79. package/package/corpus/skills/cratis-screenplay-scenario-coverage/verification.json +1 -1
  80. package/package/corpus/skills/cratis-screenplay-slice-design/references/read-model-design.md +1 -1
  81. package/package/corpus/skills/cratis-screenplay-slice-design/references/slicing.md +1 -1
  82. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +3 -3
  83. package/package/corpus/skills/cratis-screenplay-specifications/SKILL.md +8 -5
  84. package/package/corpus/skills/cratis-screenplay-specifications/references/actions-beyond-commands.md +4 -2
  85. package/package/corpus/skills/cratis-screenplay-specifications/references/child-ordering.md +12 -3
  86. package/package/corpus/skills/cratis-screenplay-specifications/references/reactions-and-cascades.md +70 -21
  87. package/package/corpus/skills/cratis-screenplay-specifications/references/vocabulary.md +3 -2
  88. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +2 -2
  89. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +3 -3
  90. package/package/corpus/skills/cratis-screenplay-toolchain/references/automation-translate-example.md +5 -8
  91. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +12 -11
  92. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet.md +1 -1
  93. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostic-arguments.md +1 -1
  94. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +2 -2
  95. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +10 -7
  96. package/package/corpus/skills/cratis-screenplay-toolchain/references/fast-path.md +1 -1
  97. package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +4 -1
  98. package/package/corpus/skills/cratis-screenplay-toolchain/references/preferred-syntax.md +4 -1
  99. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +4 -4
  100. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract-exceptions.json +0 -70
  101. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +4743 -623
  102. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  103. package/package/corpus/skills/cratis-screenplay-toolchain/references/traps.md +1 -1
  104. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +1 -1
  105. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +6 -0
  106. package/package/corpus/skills/cratis-screenplay-ui-composition/references/action-subjects.md +73 -0
  107. package/package/corpus/skills/cratis-screenplay-ui-composition/references/file-references.md +4 -3
  108. package/package/corpus/skills/cratis-screenplay-ui-composition/references/response-continuations.md +1 -1
  109. package/package/corpus/skills/cratis-screenplay-ui-composition/references/worked-flow.md +1 -1
  110. package/package/corpus/skills/cratis-specifications-csharp/references/running-specs.md +7 -3
  111. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +8 -6
  112. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +8 -5
  113. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/render-example.md +1 -1
  114. package/package/corpus/skills/csharp-refactoring/SKILL.md +2 -2
  115. package/package/corpus/skills/eliminate-redundant-restores/SKILL.md +2 -1
  116. package/package/corpus/skills/filter-syntax/SKILL.md +1 -1
  117. package/package/corpus/skills/msbuild/references/build-perf-baseline.md +4 -1
  118. package/package/corpus/skills/run-tests/SKILL.md +9 -0
  119. package/package.json +1 -1
@@ -62,7 +62,7 @@ Identity and compliance traps (`identity.md`, `concepts.md`, `events.md`, `purpo
62
62
  unknown, not safe. Arc needs `[ExecuteCommandsAsSystem]` to supply a principal.
63
63
 
64
64
  Traps 39 to 44 are tool traps.
65
- 39. Attached file/inline command handlers refuse PLAY0800 (`CommandHandlerRequiresAttachment`): permanent constrained-attachment requirement, so gap-fill in code rather than wait for ESM admission. Read required typed `arguments.subject`, not the message; older binders use PLAY0268 (version gate: [diagnostic arguments](diagnostic-arguments.md)). Pending `handler implementation` beside unconditional productions binds as a described v23 command (PLAY0695). Body-reaching specs are Unsupported ImplementationBody; Stage still refuses rendering STAGE-IMPL-002 even in Stub mode; semantic execution reports ImplementationBody only when reached after gates. `implementation` and `hint` are accepted on a command handler, an operation execute/compensate phase and a command property named rule, and are rejected on concept rules, built-in property rules and whole-command `require`/`validate` bodies; hints do not execute, lock or confirm a body. A handler slice is gap-fill, not a customization of a rendered slice.
65
+ 39. An attached file/inline command handler binds as the v23 result contract only beside unconditional `produces` with a resolved, nonempty body; with no `produces`, `produces ... when` or an unresolved body it refuses PLAY0800 (`CommandHandlerRequiresAttachment`). Read required typed `arguments.subject`, not the message; older binders refuse every attached handler (version gate: [diagnostic arguments](diagnostic-arguments.md)). Pending `handler implementation` beside unconditional productions binds as a described v23 command (PLAY0695). Body-reaching specs are Unsupported ImplementationBody; Stage still refuses rendering STAGE-IMPL-002 even in Stub mode; semantic execution reports ImplementationBody only when reached after gates. `implementation` and `hint` are accepted on a command handler, an operation execute/compensate phase and a command property named rule, and are rejected on concept rules, built-in property rules and whole-command `require`/`validate` bodies; hints do not execute, lock or confirm a body. A handler slice is gap-fill, not a customization of a rendered slice.
66
66
  40. `numbers exact` (the source mode) parses but never binds (PLAY0268; "not admitted by any supported executable model (ESM) version yet") and is PLAY0001 on older compilers; it is absent from `grammar.md`. Exact lowering of qualifying Double-mode literals is separate (v11). Never use it in a model or example meant to execute.
67
67
  41. MCP roots bug: a dynamic-root server on an old tool answers the roots request with an `id: null` error right after `notifications/initialized`; hosts treat it as fatal, and `open-workspace.path` does not help. Start with a fixed root (`screenplay mcp <folder>`, `cratis screenplay mcp` in a project with `.cratis/ai.json`).
68
68
  Requires Screenplay 4.63.2 or later (`screenplay --version`) for a dynamic-root server; the compiler bundled in older cratis releases lacks it.
@@ -227,7 +227,7 @@ results, plus runtime when it was exercised:
227
227
  2. **Publication**: what was written, unchanged or refused (`.cratis-render.json`,
228
228
  `.cratis-render/journal.json`; `recovered: true` means stop and reconcile).
229
229
  3. **Build**: Debug build of the destination (`dotnet build`).
230
- 4. **Tests**: Debug tests of the destination (`dotnet test`). Generated specifications are
230
+ 4. **Tests**: After the Debug build, run `dotnet test <destination>/<Project>.csproj -c Debug --no-build` for Stage-rendered apps (VSTest). Use a built spec executable only in repositories whose spec projects really are executables (see [specs.csharp](../../../rules/specs.csharp.md)); never start the rendered app's web-server executable to run specs. Generated specifications are
231
231
  compiled in Debug only; map results by generated spec class (`when_<snake>` in namespace
232
232
  `<Slice ns>.when_<snake>`, `when_<snake>_is_queried`, `when_<snake>_is_projected`) back to
233
233
  the `.play` specification, not by test counts.
@@ -248,6 +248,12 @@ Read [change alternatives](references/change-alternatives.md) when a component's
248
248
 
249
249
  Read [interaction example](references/interaction-example.md) when wiring a
250
250
  named confirmation behavior and an inline refresh to the same screen.
251
+
252
+ State every plain and toolbar `action`'s subject: `for item` (the chosen record fills its
253
+ inputs) or `for screen` (no row does). Omitted, the compiler infers it from types, and a
254
+ create action on a list can bind the selected row's id. Read
255
+ [action subjects](references/action-subjects.md) when adding a screen action or when
256
+ PLAY0817-PLAY0821 appear.
251
257
  Scalar/named `returns` bind and reference-execute (ESM v7).
252
258
  Renderer generation/response limits: command-surface `references/generated-values-and-responses.md`.
253
259
  Screenplay resolves response names in form submit and execute success (Requires Screenplay 4.148.0 or later);
@@ -0,0 +1,73 @@
1
+ # Action subjects: `for item` and `for screen`
2
+
3
+ Requires Screenplay 4.248.0 or later (`screenplay --version`). Source: Screenplay
4
+ `Documentation/screenplay/action-subjects.md` (decision 0110).
5
+
6
+ A plain or toolbar `action` states whether it acts on one chosen record or on the screen:
7
+
8
+ - `for item`: the nearest single `data` record, or the selected row of a collection. Inputs bind
9
+ from it: explicit `with <input> from item.<field>` first, then case-sensitive same-name
10
+ fields, then one key field with the same declared concept.
11
+ - `for screen`: independent of selection; no row fills the inputs. Use it for actions that
12
+ create something or that the user fills in through the form.
13
+
14
+ The clause follows the command name, before an inline `label`. Only action toolbar items
15
+ accept it.
16
+
17
+ ```screenplay
18
+ concept TaskId : Uuid
19
+ concept Title : String
20
+ module Work
21
+ feature Tasks
22
+ slice StateChange AddTask
23
+ command AddTask
24
+ taskId TaskId identifier
25
+ title Title
26
+ produces event TaskAdded
27
+ title Title = title
28
+ slice StateChange CompleteTask
29
+ command CompleteTask
30
+ taskId TaskId identifier
31
+ note String
32
+ produces event TaskCompleted
33
+ note String = note
34
+ slice StateView OpenTasks
35
+ readmodel OpenTask
36
+ taskId TaskId key
37
+ title Title
38
+ projection OpenTasks => OpenTask
39
+ from TaskAdded
40
+ taskId = $eventSourceId
41
+ title = title
42
+ remove with TaskCompleted
43
+ query ListOpenTasks => OpenTask[]
44
+ screen OpenTasksScreen
45
+ title "Open tasks"
46
+ data OpenTask[] via query ListOpenTasks
47
+ action AddTask for screen
48
+ label "Add task"
49
+ action CompleteTask for item
50
+ label "Complete"
51
+ with taskId from item.taskId
52
+ table OpenTask
53
+ column title label "Task"
54
+ ```
55
+
56
+ State the subject on every plain and toolbar action. Without it, the compiler infers `for item`
57
+ when there is exactly one collection `data`, one required non-generated identifier and one key
58
+ with the same concept, and `for screen` otherwise. Inference follows types, not intent: here
59
+ `AddTask` without a clause infers `for item`, because its `taskId` has the row key's concept,
60
+ and would bind the selected row's id to a new task.
61
+
62
+ | Code | Severity | Meaning | Fix |
63
+ | --- | --- | --- | --- |
64
+ | PLAY0817 | Error | Malformed, duplicate or misplaced subject clause | One clause after the command name |
65
+ | PLAY0818 | Information | Explains an omitted subject's inference | State `for item` or `for screen` |
66
+ | PLAY0819 | Warning | The inferred binding differs from the legacy case-insensitive row-name matching | Decide per action: `for screen`, or `for item` with explicit inputs; never bulk-accept |
67
+ | PLAY0820 | Warning | Several keys could bind one input | Write `with <input> from item.<field>` |
68
+ | PLAY0821 | Warning | A guarded `for screen` action has collection data and cannot choose one item | Use `for item` or single-record data |
69
+
70
+ A model written before 4.248.0 can report PLAY0818/PLAY0819 on every list-screen action. Review
71
+ each one against what the action means; a create action is `for screen` even when the row has a
72
+ matching identifier. Compiler inference is authoring evidence only: Scene owns the runtime
73
+ selection and form-input behavior.
@@ -7,8 +7,9 @@ This reference holds the three meanings of `file` and the rules for paths and lo
7
7
  Three meanings, one word:
8
8
 
9
9
  - **Backend implementation attachment.** On an attached command `handler`
10
- (PLAY0800: permanent constrained-attachment requirement, gap-filled in code;
11
- pending described handlers instead bind v23 without a file), a validation
10
+ (binds as the v23 result contract beside unconditional `produces` with a resolved
11
+ body from Screenplay 4.250.0, otherwise PLAY0800; pending described handlers bind
12
+ v23 without a file), a validation
12
13
  rule predicate, a query `performer`, a reducer rule, a reaction trigger, a
13
14
  `constraint` and a `policy`, `file` stands in for the inline body: the
14
15
  implementation lives there. These are the files a host inventories.
@@ -22,7 +23,7 @@ Three meanings, one word:
22
23
  `readmodel`, `projection`, `slice`, `specification`, top-level `trigger` — it
23
24
  only records which file realizes it.
24
25
 
25
- Requires Screenplay 4.210.0 (`screenplay --version`) for the file/inline handler's PLAY0800; older binders use PLAY0268. Read its required typed `arguments.subject` to identify the command, never the message.
26
+ Requires Screenplay 4.250.0 (`screenplay --version`) for a file/inline handler beside `produces` to bind; 4.210.0 to 4.249.x refuse it with PLAY0800 and older binders use PLAY0268. Read its required typed `arguments.subject` to identify the command, never the message.
26
27
 
27
28
  The rules:
28
29
 
@@ -72,7 +72,7 @@ module Billing
72
72
  title String = title
73
73
  returns invoiceId
74
74
  screen CreateInvoiceScreen
75
- action CreateInvoice
75
+ action CreateInvoice for screen
76
76
  label "Create invoice"
77
77
  slice StateView Details
78
78
  readmodel Invoice
@@ -21,7 +21,7 @@ module Marina
21
21
  screen BookBerthScreen
22
22
  title "Book a berth"
23
23
  data BerthListView[] via query ListBerths
24
- action BookBerth
24
+ action BookBerth for screen
25
25
  navigate to BerthListScreen
26
26
  label "Book berth"
27
27
  slice StateView BerthList
@@ -11,9 +11,13 @@
11
11
  - Filters
12
12
  - Migrate from 4.x to 5.0
13
13
 
14
- Requires `Cratis.Specifications.XUnit.v3` 5.0 on `net10.0`. Check the
15
- `PackageReference` versions in the specification project; 4.x projects follow the
16
- checklist below before the executable loop applies.
14
+ The xUnit examples and migration checklist require `Cratis.Specifications.XUnit.v3`
15
+ 5.0 on `net10.0`. This is not a requirement to migrate frameworks: identify the
16
+ project's evaluated runner first. TUnit and `Cratis.Specifications.Runner` suites
17
+ also run their built executable, with their own help-confirmed flags, not xUnit
18
+ `-trx`/filter flags. Only legacy VSTest projects use `dotnet test <project> --no-build`.
19
+ Check package versions and the actual configuration/TFM; the 4.x migration checklist
20
+ below applies only when migrating, not as a prerequisite to running an existing suite.
17
21
 
18
22
  Sources: [Running specifications fast](https://github.com/Cratis/Specifications/blob/main/Documentation/running-fast.md),
19
23
  [The native runner](https://github.com/Cratis/Specifications/blob/main/Documentation/runner.md) and
@@ -148,11 +148,12 @@ and unaudited-version refusals still stop first. Codes, limits and fixes:
148
148
  overrides (`-036`), unsupported code validation (`-005`), DateTime filters (`-010`),
149
149
  unsupported conditional productions, unsupported composite-key projection shapes, including DateTime and decimal key parts (`STAGE-ESM-048`, and `-047` for a single-instance query by parts) and unsupported `all` shapes.
150
150
  Protected reads render as Arc read protection in a new enough bundle; shapes it cannot preserve, and every protected read in an older bundle, refuse `STAGE-ESM-044` (see admission.md). Described handlers still refuse `STAGE-IMPL-002` even in Stub mode. Query-performer gaps are a separate contract, not a completed implementation.
151
- - **Attached command handlers (`PLAY0800`):** file/inline handlers permanently require
152
- constrained implementation attachments: gap-fill the slice in code, not by waiting
153
- for ESM admission. Read the required typed `arguments.subject` for the command,
154
- never match message text. Requires Screenplay 4.210.0 (`screenplay --version`);
155
- older bundled binders use PLAY0268 for these handlers.
151
+ - **Attached command handlers:** a file/inline handler beside unconditional `produces`
152
+ with a resolved body binds as the v23 result contract and Stage renders its C# body.
153
+ Without `produces`, with `produces ... when` or with an unresolved body it refuses
154
+ `PLAY0800`: read the required typed `arguments.subject` for the command, never match
155
+ message text. Older bundled binders refuse every attached handler (version gate:
156
+ toolchain `references/executable-subset.md`).
156
157
  - **Binding refusals:** read toolchain `references/executable-subset.md` for
157
158
  `PLAY0268`/`PLAY0271` families; binding is not rendering. Composite keys have
158
159
  target-specific support, not blanket refusal. Never drop protection.
@@ -240,7 +241,8 @@ to disk with no managed staging and no safe stale-file removal; a failure can le
240
241
  result. State the scope in the V5 report.
241
242
  - Report V5 as separate results, each a result or "not run": admission, publication,
242
243
  Debug build (`dotnet build <destination>/<Project>.csproj -c Debug`), Debug tests
243
- (`dotnet test` on the same project) and runtime. Render alone is the first two.
244
+ (`dotnet test <destination>/<Project>.csproj -c Debug --no-build` after the build; Stage-rendered apps use VSTest) and runtime. Render alone is the first two.
245
+ Use a built spec executable only in repositories whose spec projects really are executables (see [specs.csharp](../../rules/specs.csharp.md)); the rendered app's executable starts its web server, not its specs.
244
246
  - A refusal is kept verbatim as reported: `PLAY*` (compile or bind), `PLAN-*` (execution
245
247
  plan), `STAGE-*` (admission), `CLI-RENDER-*`, or a plain ownership error for a managed
246
248
  file. The fix is an intent-preserving model change or a recorded gap, never an edit of
@@ -314,11 +314,14 @@ pure expressions, and no generated type shadowing a referenced one. Anything els
314
314
  `STAGE-ESM-019`, `-021` or `-022`. A reducer needs a `StateView` slice, its read model in the
315
315
  same slice, a required Guid or text identifier and a matching keyed query. Resolved
316
316
  C# command/concept rule and iterator validation bodies have pure-gated render
317
- paths; unsupported body/context shapes still refuse. Attached
318
- command handlers refuse `PLAY0800` and permanently require constrained implementation
319
- attachments: gap-fill in code, not by waiting for ESM admission. Requires Screenplay
320
- 4.210.0 (`screenplay --version`); older bundled binders use PLAY0268 for these handlers.
321
- Read the required typed `arguments.subject` for the command rather than the message.
317
+ paths; unsupported body/context shapes still refuse. An attached command handler
318
+ beside unconditional `produces` with a resolved body binds as the v23 result contract
319
+ (Screenplay 4.250.0, decision 0117); Stage renders a C# body (`STAGE-IMPL-LANGUAGE` when
320
+ no `csharp` body exists) and its semantic Host and executor report a reached body as
321
+ `Unsupported(ImplementationBody)`. Without `produces`, with `produces ... when` or with
322
+ an unresolved body the handler refuses `PLAY0800` at binding; 4.210.0 to 4.249.x refuse
323
+ every attached handler with it and older binders use PLAY0268. Read the required typed
324
+ `arguments.subject` for the command rather than the message.
322
325
  A pending handler beside unconditional productions binds as a described v23
323
326
  command; rendering still refuses it with STAGE-IMPL-002 even in Stub mode.
324
327
  Query-performer gaps are a separate contract: see [bodies and implementation gaps](current-boundaries.md#bodies-and-implementation-gaps).
@@ -119,7 +119,7 @@ Why it is shaped this way:
119
119
  | Forced | the same with `--force` | `written: 1`, the rest `unchanged` |
120
120
  | Missing name | render without `--name` | exit 5: `A valid --name is required and must be a C# identifier` |
121
121
  | Debug build | `dotnet build out/Marina.csproj -c Debug` | succeeds, 0 warnings, 0 errors |
122
- | Debug tests | `dotnet test out/Marina.csproj -c Debug` | all specification classes pass |
122
+ | Debug tests | `dotnet test out/Marina.csproj -c Debug --no-build` after the Debug build (Stage-rendered apps use VSTest) | all specification classes pass |
123
123
 
124
124
  Runtime (`docker compose up`, `/healthz`) and the frontend build are separate results.
125
125
 
@@ -132,8 +132,8 @@ Use the repo's own build/test workflow when it documents one (`README`/`CONTRIBU
132
132
 
133
133
  Otherwise:
134
134
  ```bash
135
- dotnet build # 0 errors
136
- dotnet test # stays green; same pass count as before
135
+ dotnet build # 0 errors; use dotnet test <project> --no-build only for VSTest (see specs.csharp)
136
+ ./<project-dir>/bin/<Config>/<TFM>/<AssemblyName> # built spec executable; same discovered/passed counts
137
137
  ```
138
138
 
139
139
  One operation per step; never mix a refactor and a behavior change in the same step. On red, stop and report the failure; repair only your edit without discarding unrelated worktree changes.
@@ -73,7 +73,8 @@ Keep the first restore. Skip a later one only when all four checks pass:
73
73
  ### Step 4: Apply the smallest change
74
74
 
75
75
  - One explicit restore carrying every restore input, then `--no-restore`, `-restore:false` or `--no-build` on later steps.
76
- - Several `dotnet test` steps over one solution: build once, then `dotnet test --no-build` on each. Add `--no-restore -restore:false` if an rsp enables restore, including on .NET 8 and earlier. `--no-restore` alone still rebuilds.
76
+ - Supported executable suites run their built spec runner instead (see [running-specs](../cratis-specifications-csharp/references/running-specs.md)); the dotnet-test examples here are VSTest-only.
77
+ - Several `dotnet test` steps over one VSTest-only solution: build once, then `dotnet test --no-build` on each. Add `--no-restore -restore:false` if an rsp enables restore, including on .NET 8 and earlier. `--no-restore` alone still rebuilds.
77
78
  - Keep self-contained publish settings. A `publish --no-build` still needs a prior build with matching configuration, framework, RID and self-contained output; restore compatibility does not prove that build outputs exist.
78
79
  - Scope the change to CI and scripts. Leave `-restore` in `Directory.Build.rsp`, because developers rely on it; pass `-restore:false` per invocation instead.
79
80
  - Never remove the first restore. If it is a `--locked-mode` gate, keep it there.
@@ -11,7 +11,7 @@ metadata:
11
11
 
12
12
  # Test Filter Syntax Reference
13
13
 
14
- Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; Cratis core repositories run xUnit v2 on VSTest.
14
+ Cratis rules in `.cratis/ai/rules/` (including `csharp.md`, `specs.csharp.md`, and `orleans.md`) and the `cratis-*` skills win where they differ. Specification authoring belongs to **cratis-specifications-csharp**; identify the actual runner rather than assuming xUnit v2/VSTest. Supported Cratis executable suites use direct runner flags first (see its [running-specs reference](../cratis-specifications-csharp/references/running-specs.md)). The dotnet-test forms below are technical syntax when that entrypoint is explicitly required, not the Cratis default.
15
15
 
16
16
  Filter syntax depends on the **platform** and **test framework**.
17
17
 
@@ -408,9 +408,12 @@ dotnet restore
408
408
  if ($LASTEXITCODE -ne 0) { throw "Restore failed; do not use stale assets." }
409
409
  dotnet build --no-restore -m
410
410
  if ($LASTEXITCODE -ne 0) { throw "Build failed; do not test stale outputs." }
411
- dotnet test --no-build
411
+ ./<project-dir>/bin/<Config>/<TFM>/<AssemblyName> # built spec executable
412
412
  ```
413
413
 
414
+ Use the evaluated output without rebuilding (see [running-specs](../../cratis-specifications-csharp/references/running-specs.md));
415
+ only VSTest uses `dotnet test <project> --no-build`. The executable step itself
416
+ produces no MSBuild binlog.
414
417
  Use matching configuration/TFM/RID and restore-affecting properties in each stage.
415
418
  `--no-restore` requires current assets; `--no-build` requires successfully built
416
419
  matching test outputs. Keep restore-inclusive and build-only timings separate.
@@ -88,6 +88,15 @@ resolved. Route identification-only requests to `platform-detection`.
88
88
 
89
89
  ## Decision table
90
90
 
91
+ For supported Cratis xUnit v3, TUnit and native-runner suites, restore/build once
92
+ and run each project's built executable directly, or `dotnet <TargetPath.dll>`
93
+ when there is no apphost. Use the matching configuration/TFM and runner-specific
94
+ filter/report flags; see [running-specs](../cratis-specifications-csharp/references/running-specs.md).
95
+ Only identified VSTest projects default to `dotnet test <project> --no-build`.
96
+ Mixed suites run per project, never solution-wide `dotnet test`. The command-mode
97
+ forms below remain valid when the user explicitly requires dotnet-test syntax;
98
+ do not switch an executable suite to them as an automatic fallback.
99
+
91
100
  | Detected mode / platform | Command shape | Never use |
92
101
  |---|---|---|
93
102
  | Classic non-SDK | Repository script, or full MSBuild followed by `vstest.console.exe` / `MSTest.exe` | Assuming `dotnet test` is compatible or migrating implicitly |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.128.0",
3
+ "version": "7.130.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [