@cratis/pi 7.34.0 → 7.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/slice-delivery-checklist.md +1 -1
- 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-automations-and-translations/references/realization-and-gap-fill.md +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -6
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +25 -7
- 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 +4 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +1 -1
- 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 +3 -2
- 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-modeling-lifecycle/references/vocabulary-map.md +2 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +6 -6
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +1 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -4
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -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 +7 -5
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -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 +8 -5
- 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 +11 -5
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +7 -4
- 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 +6 -1
- 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
|
@@ -13,40 +13,32 @@ you construct a client, ask it for an event store, and append or observe.
|
|
|
13
13
|
|
|
14
14
|
## Verified product sources
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
Spring bean this skill names exists there. The `4→5` major is the Chronicle 17/18
|
|
19
|
-
wire migration (gRPC request/response shapes and `ensureSuccess` result
|
|
20
|
-
envelopes — internal to the client); `5.0.0` also adds a `ChronicleCommandRejected`
|
|
21
|
-
exception for a rejected server-side command. The `file:line` citations below
|
|
22
|
-
were taken at `v4.0.0` and may have shifted.
|
|
16
|
+
Verified against `Chronicle.Kotlin` at tag **`v6.13.0`** by source symbols and
|
|
17
|
+
signatures. Historical line citations below are locators, not current line numbers.
|
|
23
18
|
|
|
24
19
|
| Artifact | Version | Verified from |
|
|
25
20
|
| --- | --- | --- |
|
|
26
|
-
| `io.cratis:chronicle` | `
|
|
27
|
-
| `io.cratis:chronicle-spring-boot-starter` | `
|
|
28
|
-
| `io.cratis:chronicle-testing` | `
|
|
29
|
-
| `io.cratis:chronicle-contracts` | `
|
|
21
|
+
| `io.cratis:chronicle` | `6.13.0` | `Chronicle.Kotlin` at tag `v6.13.0` |
|
|
22
|
+
| `io.cratis:chronicle-spring-boot-starter` | `6.13.0` | same tag, `Integrations/SpringBoot` |
|
|
23
|
+
| `io.cratis:chronicle-testing` | `6.13.0` | same tag, `Testing` |
|
|
24
|
+
| `io.cratis:chronicle-contracts` | `19.30.0` | `Source/build.gradle.kts` (`chronicleContractsVersion`) |
|
|
30
25
|
|
|
31
|
-
All three artifacts are published to Maven Central under `io.cratis`
|
|
32
|
-
|
|
33
|
-
`Integrations/SpringBoot/build.gradle.kts:48`). The JVM toolchain is **17**
|
|
34
|
-
(`Source/build.gradle.kts:43`).
|
|
26
|
+
All three artifacts are published to Maven Central under `io.cratis` (their
|
|
27
|
+
`build.gradle.kts` publishing blocks). The JVM toolchain is **17**.
|
|
35
28
|
|
|
36
29
|
> **Do not copy a version number out of the repository's README or docs.** At
|
|
37
|
-
> `
|
|
38
|
-
>
|
|
39
|
-
>
|
|
30
|
+
> `v6.13.0` the README and getting-started documentation still say `6.5.0`.
|
|
31
|
+
> The version comes from a Gradle property injected at release time —
|
|
32
|
+
> `Source/build.gradle.kts` reads
|
|
40
33
|
> `providers.gradleProperty("version")` and defaults to `0.0.0-SNAPSHOT` — so
|
|
41
34
|
> the checked-in source never carries the real number. Take it from Maven
|
|
42
35
|
> Central.
|
|
43
36
|
|
|
44
|
-
> **The client and the kernel version independently.** Client `
|
|
45
|
-
>
|
|
46
|
-
> `
|
|
47
|
-
>
|
|
48
|
-
>
|
|
49
|
-
> both are "latest".
|
|
37
|
+
> **The client and the kernel version independently.** Client `6.13.0` requires
|
|
38
|
+
> kernel `19.30.0` or later. Historically, client `6.5.0` was verified on kernel
|
|
39
|
+
> `19.6.1`, while `19.4.8` rejects it. `CompatibilityPreflight` checks contracts
|
|
40
|
+
> at connect and throws `ChronicleServerIncompatible`; do not infer a supported
|
|
41
|
+
> pair just because both products are "latest".
|
|
50
42
|
|
|
51
43
|
## Common pitfalls
|
|
52
44
|
|
|
@@ -55,10 +47,11 @@ All three artifacts are published to Maven Central under `io.cratis`
|
|
|
55
47
|
| Naming a reactor method after the event | The name is ignored; **the first parameter's type** is the subscription (`EventHandlerMethod.kt:61-74`) |
|
|
56
48
|
| Two `@EventType` classes sharing a simple name | The id defaults to the simple name, so they collide on the wire (`EventTypesService.kt:67`) |
|
|
57
49
|
| Shipping the default connection string to production | `skipTlsValidation` defaults to **true**; certificate validation is off (`ChronicleConnectionString.kt:28`) |
|
|
58
|
-
| Copying a version from the README or docs | Both
|
|
50
|
+
| Copying a version from the README or docs | Both still say `6.5.0` at `v6.13.0`; use the release version |
|
|
51
|
+
| Supplying `apiKey` in the connection string | Client construction rejects it with `IllegalArgumentException`; use `user:password@` |
|
|
59
52
|
| Expecting `getEventStore` to suspend | It does not — the client already connected in its constructor (`ChronicleClient.kt:12`) |
|
|
60
|
-
| Expecting `awaitRegistration()` to
|
|
61
|
-
|
|
|
53
|
+
| Expecting `awaitRegistration()` to prove all artifacts registered | The initial gate completes in `finally` even after failure; connection rejection still throws `ChronicleConnectionFailed` |
|
|
54
|
+
| Treating automatic and explicit registration alike | The automatic pass logs failures; explicit `registerAll()` throws `ArtifactRegistrationFailed` for failed observers, and rejected event-type registration throws `ChronicleCommandRejected` |
|
|
62
55
|
| Expecting read model reactors to be discovered | `IReadModelReactor` is absent from the scan and from `IEventStore`; construct `ReadModelReactors(...)` yourself |
|
|
63
56
|
| Leaving the default classpath scan on in a large app | Use `withArtifactsFrom(...)` or `artifact-packages` to narrow it (`ChronicleOptions.kt:58`) |
|
|
64
57
|
| Expecting WebFlux support from the starter | The web auto-configuration is `SERVLET`-only (`ChronicleWebAutoConfiguration.kt:29`) |
|
|
@@ -97,46 +90,19 @@ fun main() = runBlocking {
|
|
|
97
90
|
}
|
|
98
91
|
```
|
|
99
92
|
|
|
100
|
-
|
|
101
|
-
`
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
| `fun getEventStore(name: String, namespace: String = EventStoreNamespaceName.default.value): EventStore` | `:17-20` | **not** suspending; returns the concrete `EventStore` |
|
|
106
|
-
| `suspend fun getEventStores(): List<String>` | `:27` | asks the kernel |
|
|
107
|
-
| `fun evictEventStores()` | `:36` | drops the local cache, keeps the client |
|
|
108
|
-
| `fun dispose()` | `:39` | `IChronicleClient : AutoCloseable`, `close()` delegates to it (`:41`) |
|
|
109
|
-
|
|
110
|
-
**The client connects in its constructor.** `ChronicleClient.kt:12` is
|
|
111
|
-
`ChronicleConnection(options.connectionString).also { it.connect() }` — there is
|
|
112
|
-
no separate `connect()` step to call, and constructing the client is the
|
|
113
|
-
connecting act. Event stores are cached per `"$name/$namespace"`
|
|
114
|
-
(`ChronicleClient.kt:21`), so repeated `getEventStore` calls return the same
|
|
115
|
-
instance.
|
|
116
|
-
|
|
117
|
-
The default namespace is the literal `"Default"` —
|
|
118
|
-
`EventStoreNamespaceName.kt:13`.
|
|
93
|
+
**The client connects in its constructor.** `getEventStore(name, namespace)`
|
|
94
|
+
is not suspending and returns the cached concrete `EventStore` for that pair.
|
|
95
|
+
The default namespace is `"Default"`. `getEventStores()` suspends;
|
|
96
|
+
`evictEventStores()` drops the cache without closing the client.
|
|
97
|
+
`IChronicleClient` is `AutoCloseable`; `close()` delegates to `dispose()`.
|
|
119
98
|
|
|
120
99
|
### Options
|
|
121
100
|
|
|
122
|
-
`ChronicleOptions`
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
| `connectionString` | required | `:36` |
|
|
128
|
-
| `programIdentifier` | `"Unknown"` | `:37` |
|
|
129
|
-
| `defaultSinkTypeId` | `CHRONICLE_SINK_TYPE` env var, else `WellKnownSinkTypes.MONGODB` | `:38` |
|
|
130
|
-
| `autoDiscoverAndRegister` | `true` | `:39` |
|
|
131
|
-
| `artifacts` | `ClientArtifacts.default` (scans the classpath) | `:40` |
|
|
132
|
-
| `artifactActivator` | `ArtifactActivator` | `:41` |
|
|
133
|
-
| `openTelemetry` | `null` (uses the globally registered one) | `:42` |
|
|
134
|
-
|
|
135
|
-
Two `@JvmStatic` factories: `ChronicleOptions.fromConnectionString(String)`
|
|
136
|
-
(`:69`) and `ChronicleOptions.development()` (`:78`). Two instance helpers:
|
|
137
|
-
`withoutAutoRegistration()` (`:48`) and `withArtifactsFrom(vararg packages)`
|
|
138
|
-
(`:58`) — the second is worth using in any large application, because the
|
|
139
|
-
default scan walks the whole classpath.
|
|
101
|
+
Use `ChronicleOptions.development()` locally or
|
|
102
|
+
`ChronicleOptions.fromConnectionString(String)` for a configured connection.
|
|
103
|
+
Narrow discovery with `withArtifactsFrom(vararg packages)` in a large app.
|
|
104
|
+
Read [references/options.md](references/options.md) when setting naming policy,
|
|
105
|
+
registration, artifact activation, sink type or OpenTelemetry options.
|
|
140
106
|
|
|
141
107
|
### The connection string
|
|
142
108
|
|
|
@@ -149,19 +115,19 @@ chronicle+srv://<host>[:<port>][?<options>]
|
|
|
149
115
|
```
|
|
150
116
|
|
|
151
117
|
Default port is `35000` (`:39`). Recognized query keys, lowercased at parse time
|
|
152
|
-
(
|
|
153
|
-
`srvnameserver`. `
|
|
118
|
+
(`ChronicleConnectionString` parser): `disabletls`, `skiptlsvalidation`,
|
|
119
|
+
`loadbalancer`, `srvnameserver`. `apiKey` is parsed but rejected at client
|
|
120
|
+
creation with `IllegalArgumentException`: the kernel has no API-key authentication.
|
|
121
|
+
Use `user:password@`. Omitting credentials selects `chronicle-dev-client` /
|
|
122
|
+
`chronicle-dev-secret`; these are development credentials, not a production setup. `ChronicleConnectionString.parse(String)` is on the companion
|
|
154
123
|
(`:63`), and `ChronicleConnectionString.DEVELOPMENT` (`:51`) points at
|
|
155
124
|
`localhost:35000` with the `chronicle-dev-client` / `chronicle-dev-secret`
|
|
156
125
|
credentials (`:42-43`).
|
|
157
126
|
|
|
158
|
-
> **TLS is on, certificate validation is off
|
|
159
|
-
>
|
|
160
|
-
>
|
|
161
|
-
>
|
|
162
|
-
> certificate. **A production connection string must carry
|
|
163
|
-
> `?skipTlsValidation=false`**, which is the only way to get chain validation
|
|
164
|
-
> against the platform trust store (`:174-176`).
|
|
127
|
+
> **TLS is on, certificate validation is off by default** (`disableTls = false`,
|
|
128
|
+
> `skipTlsValidation = true`), for a self-signed development kernel.
|
|
129
|
+
> **Production must set `?skipTlsValidation=false`** for platform trust-store
|
|
130
|
+
> chain validation (`ChronicleConnectionString.createCredentials`).
|
|
165
131
|
|
|
166
132
|
### Spring Boot
|
|
167
133
|
|
|
@@ -196,13 +162,19 @@ annotation class EventType(
|
|
|
196
162
|
Two event classes with the same simple name in different packages therefore
|
|
197
163
|
collide on the wire. Give one an explicit `id`.
|
|
198
164
|
|
|
199
|
-
The house shape is a Kotlin `data class` with defaulted properties
|
|
200
|
-
|
|
201
|
-
(`Samples/Java/SpringBoot/.../EmployeeHired.java:9-10`). Property-level
|
|
165
|
+
The house shape is a Kotlin `data class` with defaulted properties or a Java
|
|
166
|
+
`record` (the Spring Boot samples). Property-level
|
|
202
167
|
annotations that travel with the event: `@io.cratis.chronicle.keys.Key`,
|
|
203
168
|
`@io.cratis.chronicle.compliance.Pii`, `@io.cratis.chronicle.Subject`,
|
|
204
169
|
`@io.cratis.chronicle.schemas.JsonSchemaType`.
|
|
205
170
|
|
|
171
|
+
`@Pii` on a `ConceptAs` type is declared once and cascades to its uses.
|
|
172
|
+
For operational secrets (API keys, partner credentials), use
|
|
173
|
+
`@io.cratis.chronicle.confidentiality.Encrypted(scope = EncryptionScope.Subject)`;
|
|
174
|
+
`EncryptionScope` also offers `Namespace` and `Global`. Encryption at rest is
|
|
175
|
+
not right-to-erasure: use `@Pii` for personal data. A value cannot combine
|
|
176
|
+
`@Pii` and `@Encrypted`, and neither is supported on an `EventSourceId` concept.
|
|
177
|
+
|
|
206
178
|
Evolving a schema is `IEventTypeMigration<TTarget, TSource>` with `upcast` and
|
|
207
179
|
`downcast` — `events/migrations/IEventTypeMigration.kt:18-37`. Migrations
|
|
208
180
|
register in the same call as event types
|
|
@@ -244,9 +216,27 @@ if (!result.isSuccess) {
|
|
|
244
216
|
batch must go to different streams — the single-source overloads cannot
|
|
245
217
|
express that.
|
|
246
218
|
|
|
247
|
-
`AppendOptions` (`eventSequences/AppendOptions.kt
|
|
248
|
-
|
|
249
|
-
`
|
|
219
|
+
`AppendOptions` (`eventSequences/AppendOptions.kt`) carries `correlationId`,
|
|
220
|
+
`concurrencyScope`, `eventSourceType`, `eventStreamType`, `eventStreamId`,
|
|
221
|
+
`subject`, `tags`, `occurred`, `causation`, `eventSource`, `eventStream`.
|
|
222
|
+
|
|
223
|
+
Since `6.0.0`, omitted/empty routing resolves **in the kernel** to
|
|
224
|
+
`Default` / `All` / `Default` (source type / stream type / stream id).
|
|
225
|
+
The client no longer substitutes the event source id as stream id. Preserve a
|
|
226
|
+
legacy route by passing all three explicitly. Reads narrow only by supplied
|
|
227
|
+
filters; single-source `appendMany` applies the routing options to every event.
|
|
228
|
+
See the product's `Documentation/guides/migrate-append-routing.md` at `v6.13.0`.
|
|
229
|
+
|
|
230
|
+
For an idempotent create, narrow the concurrency scope and use
|
|
231
|
+
`ConcurrencyScopeBuilder.withExpectsNoMatchingEvent()`. The equivalent is
|
|
232
|
+
`ConcurrencyScope(EventSequenceNumber.unavailable, eventSourceId = true,
|
|
233
|
+
expectsNoMatchingEvent = true)`; a concrete sequence number and this flag are
|
|
234
|
+
mutually exclusive (package `eventSequences.concurrency`).
|
|
235
|
+
|
|
236
|
+
Event-source definitions and their named streams are optional, discovered
|
|
237
|
+
artifacts requiring kernel `19.30.0` or later.
|
|
238
|
+
Read [references/event-sources.md](references/event-sources.md) when declaring
|
|
239
|
+
`@EventSource`/`@EventStream` or appending through a definition.
|
|
250
240
|
|
|
251
241
|
A unit of work spans several appends:
|
|
252
242
|
|
|
@@ -283,19 +273,18 @@ class <ReactorName>(private val <dependency>: <Dependency>) {
|
|
|
283
273
|
}
|
|
284
274
|
```
|
|
285
275
|
|
|
286
|
-
That shape is the shipped sample verbatim
|
|
287
|
-
(`Samples/Kotlin/SpringBoot/.../WelcomePackageReactor.kt:16-22`).
|
|
288
|
-
|
|
289
276
|
**A returned event is appended as a side effect.** `null`, `Unit`, and any value
|
|
290
277
|
whose type is not annotated `@EventType` are ignored; a single event, an
|
|
291
278
|
`EventForEventSourceId`, or a `List` mixing both is appended, defaulting to the
|
|
292
|
-
triggering event source
|
|
279
|
+
triggering event source. A returned `List` is one atomic batch: one rejected
|
|
280
|
+
event rejects all — `observation/ReactorSideEffects.kt:26-39`, `:48-59`.
|
|
293
281
|
This is how a reactor appends without ever touching the event log.
|
|
294
282
|
|
|
295
283
|
`EventContext` is a data class with `sequenceNumber: Long`, `eventSourceId`,
|
|
296
284
|
`eventType`, `occurred`, `correlationId`, `causedBy`, `eventSourceType`,
|
|
297
285
|
`eventStreamType`, `eventStreamId`, `eventStore`, `namespace`, `causation`,
|
|
298
|
-
`tags`, `hash`, `observationState` —
|
|
286
|
+
`tags`, `hash`, `observationState`, `subject`, `eventSource` —
|
|
287
|
+
`events/EventContext.kt`. The constructor changed in `6.0.0`; recompile on upgrade.
|
|
299
288
|
|
|
300
289
|
### The annotations
|
|
301
290
|
|
|
@@ -335,10 +324,18 @@ A model-bound projection puts the projection on the read model with `@FromEvent`
|
|
|
335
324
|
`DecrementFromAll`, `Nested`, `NoAutoMap`, `NoAutoMapProperties`,
|
|
336
325
|
`NotRewindable`. The declarative
|
|
337
326
|
alternative is a class implementing `IProjectionFor<TReadModel>`.
|
|
327
|
+
Use fluent `set(...).toValue(...)` for a constant, or `toProperty(...)` for an
|
|
328
|
+
event property. `set(...).to { }` is deprecated: it never evaluated the lambda.
|
|
329
|
+
`noAutoMap()` is honored; composite key parts can use
|
|
330
|
+
`toEventContextProperty(targetPropertyName, contextProperty)`.
|
|
331
|
+
|
|
332
|
+
`@io.cratis.chronicle.readModels.Passive` and `@Reducer(isActive = false)`
|
|
333
|
+
compute a passive model from its events on read, so a read immediately after an
|
|
334
|
+
append includes that event rather than waiting for a materialized observer.
|
|
338
335
|
|
|
339
336
|
### Variants — mutually exclusive read models for one entity's lifecycle
|
|
340
337
|
|
|
341
|
-
Variants let several read models share one identity and be mutually exclusive; each variant must declare an `@EntersOn`/`entersOn(...)` event or registration throws `VariantMustDeclareEntersOnEvent`.
|
|
338
|
+
Variants let several read models share one identity and be mutually exclusive; each variant must declare an `@EntersOn`/`entersOn(...)` event or registration throws `VariantMustDeclareEntersOnEvent`. Annotations require `6.3.0`; use `6.5.0` or later for end-to-end key support and replay once when upgrading from an earlier version.
|
|
342
339
|
|
|
343
340
|
Read [references/variants.md](references/variants.md) when an entity changes shape over its lifecycle and you need `@VariantOf`, `@EntersOn`, `@GlobalFor` or the declarative `variantOf`/`entersOn` builder.
|
|
344
341
|
|
|
@@ -368,7 +365,8 @@ Read [references/connection-lifecycle.md](references/connection-lifecycle.md) wh
|
|
|
368
365
|
folds a reducer through the same handler-shape rules as production
|
|
369
366
|
(`ReadModelScenario.kt:139-150`). Its scope is small — appends and reducer folds
|
|
370
367
|
only; there is no in-process reactor, projection, or constraint scenario
|
|
371
|
-
(`Testing/api/Testing.api`
|
|
368
|
+
(`Testing/api/Testing.api`). Since `6.5.0`, `EventScenario` assertions and
|
|
369
|
+
`eventsOf` count only events appended after the last `given`.
|
|
372
370
|
|
|
373
371
|
## Verify
|
|
374
372
|
|
|
@@ -380,8 +378,9 @@ only; there is no in-process reactor, projection, or constraint scenario
|
|
|
380
378
|
- Every `@EventType` class has a unique simple name, or an explicit `id`.
|
|
381
379
|
- Every reactor and reducer handler's **first parameter** is an `@EventType`
|
|
382
380
|
class.
|
|
383
|
-
- `awaitRegistration()
|
|
384
|
-
|
|
381
|
+
- Handle `ChronicleConnectionFailed` from `awaitRegistration()`/appends and
|
|
382
|
+
Spring startup; inspect automatic registration diagnostics, or handle explicit
|
|
383
|
+
`registerAll()` failures. The initial gate alone is not proof of full registration.
|
|
385
384
|
- Every variant group has at least one `@EntersOn`/`entersOn(...)` per variant,
|
|
386
385
|
and every `@GlobalFor` member exists on every variant it targets.
|
|
387
386
|
- The build is clean and the specifications pass against the verified artifact
|
package/package/corpus/skills/cratis-chronicle-client-kotlin/references/connection-lifecycle.md
CHANGED
|
@@ -1,5 +1,18 @@
|
|
|
1
1
|
## Connection lifecycle
|
|
2
2
|
|
|
3
|
+
Verified at `Chronicle.Kotlin v6.13.0`: `CompatibilityPreflight`,
|
|
4
|
+
`ConnectionManager`, `ChronicleConnection` and `EventStore.awaitRegistration`.
|
|
5
|
+
|
|
6
|
+
- Connect checks kernel contract compatibility with a 10-second deadline;
|
|
7
|
+
incompatibility raises `ChronicleServerIncompatible`.
|
|
8
|
+
- Credentials are not validated when constructing the client. A rejected
|
|
9
|
+
connection is surfaced by `awaitRegistration()` and the first append as
|
|
10
|
+
`ChronicleConnectionFailed`. The client keeps retrying and can recover.
|
|
11
|
+
- Since `6.11.0`, GUIDs use .NET byte order on the wire. New correlation ids
|
|
12
|
+
round-trip; older events return the first three UUID groups byte-reversed
|
|
13
|
+
relative to what the application originally supplied. Earlier capture ids
|
|
14
|
+
remain stored as-is; supply your original id and the client resolves both.
|
|
15
|
+
|
|
3
16
|
- **Keepalive is two-way.** The kernel pushes a keep-alive down the `Connect`
|
|
4
17
|
stream and the client answers with a separate unary `connectionKeepAlive` RPC
|
|
5
18
|
(`connection/ConnectionManager.kt:30`). A watchdog checks every
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
## Discovery and registration
|
|
2
2
|
|
|
3
|
+
Verified at `Chronicle.Kotlin v6.13.0`: `ClientArtifacts`,
|
|
4
|
+
`ArtifactRegistrations.registerAll` and `EventStore`.
|
|
5
|
+
|
|
3
6
|
`ClientArtifacts` scans the classpath with ClassGraph
|
|
4
7
|
(`artifacts/ClientArtifacts.kt:66-98`), and `ClientArtifacts.default` is a
|
|
5
8
|
process-wide lazy singleton (`:156`). What it looks for (`:66-98`):
|
|
@@ -7,6 +10,7 @@ process-wide lazy singleton (`:156`). What it looks for (`:66-98`):
|
|
|
7
10
|
| Kind | Rule |
|
|
8
11
|
| --- | --- |
|
|
9
12
|
| event types | `@EventType` |
|
|
13
|
+
| event-source definitions | `@EventSource` |
|
|
10
14
|
| event type migrations | implements `IEventTypeMigration` |
|
|
11
15
|
| read models | `@ReadModel` |
|
|
12
16
|
| declarative projections | implements `IProjectionFor` |
|
|
@@ -27,10 +31,14 @@ process-wide lazy singleton (`:156`). What it looks for (`:66-98`):
|
|
|
27
31
|
> projection.
|
|
28
32
|
|
|
29
33
|
Registration order is fixed and matters
|
|
30
|
-
(`
|
|
31
|
-
unowned read models → constraints → model-bound constraints → projections →
|
|
34
|
+
(`ArtifactRegistrations.register`): event types and migrations →
|
|
35
|
+
event-source definitions → unowned read models → constraints → model-bound constraints → projections →
|
|
32
36
|
webhooks → reactors → reducers → captures → seeders. Reactors and reducers are
|
|
33
|
-
started
|
|
37
|
+
started once successfully; failed observers are retried on the next pass.
|
|
38
|
+
An automatic pass logs each failure to stderr and continues reconnecting.
|
|
39
|
+
Explicit `registerAll()` starts the remaining observers then throws
|
|
40
|
+
`ArtifactRegistrationFailed` listing failures. A kernel-rejected event-type
|
|
41
|
+
registration throws `ChronicleCommandRejected`.
|
|
34
42
|
|
|
35
43
|
**Registration re-runs on every reconnect.** `EventStore.kt:226-241` launches a
|
|
36
44
|
coroutine on `Dispatchers.IO` collecting the connection lifecycle and
|
|
@@ -39,6 +47,8 @@ the kernel keys observer subscriptions by it
|
|
|
39
47
|
(`connection/ConnectionLifecycle.kt:24-32`), so observers must re-register — and
|
|
40
48
|
they do.
|
|
41
49
|
|
|
42
|
-
`store.awaitRegistration()`
|
|
50
|
+
`store.awaitRegistration()` waits for the first attempted pass; its gate
|
|
51
|
+
completes in `finally` even on failure. It throws `ChronicleConnectionFailed`
|
|
52
|
+
when the kernel rejects the connection, as do gated appends.
|
|
43
53
|
`store.registerAll()` (`:83`) runs it by hand when
|
|
44
54
|
`autoDiscoverAndRegister = false`.
|
|
@@ -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
|
+
# Event-source definitions and streams
|
|
5
|
+
|
|
6
|
+
Verified at `Chronicle.Kotlin v6.13.0`: `eventSources/EventSource.kt`,
|
|
7
|
+
`EventStream.kt`, `ConcurrencyDimension.kt`, `EventSources.kt` and
|
|
8
|
+
`eventSequences/EventSequenceEventSources.kt`. Requires kernel `19.30.0` or later.
|
|
9
|
+
|
|
10
|
+
Definitions are optional: an append without one keeps the ordinary routing
|
|
11
|
+
contract. A definition is a carrier class, never instantiated, discovered with
|
|
12
|
+
other client artifacts and registered after event types by `ArtifactRegistrations`.
|
|
13
|
+
|
|
14
|
+
```kotlin
|
|
15
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
16
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
17
|
+
|
|
18
|
+
import io.cratis.chronicle.eventSources.ConcurrencyDimension
|
|
19
|
+
import io.cratis.chronicle.eventSources.EventSource
|
|
20
|
+
import io.cratis.chronicle.eventSources.EventStream
|
|
21
|
+
|
|
22
|
+
@EventSource(
|
|
23
|
+
name = "Account",
|
|
24
|
+
description = "A customer account",
|
|
25
|
+
concurrency = [ConcurrencyDimension.EventSourceId],
|
|
26
|
+
streams = [EventStream("Transactions", "Money in and out")]
|
|
27
|
+
)
|
|
28
|
+
class AccountEventSource
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
Excerpt inside a suspending function with an `IEventSequence` named `eventLog`,
|
|
32
|
+
a string `accountId` and a registered event `deposited`:
|
|
33
|
+
|
|
34
|
+
```kotlin
|
|
35
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
36
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
37
|
+
|
|
38
|
+
import io.cratis.chronicle.eventSequences.appendThroughEventSource
|
|
39
|
+
|
|
40
|
+
eventLog.appendThroughEventSource(
|
|
41
|
+
AccountEventSource::class, accountId, deposited, eventStream = "Transactions"
|
|
42
|
+
)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
`appendThroughEventSource` extends `IEventSequence` and takes the definition
|
|
46
|
+
`KClass`, event-source id, event, optional stream name, then `AppendOptions`.
|
|
47
|
+
`appendManyThroughEventSource` takes a `List<Any>` in the event position and
|
|
48
|
+
commits one atomic single-source batch. Alternatively set
|
|
49
|
+
`AppendOptions(eventSource = AccountEventSource::class, eventStream = "Transactions")`.
|
|
50
|
+
Java can use `AppendOptionsBuilder.throughEventSource` on its blocking append path.
|
|
51
|
+
|
|
52
|
+
The definition resolves source type, validates the named stream and records its
|
|
53
|
+
name in `EventContext.eventSource` (empty for events without a definition,
|
|
54
|
+
including older stored events). Its concurrency dimensions apply unless an
|
|
55
|
+
explicit scope is supplied. Explicit routing must agree with the definition;
|
|
56
|
+
this is not a way to silently override another route.
|
|
57
|
+
|
|
58
|
+
- `UnknownEventSource`: definition was not discovered.
|
|
59
|
+
- `EventStreamDoesNotBelongToEventSource`: stream name is not declared.
|
|
60
|
+
- `EventRoutingContradictsEventSource`: explicit route contradicts the definition.
|
|
61
|
+
- `ConflictingEventSourceConcurrency`: incompatible declared concurrency.
|
|
62
|
+
|
|
63
|
+
Verify discovery and registration against the target kernel, then specify both
|
|
64
|
+
successful routing and rejected contradictory options. Do not treat an initial
|
|
65
|
+
registration gate as proof every artifact registered.
|
|
@@ -0,0 +1,29 @@
|
|
|
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 options
|
|
5
|
+
|
|
6
|
+
Verified at `Chronicle.Kotlin v6.13.0`: `ChronicleOptions.kt` and
|
|
7
|
+
`readModels/DefaultReadModelNamingPolicy.kt`. `ChronicleOptions` is a data class
|
|
8
|
+
with `@JvmOverloads` constructors.
|
|
9
|
+
|
|
10
|
+
| Property | Default |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| `connectionString` | required |
|
|
13
|
+
| `programIdentifier` | `"Unknown"` |
|
|
14
|
+
| `defaultSinkTypeId` | `CHRONICLE_SINK_TYPE` env var, else `WellKnownSinkTypes.MONGODB` |
|
|
15
|
+
| `autoDiscoverAndRegister` | `true` |
|
|
16
|
+
| `artifacts` | `ClientArtifacts.default` (scans the classpath) |
|
|
17
|
+
| `artifactActivator` | `ArtifactActivator` |
|
|
18
|
+
| `openTelemetry` | `null` (uses globally registered API) |
|
|
19
|
+
| `readModelNamingPolicy` | `DefaultReadModelNamingPolicy`: `@ReadModel(id)` or simple name |
|
|
20
|
+
|
|
21
|
+
Set `readModelNamingPolicy` with `withReadModelNamingPolicy(policy)`, **not a
|
|
22
|
+
constructor argument**. It names the storage collection/table, not the
|
|
23
|
+
read-model identifier. `copy()` drops it: set it again afterward.
|
|
24
|
+
`withoutAutoRegistration()` and `withArtifactsFrom(...)` preserve it.
|
|
25
|
+
|
|
26
|
+
Two `@JvmStatic` factories: `ChronicleOptions.fromConnectionString(String)`
|
|
27
|
+
and `ChronicleOptions.development()`. Use `withoutAutoRegistration()` for
|
|
28
|
+
explicit registration or `withArtifactsFrom(vararg packages)` to avoid scanning
|
|
29
|
+
the entire classpath in a large application.
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
## Spring Boot
|
|
2
2
|
|
|
3
|
+
Verified at `Chronicle.Kotlin v6.13.0`: `ChronicleProperties`,
|
|
4
|
+
`ChronicleAutoConfiguration`, `ChronicleStartup` and `ChronicleWebAutoConfiguration`.
|
|
5
|
+
|
|
3
6
|
The starter registers exactly two auto-configurations —
|
|
4
7
|
`Integrations/SpringBoot/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports`:
|
|
5
8
|
|
|
@@ -31,6 +34,16 @@ Everything else has a default (`ChronicleProperties.kt:44-55`):
|
|
|
31
34
|
| `namespace-resolution.strategy` | `FIXED` | `:65` |
|
|
32
35
|
| `namespace-resolution.http-header` | `"x-cratis-tenant-id"` | `:66` |
|
|
33
36
|
| `namespace-resolution.claim` | `"tenant_id"` | `:67` |
|
|
37
|
+
| `unit-of-work.enabled` | `true` | `ChronicleProperties.UnitOfWork` |
|
|
38
|
+
| `causation.enabled` | `true` | `ChronicleProperties.Causation` |
|
|
39
|
+
| `identity.enabled` | `true` | `ChronicleProperties.Identity` |
|
|
40
|
+
|
|
41
|
+
The starter selects a unique `ReadModelNamingPolicy` bean. With none or an
|
|
42
|
+
ambiguous set, it retains identifier-based naming. A rejected connection at
|
|
43
|
+
startup propagates `ChronicleConnectionFailed` and fails the application;
|
|
44
|
+
an unreachable kernel only logs after `registration-timeout` and keeps retrying.
|
|
45
|
+
Chronicle uses kotlinx-coroutines `1.10.2`; remove an older
|
|
46
|
+
`kotlin-coroutines.version` override to `1.11.0`.
|
|
34
47
|
|
|
35
48
|
`NamespaceResolution.Strategy` is `FIXED`, `HTTP_HEADER`, `SUBDOMAIN`,
|
|
36
49
|
`AUTHENTICATION` (`ChronicleProperties.kt:70-82`).
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
## Variants — mutually exclusive read models for one entity's lifecycle
|
|
2
2
|
|
|
3
|
-
>
|
|
4
|
-
> `
|
|
5
|
-
>
|
|
6
|
-
>
|
|
3
|
+
> Verified at `Chronicle.Kotlin v6.13.0` (`projections/VariantOf.kt`,
|
|
4
|
+
> `EntersOn.kt`, `GlobalFor.kt`, `ProjectionsService.kt`). Annotations shipped in
|
|
5
|
+
> `6.3.0`; end-to-end support requires `6.5.0` or later. Earlier definitions
|
|
6
|
+
> stored `$eventSourceId` keys empty: replay affected projections once on upgrade.
|
|
7
|
+
> Take the version from Maven Central, not the checked-in source.
|
|
7
8
|
|
|
8
9
|
Some entities do not have one shape for their whole lifetime — a work item is a
|
|
9
10
|
backlog entry until a pull request exists for it, then it is a pull request
|