@cratis/pi 7.34.1 → 7.35.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 (227) hide show
  1. package/package/corpus/agents/security-reviewer.md +1 -0
  2. package/package/corpus/agents/spec-writer.md +1 -1
  3. package/package/corpus/harnesses/pi/extensions/shared/rules.ts +3 -1
  4. package/package/corpus/hooks/scripts/cratis-nuget-pins.txt +7 -6
  5. package/package/corpus/hooks/scripts/cratis-release-notes-reviewed.cjs +7 -6
  6. package/package/corpus/hooks/scripts/cratis-store-mutations.json +7 -3
  7. package/package/corpus/product-sync.json +896 -0
  8. package/package/corpus/prompts/add-business-rule.prompt.md +1 -1
  9. package/package/corpus/prompts/ship-changes.prompt.md +2 -2
  10. package/package/corpus/rules/ai-distribution.md +31 -3
  11. package/package/corpus/rules/application-profile.md +2 -1
  12. package/package/corpus/rules/components.md +66 -7
  13. package/package/corpus/rules/concepts.md +11 -3
  14. package/package/corpus/rules/csharp.md +3 -1
  15. package/package/corpus/rules/dialogs.md +9 -0
  16. package/package/corpus/rules/efcore.md +1 -1
  17. package/package/corpus/rules/elixir.md +49 -0
  18. package/package/corpus/rules/framework.md +5 -3
  19. package/package/corpus/rules/general.md +1 -0
  20. package/package/corpus/rules/glossary.md +4 -4
  21. package/package/corpus/rules/go-engineering.md +60 -0
  22. package/package/corpus/rules/go.md +115 -0
  23. package/package/corpus/rules/java.md +5 -2
  24. package/package/corpus/rules/kotlin.md +7 -5
  25. package/package/corpus/rules/orleans.md +65 -9
  26. package/package/corpus/rules/profiles.md +43 -6
  27. package/package/corpus/rules/pull-requests.md +3 -3
  28. package/package/corpus/rules/react.md +8 -1
  29. package/package/corpus/rules/reactors.md +27 -3
  30. package/package/corpus/rules/specs.csharp.md +11 -4
  31. package/package/corpus/rules/specs.scenarios.csharp.md +35 -4
  32. package/package/corpus/rules/specs.typescript.md +2 -1
  33. package/package/corpus/rules/storybook.md +1 -1
  34. package/package/corpus/rules/typescript.md +1 -1
  35. package/package/corpus/rules/vertical-slices.md +37 -5
  36. package/package/corpus/skills/cratis-application-react-specifications/SKILL.md +4 -2
  37. package/package/corpus/skills/cratis-application-slice-specifications/SKILL.md +18 -8
  38. package/package/corpus/skills/cratis-application-slice-specifications/references/query-and-decision-scenarios.md +65 -0
  39. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/SKILL.md +53 -57
  40. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authentication.md +38 -42
  41. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authorization.md +18 -7
  42. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authproxy.md +30 -0
  43. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/frontend.md +12 -9
  44. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/local-development.md +9 -9
  45. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/observable-emission-guards.md +8 -5
  46. package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/tenancy.md +20 -4
  47. package/package/corpus/skills/cratis-arc-command/SKILL.md +32 -10
  48. package/package/corpus/skills/cratis-arc-command/references/command-result.md +12 -5
  49. package/package/corpus/skills/cratis-arc-command/references/decisions-and-routing.md +95 -0
  50. package/package/corpus/skills/cratis-arc-command/references/generated-values.md +3 -2
  51. package/package/corpus/skills/cratis-arc-command/references/handler-shapes.md +8 -8
  52. package/package/corpus/skills/cratis-arc-command/references/proxy-generation.md +22 -3
  53. package/package/corpus/skills/cratis-arc-command/references/read-model-injection.md +13 -1
  54. package/package/corpus/skills/cratis-arc-command-execution/SKILL.md +19 -9
  55. package/package/corpus/skills/cratis-arc-command-kotlin/SKILL.md +44 -18
  56. package/package/corpus/skills/cratis-arc-command-kotlin/references/read-model-naming.md +29 -0
  57. package/package/corpus/skills/cratis-arc-command-operation/SKILL.md +10 -9
  58. package/package/corpus/skills/cratis-arc-command-operation/references/execution-and-recovery.md +2 -2
  59. package/package/corpus/skills/cratis-arc-command-operation/references/testing.md +4 -3
  60. package/package/corpus/skills/cratis-arc-command-typescript/SKILL.md +42 -22
  61. package/package/corpus/skills/cratis-arc-command-typescript/references/chronicle-events.md +36 -5
  62. package/package/corpus/skills/cratis-arc-command-typescript/references/command-operations.md +114 -0
  63. package/package/corpus/skills/cratis-arc-command-typescript/references/hosting-and-storage.md +37 -16
  64. package/package/corpus/skills/cratis-arc-command-typescript/references/identity-and-introspection.md +88 -0
  65. package/package/corpus/skills/cratis-arc-command-typescript/references/observability-and-host-scopes.md +25 -0
  66. package/package/corpus/skills/cratis-arc-command-typescript/references/proxy-generation.md +35 -4
  67. package/package/corpus/skills/cratis-arc-command-typescript/references/slice-layout.md +11 -0
  68. package/package/corpus/skills/cratis-arc-command-typescript/verification.json +8 -1
  69. package/package/corpus/skills/cratis-arc-command-validation/SKILL.md +49 -19
  70. package/package/corpus/skills/cratis-arc-ef-core-migration/SKILL.md +12 -6
  71. package/package/corpus/skills/cratis-arc-go/SKILL.md +148 -0
  72. package/package/corpus/skills/cratis-arc-go/references/queries.md +80 -0
  73. package/package/corpus/skills/cratis-arc-hosting/SKILL.md +96 -0
  74. package/package/corpus/skills/cratis-arc-hosting/references/integrations-and-publish.md +80 -0
  75. package/package/corpus/skills/cratis-arc-identity-and-tenancy-kotlin/SKILL.md +137 -0
  76. package/package/corpus/skills/cratis-arc-observable-query-http/SKILL.md +20 -2
  77. package/package/corpus/skills/cratis-arc-query-kotlin/SKILL.md +26 -6
  78. package/package/corpus/skills/cratis-arc-query-paging/SKILL.md +25 -20
  79. package/package/corpus/skills/cratis-arc-query-typescript/SKILL.md +32 -6
  80. package/package/corpus/skills/cratis-arc-query-typescript/references/storage-observation-and-compliance.md +66 -0
  81. package/package/corpus/skills/cratis-arc-query-typescript/verification.json +5 -1
  82. package/package/corpus/skills/cratis-arc-react-page/SKILL.md +24 -13
  83. package/package/corpus/skills/cratis-arc-react-page/references/data-page.md +20 -10
  84. package/package/corpus/skills/cratis-arc-react-page/references/data-tables.md +17 -3
  85. package/package/corpus/skills/cratis-arc-react-page/references/dialogs.md +14 -3
  86. package/package/corpus/skills/cratis-arc-react-page/references/from-screenplay.md +6 -1
  87. package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +1 -1
  88. package/package/corpus/skills/cratis-arc-react-page/references/queries-and-commands.md +11 -1
  89. package/package/corpus/skills/cratis-arc-react-page/verification.json +6 -1
  90. package/package/corpus/skills/cratis-arc-spring-data-kotlin/SKILL.md +163 -0
  91. package/package/corpus/skills/cratis-arc-testing-kotlin/SKILL.md +131 -0
  92. package/package/corpus/skills/cratis-arc-validation-kotlin/SKILL.md +44 -11
  93. package/package/corpus/skills/cratis-arc-validation-typescript/SKILL.md +5 -3
  94. package/package/corpus/skills/cratis-chronicle-cli-operations/SKILL.md +79 -25
  95. package/package/corpus/skills/cratis-chronicle-cli-operations/references/command-effects.md +57 -0
  96. package/package/corpus/skills/cratis-chronicle-client-dotnet/SKILL.md +87 -99
  97. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/additional-surfaces.md +65 -0
  98. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/client-construction.md +42 -0
  99. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/compatibility-check.md +12 -0
  100. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/discovery.md +43 -19
  101. package/package/corpus/skills/cratis-chronicle-client-dotnet/references/hosting.md +29 -1
  102. package/package/corpus/skills/cratis-chronicle-client-elixir/SKILL.md +158 -162
  103. package/package/corpus/skills/cratis-chronicle-client-elixir/references/append-api.md +36 -15
  104. package/package/corpus/skills/cratis-chronicle-client-elixir/references/compliance.md +32 -0
  105. package/package/corpus/skills/cratis-chronicle-client-elixir/references/connections.md +56 -0
  106. package/package/corpus/skills/cratis-chronicle-client-elixir/references/event-sources.md +64 -0
  107. package/package/corpus/skills/cratis-chronicle-client-elixir/references/pitfalls.md +25 -0
  108. package/package/corpus/skills/cratis-chronicle-client-elixir/references/projections.md +48 -0
  109. package/package/corpus/skills/cratis-chronicle-client-elixir/references/upgrading.md +34 -0
  110. package/package/corpus/skills/cratis-chronicle-client-elixir/references/variants.md +13 -5
  111. package/package/corpus/skills/cratis-chronicle-client-elixir/verification.json +23 -0
  112. package/package/corpus/skills/cratis-chronicle-client-go/SKILL.md +162 -0
  113. package/package/corpus/skills/cratis-chronicle-client-go/references/projections.md +73 -0
  114. package/package/corpus/skills/cratis-chronicle-client-kotlin/SKILL.md +87 -88
  115. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/connection-lifecycle.md +13 -0
  116. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/discovery-and-registration.md +14 -4
  117. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/event-sources.md +65 -0
  118. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/options.md +29 -0
  119. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/spring-boot.md +13 -0
  120. package/package/corpus/skills/cratis-chronicle-client-kotlin/references/variants.md +5 -4
  121. package/package/corpus/skills/cratis-chronicle-client-typescript/SKILL.md +165 -156
  122. package/package/corpus/skills/cratis-chronicle-client-typescript/references/read-models-and-projections.md +54 -11
  123. package/package/corpus/skills/cratis-chronicle-client-typescript/references/testing.md +126 -0
  124. package/package/corpus/skills/cratis-chronicle-client-typescript/references/variants.md +3 -5
  125. package/package/corpus/skills/cratis-chronicle-client-typescript/verification.json +19 -0
  126. package/package/corpus/skills/cratis-chronicle-compliance/SKILL.md +36 -13
  127. package/package/corpus/skills/cratis-chronicle-decision-reads/SKILL.md +110 -0
  128. package/package/corpus/skills/cratis-chronicle-decision-reads/references/admission-and-ownership.md +57 -0
  129. package/package/corpus/skills/cratis-chronicle-decision-reads/verification.json +12 -0
  130. package/package/corpus/skills/cratis-chronicle-event-constraints/SKILL.md +58 -19
  131. package/package/corpus/skills/cratis-chronicle-event-constraints/references/closing-streams.md +73 -0
  132. package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +32 -3
  133. package/package/corpus/skills/cratis-chronicle-event-specifications/SKILL.md +18 -5
  134. package/package/corpus/skills/cratis-chronicle-event-type-migration/SKILL.md +32 -2
  135. package/package/corpus/skills/cratis-chronicle-hosting/SKILL.md +134 -0
  136. package/package/corpus/skills/cratis-chronicle-hosting/references/operations.md +89 -0
  137. package/package/corpus/skills/cratis-chronicle-hosting/verification.json +14 -0
  138. package/package/corpus/skills/cratis-chronicle-mcp-inspection/SKILL.md +93 -66
  139. package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/blocked-tools.md +21 -7
  140. package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/deployment.md +77 -0
  141. package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/observational-tools.md +46 -4
  142. package/package/corpus/skills/cratis-chronicle-multi-tenancy/SKILL.md +15 -1
  143. package/package/corpus/skills/cratis-chronicle-projection/SKILL.md +44 -10
  144. package/package/corpus/skills/cratis-chronicle-projection/references/fluent-builder.md +7 -1
  145. package/package/corpus/skills/cratis-chronicle-projection/references/model-bound-attributes.md +8 -0
  146. package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +85 -105
  147. package/package/corpus/skills/cratis-chronicle-reactor/references/specifications.md +20 -1
  148. package/package/corpus/skills/cratis-chronicle-read-model/SKILL.md +2 -2
  149. package/package/corpus/skills/cratis-chronicle-read-model/references/queries.md +35 -16
  150. package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +15 -3
  151. package/package/corpus/skills/cratis-chronicle-reducer/SKILL.md +23 -4
  152. package/package/corpus/skills/cratis-chronicle-web-workbench/SKILL.md +40 -15
  153. package/package/corpus/skills/cratis-cli-terminal-workbench/SKILL.md +20 -6
  154. package/package/corpus/skills/cratis-code-review/SKILL.md +25 -3
  155. package/package/corpus/skills/cratis-components-accessibility/SKILL.md +20 -4
  156. package/package/corpus/skills/cratis-components-schema-editor/SKILL.md +40 -28
  157. package/package/corpus/skills/cratis-components-schema-editor/references/tree-layout.md +62 -0
  158. package/package/corpus/skills/cratis-components-schema-editor/verification.json +14 -0
  159. package/package/corpus/skills/cratis-components-stepper-command-dialog/SKILL.md +16 -8
  160. package/package/corpus/skills/cratis-components-styling/SKILL.md +57 -20
  161. package/package/corpus/skills/cratis-components-styling/verification.json +13 -0
  162. package/package/corpus/skills/cratis-components-toolbar/SKILL.md +37 -7
  163. package/package/corpus/skills/cratis-components-toolbar/verification.json +12 -0
  164. package/package/corpus/skills/cratis-engineering-csharp-conventions/SKILL.md +6 -0
  165. package/package/corpus/skills/cratis-engineering-csharp-conventions/references/exceptions-logging-and-di.md +5 -3
  166. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +19 -6
  167. package/package/corpus/skills/cratis-fundamentals-concept/references/typescript-concepts.md +97 -0
  168. package/package/corpus/skills/cratis-fundamentals-concept/verification.json +4 -1
  169. package/package/corpus/skills/cratis-fundamentals-concept-go/SKILL.md +112 -0
  170. package/package/corpus/skills/cratis-fundamentals-type-discovery/SKILL.md +54 -17
  171. package/package/corpus/skills/cratis-fundamentals-type-discovery/verification.json +14 -0
  172. package/package/corpus/skills/cratis-lens-browser-extension/SKILL.md +55 -28
  173. package/package/corpus/skills/cratis-performance-review/SKILL.md +5 -2
  174. package/package/corpus/skills/cratis-release-notes/SKILL.md +3 -1
  175. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +5 -4
  176. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -6
  177. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +24 -6
  178. package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +4 -2
  179. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -1
  180. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +3 -2
  181. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +2 -2
  182. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +1 -0
  183. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +34 -4
  184. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +5 -3
  185. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
  186. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +4 -2
  187. package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +42 -3
  188. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -1
  189. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -1
  190. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
  191. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +48 -0
  192. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +3 -1
  193. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -2
  194. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +5 -4
  195. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +8 -6
  196. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
  197. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -2
  198. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
  199. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +16 -11
  200. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +5 -2
  201. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1329 -32
  202. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  203. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +2 -2
  204. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -7
  205. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
  206. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +2 -0
  207. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +27 -9
  208. package/package/corpus/skills/cratis-security-review/SKILL.md +9 -3
  209. package/package/corpus/skills/cratis-security-review/references/arc-boundaries.md +59 -0
  210. package/package/corpus/skills/cratis-specification-by-example/SKILL.md +7 -0
  211. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +43 -11
  212. package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +16 -4
  213. package/package/corpus/skills/cratis-specifications-csharp/references/csharp-patterns.md +18 -5
  214. package/package/corpus/skills/cratis-specifications-csharp/references/integration-specs.md +21 -0
  215. package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +34 -0
  216. package/package/corpus/skills/cratis-specifications-csharp/verification.json +13 -0
  217. package/package/corpus/skills/cratis-specifications-typescript/SKILL.md +14 -5
  218. package/package/corpus/skills/cratis-specifications-typescript/verification.json +12 -0
  219. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +8 -2
  220. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +6 -3
  221. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +10 -1
  222. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/scene-runtime.md +75 -0
  223. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +5 -0
  224. package/package/corpus/skills/cratis-studio-mcp-safety-guidance/SKILL.md +14 -1
  225. package/package/profile-catalog.json +68 -1
  226. package/package.json +1 -1
  227. package/src/index.ts +3 -1
@@ -53,7 +53,7 @@ V3 are read from the MCP server or from a render, V1 and V5 from the CLIs.
53
53
  Needs an MCP connection (V2 and V3 belong to the session that owns MCP; a subagent without
54
54
  MCP reports `V2 not run: no MCP in this agent` unless the brief supplies fresh output). Without
55
55
  MCP, a binding check exists: `cratis screenplay validate --executable <root>` binds with the
56
- **bundled** compiler (CLI 3.53.1 bundles Screenplay 4.137.0, not the standalone 4.139.0), never
56
+ **bundled** compiler (CLI 3.53.1 bundles Screenplay 4.137.0, not the standalone 4.141.0), never
57
57
  renders or writes files, and exits 5 with "The model does not bind into an executable semantic
58
58
  model" when it does not. Report it as `V3 (bundled 4.137.0 via cratis validate --executable)`; it
59
59
  gives binding errors, not the V2 `executable-diagnostics` view, so V2 stays MCP-only.
@@ -68,7 +68,7 @@ gives binding errors, not the V2 `executable-diagnostics` view, so V2 stays MCP-
68
68
  source revision).
69
69
  4. Report the codes with counts, blocking (error severity) apart from informational. A list
70
70
  with blocking entries is a valid V2 result (`V2 read: 6 blocking, PLAY0268 x3 filter query,
71
- pii ...`); it is the evidence for a "V3 blocked" report. The view also lists
71
+ enum compliance ...`); it is the evidence for a "V3 blocked" report. The view also lists
72
72
  information-severity diagnostics (PLAY0269 deferred UI, PLAY0270 authoring metadata such as
73
73
  descriptions, personas and screens) on models that bind; they do not block.
74
74
 
@@ -17,16 +17,23 @@ probe; older probes retain their original labels in the other references.
17
17
 
18
18
  | Source | Pin | Evidence |
19
19
  | --- | --- | --- |
20
- | Screenplay language, standalone tool and MCP | **4.139.0** (`dcd84574`) | Released tag `v4.139.0` and its unchanged published contract; enum numbers/ESM v12 and property references |
20
+ | Screenplay language, standalone tool and MCP | **4.141.0** (`8ce785e3`) | Released tag `v4.141.0` and its unchanged published contract; concept compliance/ESM v13 and the property-change planner |
21
21
  | cratis CLI | **3.53.1** | Released tag `v3.53.1`; source-checked, not a new render/browser probe |
22
22
  | Screenplay bundled by CLI | **4.137.0** | CLI `v3.53.1:Directory.Packages.props`; enum-number authoring, not v12 binding |
23
23
  | Stage bundled by CLI | **4.73.1** | Same file; Stage's own `Directory.Packages.props` also pins Screenplay 4.137.0 |
24
+ | Latest standalone Stage released when this was checked | **4.76.0** (Screenplay 4.139.0) | Released tag `v4.76.0`; no cli release bundles Stage 4.74.0 to 4.76.0, so a cli user observes none of it. It admits ESM v1 to v12 (v11 from 4.75.0, v12 from 4.76.0), renders UUID-concept generated values and responses (4.74.0) and explicit enum numbers (4.76.0). Its scaffold pins match 4.73.1 (Arc 22.68.0, Chronicle 19.45.0, frontend pins); `Directory.Packages.props` takes Scene 4.21.0 |
25
+ | Screenplay.Generation / CritterStack / Prologue bundled by CLI | **0.18.0 / 0.24.0 / 2.0.0** | CLI `v3.53.1:Directory.Packages.props`. Latest released: Generation 0.18.1, CritterStack 0.26.0, Prologue 2.0.0 (no release after 2.0.0); the newer Generation and CritterStack releases are not in a cli |
24
26
  | Cratis.Arc.Screenplay bundled by CLI | **22.54.0** | Same file; this is the generator package, not a blanket rendered-app dependency pin |
25
27
  | Chronicle / Fundamentals bundled by CLI | **19.32.0 / 7.22.8** | Same file |
26
- | Latest Arc / Chronicle / Fundamentals released when this was checked | **22.72.0 / 19.50.0 / 7.23.0** | Released tags; newer than the CLI bundle and than Stage's scaffold. Arc 22.72.0 and later run a reactor returning events and commands (absent through 22.71.0); the Stage 4.73.1 scaffold pins Arc 22.68.0, whose command handler accepts a collection only when every element is a command, so a rendered app needs a proven dependency override to 22.72.0 or later |
27
- | Stage 4.73.1 rendered backend and frontend | **Arc 22.68.0 / Chronicle 19.45.0**; Components 4.26.2, Scene 4.21.0, `@cratis/arc` 22.58.2, Fundamentals 7.22.8 | Stage `v4.73.1:Source/Rendering.Cratis/Scaffolding/CratisBackendApplicationScaffoldProfile.cs` and `CratisFrontendPackageSet.cs` (`Current`); not the latest releases and not bumped by hand |
28
+ | Latest Arc / Chronicle / Fundamentals released when this was checked | **22.76.0 / 19.51.0 / 7.23.0** | Released tags; newer than the CLI bundle and than Stage's scaffold. Arc 22.72.0 and later run a reactor returning events and commands (absent through 22.71.0); the Stage 4.73.1 scaffold pins Arc 22.68.0, whose command handler accepts a collection only when every element is a command, so a rendered app needs a proven dependency override to 22.72.0 or later |
29
+ | Stage 4.73.1 rendered backend and frontend | **Arc 22.68.0 / Chronicle 19.45.0**; `@cratis/components` 4.26.2, `@cratis/scene.*` 4.21.0, `@cratis/arc` 22.58.2, Fundamentals 7.22.8 | Stage `v4.73.1:Source/Rendering.Cratis/Scaffolding/CratisBackendApplicationScaffoldProfile.cs` and `CratisFrontendPackageSet.cs` (`Current`); not the latest releases and not bumped by hand |
28
30
  | Historical Stage 4.51.3 rendered backend | **Arc 22.50.5 / Chronicle 19.32.0** | Stage `v4.51.3:Source/Rendering.Cratis/Scaffolding/CratisBackendApplicationScaffoldProfile.cs`; client/testing/image match; scaffold disables embedded reverse extraction |
29
31
 
32
+ Scene's family id denotes the six scaffold packages listed in
33
+ `cratis-stage-rendering-and-sandbox/references/rendered-application.md`, not a
34
+ package named `@cratis/scene`. The Components skills verify the latest 4.26.4
35
+ surface; that does not upgrade Stage's managed scaffold pin.
36
+
30
37
  The published `screenplay-contract.json` beside this reference is the machine-readable authority for PLAY codes, MCP tools and parameters, and standalone CLI commands/options. Its unchanged release bytes are pinned by `screenplay-contract.version` to the standalone version above. Before adding a claim, search this large JSON file by exact `code` in `diagnostics`, or by exact `name` in `mcpTools`/`cliCommands`, and inspect that object's retirement flag, parameters or options; do not load the full file into context. For example, search for `"code": "PLAY0029"` or `"name": "read-workspace"`; `screenplay-contract-exceptions.json` preserves explicitly reasoned historical statements, not current-release exceptions. Coverage gaps are mention inventories, not proof that a skill teaches a feature.
31
38
 
32
39
  Check the actual executable before relying on this table: `screenplay --version`,
@@ -46,7 +53,7 @@ or renderer probes below as results from the newer bundle.
46
53
 
47
54
  ## Two compilers, one rule
48
55
 
49
- Standalone Screenplay 4.139.0 and CLI 3.53.1's 4.137.0 bundle are different releases.
56
+ Standalone Screenplay 4.141.0 and CLI 3.53.1's 4.137.0 bundle are different releases.
50
57
  Prefer standalone for the current language checks; CLI owns generation, Prologue
51
58
  and rendering. Name the tool/version with every verdict. No verdict transfers
52
59
  between differing compilers without checking the same inputs there.
@@ -78,8 +85,8 @@ for identity-stable selection.
78
85
 
79
86
  ## Admission boundaries
80
87
 
81
- Screenplay `v4.139.0:Source/DotNET/Screenplay/Semantics/Versions.cs` supports
82
- schema pairs through v12. Admission selects by use:
88
+ Screenplay `v4.141.0:Source/DotNET/Screenplay/Semantics/Versions.cs` supports
89
+ schema pairs through v13. Admission selects by use:
83
90
 
84
91
  - v7: generated values/responses and policy negation.
85
92
  - v8: sources/streams and command/specification routes.
@@ -110,6 +117,14 @@ schema pairs through v12. Admission selects by use:
110
117
  with mismatched length, duplicates, non-int32 entries or positional numbers
111
118
  (non-canonical). Consumers must admit v12 explicitly. Authoring shipped in
112
119
  4.137.0 (decision 0065); syntax/example: command-surface `references/enum-numbers.md`.
120
+ - **Published v13 in 4.141.0:** concept `pii`/`secret`, personal qualifiers and
121
+ secret scopes bind as optional concept `compliance`. Unmarked models retain
122
+ their exact bytes/version/revision. Reference execution outcomes stay unchanged;
123
+ it proves no storage encryption or erasure. Enum/identity compliance and an
124
+ event combining personal or explicitly subject-scoped secret values with an
125
+ explicit `subject` mark refuse PLAY0268. See command-surface
126
+ `references/compliance.md` and Screenplay decision 0068. Stage 4.76.0 admits
127
+ only through v12; no current cli bundles this compiler or admits v13.
113
128
 
114
129
  Decision 0066 freezes a version when any exposing NuGet/npm package is published,
115
130
  including prereleases. Later byte-changing features take the next version at
@@ -157,7 +172,8 @@ The Stage skill teaches the version-gated examples.
157
172
 
158
173
  At 4.127.0, `$identity` aliases built-in caller paths; declared identity details
159
174
  remain metadata and their executable reads report PLAY0268. Bare `pii`/`secret`
160
- still block binding; `personal` aliases `pii`. Legacy markers are accepted with
175
+ bind as v13 on standalone 4.141.0, but still block binding on CLI 3.53.1's
176
+ 4.137.0 bundle; `personal` aliases `pii`. Legacy markers are accepted with
161
177
  PLAY0565 information, duplicates warn PLAY0653. Event `subject` and processing
162
178
  purposes are report-only metadata (PLAY0270); purpose checks/reports do not prove
163
179
  lawfulness or enforce retention. See command-surface context/compliance references.
@@ -10,7 +10,7 @@
10
10
  { "kind": "skill-contains", "value": "Composite read-model keys/query blocks are also still PLAY0268", "file": "references/versions.md" },
11
11
  { "kind": "skill-contains", "value": "the **whole source, stream and stream id**", "file": "references/production-routes-and-filters.md" },
12
12
  { "kind": "play-compiles" },
13
- { "kind": "skill-contains", "value": "4.139.0" },
13
+ { "kind": "skill-contains", "value": "4.141.0" },
14
14
  { "kind": "skill-contains", "value": "Published v12" },
15
15
  { "kind": "skill-contains", "value": "PLAY0671", "file": "references/diagnostics.md" },
16
16
  { "kind": "skill-contains", "value": "PLAY0653", "file": "references/diagnostics.md" },
@@ -35,6 +35,8 @@ Current pins: toolchain `references/versions.md`; UI statements were re-read at
35
35
  (`screens.md`, `contributions.md`, `forms.md`, `templates.md`, `ui-profile.md`, `fixtures/screen-release-ui.play`). Older provenance:
36
36
  `4.31.0` (original parser evidence), main `fd18129` (cancellation routing, `optional`), `4.66.0` (`c89198b`: `PLAY0269`).
37
37
 
38
+ Scene runtime sources: scaffold Scene tag, `Source/JavaScript/**`.
39
+
38
40
  The update follows `commands.md`, `events.md`, `queries.md` and decision 0023
39
41
  at that main commit (after v4.52.0). It does not verify UI rendering.
40
42
 
@@ -37,9 +37,10 @@ Keep those three lines separate in reports. Correct an old limitation only when
37
37
  the package/version you are using proves the new level. Historical verified vector:
38
38
  CLI 3.43.0 with its default `cratis/stage:4.52.0` and bundled Screenplay 4.127.0;
39
39
  the executed vector renders on Scene 4.15.0. Packages published since are newer than
40
- that vector and are not claimed verified: Scene 4.17.0, Screenplay 4.133.1, Stage
41
- 4.64.0, previous CLI 3.46.1 (bundled Screenplay 4.130.0; its then-default Stage was
42
- 4.52.0) and Studio 0.152.2. Current pins:
40
+ that vector and are not claimed browser-verified. Scene 4.17.0 was the earlier
41
+ source-checked runtime summary, not a new executed vector. Scene runtime capabilities
42
+ below were source-checked at the current scaffold's Scene tag; this does not
43
+ re-label the historical execution result. Current pins:
43
44
  `cratis-screenplay-toolchain/references/versions.md`.
44
45
  All three levels hold for the canonical `ScreenComposition` corpus on the historical vector:
45
46
 
@@ -238,11 +239,28 @@ when a single screen owns the button. A parameter that reads a selection is a ty
238
239
  data-context path). A dialog destination must state every input with a typed `with`/`parameter`
239
240
  binding; a runtime default is not an authored contract.
240
241
 
241
- What Scene 4.17 adds to the runtime side of this contract, so an agent knows what a
242
- destination can do once it is authored (authoring acceptance and executable
243
- admission are separate, see Support levels - a Scene release is not a Stage
244
- release):
245
-
242
+ Scene 4.21 runtime capabilities (source-checked at the Scene tag in the
243
+ scaffold pin table, not a browser run). Authoring acceptance, executable
244
+ admission and runtime support stay separate — a Scene release is not a Stage
245
+ release. Stage 4.73.1 pins that Scene release; never upgrade managed files by hand:
246
+
247
+ - **Hierarchy and routes.** `Screen.path` and `NavigationItem.hierarchy` carry
248
+ module/feature paths, outermost first. Browser/hash history
249
+ (`createBrowserSceneHistory`, `createHashSceneHistory`) supports deep links;
250
+ dialogs are history entries closed with `closeDialog(result)`.
251
+ - **Bindings.** Inputs publish a `value` output through `useValueOutput`;
252
+ command arguments resolve `component.<id>.<output>` through
253
+ `resolveArgumentSource`. `useBoundQuery` reruns on argument changes, aborts
254
+ prior runs and discards stale answers; clearing/failing removes old data.
255
+ - **Descriptors and packages.** Object descriptors carry nested `properties`
256
+ and `open`. `ApprovedPackageSet`, `loadApprovedPackages` and
257
+ `resolveApprovedPackageHost` align planning declarations with runtime bundles;
258
+ executable imports require host approval.
259
+ - **Master/detail.** The default blueprint supplies `MasterDetail`.
260
+ - **Core toolbar.** `core:toolbar` holds `core:toolbarItem` entries. Action items
261
+ announce `cratis.scene.command` with resolved parameters; Navigate/Dialog
262
+ items execute through the navigation host (or announce a navigation event
263
+ outside one). This is not a promise that the command executes without a host.
246
264
  - **Nested outlets.** A `core:outlet` component declares a named nested outlet on a
247
265
  screen. A destination into it opens its screen there and keeps the declaring
248
266
  screen on the page; the opened screen may declare outlets of its own, so
@@ -269,7 +287,7 @@ claim: confirm it from the render receipt and diagnostics before reporting it.
269
287
  ## Design-time generation results
270
288
 
271
289
  Design-time actions belong to component packages, not to the model and not to an
272
- agent. Scene 4.15 (unchanged in 4.17) declares them as data (`PackageDesignTimeMetadata`) and ships
290
+ agent. Scene 4.15 (re-verified at the current scaffold Scene tag) declares them as data (`PackageDesignTimeMetadata`) and ships
273
291
  their code in an optional design-time bundle; a runtime host that does not set
274
292
  `loadDesignTime` loads none of it, so nothing a design-time action does can exist
275
293
  only at runtime. The one Cratis action today is **Generate fields**
@@ -16,12 +16,14 @@ first.
16
16
 
17
17
  | Package | Version | Purpose |
18
18
  | --- | --- | --- |
19
- | `Cratis.Arc.Chronicle` | `22.16.0` | `[NotAudited]` in `Cratis.Arc.Chronicle.Commands`; the `ARCCHR0009` analyzer |
19
+ | `Cratis.Arc.Chronicle` | `22.75.0` | `[NotAudited]` in `Cratis.Arc.Chronicle.Commands`; the `ARCCHR0009` analyzer |
20
20
  | `Cratis.Chronicle` | `18.3.0` | `[PII]`, `[Subject]`, redaction, namespace isolation |
21
21
  | `Cratis.Chronicle` | `19.32.0` | `[Encrypted]` in `Cratis.Chronicle.ProtectedValues`; analyzers `CHR0052`, `CHR0053` |
22
- | `Cratis.Arc.Core` | `22.16.0` | Authorization filters, `CommandResult.Unauthorized` |
22
+ | `Cratis.Arc.Core` | `22.75.0` | Authorization filters, `CommandResult.Unauthorized` |
23
23
 
24
- > Re-verified at the versions above by **symbol and signature**: every type, attribute and member this skill names exists at that tag, and the public surface it describes is unchanged since the previous verification (Chronicle 16.45.x / Arc 22.10.4 — the Chronicle 16→18 client diff is converters, options and doc comments; no type was removed or renamed). Behavior claims were verified at the earlier tag unless a section says otherwise.
24
+ > Arc security boundaries rechecked at v22.75.0; every added check is cited in
25
+ > references/arc-boundaries.md. Arc depends on Chronicle 19.39.1; separately
26
+ > version-qualified Chronicle security claims retain their original verification.
25
27
 
26
28
  Reverify against the owning product repository before asserting a framework
27
29
  guarantee this file does not already state.
@@ -97,6 +99,10 @@ command's properties as well as grepping them.
97
99
  must not be able to assert who it is through a command property.
98
100
  - Note that an unauthorized command result maps to HTTP **403**, not 401 — a
99
101
  reviewer reading logs for 401s will miss authorization failures.
102
+ - Review [Arc-specific security boundaries](references/arc-boundaries.md) when
103
+ the diff touches hosting, identity, policies, discovery, streams or system actors.
104
+ It pins the checks to Arc v22.75.0; do not assume a clean analyzer run proves
105
+ those deployment boundaries.
100
106
 
101
107
  ## Step 4 — Data exposure
102
108
 
@@ -0,0 +1,59 @@
1
+ # Arc security checks
2
+
3
+ <!-- Copyright (c) Cratis. All rights reserved. -->
4
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
5
+
6
+ Verified at **Arc v22.75.0**. Each source below is pinned to that tag.
7
+
8
+ - Enable `TrustForwardedIdentityHeaders` only behind an authenticating ingress
9
+ that strips caller identity headers, replaces them and prevents direct backend
10
+ access. Headers are unsigned, not proof of identity. Without the explicit
11
+ host-wide opt-in Arc ignores them. Custom handlers must honor the same flag.
12
+ [Secure defaults](https://github.com/Cratis/Arc/blob/v22.75.0/Documentation/upgrading/secure-defaults.mdx).
13
+ - Application code must not read `.cratis-identity`. The backend derives identity
14
+ from the authenticated principal; the JS client only falls back to the legacy
15
+ cookie on 404, never on 401/403. Use `clearCache()` on logout. Browser identity
16
+ remains display state, not server authorization.
17
+ [Backend provider](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Identity/IdentityProvider.cs),
18
+ [JS provider](https://github.com/Cratis/Arc/blob/v22.75.0/Source/JavaScript/Arc/identity/IdentityProvider.ts).
19
+ - Test all discovery routes outside Development. Default access is authenticated
20
+ there, or 404 when the host cannot authenticate. Explicit
21
+ `RequireAuthentication=false` opens discovery in every environment;
22
+ `Enabled=false` removes catalogs, not identity discovery. Disable both switches
23
+ when neither is needed. `[ExcludeFromDiscovery]` hides documentation/catalogs,
24
+ not invocation or authorization.
25
+ [Introspection](https://github.com/Cratis/Arc/blob/v22.75.0/Documentation/backend/csharp/introspection/index.md).
26
+ - Check ARC0019/0020/0021: conflicting declarations, Microsoft attributes without
27
+ the ASP.NET integration, and schemes on the standalone host. Microsoft
28
+ `[Authorize]` is enforced only by the ASP.NET host; policies/schemes fail closed
29
+ on supported hosts. A method declaration **replaces** the type declaration.
30
+ Guest access requires every policy in the declaration to opt in
31
+ (`evaluatesAnonymous`), without roles/schemes. Since 22.44.2 guest endpoints are
32
+ reachable through HTTP even with an authenticated fallback policy. Keep an
33
+ intentional `IFallbackAuthorizationEvaluator` baseline; it is separate from
34
+ ASP.NET's `FallbackPolicy`.
35
+ [Authorization descriptors](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core.CodeAnalysis/DiagnosticDescriptors.cs),
36
+ [guest endpoint specs](https://github.com/Cratis/Arc/tree/v22.75.0/Source/DotNET).
37
+ - The embedded `/.cratis/event-model` viewer defaults to Debug **and** Development.
38
+ Explicit `Enabled=true` overrides that default: check that deployed hosts have
39
+ not enabled it, rather than claiming Production can never map it.
40
+ [Exposure implementation](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Screenplay.Embedded/Hosting/EventModelViewerExposure.cs).
41
+ - Generated identifiers are not secrets, authorization proofs or idempotency
42
+ keys. [Generated values](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Commands/ModelBound/GeneratedValueAttribute.cs).
43
+ - Arc telemetry records type/name/outcome metadata and correlation/tenant ids,
44
+ not command/query/event payload values or validation/exception messages. Do not
45
+ widen it with sensitive payloads or mistake this for a promise of no ids.
46
+ [Telemetry names](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/WellKnownTelemetryNames.cs).
47
+ - Returned reactor commands marked `[ExecuteCommandsAsSystem]` use a narrow
48
+ disposed system scope. The caller-principal leak before 22.72.0 is fixed;
49
+ manually executing commands still needs explicit actor ownership.
50
+ [Executor](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Chronicle/Reactors/CommandSideEffectExecutor.cs).
51
+ - Revocable observable data needs `IGuardObservableQueryEmission`; it applies to
52
+ plain HTTP snapshots/waits/long polls too. Suppression withholds data; denial
53
+ terminates/returns unauthorized. Never read the producer's ambient principal.
54
+ [HTTP processing](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/ObservableQueryHttp.cs).
55
+ - Query health remains explicitly anonymous and returns connection health. Audit
56
+ exposure of connection user ids (tracked by Arc#2873), not just catalogs:
57
+ discovery restrictions are not blanket protection of `/.cratis/*`.
58
+ [QueryHealth](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/QueryHealth.cs),
59
+ [subscription client UserId](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/QuerySubscriptionClientInfo.cs).
@@ -39,6 +39,13 @@ In a language without those analyzers the same rules hold; the reviewer enforces
39
39
  them instead of the compiler. Reverify against the owning product repository
40
40
  before claiming behavior for another version.
41
41
 
42
+ The `Cratis.Synopsis.Tool` dotnet tool (verified at `v1.1.3`) reads these
43
+ names statically, never running code, and writes one HTML or JSON behavior
44
+ document from C#, TypeScript, Gherkin and Screenplay specifications:
45
+ `dotnet tool install --global Cratis.Synopsis.Tool`, then `synopsis . --open`
46
+ (or `synopsis . --format both --output Artifacts/synopsis.html`). Good names are
47
+ the documentation it produces.
48
+
42
49
  ## Route near misses
43
50
 
44
51
  - Writing the C# mechanics — the `Specification` base, `Establish`/`Because`,
@@ -12,14 +12,21 @@ Specifications are executable documentation. The folder tree reads like a table
12
12
  of contents, and each file states one setup, one action, and one or more
13
13
  focused assertions.
14
14
 
15
+ Read [query and decision scenarios](../cratis-application-slice-specifications/references/query-and-decision-scenarios.md)
16
+ when specifying query emissions, routed conflicts or protected projection reads.
17
+ Call `UseDecisionReads()` before seeding actual events; pinned models cannot
18
+ supply a guard. `Perform`/`Observe` need configured services/principal, and
19
+ MongoDB observations still need real infrastructure.
20
+
15
21
  ## Verified product sources
16
22
 
17
23
  This skill is verified against these exact public releases:
18
24
 
19
25
  | Package | Version | Purpose |
20
26
  | --- | --- | --- |
21
- | `Cratis.Specifications` | `4.1.1` | `Specification` base, `Catch.Exception`, `ShouldXxx` assertions |
22
- | `Cratis.Arc.Testing` | `22.16.0` | `CommandScenario<TCommand>` and `CommandResult` assertions |
27
+ | `Cratis.Specifications.XUnit` | `4.1.1` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions, optional shared lifecycle |
28
+ | `Cratis.Specifications` | `4.1.1` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit package) |
29
+ | `Cratis.Arc.Testing` | `22.76.0` (caller registrations); `22.75.0` (other scenario assertions) | `CommandScenario<TCommand>` preserves explicit principal/override/policy services from 22.75.1; see application-scenarios |
23
30
  | `Cratis.Chronicle.Testing` | `18.3.0` | `EventScenario`, `ReadModelScenario<T>`, `ReactorScenario<T>` |
24
31
 
25
32
  Reactor read-model seeding/absence, synchronous handler exceptions and the
@@ -27,8 +34,13 @@ Reactor read-model seeding/absence, synchronous handler exceptions and the
27
34
  and require **19.46.0+**; see the ReactorScenario section in
28
35
  [application-scenarios.md](references/application-scenarios.md).
29
36
 
37
+ Per-context in-process MongoDB host isolation is verified at
38
+ `Cratis.Chronicle.XUnit.Integration` **19.51.0** (`ChronicleFixture.cs`,
39
+ `ChronicleClientFixture.cs`, `MongoDBContextStorage.cs`); it is opt-in and does
40
+ not isolate out-of-process/remote kernels. See [integration-specs.md](references/integration-specs.md).
41
+
30
42
  Generated-value scenario pinning is verified separately against
31
- `Cratis.Arc.Testing` **22.68.0** (introduced in **22.67.0**).
43
+ `Cratis.Arc.Testing` **22.75.0** (introduced in **22.67.0**).
32
44
 
33
45
  Reverify against the owning product repository before claiming support for
34
46
  another version. Never translate an assertion or helper name from memory.
@@ -61,6 +73,7 @@ another version. Never translate an assertion or helper name from memory.
61
73
  | Pure `Handle()` / `Handle(providedValue)`, reducer logic or reactor decision (default) | Plain method call with `Specification` |
62
74
  | Isolated class, collaborators can be substituted | `Specification` + NSubstitute |
63
75
  | Arc command pipeline (validators, `Provide()`, `Handle()`, appended events) | `CommandScenario<TCommand>` |
76
+ | Arc query conversion, validation, authorization and interceptors | `QueryScenario<TReadModel>` (`Cratis.Arc.Testing.Queries`) |
64
77
  | Chronicle append semantics, constraints, concurrency | `EventScenario` |
65
78
  | Projection or reducer state from a sequence of events | `ReadModelScenario<TReadModel>` |
66
79
  | Reactor invocation and its side effects | `ReactorScenario<TReactor>` |
@@ -76,11 +89,10 @@ one. Out-of-process integration specifications are an advanced case reserved for
76
89
  boundaries the scenario helpers cannot reach — see
77
90
  [integration-specs.md](references/integration-specs.md).
78
91
 
79
- > **Validator state can be order-sensitive.** The command-scenario pipeline can
80
- > cache enough state that injected-validator branches depend on execution order
81
- > when xUnit runs classes in parallel. Use `CommandScenario` for the valid path,
82
- > test rejected state variants by instantiating the validator directly, and only
83
- > for that case put the command's specifications in a small xUnit `[Collection]`.
92
+ > **Historical validator-state order-sensitivity:** observed at 22.16-era Arc.
93
+ > Process-wide provider replacement was fixed in 22.23.2; later releases isolated
94
+ > scenario stores/services. Reproduce at 22.75.0 before applying the old
95
+ > direct-validator/small `[Collection]` workaround; it is not verified here.
84
96
 
85
97
  ⚠️ `EventScenario` wires a strategy that always answers `ConcurrencyScope.None`,
86
98
  which the validator skips, so an append that lets the strategy choose the scope
@@ -96,7 +108,13 @@ build it, even if passive. Missing setup throws
96
108
  resolved read-model key. See the ReactorScenario reference for diagnostics,
97
109
  exception capture and UTC occurrence-time defaults.
98
110
 
99
- Specification projects are named `<Source>.Specs` and run on xUnit.
111
+ Specification projects are named `<Source>.Specs`. Add a `PackageReference` to
112
+ `Cratis.Specifications.XUnit` 4.1.1, not just `Cratis.Specifications`; the C#
113
+ namespace stays `Cratis.Specifications`. The house runner is xUnit **2.x**
114
+ (2.9.3 at this tag), not xUnit v3. Supported targets are net8.0/net9.0/net10.0;
115
+ net48 was dropped in 4.0.0 (retain 3.x for that target).
116
+ `Cratis.Specifications.NUnit` 4.0.0+ is an alternative with the same base pattern,
117
+ `[Test]` instead of `[Fact]`, and **public** test methods.
100
118
 
101
119
  ### Pin server-generated Handle values
102
120
 
@@ -182,11 +200,17 @@ public class when_<behavior> : Specification
182
200
  leave no blank line between `should_` methods.
183
201
  - Fields are `private` in a concrete specification and `protected` in a `given/`
184
202
  context, named `_camelCase`.
185
- - Any phase may be `async Task`. `void Destroy()` is the optional teardown.
203
+ - Any phase may be `async Task`. `void Destroy()` is optional teardown, after
204
+ each fact by default; once per eligible class with the shared lifecycle opt-in.
186
205
 
187
- `Cratis.Specifications` discovers `Establish`, `Because`, and `Destroy` by
206
+ `Cratis.Specifications.XUnit` discovers `Establish`, `Because`, and `Destroy` by
188
207
  convention — there are no attributes on them.
189
208
 
209
+ Keep the stock per-fact lifecycle by default. Read
210
+ [shared-lifecycle.md](references/shared-lifecycle.md) when deliberately opting
211
+ into one instance and one Establish/Because execution per specification class.
212
+ Facts must not mutate that shared context.
213
+
190
214
  ## Step 4 — Extract a reusable context
191
215
 
192
216
  When several specifications share setup, layer it under `given/`:
@@ -272,6 +296,14 @@ between collaborators. That is where defects hide.
272
296
 
273
297
  ## Verify
274
298
 
299
+ CRSPEC0001–CRSPEC0007 ship as **warnings** in `Cratis.Specifications`, `.XUnit`,
300
+ and `.NUnit` 4.0.0+. A warnings-as-errors build enforces them: `should_` names,
301
+ one specification per file (given contexts exempt), no facts on given contexts,
302
+ test attributes on `should_` methods, no explicit base lifecycle calls, public
303
+ specification classes, and no `Because` on given contexts. See
304
+ `cratis-specification-by-example` for the diagnostic-by-diagnostic checklist.
305
+ Do not suppress these warnings to pass the gate.
306
+
275
307
  - Every specification file states one `Establish`, one `Because`, and one or
276
308
  more `should_` facts.
277
309
  - `Because()` appears only in concrete specifications, never in a `given/`
@@ -15,12 +15,17 @@ validation, constraints or projections matter; a pure decision (`Handle()`,
15
15
  call. A library or framework repository reaches for a scenario only to test the
16
16
  very engine it provides.
17
17
 
18
- Verified against `Cratis.Arc.Testing` `22.16.0` and `Cratis.Chronicle.Testing`
19
- `18.3.0`.
18
+ Arc scenarios verified at **v22.75.0** (Chronicle dependency 19.39.1).
19
+ Separate Chronicle-only scenario claims retain their version-qualified sources.
20
+ Read [query and decision scenarios](../../cratis-application-slice-specifications/references/query-and-decision-scenarios.md)
21
+ when using `QueryScenario<T>`, buffered emissions or `UseDecisionReads()`.
22
+ Guarded decisions need actual seeded events, not pinned models; their given
23
+ state and appends share one in-process log, unlike legacy dictionary seeding.
20
24
 
21
25
  | Helper | Exercises | Use for |
22
26
  | --- | --- | --- |
23
27
  | `CommandScenario<TCommand>` | Authorization, validators, `Provide()`, `Handle()`, appended events | State Change behavior |
28
+ | `QueryScenario<TReadModel>` | Argument conversion, authorization, validation, interceptors and buffered observations | Query pipeline behavior |
24
29
  | `EventScenario` | Chronicle append semantics without the command pipeline | Constraints, raw sequencing, concurrency |
25
30
  | `ReadModelScenario<TReadModel>` | Projection or reducer state from a sequence of events | State View behavior |
26
31
  | `ReactorScenario<TReactor>` | Reactor invocation and its side effects | Automation and Translation behavior |
@@ -85,10 +90,17 @@ from `Cratis.Arc.Chronicle.Testing`.
85
90
  pass against a read-model shape the projection never produces.
86
91
  - **Validator and `Provide()` dependencies** are registered in
87
92
  `_scenario.Services`; the concrete validator is discovered automatically.
93
+ - **Caller setup (Arc 22.75.1+, re-verified at 22.76.0):** register a substituted
94
+ `ICurrentPrincipalAccessor`, `ICurrentPrincipalOverride` or
95
+ `IAuthorizationPolicyRuntime` in `Services` before first execution. The scenario
96
+ preserves these registrations instead of replacing them with Arc defaults,
97
+ so role/policy success and denial specs run as the caller you supplied.
98
+ Source: `Testing/ScenarioServices.cs` and `Testing/Commands/CommandScenario.cs`
99
+ under `Source/DotNET/`.
88
100
 
89
101
  ### Pin generated values
90
102
 
91
- Verified at **Arc v22.68.0**, available in `Cratis.Arc.Testing` **22.67.0+**.
103
+ Verified at **Arc v22.75.0**, available in `Cratis.Arc.Testing` **22.67.0+**.
92
104
  For the `AllocateCartId` command from `cratis-arc-command`, whose
93
105
  `Handle([GeneratedValue("cart")] CartId cartId)` returns that id, specify the
94
106
  pipeline with a known concept pin. Import `Cratis.Arc.Commands` and
@@ -153,7 +165,7 @@ public class and_value_is_pinned : Specification
153
165
  A direct-call decision spec supplies the known argument to `Handle()` itself.
154
166
 
155
167
  Guide: [Pin generated values in command specs](/arc/backend/csharp/testing/generated-values/).
156
- Source: **Arc v22.68.0**, `Source/DotNET/Testing/Commands/CommandScenarioGeneratedValueExtensions.cs`,
168
+ Source: **Arc v22.75.0**, `Source/DotNET/Testing/Commands/CommandScenarioGeneratedValueExtensions.cs`,
157
169
  `ScenarioGeneratedValueFixture.cs`, `ScenarioGeneratedValues.cs` and
158
170
  `GeneratedValuesCommandScenarioExtender.cs`;
159
171
  `Source/DotNET/Testing.Specs/Commands/for_CommandScenario/generated_values/when_pinning_a_value.cs`.
@@ -11,8 +11,9 @@
11
11
  - One outcome per file
12
12
 
13
13
  Detail for the plain `Cratis.Specifications` surface: phases, substitution,
14
- assertions, and exception capture. Verified against `Cratis.Specifications`
15
- `4.1.1` and NSubstitute as consumed by that package.
14
+ assertions, and exception capture. Verified against `Cratis.Specifications.XUnit`
15
+ `4.1.1` (base and assertions) and its `Cratis.Specifications` dependency (`Catch`).
16
+ NSubstitute is a separate collaborator-substitution dependency.
16
17
 
17
18
  ## Phases
18
19
 
@@ -21,7 +22,7 @@ assertions, and exception capture. Verified against `Cratis.Specifications`
21
22
  | `void Establish()` | Setup, before `Because()` | One per class in the chain, run base-first. Never call `base.Establish()` |
22
23
  | `void Because()` | The single action under test | Only in a concrete specification, never in a `given/` context |
23
24
  | `[Fact] void should_*()` | One assertion per fact | Expression-body form, no blank lines between facts |
24
- | `void Destroy()` | Teardown after each specification | Optional |
25
+ | `void Destroy()` | Teardown after each fact by default | Optional; once per eligible class with [shared lifecycle](shared-lifecycle.md) |
25
26
 
26
27
  Every phase may be `async Task`.
27
28
 
@@ -91,7 +92,7 @@ _<collaborator>.<Method>(Arg.Any<<ArgumentType>>())
91
92
 
92
93
  ## Assertion extension methods
93
94
 
94
- From `Cratis.Specifications`:
95
+ From the `Cratis.Specifications.XUnit` package, namespace `Cratis.Specifications`:
95
96
 
96
97
  | Method | Example |
97
98
  | --- | --- |
@@ -103,6 +104,16 @@ From `Cratis.Specifications`:
103
104
  | `.ShouldContainOnly(items)` | `_items.ShouldContainOnly(<expectedItems>)` |
104
105
  | `.ShouldBeOfExactType<T>()` | `_event.ShouldBeOfExactType<<EventType>>()` |
105
106
  | `.ShouldBeGreaterThan(n)` / `.ShouldBeLessThan(n)` | `_count.ShouldBeGreaterThan(0)` |
107
+ | `.ShouldNotEqual(expected)` | Value inequality |
108
+ | `.ShouldBeSame(expected)` / `.ShouldNotBeSame(expected)` | Reference identity |
109
+ | `.ShouldMatch(Func<T, bool>)` | Value predicate |
110
+ | `.ShouldBeInRange(low, high)` | Inclusive range |
111
+ | `.ShouldBeGreaterThanOrEqual(n)` / `.ShouldBeLessThanOrEqual(n)` | Inclusive comparison |
112
+ | `.ShouldContainSingleItem()` / `.ShouldEachConformTo(predicate)` | Collection cardinality / each-item predicate |
113
+ | Collection `.ShouldEqual(IEnumerable<T>)` | Ordered sequence equality |
114
+ | Collection `.ShouldContain(Predicate<T>)` | At least one matching item |
115
+ | `.ShouldBeAssignableFrom<T>()` | Actual object is assignable to T |
116
+ | String `.ShouldContain(substring, StringComparison)` | Explicit string comparison |
106
117
 
107
118
  Assert on values and types. Do not assert on presentation message strings by
108
119
  default; assert exact text only when that wording is the specified behavior,
@@ -121,7 +132,9 @@ async Task Because() => _error = await Catch.Exception(_<sut>.<Action>);
121
132
  ```
122
133
 
123
134
  Use `Catch.Exception` rather than a `try`/`catch` in `Because()`; the captured
124
- exception is the outcome the facts assert on.
135
+ exception is the outcome the facts assert on. Overloads accept `Action` and
136
+ `Func<Task>`; `Catch.Exception<T>(Action)` captures only T and lets other
137
+ exception types propagate.
125
138
 
126
139
  ## Usings
127
140
 
@@ -7,6 +7,7 @@
7
7
  - Command execution overloads
8
8
  - Assertion helpers
9
9
  - Asynchronous follow-ups
10
+ - In-process MongoDB context isolation (19.51.0)
10
11
  - Rules
11
12
 
12
13
  Reserve these for the host, transport, serialization, or real-infrastructure
@@ -125,6 +126,26 @@ void Destroy() => _collector.Dispose();
125
126
  `IEventAppendCollection` is part of the Chronicle testing API. The timeout is a
126
127
  deadline, not a sleep — it turns a hang into a named failure.
127
128
 
129
+ ## In-process MongoDB context isolation (19.51.0)
130
+
131
+ For an **in-process MongoDB** suite using `Cratis.Chronicle.XUnit.Integration`,
132
+ override `ChronicleFixture.UsesPerContextMongoDBHost` to return `true`. It defaults
133
+ to `false`: consumers otherwise retain shared-host behavior. Each context gets a
134
+ fresh host and unique database prefix, so writes flushed by an earlier host after
135
+ shutdown cannot alter the next context's events or projections.
136
+
137
+ The default storage configuration applies the prefix. If your client fixture
138
+ overrides `GetStorageConfigurator`, pass its `DatabaseNamePrefix` to `WithMongoDB`
139
+ as `databaseNamePrefix`. Context teardown awaits host disposal without wiping its
140
+ databases in place; collection teardown drops only prefixes it issued. Starting
141
+ one host per context costs time. This does not isolate out-of-process or remote
142
+ kernels, which retain kernel reset.
143
+
144
+ Source-verified at Chronicle `v19.51.0:Source/Clients/XUnit.Integration/ChronicleFixture.cs`,
145
+ `ChronicleClientFixture.cs`, `MongoDBContextStorage.cs`,
146
+ `ChronicleOrleansInProcessWebApplicationFactory.cs`, and
147
+ `Documentation/contributing/integration-tests.md` (per-context storage isolation).
148
+
128
149
  ## Rules
129
150
 
130
151
  - `context` is an inner `public class` inheriting `given.an_http_client(fixture)`.
@@ -0,0 +1,34 @@
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
3
+
4
+ # Optional shared xUnit lifecycle
5
+
6
+ Verified against `Cratis.Specifications.XUnit` 4.1.1,
7
+ `SpecificationTestFramework.cs`, `SpecificationTestClassRunner.cs`, and
8
+ `Specification.cs`. Introduced in 4.1.0. The house default remains stock xUnit
9
+ per-fact execution.
10
+
11
+ ## Opt in
12
+
13
+ Add this assembly attribute to the specification project:
14
+
15
+ ```csharp
16
+ // Copyright (c) Cratis. All rights reserved.
17
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
18
+
19
+ [assembly: Xunit.TestFramework("Cratis.Specifications.SpecificationTestFramework", "Cratis.Specifications.XUnit")]
20
+ ```
21
+
22
+ For eligible classes, construction, `Establish`, and `Because` happen once.
23
+ All facts share the instance; `Destroy` runs once after the last fact, including
24
+ when initialization failed. A throwing `Establish` or `Because` fails every fact
25
+ in that class. Facts must only assert, never mutate shared context.
26
+
27
+ A class is eligible only when it derives from `Specification`, has a single
28
+ public parameterless constructor, does not implement `IDisposable`, and has only
29
+ plain facts. Theories, custom fact test cases, fixture/output-helper constructors,
30
+ and plain xUnit classes keep the stock per-fact lifecycle. This is not xUnit v3
31
+ support; the package uses xUnit 2.x.
32
+
33
+ `Specification.InitializeAsync()` is idempotent for a single instance. It does
34
+ not make an ineligible class shared or cache instances across classes.
@@ -0,0 +1,13 @@
1
+ {
2
+ "skill": "cratis-specifications-csharp",
3
+ "input": "Set up a C# specification project and choose its lifecycle.",
4
+ "fixtures": [],
5
+ "assertions": [
6
+ { "kind": "skill-contains", "value": "Cratis.Specifications.XUnit" },
7
+ { "kind": "skill-contains", "value": "xUnit **2.x**" },
8
+ { "kind": "skill-contains", "value": "stock per-fact lifecycle by default" },
9
+ { "kind": "skill-contains", "value": "shared-lifecycle.md" },
10
+ { "kind": "skill-contains", "value": "CRSPEC0001–CRSPEC0007" },
11
+ { "kind": "skill-contains", "value": "Do not suppress these warnings" }
12
+ ]
13
+ }
@@ -14,7 +14,9 @@ base: setup is separated from the action, and each `it()` verifies one outcome.
14
14
 
15
15
  ## Verified product sources
16
16
 
17
- This skill is verified against the frameworks these specifications run on:
17
+ Helper and setup patterns are verified against Fundamentals **v7.23.0**
18
+ (`for_JsonSerializer/given/given.ts`, `vitest.setup.ts`) and Arc **v22.75.0**
19
+ (`Source/JavaScript/Arc/given.ts`). The execution stack is:
18
20
 
19
21
  | Framework | Role |
20
22
  | --- | --- |
@@ -23,10 +25,17 @@ This skill is verified against the frameworks these specifications run on:
23
25
  | Chai | Assertions, always through the `.should` fluent interface |
24
26
  | Sinon | Stubbing and call verification |
25
27
 
26
- The `given()` helper is supplied by the Cratis TypeScript package under
27
- specification and is imported from that package root. Reverify the helper's
28
- location and signature against the owning repository before relying on a
29
- different import path.
28
+ `given()` is a small **local file** inside the package under specification, not
29
+ a published package export. Import it with a relative path to that file; create
30
+ it if absent. Fundamentals constructs a parameterless context; Arc passes the
31
+ Mocha `Suite` to the context constructor and binds the callback's `this` to it.
32
+ Match the owning package's helper signature rather than assuming one import path.
33
+
34
+ Configure Vitest to load a setup file that calls `chai.should()` and registers
35
+ `sinon-chai` and `chai-as-promised`; otherwise `.should` is undefined or plugin
36
+ assertions are unavailable. Load the reflection polyfill when specifying
37
+ metadata-dependent code (Fundamentals' setup imports its local `reflection`
38
+ entry). The Specifications repository publishes no TypeScript helper.
30
39
 
31
40
  ## Route near misses
32
41