@cratis/pi 7.34.1 → 7.36.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 (229) 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 +7 -11
  177. package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +26 -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-command-surface/verification.json +7 -1
  181. package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +3 -2
  182. package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +6 -2
  183. package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +1 -0
  184. package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +34 -4
  185. package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +17 -24
  186. package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
  187. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +19 -2
  188. package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +11 -3
  189. package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +90 -4
  190. package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +19 -2
  191. package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -1
  192. package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
  193. package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +48 -0
  194. package/package/corpus/skills/cratis-screenplay-specifications/verification.json +3 -1
  195. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -2
  196. package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +5 -4
  197. package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +8 -6
  198. package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +8 -2
  199. package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -2
  200. package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +7 -1
  201. package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +24 -11
  202. package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +10 -4
  203. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1543 -131
  204. package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
  205. package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +9 -3
  206. package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -7
  207. package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
  208. package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +2 -0
  209. package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +27 -9
  210. package/package/corpus/skills/cratis-security-review/SKILL.md +9 -3
  211. package/package/corpus/skills/cratis-security-review/references/arc-boundaries.md +59 -0
  212. package/package/corpus/skills/cratis-specification-by-example/SKILL.md +7 -0
  213. package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +43 -11
  214. package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +16 -4
  215. package/package/corpus/skills/cratis-specifications-csharp/references/csharp-patterns.md +18 -5
  216. package/package/corpus/skills/cratis-specifications-csharp/references/integration-specs.md +21 -0
  217. package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +34 -0
  218. package/package/corpus/skills/cratis-specifications-csharp/verification.json +13 -0
  219. package/package/corpus/skills/cratis-specifications-typescript/SKILL.md +14 -5
  220. package/package/corpus/skills/cratis-specifications-typescript/verification.json +12 -0
  221. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +8 -2
  222. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +6 -3
  223. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +10 -1
  224. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/scene-runtime.md +75 -0
  225. package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +5 -0
  226. package/package/corpus/skills/cratis-studio-mcp-safety-guidance/SKILL.md +14 -1
  227. package/package/profile-catalog.json +68 -1
  228. package/package.json +1 -1
  229. package/src/index.ts +3 -1
@@ -0,0 +1,57 @@
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
+ # Chronicle CLI effects at v3.53.1
5
+
6
+ Derived from `cratis llm-context` printed by **Cratis.Cli 3.53.1**. Use the
7
+ installed version's catalog, not this snapshot, for later releases. The tag's
8
+ [effect/confirmation contract](https://github.com/Cratis/cli/blob/v3.53.1/Documentation/reference/llm-context.md)
9
+ defines `read-only`, `local`, `mutating`, `destructive`; every other or unknown
10
+ effect is a state change. `requiresConfirmation=true` fails non-interactively
11
+ without `--yes`, independently of effect. Confirmation is not authorization.
12
+
13
+ All paths below start with `cratis chronicle`. This table exhausts its
14
+ non-read-only commands at that version.
15
+
16
+ | Path | Effect | requiresConfirmation |
17
+ | --- | --- | --- |
18
+ | `login` | local | false |
19
+ | `logout` | local | false |
20
+ | `workbench` | destructive | false (its actions have their own dialogs) |
21
+ | `applications add` | mutating | false |
22
+ | `applications remove` | destructive | true |
23
+ | `jobs resume` | mutating | true |
24
+ | `jobs stop` | mutating | true |
25
+ | `observers clear-partition-quarantine` | mutating | true |
26
+ | `observers clear-quarantine` | mutating | true |
27
+ | `observers remove` | destructive | true |
28
+ | `observers replay` | destructive | true |
29
+ | `observers replay-partition` | destructive | true |
30
+ | `observers retry-partition` | mutating | true |
31
+ | `recommendations ignore` | mutating | true |
32
+ | `recommendations perform` | destructive | true |
33
+ | `subscriptions add` | mutating | false |
34
+ | `subscriptions remove` | destructive | true |
35
+ | `users add` | mutating | false |
36
+ | `users remove` | destructive | true |
37
+
38
+ The remaining Chronicle commands are cataloged read-only, including
39
+ `report-error`; the guard deliberately blocks that command because it opens an
40
+ external browser issue form. `chronicle version` is not a command in this
41
+ catalog; server version is included in diagnostic output.
42
+
43
+ Critical effect implementations at the tag:
44
+
45
+ - [RemoveObserverCommand.cs:18–52](https://github.com/Cratis/cli/blob/v3.53.1/Source/Cli/Commands/Chronicle/Observers/RemoveObserverCommand.cs#L18-L52):
46
+ deletes observer records across all namespaces, leaves read model data,
47
+ refuses running/subscribed observers.
48
+ - [ClearPartitionQuarantineCommand.cs:20–53](https://github.com/Cratis/cli/blob/v3.53.1/Source/Cli/Commands/Chronicle/Observers/ClearPartitionQuarantineCommand.cs#L20-L53):
49
+ Chronicle 19.29.0+, resets retry budget, retries unless `--no-retry`.
50
+ - [ChronicleCommand.cs](https://github.com/Cratis/cli/blob/v3.53.1/Source/Cli/Commands/Chronicle/ChronicleCommand.cs):
51
+ confirmation handling shared by prompted commands.
52
+ - [WorkbenchCommand.cs](https://github.com/Cratis/cli/blob/v3.53.1/Source/Cli/Commands/Chronicle/Workbench/WorkbenchCommand.cs):
53
+ destructive interactive surface, table output only.
54
+
55
+ The guard covers `chronicle` only. `direct login|logout|status|use` declares
56
+ `mutating` but is outside that guard's scope, as are other top-level groups.
57
+ Do not infer authorization from the absence of a guard.
@@ -16,59 +16,57 @@ There is no host requirement and no application architecture imposed.
16
16
 
17
17
  ## Verified product sources
18
18
 
19
- This skill is verified against the `Cratis/Chronicle` repository at tag
20
- `v18.3.0`. Its client sources are unchanged in public shape since `v17.0.1`
21
- (the 17→18 client diff is converters, options and doc comments), and `v17.0.1`
22
- was byte-identical to `16.45.2` for every public type cited here except the
23
- compatibility check noted below.
19
+ Verified against `Cratis/Chronicle` **v19.50.1**. The client surface is unchanged
20
+ from v19.50.0; earlier release numbers identify feature availability.
24
21
 
25
- | Package | Line | Purpose |
22
+ | Package | Version | Purpose |
26
23
  | --- | --- | --- |
27
- | `Cratis.Chronicle` | `18.3.0` | `ChronicleClient`, `IEventStore`, `[EventType]`, observers |
28
- | `Cratis.Chronicle.Connections` | `18.3.0` | `ChronicleConnectionString`, connection lifecycle |
29
- | `Cratis.Chronicle.AspNetCore` | `18.3.0` | ASP.NET Core wiring, header/subdomain namespace resolvers |
30
- | `Cratis.Chronicle.Testing` | `18.3.0` | in-process scenarios |
31
- | `Cratis.Chronicle.CodeAnalysis` | `18.3.0` | the analyzers, a **separate opt-in** package |
24
+ | `Cratis.Chronicle` | `19.50.1` | `ChronicleClient`, `IEventStore`, `[EventType]`, observers |
25
+ | `Cratis.Chronicle.Connections` | `19.50.1` | `ChronicleConnectionString`, connection lifecycle |
26
+ | `Cratis.Chronicle.AspNetCore` | `19.50.1` | ASP.NET Core wiring, header/subdomain namespace resolvers |
27
+ | `Cratis.Chronicle.Testing` | `19.50.1` | in-process scenarios |
28
+ | `Cratis.Chronicle.CodeAnalysis` | `19.50.1` | CHR analyzers, distributed as a client dependency |
32
29
 
33
- Take the exact version from nuget.org. The version in source is a `1.0.0`
34
- placeholder injected at pack time (`Source/Directory.Build.props`), so the
35
- repository never carries the real number. Reverify before claiming support for a
36
- version you have not checked.
30
+ Take the version from nuget.org, not the `1.0.0` source pack-time placeholder.
31
+ Reverify before claiming another version.
37
32
 
38
33
  ## Lifecycle
39
34
 
40
35
  - **Registration is wired to the connection, not called by you.**
41
- `EventStore.cs:265-268` subscribes `RegisterAll` to `Connection.Lifecycle.OnConnected`
42
- when `autoDiscoverAndRegister` is on, so a reconnect re-registers everything.
36
+ `EventStore.RegisterAll` subscribes to `Connection.Lifecycle.OnConnected`
37
+ when `autoDiscoverAndRegister` is on; reconnect re-registers artifacts.
43
38
  - `DiscoverAll()` does event types first, then constraints, reactors, reducers,
44
- projections, and seeding in parallel (`EventStore.cs:349-362`). `RegisterAll()`
45
- is single-flighted with jittered backoff and a background retry loop (`:373-379`).
39
+ projections and seeding in parallel; registration is single-flighted with
40
+ jittered backoff/background retry (`EventStore.cs`).
46
41
  - **Wait with `WaitForRegistration`, not by polling `IsConnected`.**
47
42
  `RegistrationWaitExtensions.WaitForRegistration(this IEventStore, TimeSpan? timeout = default)`
48
- (`Source/Clients/DotNET/Registrations/RegistrationWaitExtensions.cs:42`, default
49
- 5 seconds) exists precisely for this, and its own remarks warn against the
50
- `IConnectionLifecycle.IsConnected` alternative (`:34-39`). Connected is not
51
- registered.
43
+ returns `RegistrationOutcome`, including failed runs; its default 5-second
44
+ timeout is for a run that never finished. Inspect `IsSuccess`, `Failure`,
45
+ `Failures` and `IdentityDrift`. It reports projection registrations, not
46
+ reactor/reducer subscription readiness (use `WaitTillSubscribed` / `WaitTillActive`).
47
+ Successful active projection registration includes observer subscription, not
48
+ read-your-writes: inspect the append's `WaitForCompletion` result or read a
49
+ passive model. Source: `Registrations/RegistrationOutcome.cs`.
52
50
  - **Keepalive is a bidirectional stream plus a watchdog.** The watchdog monitors
53
51
  every `MonitorIntervalMilliseconds = 1000`
54
- (`Source/Clients/Connections/ConnectionWatchdog.cs:34`) and a keepalive that
52
+ (`Source/Clients/Connections/ConnectionWatchdog.cs`) and a keepalive that
55
53
  falls more than 5 seconds behind is treated as a lost connection, with
56
54
  reconnect backoff capped at 30 seconds. **The failure mode is silence, not an
57
55
  exception** — appends keep working while observers go quiet.
58
56
  - `Dispose()` disposes read model reactors for created stores, cancels the owned
59
57
  connection, and disposes the connection
60
- (`Source/Clients/DotNET/ChronicleClient.cs:225-246`).
58
+ (`Source/Clients/DotNET/ChronicleClient.cs`, `Dispose`).
61
59
 
62
60
  ## What a standalone app owns that a host would have supplied
63
61
 
64
62
  Every one of these has a silent default. Read them as a checklist, because the
65
63
  defaults are reasonable for a sample and wrong for a service
66
- (`ChronicleClient.cs:121-127`):
64
+ (`ChronicleClient.cs`, options constructor):
67
65
 
68
66
  | Concern | Default when you pass nothing |
69
67
  | --- | --- |
70
68
  | `IClientArtifactsProvider` | `DefaultClientArtifactsProvider.Default` — full assembly scan |
71
- | `IServiceProvider` | `DefaultServiceProvider`, which activates everything through `Activator.CreateInstance` (`DefaultServiceProvider.cs:41`) |
69
+ | `IServiceProvider` | `DefaultServiceProvider`, which activates everything through `Activator.CreateInstance` |
72
70
  | `IIdentityProvider` | `BaseIdentityProvider` |
73
71
  | `ICorrelationIdAccessor` | `CorrelationIdAccessor` |
74
72
  | `IEventStoreNamespaceResolver` | `DefaultEventStoreNamespaceResolver` — always `"Default"` |
@@ -93,9 +91,10 @@ dotnet add package Cratis.Chronicle # console / worker service
93
91
  dotnet add package Cratis.Chronicle.AspNetCore # ASP.NET Core
94
92
  ```
95
93
 
96
- `Cratis.Chronicle.CodeAnalysis` is **not** pulled in by `Cratis.Chronicle`. Add
97
- it deliberately — it is what warns about the mistakes an event model makes
98
- silently, such as a nullable event property.
94
+ Since 19.4.8, `Cratis.Chronicle` brings `Cratis.Chronicle.CodeAnalysis` as a
95
+ package dependency: consumers receive the CHR analyzers without opting in.
96
+ The package id is still separate; Chronicle does not run these analyzers over
97
+ its own generic client plumbing. Source: `Source/Clients/DotNET/DotNET.csproj`.
99
98
 
100
99
  ## Connecting
101
100
 
@@ -109,66 +108,32 @@ using var client = new ChronicleClient(ChronicleConnectionString.Development);
109
108
  var eventStore = await client.GetEventStore("<EventStoreName>");
110
109
  ```
111
110
 
112
- That is the compiled documentation snippet verbatim
113
- (`Documentation/client-snippets/get-started/console/connect.md`). Those snippet
114
- files are compiled in CI against the real client projects, which makes them the
115
- safest source of .NET Chronicle example code in existence — prefer them over
116
- prose documentation.
111
+ Source: `Documentation/client-snippets/get-started/console/connect.md`;
112
+ client snippets compile in product CI. Prefer them to untested prose examples.
117
113
 
118
- `IChronicleClient` — `Source/Clients/DotNET/IChronicleClient.cs:11`:
119
-
120
- | Member | Line |
121
- | --- | --- |
122
- | `ChronicleOptions Options { get; }` | `:16` |
123
- | `ICausationManager CausationManager { get; }` | `:21` |
124
- | `Task<IEventStore> GetEventStore(EventStoreName name, EventStoreNamespaceName? @namespace = default)` | `:32` |
125
- | `Task<IEnumerable<EventStoreName>> GetEventStores(CancellationToken cancellationToken = default)` | `:39` |
126
- | `void EvictEventStores()` | `:53` |
127
-
128
- **There is no `IChronicleClient.Connect`.** Connecting happens inside
129
- `GetEventStore`, which discovers artifacts and then connects
130
- (`Source/Clients/DotNET/ChronicleClient.cs:403-409`). When you do need the
131
- connection explicitly — in a worker's `ExecuteAsync`, for instance — it is
132
- `eventStore.Connection.Connect()`.
133
-
134
- `ChronicleClient` is `IDisposable`
135
- (`Source/Clients/DotNET/ChronicleClient.cs:30`) with five public constructors
136
- (`:76`, `:85`, `:94`, `:110`, `:183`). The one that matters for a real
137
- application is `:110`:
138
-
139
- ```csharp
140
- public ChronicleClient(
141
- ChronicleOptions options,
142
- IClientArtifactsProvider? artifactsProvider = null,
143
- IServiceProvider? serviceProvider = null,
144
- IIdentityProvider? identityProvider = null,
145
- ICorrelationIdAccessor? correlationIdAccessor = null,
146
- IEventStoreNamespaceResolver? namespaceResolver = null,
147
- ILoggerFactory? loggerFactory = null,
148
- INamingPolicy? namingPolicy = null)
149
- ```
150
-
151
- The canonical standalone sample uses it — `Samples/SimpleConsole/Program.cs:28-33`:
152
-
153
- ```csharp
154
- var options = ChronicleOptions.FromConnectionString("chronicle://chronicle-dev-client:chronicle-dev-secret@localhost:35000");
155
- options.DefaultSinkTypeId = sinkType;
156
-
157
- using var client = new ChronicleClient(options, loggerFactory: loggerFactory);
158
- var store = await client.GetEventStore("TestStoreCS");
159
- ```
114
+ **There is no `IChronicleClient.Connect`.** `GetEventStore` discovers and connects;
115
+ `eventStore.Connection.Connect()` is the explicit connection form.
116
+ `ChronicleClient` is `IDisposable`; supply the options constructor's collaborators
117
+ instead of retaining sample defaults. Read [client construction](references/client-construction.md)
118
+ when choosing the constructor or passing a real container/logger.
160
119
 
161
120
  ### Options
162
121
 
163
122
  `ChronicleOptions` — `Source/Clients/DotNET/ChronicleOptions.cs`. Statics:
164
- `FromConnectionString(string)` (`:191`), `FromConnectionString(ChronicleConnectionString)`
165
- (`:198`), `FromDevelopmentConnectionString()` (`:214`). The parameterless
166
- constructor (`:40`) is the development connection string.
167
-
168
- Options worth knowing: `AutoDiscoverAndRegister` (default `true`, `:90`),
169
- `ConnectTimeout` (default 5 seconds, `:95`), `SkipKeepAlive` (`:127` — turn the
170
- watchdog off for a short-lived client), `DefaultSinkTypeId` (default
171
- `WellKnownSinkTypes.MongoDB`), `Tls`, `Authentication`, `RegistrationRetry`.
123
+ `FromConnectionString(string)`, `FromConnectionString(ChronicleConnectionString)`,
124
+ `FromDevelopmentConnectionString()`. The parameterless constructor uses the
125
+ development connection string.
126
+
127
+ Options worth knowing: `AutoDiscoverAndRegister` (default `true`),
128
+ `ConnectTimeout` (5 seconds), `SkipKeepAlive` (short-lived clients),
129
+ `DefaultSinkTypeId` (`WellKnownSinkTypes.MongoDB`), `Tls`, `Authentication`,
130
+ `RegistrationRetry`, `SkipCompatibilityCheck`, `ArtifactIdentityDrift` (`Warn`),
131
+ `UnitOfWorkLifecyclePolicy` (`Compatibility`; `Strict` opts in to completion
132
+ checks), `EventGenerationDelivery`, `ExplicitArtifacts`, `ConcurrencyOptions`,
133
+ `ClaimsBasedNamespaceResolverClaimType` (`tenant_id`), and
134
+ `MaxReceiveMessageSize` / `MaxSendMessageSize` (100 MB each).
135
+ `EnableEventTypeGenerationValidation` opts into strict migration-chain checking
136
+ on development kernels; production always enforces it.
172
137
 
173
138
  ### Connection strings, not URLs
174
139
 
@@ -183,12 +148,24 @@ chronicle://user:pass@host[:port]/?opts
183
148
  chronicle+srv://host/?opts
184
149
  ```
185
150
 
186
- Default port `35000`. `Default` is `chronicle://localhost:35000` (`:48`);
151
+ Default port `35000`. `Default` is `chronicle://localhost:35000`;
187
152
  `Development` adds the `chronicle-dev-client` / `chronicle-dev-secret`
188
- credentials (`:57`). Query options: `apiKey`, `auth`, `skipTlsValidation`,
189
- `loadBalancer`, `srvNameServer`, `certificatePath`, `certificatePassword`
190
- (`ChronicleConnectionStringBuilder.cs:27-36`). There is an implicit conversion
191
- from `string` (`:158`) and a `Redacted` form for logging (`:152`).
153
+ credentials. Query options: `apiKey`, `auth`, `skipTlsValidation`,
154
+ `skipCompatibilityCheck`, `loadBalancer`, `srvNameServer`, `certificatePath`,
155
+ `certificatePassword` (`ChronicleConnectionStringBuilder.cs`). There is an
156
+ implicit conversion from `string` and a `Redacted` form for logging.
157
+
158
+ With ClientCredentials auth and **both** username and password absent, the .NET
159
+ client also falls back to these development credentials, including through
160
+ `AddCratisChronicleConnection`. Only a `DEVELOPMENT`-compiled kernel creates the
161
+ application, directly in persistent storage. Switching that storage to a
162
+ production image does not remove it: remove the development application and any
163
+ configuration declaration that would recreate it. Do not infer other clients'
164
+ authentication behavior from this one. Verified at **v19.50.0**:
165
+ `Source/Clients/DotNET/ChronicleClient.cs:334-345`,
166
+ `Source/Clients/Connections/ServiceCollectionExtensions.cs:57-68`, and
167
+ `Source/Kernel/Core/Setup/Authentication/AuthenticationService.cs:170-208`.
168
+ Read [host wiring](references/hosting.md) for the deployment distinction.
192
169
 
193
170
  > **Certificate validation is skipped by default, and that is deliberate.** The
194
171
  > development Chronicle images (`latest-development` and `latest-development-slim`)
@@ -201,6 +178,9 @@ from `string` (`:158`) and a `Redacted` form for logging (`:152`).
201
178
  ### In a host
202
179
 
203
180
  `AddCratisChronicle` is an extension on `IHostApplicationBuilder` (and `WebApplicationBuilder`), not on `IServiceCollection`; there is no `WithClaimsBasedNamespaceResolver`.
181
+ `IServiceCollection` instead has `AddCratisChronicleClient` and
182
+ `AddCratisChronicleConnection` (including `skipTlsValidation`,
183
+ `skipCompatibilityCheck` and `skipKeepAlive` parameters).
204
184
 
205
185
  Read [references/hosting.md](references/hosting.md) when wiring Chronicle into a worker or ASP.NET Core host, or when `AddCratisChronicle` or a namespace resolver does not resolve.
206
186
 
@@ -208,10 +188,9 @@ Read [references/hosting.md](references/hosting.md) when wiring Chronicle into a
208
188
 
209
189
  `ChronicleOptions.EventGenerationDelivery` defaults to `Compatibility`. Opt in
210
190
  with `EventGenerationDelivery.Pinned` (`Cratis.Chronicle.Observation`) **before
211
- connecting**. Reactors and reducers then receive their handler's CLR event
212
- generation (Chronicle **19.41.0+**); typed materialized projections use each
213
- clause's declared CLR event generation (**19.48.0+**). These additions are
214
- verified separately against those release tags, not the baseline above.
191
+ connecting**. Reactors/reducers receive their handler's CLR event generation
192
+ (**19.41.0+**); typed materialized projections use each clause's CLR generation
193
+ (**19.48.0+**), reverified at **19.50.0**.
215
194
 
216
195
  Read [references/pinned-generation-delivery.md](references/pinned-generation-delivery.md)
217
196
  for compiling standalone/host configuration, registration constraints, and the
@@ -317,9 +296,15 @@ if (!result.IsSuccess)
317
296
  several event sources in one batch.
318
297
  - **There is no `AppendAnonymous`.** It does not exist anywhere in the product.
319
298
 
320
- Reading back is on the same interface: `GetForEventSourceIdAndEventTypes` (`:51`),
321
- `HasEventsFor` (`:58`), `GetFromSequenceNumber` (`:67`), `GetNextSequenceNumber`
322
- (`:73`), `GetTailSequenceNumber` (`:84`). Erasure is `Redact` (`:191`, `:200`).
299
+ Reading back is on `IEventSequence`: `GetForEventSourceIdAndEventTypes`,
300
+ `HasEventsFor`, `GetFromSequenceNumber`, `GetNextSequenceNumber`, and
301
+ `GetTailSequenceNumber`. Redaction is `Redact`; subject erasure is a separate
302
+ compliance operation.
303
+
304
+ Read [additional client surfaces](references/additional-surfaces.md) when using
305
+ named tags, prepared appends, metadata-only reads, seeding or cross-cutting event
306
+ properties. For `CompleteStream`, use **cratis-chronicle-event-constraints**;
307
+ for guarded state-dependent decisions, use **cratis-chronicle-decision-reads**.
323
308
 
324
309
  Several appends as one unit:
325
310
 
@@ -392,7 +377,7 @@ Read [references/discovery.md](references/discovery.md) when an event type, reac
392
377
  | Polling `IsConnected` to know it is ready | Connected is not registered; use `WaitForRegistration` |
393
378
  | Treating a quiet reactor as "no events yet" | Keepalive loss stops observers while appends keep succeeding |
394
379
  | Returning from `Main` after appending | The observation stream dies with the process |
395
- | Expecting the analyzers | `Cratis.Chronicle.CodeAnalysis` is a separate opt-in package |
380
+ | Assuming no CHR analyzers without an explicit reference | The client brings `Cratis.Chronicle.CodeAnalysis` transitively since 19.4.8 |
396
381
  | Copying a version out of the repository | It is a `1.0.0` placeholder; take it from nuget.org |
397
382
 
398
383
  ## Verify
@@ -404,7 +389,10 @@ Read [references/discovery.md](references/discovery.md) when an event type, reac
404
389
  - A production connection string sets `skipTlsValidation=false`.
405
390
  - An `ILoggerFactory` is supplied, and client logs are visible.
406
391
  - Observers that take dependencies get a real `IServiceProvider`.
407
- - Readiness is established with `WaitForRegistration`, not with `IsConnected`.
392
+ - Projection readiness inspects the `WaitForRegistration` outcome, not `IsConnected`;
393
+ reactor/reducer readiness waits for their observer state.
394
+ - CHR0054–CHR0057 are clean: dispatchable returns, valid typed stream filters,
395
+ and one projection/reducer target per class.
408
396
  - The process stays alive for as long as observation is expected.
409
397
  - The build is clean and the specifications pass against the verified package
410
398
  version.
@@ -0,0 +1,65 @@
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
+ # Additional client surfaces
5
+
6
+ Verified at **Cratis/Chronicle v19.50.0**:
7
+ `Source/Clients/DotNET/EventSequences/{IEventSequence,EventForEventSourceId}.cs`,
8
+ `Events/{EventSerializer,ICanProvideAdditionalEventInformation}.cs`, `Seeding/`,
9
+ and `Documentation/event-seeding/seeding-with-csharp.mdx`. Connection checks:
10
+ `Source/Clients/Connections/{ChronicleConnection,CertificateLoader}.cs` and
11
+ `Source/Clients/AspNetCore/Diagnostics/ChronicleHealthCheckServiceCollectionExtensions.cs`.
12
+
13
+ ## Tags and ambiguous appends
14
+
15
+ `AppendWithNamedTags` / `AppendManyWithNamedTags` and
16
+ `EventForEventSourceId.NamedTags` carry structured tags (19.15.0+). Tags are
17
+ plaintext and indexed: never personal data, credentials or business payloads.
18
+ Upgrade kernels before clients that depend on named tags. `AppendThroughEventSource`
19
+ uses a declared source type and stream name rather than hand-built routing strings.
20
+
21
+ `Prepare(event)` captures append content; `AppendPrepared(...)` sends that
22
+ prepared event. After an ambiguous transport failure, `VerifyContent(sequenceNumber,
23
+ preparedEvent, eventSourceId)` reports `Equal`, `Different` or `Unavailable`.
24
+ This compares content at a locator, not exactly-once execution. `Unavailable`
25
+ is not evidence of absence; never turn it into a blind retry of irreversible work.
26
+ `Revise(sequenceNumber, event)` is an authorized mutation, not a retry mechanism.
27
+
28
+ `GetMetadataAt` reads without payload, one locator or up to **500** locators.
29
+ Authorize the read first; a metadata-only response can still expose identities
30
+ and causation. Missing events are omitted from the batch. Closing scopes is
31
+ covered by **cratis-chronicle-event-constraints**, not by redaction.
32
+
33
+ ## Cross-cutting event properties
34
+
35
+ `ICanProvideAdditionalEventInformation.ProvideFor(JsonObject @event)` providers
36
+ are discovered automatically. The **.NET client** adds their properties in
37
+ `EventSerializer` before sending; the kernel does not add them. A different
38
+ client must implement its own enrichment contract. Keep domain facts explicit
39
+ in the event type and avoid collisions, secrets or personal-data leakage through
40
+ unannotated added properties.
41
+
42
+ ## Seed events deliberately
43
+
44
+ `ICanSeedEvents.Seed(IEventSeedingBuilder)` declares seeds sent on connection and
45
+ applied once per namespace. `ForNamespace` targets one namespace; global seeds
46
+ also apply to namespaces created later (not a retroactive replay of all history).
47
+ `For` / `ForEventSource` route by source/stream metadata; `ForEvents` keeps each
48
+ wrapper's routing and tags. Routing participates in seed identity, so the same
49
+ payload on another stream is another seed. Seeding is a write, not a read-only
50
+ connect diagnostic; inspect target namespaces before changing it.
51
+
52
+ ## Connection health and discovery
53
+
54
+ Calls while disconnected fail fast (`ConnectionTimedOut`, then
55
+ `ConnectionUnavailable` after backoff); ASP.NET hosts start while the kernel is
56
+ unreachable, log failure and expose the `chronicle` health check.
57
+ `AddChronicleHealthCheck(HealthStatus)` honors its configured failure status.
58
+ `IEventStore.Discovery` and startup reports expose discovered artifacts.
59
+ `IEventSources` is scoped in host wiring, not a singleton to retain across requests.
60
+
61
+ Passwordless PKCS#12 client certificates retain their private key on .NET 9+.
62
+ A pinned server certificate is trusted only when its chain is the sole validation
63
+ failure (`SslPolicyErrors.RemoteCertificateChainErrors` alone): additional
64
+ policy errors such as hostname mismatch are not waived. Production clients still set
65
+ `skipTlsValidation=false`; pinning is not a general validation bypass.
@@ -0,0 +1,42 @@
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
+ # Construct a standalone client
5
+
6
+ Verified at **Cratis/Chronicle v19.50.0**:
7
+ `Source/Clients/DotNET/ChronicleClient.cs` and `IChronicleClient.cs`.
8
+
9
+ The options constructor takes these optional collaborators:
10
+ `IClientArtifactsProvider artifactsProvider`, `IServiceProvider serviceProvider`,
11
+ `IIdentityProvider identityProvider`, `ICorrelationIdAccessor correlationIdAccessor`,
12
+ `IEventStoreNamespaceResolver namespaceResolver`, `ILoggerFactory loggerFactory`,
13
+ and `INamingPolicy namingPolicy`. All default to null at the call boundary and
14
+ are replaced with the standalone defaults described in the skill. A reactor
15
+ with constructor dependencies needs a real container; pass a logger factory to
16
+ see registration failures rather than a silent client.
17
+
18
+ The following is a connection excerpt assuming a configured `loggerFactory`;
19
+ use a development kernel and keep the process alive for observation:
20
+
21
+ ```csharp
22
+ // Copyright (c) Cratis. All rights reserved.
23
+ // Licensed under the MIT license. See LICENSE file in the project root for full license information.
24
+
25
+ using Cratis.Chronicle;
26
+ using Cratis.Chronicle.Registrations;
27
+
28
+ var options = ChronicleOptions.FromConnectionString("chronicle://localhost:35000");
29
+ using var client = new ChronicleClient(options, loggerFactory: loggerFactory);
30
+ var store = await client.GetEventStore("TestStoreCS");
31
+ var outcome = await store.WaitForRegistration();
32
+ if (!outcome.IsSuccess)
33
+ {
34
+ throw outcome.Failure ?? new InvalidOperationException(string.Join(", ", outcome.Failures));
35
+ }
36
+ ```
37
+
38
+ `WaitForRegistration` returns after either success or failure; it is not a reactor
39
+ subscription wait. `IChronicleClient` exposes `Options`, `CausationManager`,
40
+ `GetEventStore(name, namespace)`, `GetEventStores(cancellationToken)`, and
41
+ `EvictEventStores()`. It has no `Connect`: getting a store connects the client;
42
+ `eventStore.Connection.Connect()` is the explicit connection form.
@@ -1,5 +1,17 @@
1
1
  ## The client and the server check each other
2
2
 
3
+ Verified at **Cratis/Chronicle v19.50.0**, `ChronicleConnection.cs`,
4
+ `ChronicleConnectionStringBuilder.cs`, `ChronicleOptions.cs` and
5
+ `Source/Kernel/Compatibility/`.
6
+
7
+ `chronicle://host:35000/?skipCompatibilityCheck=true` or
8
+ `ChronicleOptions.SkipCompatibilityCheck = true` skips the check; either input
9
+ is sufficient, including for a standalone `ChronicleClient`. Use this only for
10
+ a known-safe skew against a kernel that cannot yet be redeployed: it hides
11
+ **genuine incompatibilities too**. This is independent of `skipTlsValidation`.
12
+ Since 19.0.1 the kernel orders contract comparison by protocol version, so added
13
+ fields in a newer client do not by themselves make an older kernel incompatible.
14
+
3
15
  Since Chronicle 17 the compatibility check is a server-side RPC, and **the client
4
16
  runs it automatically inside `Connect()`** —
5
17
  `Source/Clients/Connections/ChronicleConnection.cs:310` calls
@@ -1,22 +1,46 @@
1
- ## Discovery
1
+ <!-- Copyright (c) Cratis. All rights reserved. -->
2
+ <!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
2
3
 
3
- Artifacts are found by **assembly scanning**, with no registration call and no DI
4
- container required. `DefaultClientArtifactsProvider.Default` composes the
5
- project-referenced and package-referenced assemblies
6
- (`Source/Clients/DotNET/DefaultClientArtifactsProvider.cs:37`), and the
7
- predicates are exactly (`:242-251`):
4
+ ## Discovery and explicit registration
8
5
 
9
- | Kind | Predicate |
6
+ Verified at **Cratis/Chronicle v19.50.0**:
7
+ `Source/Clients/DotNET/DefaultClientArtifactsProvider.cs`,
8
+ `Registrations/ExplicitArtifacts.cs`, `Projections/IProjections.cs`,
9
+ `Reactors/IReactors.cs`.
10
+
11
+ `DefaultClientArtifactsProvider.Default` scans project- and package-referenced
12
+ assemblies. Discovered artifacts include:
13
+
14
+ | Kind | Shape |
10
15
  | --- | --- |
11
- | event types | `HasAttribute<EventTypeAttribute>()` or `HasAttribute<EventTypeGenerationForAttribute>()` |
12
- | projections | `HasInterface(typeof(IProjectionFor<>))` |
13
- | model-bound projections | `HasModelBoundProjectionAttributes()` |
14
- | reactors | `HasInterface<IReactor>()` and not generic |
15
- | read model reactors | `HasInterface<IReadModelReactor>()` and not generic |
16
- | reducers | `HasInterface(typeof(IReducerFor<>))` and not generic |
17
-
18
- Explicit registration is available per family as an alternative —
19
- `IEventTypes.Register`, `IConstraints.Register`, `IProjections.Register`,
20
- `IReducers.Register`, `IReactors.Register<TReactor>()`,
21
- `IReadModels.Register<TReadModel>()` — and is what you use with
22
- `AutoDiscoverAndRegister = false`.
16
+ | Event types | `[EventType]` or `[EventTypeGenerationFor]` |
17
+ | Projections | one `IProjectionFor<T>` per class, or model-bound projection annotations |
18
+ | Reactors | non-generic `IReactor` |
19
+ | Read-model reactors | non-generic `IReadModelReactor` |
20
+ | Reducers | non-generic class implementing one `IReducerFor<T>` |
21
+ | Event source definitions | `IEventSource` |
22
+ | Constraints | `IConstraint`, plus `[Unique]`, `[RemoveConstraint]`, `[ClosesStream]` event declarations |
23
+ | Seeds / migrations | `ICanSeedEvents`, `IEventTypeMigrationFor<T>` |
24
+ | Event enrichment / middleware | `ICanProvideAdditionalEventInformation`, reactor middlewares |
25
+
26
+ Multiple projection or reducer targets in one class fail discovery with
27
+ `TypeImplementsMultipleProjectionInterfaces` / `TypeMustImplementOnlyOneReducer`
28
+ (analyzer CHR0057). They are not silently flattened into independent artifacts.
29
+
30
+ Configure `ChronicleOptions.ExplicitArtifacts` **before connecting**:
31
+ `RegisterProjection<TReadModel>(define, id)`, `RegisterReadModel<TReadModel>()`,
32
+ `RegisterReactor(id, builder)`. These participate in every normal registration
33
+ pass, including reconnects. For an existing store, use
34
+ `IProjections.Register<TReadModel>(define, id)` or `Register<TReadModel>()`,
35
+ `IReactors.Define/Register(id, builder)`, and the family-specific event type,
36
+ constraint, reducer and read-model registration APIs. Fluent reactors use typed
37
+ `On<TEvent>` handlers or catch-all `Subscribe`.
38
+
39
+ Runtime reactors also support `IReactors.Register(id, configure, handle)` and
40
+ `Unregister(id)`. Use an explicit stable id for side effects. Variant read models
41
+ cannot be registered explicitly (`VariantReadModelsCannotBeRegisteredExplicitly`).
42
+
43
+ `AutoDiscoverAndRegister = false` disables the automatic pass; owning explicit
44
+ registrations then also means owning their registration and subscription waits.
45
+ Inspect `IEventStore.Discovery` and startup logs before guessing why an artifact
46
+ is missing.
@@ -1,5 +1,9 @@
1
1
  ## In a host
2
2
 
3
+ Verified at **Cratis/Chronicle v19.50.0**, `ChronicleHostApplicationBuilderExtensions.cs`,
4
+ `ChronicleClientServiceCollectionExtensions.cs`, and
5
+ `Source/Clients/Connections/ServiceCollectionExtensions.cs`.
6
+
3
7
  ```csharp
4
8
  var builder = Host.CreateApplicationBuilder(args);
5
9
  builder.AddCratisChronicle(options => options.EventStore = "<EventStoreName>");
@@ -20,7 +24,8 @@ and an optional `EventStoreNamespaceResolverType`.
20
24
  > package), and Aspire's `IDistributedApplicationBuilder`. `IHostBuilder.AddCratisChronicle()`
21
25
  > also exists but only registers concept type converters
22
26
  > (`Source/Clients/DotNET/Hosting/HostBuilderExtensions.cs:18-23`) — it is not
23
- > the wiring entry point.
27
+ > the wiring entry point. `IServiceCollection` has `AddCratisChronicleClient`
28
+ and `AddCratisChronicleConnection` instead.
24
29
 
25
30
  `IChronicleBuilder` extensions are exactly five:
26
31
  `WithArtifactsProvider`, `WithIdentityProvider`, `WithCorrelationIdAccessor`,
@@ -29,3 +34,26 @@ and an optional `EventStoreNamespaceResolverType`.
29
34
  `WithClaimsBasedNamespaceResolver`**, despite a doc comment at
30
35
  `ChronicleOptions.cs:141` referring to one. Pass the resolver instead:
31
36
  `new ChronicleClient(options, namespaceResolver: new ClaimsBasedNamespaceResolver("tenant_id"))`.
37
+
38
+ A host starts even when the kernel is unavailable. Calls while disconnected fail
39
+ fast with `ConnectionTimedOut` or, after backoff, `ConnectionUnavailable`.
40
+ ASP.NET's `AddChronicleHealthCheck(HealthStatus)` exposes the connection health
41
+ under `chronicle` and honors the selected failure status; keep startup failure
42
+ logs visible. Host wiring registers `IEventSources` scoped.
43
+
44
+ ### Development credentials are persisted
45
+
46
+ At **v19.50.0**, ClientCredentials with both username and password absent uses
47
+ `chronicle-dev-client` / `chronicle-dev-secret`:
48
+ `Source/Clients/DotNET/ChronicleClient.cs:334-345` and
49
+ `Source/Clients/Connections/ServiceCollectionExtensions.cs:57-68`.
50
+ `Source/Kernel/Core/Setup/Authentication/AuthenticationService.cs:170-208`
51
+ creates that application **directly in storage** only under `#if DEVELOPMENT`.
52
+ This is a Debug-build symbol, not an ASP.NET environment setting
53
+ (`Documentation/hosting/production.md`, "What makes a build a production build").
54
+ A production kernel reusing development storage can therefore still accept the
55
+ known development credentials. Remove the application from storage and, if
56
+ configured, from bootstrap configuration (configured applications are recreated
57
+ on startup). Changing the image or supplying new client credentials alone does
58
+ not remove that old application. See **cratis-chronicle-hosting** for kernel
59
+ certificates, private h2c and production setup.