@cratis/pi 7.34.0 → 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 (241) 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/slice-delivery-checklist.md +1 -1
  148. package/package/corpus/skills/cratis-chronicle-reactor/references/specifications.md +20 -1
  149. package/package/corpus/skills/cratis-chronicle-read-model/SKILL.md +2 -2
  150. package/package/corpus/skills/cratis-chronicle-read-model/references/queries.md +35 -16
  151. package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +15 -3
  152. package/package/corpus/skills/cratis-chronicle-reducer/SKILL.md +23 -4
  153. package/package/corpus/skills/cratis-chronicle-web-workbench/SKILL.md +40 -15
  154. package/package/corpus/skills/cratis-cli-terminal-workbench/SKILL.md +20 -6
  155. package/package/corpus/skills/cratis-code-review/SKILL.md +25 -3
  156. package/package/corpus/skills/cratis-components-accessibility/SKILL.md +20 -4
  157. package/package/corpus/skills/cratis-components-schema-editor/SKILL.md +40 -28
  158. package/package/corpus/skills/cratis-components-schema-editor/references/tree-layout.md +62 -0
  159. package/package/corpus/skills/cratis-components-schema-editor/verification.json +14 -0
  160. package/package/corpus/skills/cratis-components-stepper-command-dialog/SKILL.md +16 -8
  161. package/package/corpus/skills/cratis-components-styling/SKILL.md +57 -20
  162. package/package/corpus/skills/cratis-components-styling/verification.json +13 -0
  163. package/package/corpus/skills/cratis-components-toolbar/SKILL.md +37 -7
  164. package/package/corpus/skills/cratis-components-toolbar/verification.json +12 -0
  165. package/package/corpus/skills/cratis-engineering-csharp-conventions/SKILL.md +6 -0
  166. package/package/corpus/skills/cratis-engineering-csharp-conventions/references/exceptions-logging-and-di.md +5 -3
  167. package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +19 -6
  168. package/package/corpus/skills/cratis-fundamentals-concept/references/typescript-concepts.md +97 -0
  169. package/package/corpus/skills/cratis-fundamentals-concept/verification.json +4 -1
  170. package/package/corpus/skills/cratis-fundamentals-concept-go/SKILL.md +112 -0
  171. package/package/corpus/skills/cratis-fundamentals-type-discovery/SKILL.md +54 -17
  172. package/package/corpus/skills/cratis-fundamentals-type-discovery/verification.json +14 -0
  173. package/package/corpus/skills/cratis-lens-browser-extension/SKILL.md +55 -28
  174. package/package/corpus/skills/cratis-performance-review/SKILL.md +5 -2
  175. package/package/corpus/skills/cratis-release-notes/SKILL.md +3 -1
  176. package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +5 -4
  177. package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +1 -1
  178. package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +1 -1
  179. package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -6
  180. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +25 -7
  181. package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +4 -2
  182. package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -1
  183. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +4 -3
  184. package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +1 -1
  185. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +2 -2
  186. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +3 -2
  187. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +34 -4
  188. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +5 -3
  189. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
  190. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +4 -2
  191. package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +42 -3
  192. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -1
  193. package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +2 -2
  194. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +6 -6
  195. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +1 -1
  196. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -4
  197. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
  198. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
  199. package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +1 -1
  200. package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
  201. package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +2 -2
  202. package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
  203. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +48 -0
  204. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +3 -1
  205. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +7 -5
  206. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +2 -2
  207. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
  208. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +5 -4
  209. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +8 -6
  210. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
  211. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -2
  212. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
  213. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +16 -11
  214. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -5
  215. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1329 -32
  216. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  217. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +2 -2
  218. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -7
  219. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
  220. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +2 -0
  221. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +27 -9
  222. package/package/corpus/skills/cratis-security-review/SKILL.md +9 -3
  223. package/package/corpus/skills/cratis-security-review/references/arc-boundaries.md +59 -0
  224. package/package/corpus/skills/cratis-specification-by-example/SKILL.md +7 -0
  225. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +43 -11
  226. package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +16 -4
  227. package/package/corpus/skills/cratis-specifications-csharp/references/csharp-patterns.md +18 -5
  228. package/package/corpus/skills/cratis-specifications-csharp/references/integration-specs.md +21 -0
  229. package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +34 -0
  230. package/package/corpus/skills/cratis-specifications-csharp/verification.json +13 -0
  231. package/package/corpus/skills/cratis-specifications-typescript/SKILL.md +14 -5
  232. package/package/corpus/skills/cratis-specifications-typescript/verification.json +12 -0
  233. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +11 -5
  234. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +7 -4
  235. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +10 -1
  236. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/scene-runtime.md +75 -0
  237. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +6 -1
  238. package/package/corpus/skills/cratis-studio-mcp-safety-guidance/SKILL.md +14 -1
  239. package/package/profile-catalog.json +68 -1
  240. package/package.json +1 -1
  241. package/src/index.ts +3 -1
@@ -18,7 +18,7 @@ removing one becomes a single-file change.
18
18
 
19
19
  | Package | Version | Purpose |
20
20
  | --- | --- | --- |
21
- | `Cratis.Fundamentals` | `7.19.2` | `IInstancesOf<T>`, `IImplementationsOf<T>`, `[Singleton]`, `[Scoped]`, `[IgnoreConvention]`, the convention bindings |
21
+ | `Cratis.Fundamentals` | `7.23.0` | `IInstancesOf<T>`, `IImplementationsOf<T>`, `ITypes`, convention bindings and the bundled `Cratis.Fundamentals.TypeDiscovery.Generator` |
22
22
 
23
23
  Reverify against the Cratis Fundamentals repository before claiming support for
24
24
  another version.
@@ -47,15 +47,31 @@ registered implementation:
47
47
 
48
48
  ## Step 1 — Confirm the implementations are discoverable
49
49
 
50
- `IInstancesOf<T>` finds types by convention across the loaded assemblies. The
51
- requirements are only:
52
-
53
- - Each implementation is a non-abstract, non-interface class. Discovery reads each assembly's `DefinedTypes` and filters only on `!IsInterface && !IsAbstract`, so an `internal` class is discovered too; `public` is a convention for a type meant to be reached from another assembly, not a discovery requirement. Instances are resolved from the service provider (`GetService(type)`), so each implementation must be registered as itself — `AddSelfBindings()` does that for every concrete, non-static, non-`Exception` class whose constructor is resolvable (visibility is not a criterion), honoring `[Singleton]`/`[Scoped]`/`[IgnoreConvention]`.
54
- - It implements the interface directly, not through a layer that hides it.
55
- - `T` is an interface or abstract class — the interface is declared
56
- `where T : class`.
57
-
58
- No assembly attribute and no registration call is needed.
50
+ Discovery normally uses compile-time generated providers, not a walk of
51
+ `DefinedTypes`. Reflection is the fallback when no generated providers exist.
52
+
53
+ - Use concrete, non-generic implementations. Generated contract maps exclude
54
+ open-generic implementors. An assembly's own provider can include its internal
55
+ types; references emitted from another assembly require public types.
56
+ - `T` is an interface or abstract class (`where T : class`).
57
+ - Instances resolve by concrete type, so each implementation needs a self-binding.
58
+ `AddSelfBindings()` honors `[Singleton]`, `[Scoped]`, and `[IgnoreConvention]`;
59
+ it excludes static/abstract/interface/exception types, System/Microsoft
60
+ namespaces, and classes with primitive or record-typed constructor parameters.
61
+ `IFoo → Foo` bindings require matching names in the same namespace and exactly
62
+ one implementation; they do not replace self-bindings for a discovered set.
63
+
64
+ The host must call `services.AddTypeDiscovery()` to register `ITypes`,
65
+ `IInstancesOf<>`, and `IImplementationsOf<>`, plus the convention binding setup.
66
+ Arc's `AddCratisArc` does this (verified at Arc v22.75.0); a plain host must do it.
67
+ No per-implementation registration is needed when self-binding applies.
68
+
69
+ The Fundamentals NuGet package carries the generator as an analyzer. A project
70
+ reference does **not** carry it: reference the generator explicitly, otherwise
71
+ only Fundamentals' own provider may contribute. A captured `ITypes` universe
72
+ never gains late-loaded assemblies. `AddTypeDiscovery()` reuses the default
73
+ universe while the provider set is unchanged; a later call rebuilds it if new
74
+ providers registered, without changing earlier consumers.
59
75
 
60
76
  ## Step 2 — Choose the lifetime with an attribute
61
77
 
@@ -106,10 +122,14 @@ public class ReportFormatters(IInstancesOf<IReportFormatter> formatters) : IRepo
106
122
 
107
123
  `IInstancesOf<T>` implements `IEnumerable<T>`, so LINQ works on it directly.
108
124
 
109
- **It resolves an instance from the service provider on every enumeration**, not
110
- once at construction. That is what makes a scoped or transient implementation
111
- behave correctly, and it is why materializing with `.ToArray()` is worth doing
112
- only when you genuinely need a stable snapshot within one operation.
125
+ **The type set is fixed at construction; instances resolve on every enumeration**
126
+ through the service provider captured by `InstancesOf<T>`. The consumer's scope
127
+ therefore matters: the singleton above is safe only when no implementation is
128
+ scoped. A singleton captures the root provider and would make a scoped
129
+ implementation captive or fail scope validation. Use a scoped or transient
130
+ consumer resolved inside a scope when any implementation is scoped; follow the
131
+ lifetime rule in `csharp.md`. Materialize with `.ToArray()` only when one operation
132
+ needs a stable instance snapshot.
113
133
 
114
134
  ## Step 4 — Delete the dead registrations
115
135
 
@@ -130,9 +150,21 @@ relying on a registration for a different reason.
130
150
 
131
151
  - **`[Singleton]` does not resolve.** The using directive is
132
152
  `Cratis.DependencyInjection`, not `Cratis`.
133
- - **An implementation is silently absent from the set.** Its assembly is not
134
- loaded at the point of enumeration, it is not `public`, it is abstract, or it
135
- carries `[IgnoreConvention]`.
153
+ - **An implementation is silently absent from the set.** Its assembly did not
154
+ contribute a generated provider before the universe was built, or its type is
155
+ abstract, generic, or inaccessible to the emitted provider. Inspect
156
+ `ITypes.DiscoveryMode` (`Unknown`, `Generated`, `Reflected`, or `Explicit`) and
157
+ `ITypes.Assemblies`; ask `TypeDiscoveryDiagnostics.FindMissingContributors(types)`
158
+ for referenced assembly names that did not contribute (it loads nothing and
159
+ may also report libraries with no discoverable types). The reflection fallback
160
+ includes package assemblies by prefix: `Cratis` by default, configurable through
161
+ `PackageReferencedAssemblies.Instance.AddAssemblyPrefixesToInclude(...)` before
162
+ discovery.
163
+ - **Discovery dependencies cannot resolve.** The plain host omitted
164
+ `services.AddTypeDiscovery()`.
165
+ - **Enumeration yields null.** The concrete type was discovered but not registered
166
+ as itself, for example because `[IgnoreConvention]` or a self-binding exclusion
167
+ skipped it. `InstancesOf<T>` uses `GetService(type)`, not `GetRequiredService`.
136
168
  - **An implementation is a new instance every time it is touched.** It has no
137
169
  lifetime attribute, so the convention made it transient. That is correct
138
170
  behavior for the convention and usually the wrong intent — add `[Singleton]`.
@@ -150,3 +182,8 @@ the affected behavior. The non-vacuity check matters here: assert the **count**
150
182
  of discovered implementations, not just that iterating them threw nothing. A
151
183
  fan-out over an empty set passes every assertion that only says "nothing went
152
184
  wrong".
185
+
186
+ Assert the expected `ITypes.DiscoveryMode` and contributing assembly names too.
187
+ For startup diagnostics, collect EventSource `Cratis.Fundamentals.TypeDiscovery`
188
+ with `dotnet-trace`: it reports universe construction and warns when only
189
+ Fundamentals contributed.
@@ -0,0 +1,14 @@
1
+ {
2
+ "skill": "cratis-fundamentals-type-discovery",
3
+ "input": "Wire a discovered set of implementations and diagnose missing types or incorrect scopes.",
4
+ "fixtures": [],
5
+ "assertions": [
6
+ { "kind": "skill-contains", "value": "concrete, non-generic implementations" },
7
+ { "kind": "skill-contains", "value": "services.AddTypeDiscovery()" },
8
+ { "kind": "skill-contains", "value": "TypeDiscoveryDiagnostics.FindMissingContributors(types)" },
9
+ { "kind": "skill-contains", "value": "type set is fixed at construction" },
10
+ { "kind": "skill-contains", "value": "singleton captures the root provider" },
11
+ { "kind": "skill-contains", "value": "Enumeration yields null" },
12
+ { "kind": "skill-contains", "value": "a later call rebuilds it" }
13
+ ]
14
+ }
@@ -19,10 +19,15 @@ the developer points it at. Nothing in it is production tooling.
19
19
 
20
20
  | Source | Version | Purpose |
21
21
  | --- | --- | --- |
22
- | `Cratis/Lens` `Source/` | manifest `1.0.0`, repository `HEAD` `3ee4882` (the repo has no release tag beyond `v0.0.1`) | The extension itself |
23
- | `Cratis.Arc.Core` | `22.16.0` | The `/.cratis/*` endpoints, the forwarded-identity contract, and the tenancy header Lens depends on |
22
+ | `Cratis/Lens` `Source/` | `v0.0.1`, manifest `1.0.0` | The extension itself; no newer release |
23
+ | `Cratis.Arc.Core` | `22.75.0` | The `/.cratis/*` endpoints, the forwarded-identity contract, and the tenancy header Lens depends on |
24
24
 
25
- > 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.
25
+ Behavior was read at Lens `v0.0.1` and `main`; the Source diff is metadata/build
26
+ packaging only. The release predates the previously verified `3ee4882` commit.
27
+ Arc evidence: [ArcOptions.cs:61–80](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/ArcOptions.cs#L61-L80),
28
+ [MicrosoftIdentityPlatformAuthenticationHandler.cs:28–40](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Identity/MicrosoftIdentityPlatformAuthenticationHandler.cs#L28-L40),
29
+ [IntrospectionOptions.cs](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Introspection/IntrospectionOptions.cs)
30
+ and [DiscoveryExposure.cs:102–138](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Introspection/DiscoveryExposure.cs#L102-L138).
26
31
 
27
32
  ⚠️ **There is no published store listing.** Nothing in the Lens repository links
28
33
  a Chrome Web Store, Edge Add-ons, AMO, or App Store entry — the only store URLs
@@ -60,6 +65,10 @@ Developer Tools", which is stale.
60
65
  Chrome after each rebuild. `yarn ci` runs `typecheck`, `test` and `build` — the
61
66
  same three the pull-request workflow runs. There is no lint script.
62
67
 
68
+ On `main`, `yarn build-package` runs `scripts/build-package.js` and writes zip
69
+ packages into repo-root `dist/`; the manifest description changed, but the name
70
+ is still **Cratis Lens**. At `v0.0.1` the script instead zips to `lens-extension.zip`.
71
+
63
72
  The code uses the `chrome.*` namespace throughout with no polyfill. The release
64
73
  workflow also packages for Edge, Firefox and Safari, but no cross-browser
65
74
  behavior is tested; treat Chromium as the supported target.
@@ -67,34 +76,46 @@ behavior is tested; treat Chromium as the supported target.
67
76
  ## What the Arc application must already provide
68
77
 
69
78
  Lens is not self-contained. It reads endpoints Arc maps for itself, and it sends
70
- headers Arc's shipped identity handler already reads. **No NuGet package,
71
- middleware, `Program.cs` change, or configuration key exists for "Lens support"
72
- — nothing in either repository names one.**
79
+ headers Arc's shipped identity handler reads only after host opt-in. There is no
80
+ Lens-specific package or middleware. For local impersonation, the development
81
+ host must set `Cratis:Arc:TrustForwardedIdentityHeaders=true` (default **false**).
82
+ Never enable this on an exposed application without a trusted ingress that
83
+ strips client-supplied identity headers.
73
84
 
74
85
  | Route | Mapped by | Lens uses it for |
75
86
  | --- | --- | --- |
76
- | `GET /.cratis/commands` | `MapIntrospectionEndpoints`, `AllowAnonymous` | The Commands tree |
77
- | `GET /.cratis/queries` | `MapIntrospectionEndpoints`, `AllowAnonymous` | The Queries tree |
78
- | `GET /.cratis/users` | every `ICanProvideUsers`, `AllowAnonymous` | The importable user roster |
79
- | `GET /.cratis/tenants` | every `ICanProvideTenants`, `AllowAnonymous` | The importable tenant list |
87
+ | `GET /.cratis/commands` | `MapIntrospectionEndpoints`, discovery access policy | The Commands tree |
88
+ | `GET /.cratis/queries` | `MapIntrospectionEndpoints`, discovery access policy | The Queries tree |
89
+ | `GET /.cratis/users` | every `ICanProvideUsers`, identity discovery policy | The importable user roster |
90
+ | `GET /.cratis/tenants` | every `ICanProvideTenants`, identity discovery policy | The importable tenant list |
80
91
  | `GET /.cratis/identity-details/schema` | the identity endpoint mapper | The schema-driven editor for a user's `identityDetails` |
81
92
 
82
- `MapIntrospectionEndpoints` is called from Arc's own application startup, so the
83
- two introspection routes exist without being asked for. The user and tenant
93
+ At Arc v22.75.0 discovery is anonymous by default **only in Development**.
94
+ Against a deployed host Lens needs the user signed in; hosts unable to authenticate
95
+ omit those routes (404). `Introspection.Enabled` controls catalogs and
96
+ `IdentityDiscovery` the roster/tenant/schema routes. Forwarded identity switching
97
+ also needs the explicit host-wide `TrustForwardedIdentityHeaders` opt-in, only
98
+ behind a header-stripping ingress. Source:
99
+ [secure defaults](https://github.com/Cratis/Arc/blob/v22.75.0/Documentation/upgrading/secure-defaults.mdx).
100
+ `MapIntrospectionEndpoints` runs during Arc activation, subject to these settings. The user and tenant
84
101
  routes return whatever the application implements — with **no implementation
85
102
  registered they return an empty list**, and Lens treats a `404` on either as
86
103
  "empty", not "broken". Users and tenants can also be created by hand in Lens's
87
104
  Settings, so an application that provides neither still works.
88
105
 
89
- ⚠️ `/.cratis/users` and `/.cratis/tenants` are mapped `AllowAnonymous` and
90
- **unconditionally**. Register `ICanProvideUsers`/`ICanProvideTenants` only for a
91
- development environment and return fixtures — see
92
- `cratis-arc-authentication-authorization-and-identity`.
106
+ At Arc `22.75.0`, all five discovery routes are anonymous by default only in
107
+ **Development**. Elsewhere they require authentication, or are not mapped when
108
+ the host cannot enforce it. `Cratis:Arc:Introspection` options `Enabled` and
109
+ `IdentityDiscovery` control mapping; `RequireAuthentication` and `Roles` control
110
+ access. Register development user/tenant providers with fixtures, not production
111
+ rosters — see `cratis-arc-authentication-authorization-and-identity`.
93
112
 
94
113
  ### Identity
95
114
 
96
- Lens sends exactly the three forwarded client-principal headers Arc's shipped
97
- handler reads:
115
+ Lens sends exactly three forwarded client-principal headers. Arc ignores them
116
+ and treats the request as anonymous unless
117
+ `Cratis:Arc:TrustForwardedIdentityHeaders=true`; a default Arc app therefore
118
+ does not honor Lens identity switching:
98
119
 
99
120
  ```text
100
121
  X-MS-CLIENT-PRINCIPAL-ID
@@ -157,10 +178,11 @@ Pick both on the **Context** tab. Two things then happen, in this order:
157
178
  2. It deletes the Arc identity cookie `.cratis-identity` on the detected base URL
158
179
  and page origins, then reloads every open tab on those origins.
159
180
 
160
- Step 2 is the one that matters. Headers alone do not change who you are once Arc
161
- has issued its identity cookie; the application keeps presenting the identity it
162
- was first given. Dropping the cookie and reloading is what makes the switch take
163
- effect.
181
+ At Arc v22.75.0 the backend neither reads nor writes that legacy identity
182
+ cookie. Lens still deletes it for older hosts; reloading clears the frontend's
183
+ in-memory identity and asks `/.cratis/me` again. Header-based switching requires
184
+ the host-wide trust opt-in and a suitable development/ingress boundary; the
185
+ extension cannot turn unsigned headers into authenticated credentials.
164
186
 
165
187
  The rules are scoped, deliberately. When a page origin is known the condition is
166
188
  `{ urlFilter: '*', initiatorDomains: [<page host>] }`; otherwise it is
@@ -184,7 +206,7 @@ query is always `GET`, with `{name}` segments in the route substituted from the
184
206
  path-parameter inputs and the same context headers.
185
207
 
186
208
  ⚠️ **The schema-driven payload form does not receive a schema from
187
- Arc `22.16.0`.** Lens reads an optional property named `schema` off each introspection
209
+ Arc `22.75.0`.** Lens reads an optional property named `schema` off each introspection
188
210
  item, and falls back to trying `/.cratis/types/{type}`, `/.cratis/schema/{type}`,
189
211
  `/.cratis/schemas/{type}` and `/.cratis/types?type={type}` in turn. Arc names the
190
212
  property **`payloadSchema`** on a command and **`argumentsSchema`** on a query,
@@ -206,9 +228,12 @@ unwrapped from the first of `data`, `result`, `items`, `results`, `value`,
206
228
 
207
229
  ⚠️ **The two introspection fetches send no headers and no credentials**, while
208
230
  the Settings user/tenant refresh does send both. So an application that puts
209
- authorization in front of `/.cratis/commands` breaks the Commands and Queries
210
- tabs while Settings keeps working — which reads as a mysterious partial failure.
211
- Leave those two routes anonymous.
231
+ authentication in front of `/.cratis/commands` and `/.cratis/queries` breaks
232
+ those tabs while Settings may keep working. This is the default outside
233
+ Development at Arc `22.75.0`. Run the app in **Development**, or knowingly set
234
+ `Cratis:Arc:Introspection:RequireAuthentication=false` on an isolated development
235
+ host; do not weaken production discovery for Lens.
236
+ Evidence: [Lens introspection.ts:100–131](https://github.com/Cratis/Lens/blob/v0.0.1/Source/arc/introspection.ts#L100-L131).
212
237
 
213
238
  Queries are path-parameter GETs only: no query-string arguments, no paging or
214
239
  sorting inputs, and no observable subscription from the popup.
@@ -222,8 +247,10 @@ it does not, the panel reports no data. Nothing else in Lens depends on it.
222
247
  ## Verify
223
248
 
224
249
  - `yarn ci` is clean, and Chrome loaded `Source/dist` without errors.
225
- - The application answers `/.cratis/commands` and `/.cratis/queries`
226
- anonymously.
250
+ - The development application answers `/.cratis/commands` and `/.cratis/queries`
251
+ anonymously under its deliberate discovery exposure policy.
252
+ - The isolated development host enables `Cratis:Arc:TrustForwardedIdentityHeaders`;
253
+ without it, Lens's forwarded identity remains anonymous.
227
254
  - Tenancy resolves from the header and the header is named
228
255
  `x-cratis-tenant-id`.
229
256
  - Opening the popup on the app's tab enables the Commands tab — that is the
@@ -21,10 +21,13 @@ storage and replay cost that never goes away.
21
21
  | Package | Version | Purpose |
22
22
  | --- | --- | --- |
23
23
  | `Cratis.Chronicle` | `18.3.0` | Observers, projections, reducers, reactors, replay |
24
- | `Cratis.Arc.Core` | `22.16.0` | Query return shapes and server-side paging |
24
+ | `Cratis.Arc.Core` | `22.75.0` | Query return shapes and server-side paging |
25
25
  | `@cratis/components` | `4.26.2` | `DataTable` paging surface |
26
26
 
27
- > 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.
27
+ > Arc query/paging surface rechecked at v22.75.0; Arc depends on Chronicle
28
+ > 19.39.1. Separate Chronicle verification remains version-qualified. Paged
29
+ > MongoDB observations now re-read page and total on each change; see the
30
+ > read-model query reference for the distinction from unpaged retained sets.
28
31
 
29
32
  Reverify against the owning product repository before asserting a framework
30
33
  behavior this file does not already state.
@@ -53,7 +53,9 @@ one to add weight.
53
53
  `(part of #n)` for anything that stays open (in repositories released by
54
54
  `cratis/release-action`, `(#n)` is what closes the issue), never `Closes`, `Fixes` or
55
55
  `Refs` before a number (also in bold or a link), and no issue reference
56
- inside an HTML comment, which still closes the issue; and absolute
56
+ inside an HTML comment (release-action removes comments before publishing,
57
+ so the issue is silently not closed; a body that is only a comment counts as
58
+ empty and GitHub generates the notes); and absolute
57
59
  `https://` links only. Sections are in
58
60
  a fixed order (Added, Changed, Fixed, Removed, Security, Deprecated); within
59
61
  a section, put changes requiring action first, then new capabilities and
@@ -58,8 +58,9 @@ sends again.
58
58
  - A reaction cascade is not one transaction: earlier accepted facts stay when a later invoked
59
59
  command rejects (Screenplay `reactions.md`). Design each step to be retried on its own.
60
60
  - Replay and recovery redelivery are different. Chronicle `[OnceOnly]` skips replays (rewind,
61
- redaction, revision) only; a recovered failed partition redelivers the event as a normal
62
- observation. A receipt keyed by `ReactorDelivery.Id` identifies the retry. Name both.
61
+ redaction, revision) only, not ordinary catch-up, repeated same-source events or crash
62
+ redelivery. Recovery runs the handler normally. It is not a per-source run limit or
63
+ deduplication. A receipt keyed by `ReactorDelivery.Id` identifies the retry. Name both.
63
64
 
64
65
  ## Capture data-protection traps
65
66
  A field left out of `map` still passes through the capture's working record: omission is not
@@ -73,7 +74,7 @@ even when it blocks binding. Never record bearer tokens, magic links or signed U
73
74
  ## Verified product sources
74
75
  Current pins: toolchain `references/versions.md`. Language claims were re-read at Screenplay v4.139.0,
75
76
  renderer claims at Stage v4.73.1 (no Automation, Translate, reaction or capture: `STAGE-ESM-024`), the
76
- runtime facts at Arc v22.72.0 and Chronicle v19.50.0. Older reads kept as history:
77
+ runtime facts at Arc v22.72.0 and Chronicle v19.50.1. Older reads kept as history:
77
78
 
78
79
  | Package | Version | Used for |
79
80
  | --- | --- | --- |
@@ -81,7 +82,7 @@ runtime facts at Arc v22.72.0 and Chronicle v19.50.0. Older reads kept as histor
81
82
  | cratis CLI | v3.28.3 | bundled Screenplay 4.66.0 and Stage 4.24.2 (before 3.28.2: 4.60.1, which gave PLAY0268 on v6 constructs and a false PLAY0285 on cascades, cli#242) |
82
83
  | Stage | v4.24.2 | admitted ESM v1 to v4; rendered no Automation or Translate slice |
83
84
  | Arc | v22.72.0 (read; v22.50.5 earlier) | `ExecuteCommandsAsSystemAttribute` (since v20.56.0); mixed events-and-commands reactor returns (since v22.72.0) |
84
- | Chronicle | v19.50.0 (read; v19.32.0 earlier) | `OnceOnlyAttribute`, `ReactorDelivery` and `Documentation/reactors/delivery-identity.mdx` |
85
+ | Chronicle | v19.50.1 (read; v19.32.0 earlier) | `OnceOnlyAttribute`, `ReactorDelivery`, `Documentation/code-analysis/CHR0022.mdx` and `Documentation/reactors/delivery-identity.mdx` |
85
86
 
86
87
  Read `references/versions.md` in `cratis-screenplay-toolchain` when selecting a tool or checking the full version and capability pins. Reverify before claiming
87
88
  another version behaves the same.
@@ -13,7 +13,7 @@ automation or translation is hand-written delivery with the model as its contrac
13
13
  A reaction that both `produces` events and `invokes` commands stays one modeled reaction. Hand-write one
14
14
  reactor that returns the events and the commands: Arc 22.72.0 and later append the events first as one
15
15
  batch, then run the commands in order, with no transaction across them (a retry can repeat both, so keep
16
- both repeatable); the Stage 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 Arc 22.72.0 or later. Never split the reaction to dodge `STAGE-ESM-037`. A `Customizations/` file never makes a
16
+ both repeatable); the Arc the Stage scaffold pins (see `cratis-stage-rendering-and-sandbox` `references/rendered-application.md`) accepts a collection in a command handler only when every element is a command, so a rendered app needs a proven dependency override to Arc 22.72.0 or later. Never split the reaction to dodge `STAGE-ESM-037`. A `Customizations/` file never makes a
17
17
  rejected model renderable, and never claim a whole-application V5 from a subset. Choose the route
18
18
  with `cratis-screenplay-render-and-gap-fill`.
19
19
 
@@ -40,7 +40,7 @@ decides, not the slice type:
40
40
  refused it and falsely reported PLAY0285 (`references/versions.md`).
41
41
  - **Stage 4.73.1** admits ESM v1-v10 by version but renders no `Automation`, `Translate`, reaction or
42
42
  capture (`STAGE-ESM-024`; `-037` for a reaction that produces and invokes, which Arc 22.72.0+
43
- runs as one reactor; scaffold 22.68.0 needs override). The automation is gap-fill; the `.play` slice and its specifications
43
+ runs as one reactor; scaffold Arc needs override). The automation is gap-fill; the `.play` slice and its specifications
44
44
  are the contract: `cratis-screenplay-render-and-gap-fill`.
45
45
 
46
46
  Model them whenever the `.play` file is the deliverable, and say which tool bound
@@ -26,14 +26,13 @@ source is the single flow model.
26
26
 
27
27
  ## Verified product sources
28
28
 
29
- Current pins: toolchain `references/versions.md`; the claims here were read at 4.139.0 and at
30
- the older tags below (provenance). Compilation checks syntax and
31
- model consistency, not reference execution.
29
+ Pins: toolchain `references/versions.md`; sources below. Compilation is not execution.
32
30
 
33
31
  - `4.31.0`: original examples and executable boundaries; main `fd18129`: inline events, repairs, canonical `optional`.
34
32
  - `4.66.0` (`c89198b`): `handler`, code attachments, `persona` and compliance binding (`Semantics/SemanticModelBinder*.cs`, `Diagnostics/DiagnosticCodes.cs`).
35
33
  - `4.68.0` (`79801bf`): generated-value/response rule probes (ESM v7).
36
- - `4.127.0`: identity and compliance guidance (`identity.md`, `context.md`, `concepts.md`, `purposes.md`, `events.md`, `diagnostics.md`).
34
+ - `4.127.0`: identity and compliance syntax (`identity.md`, `context.md`, `concepts.md`, `purposes.md`, `events.md`, `diagnostics.md`).
35
+ - `4.141.0`: v13 compliance admission/refusals: `references/compliance.md`.
37
36
 
38
37
  "Parses" and "runs" are different claims. The executable profile, and what
39
38
  each construct binds to, is in the `cratis-screenplay-model-authoring` language
@@ -60,8 +59,8 @@ The seven primitives are `Uuid`, `String`, `Int`, `Decimal`, `Bool`, `Date` and
60
59
  is why the compiler says *expected … or Enum* rather than listing it among them.
61
60
  Use bare `pii` for personal data (`personal` is the same marker) and `secret`
62
61
  for operational secrets. **Compliance is inherited** from concepts, including
63
- nested uses. Either marker blocks executable binding with PLAY0268; keep the
64
- protection. `pii personal` is redundant and warns PLAY0653. Legacy `@pii`,
62
+ nested uses. Standalone 4.141.0 admits v13 compliance; the CLI does not. Residual
63
+ PLAY0268 refusals are in the reference below; keep protection. `pii personal` is redundant and warns PLAY0653. Legacy `@pii`,
65
64
  `sensitive` and `@sensitive` remain accepted with PLAY0565 information and a repair.
66
65
  Read [compliance and purposes](references/compliance.md) for reasons, special/criminal
67
66
  qualifiers, secret scopes, provider mappings, purpose declarations and coverage checks.
@@ -10,8 +10,9 @@
10
10
  - Declare the use separately
11
11
  - Identify the person, not the stream
12
12
 
13
- Authority: Screenplay v4.127.0 `concepts.md`, `purposes.md`, `events.md` and
14
- `diagnostics.md`; decision 0041. These declarations do not establish lawful
13
+ Authority: Screenplay v4.141.0 `concepts.md`, `events.md`,
14
+ `Semantics/SemanticModelBinder.Compliance.cs` and `SemanticModelValidator.Compliance.cs`;
15
+ processing-purpose guidance retains v4.127.0 evidence; decisions 0041 and 0068. These declarations do not establish lawful
15
16
  processing or enforce retention. Check provider support separately.
16
17
 
17
18
  ## Classify the value on its concept
@@ -60,9 +61,24 @@ new event generation.
60
61
 
61
62
  C# provider mapping: `pii` → `[PII]`; `secret` → `[Encrypted]` + `[NotAudited]`;
62
63
  `pii secret` → `[PII]` only (Chronicle refuses `[PII]` with `[Encrypted]`, CHR0053).
63
- This mapping is not admission: either marker, including qualifiers and scopes,
64
- still blocks executable binding with PLAY0268. Subject lineage is a different
65
- role, described below.
64
+ Standalone Screenplay 4.141.0 admits these markers, qualifiers and scopes as
65
+ ESM v13. Optional concept `compliance` applies through command, event, read-model,
66
+ composite and response type references, including collection elements. Bare `pii`
67
+ writes `{"personal":{}}`; `secret scope namespace` writes
68
+ `{"secret":{"scope":"namespace"}}`. With both markers, personal protection
69
+ wins and no secret scope is stored. Reasons stay report-only (PLAY0270).
70
+ Unmarked models keep their exact executable bytes and revision. The reference
71
+ evaluator runs marked models with unchanged outcomes but tests neither encryption
72
+ nor erasure. Consumers must explicitly admit v13 and realize the protection;
73
+ CLI 3.53.1's 4.137.0 compiler still refuses markers, and Stage 4.76.0 admits only
74
+ through v12. Never remove protection to fit either tool.
75
+
76
+ PLAY0268 still refuses compliance on enum or event-source/stream identity concepts.
77
+ It also refuses an event combining personal values or explicitly
78
+ `secret scope subject` values with an explicit event-property `subject` mark,
79
+ including nested composite and collection uses: subject lineage is not admitted.
80
+ In v13 the personal-data subject is the event source. Remove a mark only when that
81
+ source truly is the intended subject, not merely to pass binding.
66
82
 
67
83
  ## Recover classification from C# with Arc 22.70.0
68
84
 
@@ -71,7 +87,7 @@ Reverse generation is not the C# provider mapping above. Source authority: Arc
71
87
  secrets), `Source/DotNET/Screenplay/Emission/Concepts/ConceptSyntaxBuilder.cs`
72
88
  and `Source/DotNET/Screenplay/Analysis/Types/PersonalDataMarkings.cs`.
73
89
  SP0058 to SP0060 exist from Arc.Screenplay 22.61.0 (or earlier); SP0061 to SP0063 first ship in 22.70.0 (read at
74
- v22.70.0 and v22.72.0), so the full set described here needs 22.70.0 or later. CLI 3.53.1 bundles 22.54.0, which has
90
+ v22.70.0 and v22.72.0), so the full set described here needs 22.70.0 or later. CLI 3.53.1 bundles an Arc.Screenplay older than that (its version is in `cratis-screenplay-toolchain` `references/versions.md`), which has
75
91
  none of SP0061 to SP0063, so the CLI shows none of them; check the generator package actually loaded.
76
92
 
77
93
  - Both `[Encrypted]` and `[NotAudited]` must be on the concept to recover
@@ -83,7 +99,9 @@ none of SP0061 to SP0063, so the CLI shows none of them; check the generator pac
83
99
  Set `ScreenplayOptions.AuthoringOnlyConstructs = true` (CLI adapter flag
84
100
  `--authoring-only-constructs`) to state `secret scope namespace` or
85
101
  `secret scope global` in the concept body. Subject stays implicit. Scope
86
- is syntax-only: it raises no ESM version and grants no executable admission.
102
+ was syntax-only on this generator's compiler. With standalone 4.141.0,
103
+ protected concepts instead select ESM v13; this does not upgrade the generator
104
+ or the CLI bundle.
87
105
  `pii secret` gets no scope because the providers ignore it.
88
106
  - A property or positional constructor parameter marked `[PII]` on a non-concept
89
107
  type reports SP0062 (Information); the marking is not stated and no concept
@@ -83,11 +83,13 @@ names; numbers are neither alternative fixture values nor flags.
83
83
  Consumers must **explicitly admit v12**. CLI 3.53.1 and Stage 4.73.1 both bundle
84
84
  Screenplay 4.137.0: `cratis render`/Stage do not admit v12 yet. A model with
85
85
  non-positional numbers compiles and binds with standalone Screenplay >= 4.139.0,
86
- but does not render through that CLI. Do not remove its pins to pass rendering;
86
+ but does not render through that CLI. Standalone Stage 4.76.0 is the first Stage that admits v12 and
87
+ renders explicit numbers as `Member = N` (sparse and negative, `-0` as 0; unnumbered enums keep declaration
88
+ order), but no cli release bundles it yet. Do not remove its pins to pass rendering;
87
89
  report the consumer gap. See toolchain `references/versions.md`.
88
90
 
89
91
  Sources checked at `v4.139.0`: `Documentation/screenplay/concepts.md`,
90
92
  `interoperability.md`, `diagnostics.md`, `mcp/authoring-tools.md`, decision 0065,
91
93
  `Semantics/Versions.cs`, `SemanticModelValidator.EnumMemberNumbers.cs` and the
92
94
  source-backed `EnumMemberNumbersCorpus.V12` (under `Source/DotNET/`). Consumer
93
- pins: CLI `v3.53.1:Directory.Packages.props`, Stage `v4.73.1:Directory.Packages.props`.
95
+ pins: CLI `v3.53.1:Directory.Packages.props`, Stage `v4.73.1:Directory.Packages.props`; Stage `v4.76.0` release notes (#296).
@@ -4,7 +4,10 @@ A `generated` command property and `returns` response bind and reference-execute
4
4
  as ESM v7 (checked at 4.68.0). Current pins:
5
5
  `cratis-screenplay-toolchain/references/versions.md`. CLI#261 is closed: CLI now admits v7
6
6
  to Stage planning, and the 4.137.0 compiler in CLI 3.53.1 binds it. Stage 4.73.1 still refuses
7
- generated values and responses with STAGE-ESM-028/029 (Stage#175), as the historical CLI 3.41.0 corpus did. Do not turn this into a blanket compiler
7
+ generated values and responses with STAGE-ESM-028/029 (Stage#175), as the historical CLI 3.41.0 corpus did.
8
+ Standalone Stage 4.74.0 and later render server-generated UUID-concept values and scalar or named
9
+ responses (read at `v4.76.0`), but no cli release bundles them yet, so `cratis render` through cli 3.53.1 still
10
+ refuses. Screenplay 4.139.0 has only `generated` / `generated identifier`; no `generate` strategy form exists. Do not turn this into a blanket compiler
8
11
  refusal or promise a render from binding alone. Preserve the contract for gap-fill
9
12
  where admission refuses. Historical rules below were read at 4.68.0. Complete compiled example:
10
13
  `cratis-screenplay-toolchain` `references/generated-responses-example.md`.
@@ -113,7 +113,7 @@ is the fallback, and neither names the other's verdict. Versions and commands:
113
113
  slices; reactions, captures, Automation and Translate, and the v7+ constructs in Stage's
114
114
  admission table refuse with their own `STAGE-ESM-*` code, so those scopes are gap-fill with
115
115
  the model as the contract. A reaction that produces events and invokes commands is refused
116
- (`STAGE-ESM-037`) although Arc 22.72.0 and later can run it (the Stage scaffold's Arc 22.68.0 needs a proven override): hand-write it as one reactor, never split the modeled reaction.
116
+ (`STAGE-ESM-037`) although Arc 22.72.0 and later can run it (the Arc the Stage scaffold pins needs a proven override): hand-write it as one reactor, never split the modeled reaction.
117
117
 
118
118
  ## Parsed is not runnable
119
119
 
@@ -135,8 +135,9 @@ What binds depends on **which tool** you ask, so name the tool and its version:
135
135
  protected against stale state. A reaction trigger's `reads` that only `invokes` is
136
136
  report-only intent (`PLAY0270`); one that `produces` directly fails binding (`PLAY0268`).
137
137
  - `persona` declarations are report-only and never block; bare `pii` and `secret`
138
- concepts do block binding (`PLAY0268`). Keep them anyway: the classification is
139
- part of the model. Report the block.
138
+ concepts bind as ESM v13 on standalone 4.141.0, but still block the pinned CLI.
139
+ Enum/identity compliance and protected events with explicit subject marks remain
140
+ refused (PLAY0268); see command-surface `references/compliance.md`. Keep protection.
140
141
  - Generated values/responses bind and reference-execute as v7; sources, streams
141
142
  and command/specification routes as v8; reaction `runs as` identity as v10;
142
143
  qualifying Double literals lower exactly as v11 and non-positional enum numbers
@@ -202,7 +202,7 @@ system state?"* If no, it is co-production — one `StateChange` slice with seve
202
202
  Stage 4.73.1 renders none, so the automation is gap-fill there (versions:
203
203
  `cratis-screenplay-toolchain`). A reaction that `produces` and `invokes` stays one reaction: Stage
204
204
  refuses it (`STAGE-ESM-037`) but Arc 22.72.0 and later run it as one reactor (events first, then
205
- commands; no cross-effect transaction; the Stage scaffold's Arc 22.68.0 needs a proven override), so gap-fill it whole, never split it. When the automation decides from a view, declare it under
205
+ commands; no cross-effect transaction; the Arc the Stage scaffold pins needs a proven override), so gap-fill it whole, never split it. When the automation decides from a view, declare it under
206
206
  the trigger with `reads` (see `cratis-screenplay-captures-and-reactions`).
207
207
 
208
208
  The example below is a complete document: a Monday-morning clock occurrence invokes a command
@@ -22,10 +22,10 @@ Pins and consumer boundaries: toolchain `references/versions.md`.
22
22
 
23
23
  ## Dispositions to keep apart
24
24
 
25
- | Construct | Standalone disposition (checked at v4.125.0; v4.139.0 unchanged for these rows) |
25
+ | Construct | Standalone disposition (v4.125.0/v4.139.0 evidence; compliance updated at v4.141.0) |
26
26
  | --- | --- |
27
27
  | `persona`, domain/authentication metadata | Report-only; unknown named policies remain source defects |
28
- | Compliance concepts | Bare `pii`/`secret` (4.127.0); binding still refuses PLAY0268, never remove protection |
28
+ | Compliance concepts | Bare `pii`/`secret`, qualifiers and scope bind as v13 at 4.141.0; enum/identity compliance and protected events with explicit subject marks refuse PLAY0268. The pinned CLI still refuses markers; never remove protection |
29
29
  | Identity details / processing purposes / event subject | Report-only metadata (4.127.0); executable detail reads refuse PLAY0268, not source declaration errors |
30
30
  | Composite stream ids | v8 routing; complete named parts/canonical comparisons, PLAY0515 refuses protected keys/sources; not a legacy text split |
31
31
  | Command reads/concurrency | Legacy unprotected decisions, PLAY0271 |
@@ -37,13 +37,14 @@ then hands off to review (P5) and acceptance (P6).
37
37
  ## Verified product sources
38
38
 
39
39
  Current pins: `cratis-screenplay-toolchain` `references/versions.md`. The sources below were read
40
- at the versions named in each row (CLI 3.53.1 bundles Screenplay 4.137.0, Stage 4.73.1, Prologue
41
- 2.0.0 and Arc.Screenplay 22.54.0, not the latest Arc or Chronicle). Checked at these sources:
40
+ at the versions named in each row (CLI 3.53.1 bundles Prologue
41
+ 2.0.0; the Screenplay, Stage and Arc.Screenplay it bundles are in that pin set, and are not the latest releases). Checked at these sources:
42
42
 
43
43
  | Fact used here | Source |
44
44
  | --- | --- |
45
45
  | `generate` options, no default-file certainty (stdout when `--file` is absent), spec-project exclusion by name, `CLI0005/0009/0014-0017` | cli `v3.28.2:Source/Cli/Commands/Screenplay/{GenerateScreenplayCommand,GenerateScreenplaySettings,ScreenplayProjectSelection,ScreenplayDiagnosticCodes}.cs` |
46
46
  | `SP0016` (rule in code, computed message, `When`/`Unless` written as unconditional), `SP0024` (source did not compile) | Arc `v22.50.5:Source/DotNET/Screenplay/ScreenplayDiagnosticCodes.cs`, `Documentation/backend/csharp/generating-a-screenplay.md` |
47
+ | Enum number preservation (SP0067–SP0069) and response-read/mutation proof | Arc `v22.76.0:Source/DotNET/Screenplay/Emission/Concepts/ConceptSyntaxBuilder.cs`, `Analysis/Types/{ConceptRegistry,FlagsEnumUses}.cs`, `Analysis/Specifications/SpecificationReturnValues.cs`; `references/generate-notes.md` |
47
48
  | Non-default secret scope in authoring mode, SP0061–SP0063, self-check contract on compiler upgrades | Arc `v22.70.0:Documentation/backend/csharp/generating-a-screenplay.md`, `Source/DotNET/Screenplay/Verification/ExpectedBindingDiagnostics.cs`; `references/generate-notes.md` |
48
49
  | `prologue start` is an interactive wizard that writes `cratis-prologue.json`; `interpret --no-llm` never creates a chat client; a local `llm.enabled` setting wins over the global CLI configuration; the provider is announced before evidence is sent (cli#241, closed) | cli `v3.53.1:Source/Cli/Commands/Prologue/{StartPrologueCommand,InterpretPrologueSettings,InterpretPrologueCommand,LlmOptionsResolver}.cs`, `Documentation/reference/prologue.md` |
49
50
  | `generate` and `conform` evaluate the project with MSBuild (design-time build; may run project targets and write `obj/`); `conform` exit 0/1/2, structural only | cli `v3.53.1:Documentation/reference/screenplay.md`, `Source/Cli/Commands/Screenplay/ConformScreenplayCommand.cs` |