@cratis/pi 7.34.1 → 7.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/agents/security-reviewer.md +1 -0
- package/package/corpus/agents/spec-writer.md +1 -1
- package/package/corpus/harnesses/pi/extensions/shared/rules.ts +3 -1
- package/package/corpus/hooks/scripts/cratis-nuget-pins.txt +7 -6
- package/package/corpus/hooks/scripts/cratis-release-notes-reviewed.cjs +7 -6
- package/package/corpus/hooks/scripts/cratis-store-mutations.json +7 -3
- package/package/corpus/product-sync.json +896 -0
- package/package/corpus/prompts/add-business-rule.prompt.md +1 -1
- package/package/corpus/prompts/ship-changes.prompt.md +2 -2
- package/package/corpus/rules/ai-distribution.md +31 -3
- package/package/corpus/rules/application-profile.md +2 -1
- package/package/corpus/rules/components.md +66 -7
- package/package/corpus/rules/concepts.md +11 -3
- package/package/corpus/rules/csharp.md +3 -1
- package/package/corpus/rules/dialogs.md +9 -0
- package/package/corpus/rules/efcore.md +1 -1
- package/package/corpus/rules/elixir.md +49 -0
- package/package/corpus/rules/framework.md +5 -3
- package/package/corpus/rules/general.md +1 -0
- package/package/corpus/rules/glossary.md +4 -4
- package/package/corpus/rules/go-engineering.md +60 -0
- package/package/corpus/rules/go.md +115 -0
- package/package/corpus/rules/java.md +5 -2
- package/package/corpus/rules/kotlin.md +7 -5
- package/package/corpus/rules/orleans.md +65 -9
- package/package/corpus/rules/profiles.md +43 -6
- package/package/corpus/rules/pull-requests.md +3 -3
- package/package/corpus/rules/react.md +8 -1
- package/package/corpus/rules/reactors.md +27 -3
- package/package/corpus/rules/specs.csharp.md +11 -4
- package/package/corpus/rules/specs.scenarios.csharp.md +35 -4
- package/package/corpus/rules/specs.typescript.md +2 -1
- package/package/corpus/rules/storybook.md +1 -1
- package/package/corpus/rules/typescript.md +1 -1
- package/package/corpus/rules/vertical-slices.md +37 -5
- package/package/corpus/skills/cratis-application-react-specifications/SKILL.md +4 -2
- package/package/corpus/skills/cratis-application-slice-specifications/SKILL.md +18 -8
- package/package/corpus/skills/cratis-application-slice-specifications/references/query-and-decision-scenarios.md +65 -0
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/SKILL.md +53 -57
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authentication.md +38 -42
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authorization.md +18 -7
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authproxy.md +30 -0
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/frontend.md +12 -9
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/local-development.md +9 -9
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/observable-emission-guards.md +8 -5
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/tenancy.md +20 -4
- package/package/corpus/skills/cratis-arc-command/SKILL.md +32 -10
- package/package/corpus/skills/cratis-arc-command/references/command-result.md +12 -5
- package/package/corpus/skills/cratis-arc-command/references/decisions-and-routing.md +95 -0
- package/package/corpus/skills/cratis-arc-command/references/generated-values.md +3 -2
- package/package/corpus/skills/cratis-arc-command/references/handler-shapes.md +8 -8
- package/package/corpus/skills/cratis-arc-command/references/proxy-generation.md +22 -3
- package/package/corpus/skills/cratis-arc-command/references/read-model-injection.md +13 -1
- package/package/corpus/skills/cratis-arc-command-execution/SKILL.md +19 -9
- package/package/corpus/skills/cratis-arc-command-kotlin/SKILL.md +44 -18
- package/package/corpus/skills/cratis-arc-command-kotlin/references/read-model-naming.md +29 -0
- package/package/corpus/skills/cratis-arc-command-operation/SKILL.md +10 -9
- package/package/corpus/skills/cratis-arc-command-operation/references/execution-and-recovery.md +2 -2
- package/package/corpus/skills/cratis-arc-command-operation/references/testing.md +4 -3
- package/package/corpus/skills/cratis-arc-command-typescript/SKILL.md +42 -22
- package/package/corpus/skills/cratis-arc-command-typescript/references/chronicle-events.md +36 -5
- package/package/corpus/skills/cratis-arc-command-typescript/references/command-operations.md +114 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/hosting-and-storage.md +37 -16
- package/package/corpus/skills/cratis-arc-command-typescript/references/identity-and-introspection.md +88 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/observability-and-host-scopes.md +25 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/proxy-generation.md +35 -4
- package/package/corpus/skills/cratis-arc-command-typescript/references/slice-layout.md +11 -0
- package/package/corpus/skills/cratis-arc-command-typescript/verification.json +8 -1
- package/package/corpus/skills/cratis-arc-command-validation/SKILL.md +49 -19
- package/package/corpus/skills/cratis-arc-ef-core-migration/SKILL.md +12 -6
- package/package/corpus/skills/cratis-arc-go/SKILL.md +148 -0
- package/package/corpus/skills/cratis-arc-go/references/queries.md +80 -0
- package/package/corpus/skills/cratis-arc-hosting/SKILL.md +96 -0
- package/package/corpus/skills/cratis-arc-hosting/references/integrations-and-publish.md +80 -0
- package/package/corpus/skills/cratis-arc-identity-and-tenancy-kotlin/SKILL.md +137 -0
- package/package/corpus/skills/cratis-arc-observable-query-http/SKILL.md +20 -2
- package/package/corpus/skills/cratis-arc-query-kotlin/SKILL.md +26 -6
- package/package/corpus/skills/cratis-arc-query-paging/SKILL.md +25 -20
- package/package/corpus/skills/cratis-arc-query-typescript/SKILL.md +32 -6
- package/package/corpus/skills/cratis-arc-query-typescript/references/storage-observation-and-compliance.md +66 -0
- package/package/corpus/skills/cratis-arc-query-typescript/verification.json +5 -1
- package/package/corpus/skills/cratis-arc-react-page/SKILL.md +24 -13
- package/package/corpus/skills/cratis-arc-react-page/references/data-page.md +20 -10
- package/package/corpus/skills/cratis-arc-react-page/references/data-tables.md +17 -3
- package/package/corpus/skills/cratis-arc-react-page/references/dialogs.md +14 -3
- package/package/corpus/skills/cratis-arc-react-page/references/from-screenplay.md +6 -1
- package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +1 -1
- package/package/corpus/skills/cratis-arc-react-page/references/queries-and-commands.md +11 -1
- package/package/corpus/skills/cratis-arc-react-page/verification.json +6 -1
- package/package/corpus/skills/cratis-arc-spring-data-kotlin/SKILL.md +163 -0
- package/package/corpus/skills/cratis-arc-testing-kotlin/SKILL.md +131 -0
- package/package/corpus/skills/cratis-arc-validation-kotlin/SKILL.md +44 -11
- package/package/corpus/skills/cratis-arc-validation-typescript/SKILL.md +5 -3
- package/package/corpus/skills/cratis-chronicle-cli-operations/SKILL.md +79 -25
- package/package/corpus/skills/cratis-chronicle-cli-operations/references/command-effects.md +57 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/SKILL.md +87 -99
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/additional-surfaces.md +65 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/client-construction.md +42 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/compatibility-check.md +12 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/discovery.md +43 -19
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/hosting.md +29 -1
- package/package/corpus/skills/cratis-chronicle-client-elixir/SKILL.md +158 -162
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/append-api.md +36 -15
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/compliance.md +32 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/connections.md +56 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/event-sources.md +64 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/pitfalls.md +25 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/projections.md +48 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/upgrading.md +34 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/variants.md +13 -5
- package/package/corpus/skills/cratis-chronicle-client-elixir/verification.json +23 -0
- package/package/corpus/skills/cratis-chronicle-client-go/SKILL.md +162 -0
- package/package/corpus/skills/cratis-chronicle-client-go/references/projections.md +73 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/SKILL.md +87 -88
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/connection-lifecycle.md +13 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/discovery-and-registration.md +14 -4
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/event-sources.md +65 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/options.md +29 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/spring-boot.md +13 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/variants.md +5 -4
- package/package/corpus/skills/cratis-chronicle-client-typescript/SKILL.md +165 -156
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/read-models-and-projections.md +54 -11
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/testing.md +126 -0
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/variants.md +3 -5
- package/package/corpus/skills/cratis-chronicle-client-typescript/verification.json +19 -0
- package/package/corpus/skills/cratis-chronicle-compliance/SKILL.md +36 -13
- package/package/corpus/skills/cratis-chronicle-decision-reads/SKILL.md +110 -0
- package/package/corpus/skills/cratis-chronicle-decision-reads/references/admission-and-ownership.md +57 -0
- package/package/corpus/skills/cratis-chronicle-decision-reads/verification.json +12 -0
- package/package/corpus/skills/cratis-chronicle-event-constraints/SKILL.md +58 -19
- package/package/corpus/skills/cratis-chronicle-event-constraints/references/closing-streams.md +73 -0
- package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +32 -3
- package/package/corpus/skills/cratis-chronicle-event-specifications/SKILL.md +18 -5
- package/package/corpus/skills/cratis-chronicle-event-type-migration/SKILL.md +32 -2
- package/package/corpus/skills/cratis-chronicle-hosting/SKILL.md +134 -0
- package/package/corpus/skills/cratis-chronicle-hosting/references/operations.md +89 -0
- package/package/corpus/skills/cratis-chronicle-hosting/verification.json +14 -0
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/SKILL.md +93 -66
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/blocked-tools.md +21 -7
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/deployment.md +77 -0
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/observational-tools.md +46 -4
- package/package/corpus/skills/cratis-chronicle-multi-tenancy/SKILL.md +15 -1
- package/package/corpus/skills/cratis-chronicle-projection/SKILL.md +44 -10
- package/package/corpus/skills/cratis-chronicle-projection/references/fluent-builder.md +7 -1
- package/package/corpus/skills/cratis-chronicle-projection/references/model-bound-attributes.md +8 -0
- package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +85 -105
- package/package/corpus/skills/cratis-chronicle-reactor/references/specifications.md +20 -1
- package/package/corpus/skills/cratis-chronicle-read-model/SKILL.md +2 -2
- package/package/corpus/skills/cratis-chronicle-read-model/references/queries.md +35 -16
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +15 -3
- package/package/corpus/skills/cratis-chronicle-reducer/SKILL.md +23 -4
- package/package/corpus/skills/cratis-chronicle-web-workbench/SKILL.md +40 -15
- package/package/corpus/skills/cratis-cli-terminal-workbench/SKILL.md +20 -6
- package/package/corpus/skills/cratis-code-review/SKILL.md +25 -3
- package/package/corpus/skills/cratis-components-accessibility/SKILL.md +20 -4
- package/package/corpus/skills/cratis-components-schema-editor/SKILL.md +40 -28
- package/package/corpus/skills/cratis-components-schema-editor/references/tree-layout.md +62 -0
- package/package/corpus/skills/cratis-components-schema-editor/verification.json +14 -0
- package/package/corpus/skills/cratis-components-stepper-command-dialog/SKILL.md +16 -8
- package/package/corpus/skills/cratis-components-styling/SKILL.md +57 -20
- package/package/corpus/skills/cratis-components-styling/verification.json +13 -0
- package/package/corpus/skills/cratis-components-toolbar/SKILL.md +37 -7
- package/package/corpus/skills/cratis-components-toolbar/verification.json +12 -0
- package/package/corpus/skills/cratis-engineering-csharp-conventions/SKILL.md +6 -0
- package/package/corpus/skills/cratis-engineering-csharp-conventions/references/exceptions-logging-and-di.md +5 -3
- package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +19 -6
- package/package/corpus/skills/cratis-fundamentals-concept/references/typescript-concepts.md +97 -0
- package/package/corpus/skills/cratis-fundamentals-concept/verification.json +4 -1
- package/package/corpus/skills/cratis-fundamentals-concept-go/SKILL.md +112 -0
- package/package/corpus/skills/cratis-fundamentals-type-discovery/SKILL.md +54 -17
- package/package/corpus/skills/cratis-fundamentals-type-discovery/verification.json +14 -0
- package/package/corpus/skills/cratis-lens-browser-extension/SKILL.md +55 -28
- package/package/corpus/skills/cratis-performance-review/SKILL.md +5 -2
- package/package/corpus/skills/cratis-release-notes/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +5 -4
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -6
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +24 -6
- package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +4 -2
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -1
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +2 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +1 -0
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +34 -4
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +5 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +4 -2
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +42 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +3 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +48 -0
- package/package/corpus/skills/cratis-screenplay-specifications/verification.json +3 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +4 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +5 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +8 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +16 -11
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +5 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1329 -32
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -7
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +2 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +27 -9
- package/package/corpus/skills/cratis-security-review/SKILL.md +9 -3
- package/package/corpus/skills/cratis-security-review/references/arc-boundaries.md +59 -0
- package/package/corpus/skills/cratis-specification-by-example/SKILL.md +7 -0
- package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +43 -11
- package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +16 -4
- package/package/corpus/skills/cratis-specifications-csharp/references/csharp-patterns.md +18 -5
- package/package/corpus/skills/cratis-specifications-csharp/references/integration-specs.md +21 -0
- package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +34 -0
- package/package/corpus/skills/cratis-specifications-csharp/verification.json +13 -0
- package/package/corpus/skills/cratis-specifications-typescript/SKILL.md +14 -5
- package/package/corpus/skills/cratis-specifications-typescript/verification.json +12 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +8 -2
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +6 -3
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +10 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/scene-runtime.md +75 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +5 -0
- package/package/corpus/skills/cratis-studio-mcp-safety-guidance/SKILL.md +14 -1
- package/package/profile-catalog.json +68 -1
- package/package.json +1 -1
- 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
|
-
|
|
20
|
-
|
|
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 |
|
|
22
|
+
| Package | Version | Purpose |
|
|
26
23
|
| --- | --- | --- |
|
|
27
|
-
| `Cratis.Chronicle` | `
|
|
28
|
-
| `Cratis.Chronicle.Connections` | `
|
|
29
|
-
| `Cratis.Chronicle.AspNetCore` | `
|
|
30
|
-
| `Cratis.Chronicle.Testing` | `
|
|
31
|
-
| `Cratis.Chronicle.CodeAnalysis` | `
|
|
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
|
|
34
|
-
|
|
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.
|
|
42
|
-
when `autoDiscoverAndRegister` is on
|
|
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
|
|
45
|
-
|
|
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
|
-
|
|
49
|
-
|
|
50
|
-
`
|
|
51
|
-
|
|
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
|
|
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
|
|
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
|
|
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`
|
|
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
|
|
97
|
-
|
|
98
|
-
|
|
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
|
-
|
|
113
|
-
|
|
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`
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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)
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
Options worth knowing: `AutoDiscoverAndRegister` (default `true
|
|
169
|
-
`ConnectTimeout` (
|
|
170
|
-
|
|
171
|
-
`
|
|
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
|
|
151
|
+
Default port `35000`. `Default` is `chronicle://localhost:35000`;
|
|
187
152
|
`Development` adds the `chronicle-dev-client` / `chronicle-dev-secret`
|
|
188
|
-
credentials
|
|
189
|
-
`loadBalancer`, `srvNameServer`, `certificatePath`,
|
|
190
|
-
(`ChronicleConnectionStringBuilder.cs
|
|
191
|
-
from `string`
|
|
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
|
|
212
|
-
|
|
213
|
-
|
|
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
|
|
321
|
-
`HasEventsFor
|
|
322
|
-
|
|
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
|
-
|
|
|
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
|
-
-
|
|
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.
|
package/package/corpus/skills/cratis-chronicle-client-dotnet/references/additional-surfaces.md
ADDED
|
@@ -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.
|
package/package/corpus/skills/cratis-chronicle-client-dotnet/references/client-construction.md
ADDED
|
@@ -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.
|
package/package/corpus/skills/cratis-chronicle-client-dotnet/references/compatibility-check.md
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
| reactors | `
|
|
15
|
-
|
|
|
16
|
-
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
`
|
|
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.
|