@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
package/package/corpus/skills/cratis-chronicle-event-constraints/references/closing-streams.md
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
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
|
+
# Closing scope and recovery
|
|
5
|
+
|
|
6
|
+
Verified at **Cratis/Chronicle v19.50.0**:
|
|
7
|
+
`Source/Clients/DotNET/EventSequences/{IEventSequence,ClosedStreamScope,CompleteStreamError}.cs`,
|
|
8
|
+
`Events/Constraints/ClosesStreamAttribute.cs`,
|
|
9
|
+
`Documentation/closing-streams/` and `Documentation/scenarios/close-the-books.mdx`.
|
|
10
|
+
|
|
11
|
+
## Choose the scope before closing
|
|
12
|
+
|
|
13
|
+
`ClosedStreamScope` has optional `EventSourceId`, `EventSourceType`,
|
|
14
|
+
`EventStreamType`, `EventStreamId`. Unset dimensions are wildcards. All set
|
|
15
|
+
values must match for an append to be refused.
|
|
16
|
+
|
|
17
|
+
- Source id alone closes **all** its streams.
|
|
18
|
+
- Stream type/id alone closes that pair for **all** sources.
|
|
19
|
+
- Source id plus type/id closes just that source's stream.
|
|
20
|
+
- Source type alone closes every source of that type.
|
|
21
|
+
|
|
22
|
+
`ForEventSource(id)` and `ForStream(type, id)` are convenience factories.
|
|
23
|
+
`All` / `Default` are real stream values, not unset dimensions. Closing the
|
|
24
|
+
catch-all default without a specific source or other specific dimension returns
|
|
25
|
+
`DefaultStreamCannotBeCompleted`. Empty scope returns `EmptyScope`.
|
|
26
|
+
|
|
27
|
+
Pass `expectedTailSequenceNumber` when a manual close must refuse if another
|
|
28
|
+
event landed after the last fact you read. Mismatch returns `ExpectedTailMismatch`.
|
|
29
|
+
Manual coverage returns `AlreadyCompleted`, before the expected-tail check:
|
|
30
|
+
retrying does not duplicate the closure. Coverage by an event-owned closure
|
|
31
|
+
alone still writes a manual closure; a later reopening event cannot undo it.
|
|
32
|
+
Use a kernel that supports scoped closing; an older server must not be allowed
|
|
33
|
+
to ignore dimensions and close a wider scope.
|
|
34
|
+
|
|
35
|
+
## Close the books with a fact
|
|
36
|
+
|
|
37
|
+
For a completed accounting period, carry the period identifier in the closing
|
|
38
|
+
fact and bind it with `ClosesStreamAttribute.EventStreamIdFrom`. Explicitly
|
|
39
|
+
choose `Dimensions`: decide whether the closure is one account's period or all
|
|
40
|
+
accounts' period. Route normal appends to that same period stream. The closing
|
|
41
|
+
event is accepted; later matching appends get `StreamClosed`. Continue new work
|
|
42
|
+
in the next period, rather than blindly retrying into the closed one.
|
|
43
|
+
|
|
44
|
+
`ReopenedBy` names domain events that remove **that constraint's exact closure**.
|
|
45
|
+
They never remove manual closures. Closing/reopening run in the append's grain
|
|
46
|
+
turn, not crash-atomically with durable append. Constraint reindex repairs
|
|
47
|
+
missing event-owned closures and never changes manual ones. Registration or
|
|
48
|
+
removal of a declaration does not automatically reindex historical facts.
|
|
49
|
+
Redacted property-sourced closing/reopening facts can leave the owning index
|
|
50
|
+
untouched because their scope is unrecoverable; inspect the warning rather than
|
|
51
|
+
assuming a complete rebuild. Read the appended generation when evolving a
|
|
52
|
+
property-sourced scope.
|
|
53
|
+
|
|
54
|
+
## Inspect and repair
|
|
55
|
+
|
|
56
|
+
`IsStreamCompleted(scope)` checks coverage; `GetClosedStreams(within)` lists
|
|
57
|
+
matching persisted scopes. Workbench's namespace **Closed streams** view shows
|
|
58
|
+
source/type/stream, origin, closing owner, sequence number and time; it is
|
|
59
|
+
read-only, not a reopen button.
|
|
60
|
+
|
|
61
|
+
Kernel `ReopenStreamScope` is an administrator repair path for a mistaken manual
|
|
62
|
+
close, not a normal business transition. Name exact scope, reason and target;
|
|
63
|
+
get authorization, re-read, then act. It appends `StreamScopeReopened` before
|
|
64
|
+
removing the manual closure; failed audit append leaves it closed. It refuses
|
|
65
|
+
an event-owned closure (`ClosedByEvent`); use the modeled reopening event there.
|
|
66
|
+
|
|
67
|
+
## Specify both sides
|
|
68
|
+
|
|
69
|
+
Use `EventScenario` for completing a scope and asserting a later append's
|
|
70
|
+
`StreamClosed` constraint violation. Include an unrelated source/period still
|
|
71
|
+
open, expected-tail mismatch, repeated completion and, where declared, reopening.
|
|
72
|
+
Keep integration proof for client/kernel compatibility and recovery. Closing
|
|
73
|
+
preserves history: observers and projection replay still consume prior events.
|
|
@@ -37,8 +37,11 @@ and the request is wiring or a narrow fix.
|
|
|
37
37
|
|
|
38
38
|
## Verified product sources
|
|
39
39
|
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
Verified against **Cratis/Chronicle v19.50.1**:
|
|
41
|
+
`Source/Clients/DotNET.CodeAnalysis/DiagnosticIds.cs`,
|
|
42
|
+
`ProtectedValues/EncryptedAttribute.cs`, `EventSources/`, `Events/PublicAttribute.cs`,
|
|
43
|
+
`Sinks/PublishToAttribute.cs`, and `Events/Constraints/ClosesStreamAttribute.cs`
|
|
44
|
+
(paths under `Source/Clients/DotNET/` unless otherwise stated).
|
|
42
45
|
Current version pins: `cratis-screenplay-toolchain` `references/versions.md`.
|
|
43
46
|
|
|
44
47
|
| Package | Purpose |
|
|
@@ -90,6 +93,29 @@ Do not append an event for derived or aggregate state. Project it from the sourc
|
|
|
90
93
|
events instead; an event that records a total is a fact that can disagree with
|
|
91
94
|
its own inputs.
|
|
92
95
|
|
|
96
|
+
## Public facts and streams that end
|
|
97
|
+
|
|
98
|
+
Declare source vocabulary with `IEventSource`, `[EventSource]` and `[EventStream]`;
|
|
99
|
+
use **cratis-chronicle-client-dotnet** for append routing and
|
|
100
|
+
**cratis-chronicle-reactor** for `[FromEventSource<T>]` filters. A stream that
|
|
101
|
+
ends needs an explicit lifetime and scope: does closing cover one source, a
|
|
102
|
+
period across sources, or every stream of a source type? Prefer a past-tense
|
|
103
|
+
closing fact with `[ClosesStream]`; use **cratis-chronicle-event-constraints** for
|
|
104
|
+
manual scope completion, reopening and its crash/reindex limits. Closing refuses
|
|
105
|
+
new appends; it does not erase history or stop projection replay. Specify a
|
|
106
|
+
late append refusal and an unrelated scope remaining open.
|
|
107
|
+
|
|
108
|
+
`[Public]` permits an event type to leave the event log; `[PublishTo("sequence")]`
|
|
109
|
+
selects publication for projection/reducer output. Private types cannot go to
|
|
110
|
+
outbox, and the event log is not a publication target. Translate inbox facts
|
|
111
|
+
into local facts at the boundary rather than treating external contracts as
|
|
112
|
+
local commands. Named tags are plaintext, indexed metadata: never personal data.
|
|
113
|
+
|
|
114
|
+
State-dependent decisions need **cratis-chronicle-decision-reads** when their
|
|
115
|
+
read facts must remain valid at append; an ordinary passive read alone does not
|
|
116
|
+
close the read/append race. Arc command integration belongs to
|
|
117
|
+
**cratis-arc-command-validation**.
|
|
118
|
+
|
|
93
119
|
## Information completeness — trace every field to an event
|
|
94
120
|
|
|
95
121
|
This is the check that pays for itself, and it belongs at modeling time rather
|
|
@@ -109,7 +135,10 @@ Chronicle is allowed where the rule needs it (an injected read model read by
|
|
|
109
135
|
explicit key, or a `[Passive]` projection for a command-side decision); see
|
|
110
136
|
Cross-slice patterns in `rules/vertical-slices.md`. Make such a read deliberate
|
|
111
137
|
and name it in the brief, with the consistency it needs: a rule that must hold
|
|
112
|
-
under concurrency
|
|
138
|
+
under concurrency needs enrolled guarded reads, not plain injection or a stale
|
|
139
|
+
materialized snapshot. In Arc v22.75.0 use `IStreamReads`/`StreamDecision` for one
|
|
140
|
+
stream or `[ProtectedDecision]` + admitted `DecisionRead<T>` for projected state;
|
|
141
|
+
`Result<,>` alone supplies rejection, not a concurrency guard.
|
|
113
142
|
|
|
114
143
|
## Compliance modeling
|
|
115
144
|
|
|
@@ -14,10 +14,11 @@ application's constraints discovered and active.
|
|
|
14
14
|
|
|
15
15
|
| Package | Version | Purpose |
|
|
16
16
|
| --- | --- | --- |
|
|
17
|
-
| `Cratis.Chronicle.Testing` | `
|
|
18
|
-
| `Cratis.Chronicle` | `
|
|
17
|
+
| `Cratis.Chronicle.Testing` | `19.50.1` | `EventScenario`, its `Given`/`When` builders, the `IAppendResult` `Should*` assertions |
|
|
18
|
+
| `Cratis.Chronicle` | `19.50.1` | `IEventSequence.Append`/`AppendMany`, `IAppendResult`, `ConstraintViolation` |
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
Sources: `Source/Clients/Testing/EventSequences/`, `TestingEventStore.cs`,
|
|
21
|
+
and `Source/Clients/DotNET/EventSequences/` at **v19.50.0**.
|
|
21
22
|
|
|
22
23
|
```bash
|
|
23
24
|
dotnet add package Cratis.Chronicle.Testing
|
|
@@ -70,6 +71,16 @@ in the loaded assemblies — which is what makes a constraint specification work
|
|
|
70
71
|
without wiring. Pass an `ICanProvideConstraints` to the single-argument
|
|
71
72
|
constructor when the specification needs a narrower set.
|
|
72
73
|
|
|
74
|
+
At v19.50.0 it implements `IDisposable`: dispose in `Destroy()`.
|
|
75
|
+
`new EventScenario(sequenceId, eventStore, @namespace)` selects identifiers;
|
|
76
|
+
constructors also accept per-run `Defaults`. One scenario shares production
|
|
77
|
+
in-memory storage across its sequences and uses the kernel append grain,
|
|
78
|
+
serialization, migrations and compliance. Older-generation appends migrate;
|
|
79
|
+
undiscovered schemas fail with `EventSchemaNotDiscovered`. Appends to one
|
|
80
|
+
sequence serialize, so racing claims of the same unique value cannot both win.
|
|
81
|
+
Seeding can specify source/stream routing through the `ForEventSource`,
|
|
82
|
+
`For<TEvent>` and `ForEvents` overloads.
|
|
83
|
+
|
|
73
84
|
## Step 2 — Seed prior state through `Given`
|
|
74
85
|
|
|
75
86
|
```csharp
|
|
@@ -195,8 +206,10 @@ assert the value can be claimed again.
|
|
|
195
206
|
- **`ShouldHaveConstraintViolationFor` fails with an empty violation list on a
|
|
196
207
|
batch append.** `When…Events` short-circuits, so the conflict may be on an
|
|
197
208
|
event the append never reached.
|
|
198
|
-
- **A concurrency specification is always green.**
|
|
199
|
-
|
|
209
|
+
- **A concurrency specification is always green.** Without an explicit checked
|
|
210
|
+
scope, the default client strategy answers `ConcurrencyScope.None` and proves
|
|
211
|
+
nothing. The kernel validator is present; explicit-scope violations have not
|
|
212
|
+
been proven end to end here. Prove the application's strategy with integration.
|
|
200
213
|
- **The specification passes alone and fails in the suite.** A hard-coded unique
|
|
201
214
|
value collided with another specification's claim.
|
|
202
215
|
|
|
@@ -35,8 +35,8 @@ This skill is verified against these exact sources:
|
|
|
35
35
|
|
|
36
36
|
| Package | Version | Purpose |
|
|
37
37
|
| --- | --- | --- |
|
|
38
|
-
| `Cratis.Chronicle` | `
|
|
39
|
-
| `Cratis.Chronicle.CodeAnalysis` | `
|
|
38
|
+
| `Cratis.Chronicle` | `19.50.1` | `Cratis.Chronicle.Events` and `Cratis.Chronicle.Events.Migrations` |
|
|
39
|
+
| `Cratis.Chronicle.CodeAnalysis` | `19.50.1` | `CHR0012`, `CHR0037`, `CHR0049`, `CHR0050` |
|
|
40
40
|
|
|
41
41
|
Reverify product sources before claiming support for another version.
|
|
42
42
|
|
|
@@ -161,6 +161,26 @@ public override void Downcast(IEventMigrationBuilder<<EventName>V1, <EventName>>
|
|
|
161
161
|
source => source.<FirstPart>, source => source.<SecondPart>));
|
|
162
162
|
```
|
|
163
163
|
|
|
164
|
+
## Nested paths and compatible schema metadata
|
|
165
|
+
|
|
166
|
+
Property expressions traverse nested CLR members:
|
|
167
|
+
`DefaultValue(m => m.Price.Description, "x")` and
|
|
168
|
+
`RenamedFrom(m => m.Price.Amount, e => e.Amount)` address the nested target.
|
|
169
|
+
`JsonPropertyName` wins over the client's naming policy; raw string paths are
|
|
170
|
+
already JSON paths and are not renamed. An undeclared `DefaultValue` target in
|
|
171
|
+
a nonempty target schema is rejected with `InvalidMigrationPropertyForEventType`
|
|
172
|
+
(`Source/Kernel/Core/EventTypes/EventTypeRegistrar.cs`, `ValidatePropertyKeys`);
|
|
173
|
+
an empty auto-generated target schema is the exception.
|
|
174
|
+
|
|
175
|
+
Adding/removing an **optional** property at any depth still needs a migration
|
|
176
|
+
class to complete the new generation chain, but no property operations: the
|
|
177
|
+
target schema supplies absence/drops undeclared properties. That is a migration
|
|
178
|
+
fact, not a reason to put nullable facts on newly authored events. Schema `title`
|
|
179
|
+
is ignored, so renaming a CLR record with a pinned `[EventType("id")]` does not
|
|
180
|
+
raise `EventTypeSchemaChanged`. A property described only by `default` may gain
|
|
181
|
+
`type`/`format` without that error. Source at v19.50.0:
|
|
182
|
+
`Documentation/migrations/dotnet-client.mdx` and the kernel event-type schema comparison.
|
|
183
|
+
|
|
164
184
|
## Step 3 — When the values changed meaning, declare a value map
|
|
165
185
|
|
|
166
186
|
The operations above move values between properties. When a *value itself* means
|
|
@@ -213,6 +233,16 @@ Migrations are discovered by convention — nothing is registered. They are
|
|
|
213
233
|
activated through the service provider, so a migration may take constructor
|
|
214
234
|
dependencies.
|
|
215
235
|
|
|
236
|
+
## Backfill scope and rollout
|
|
237
|
+
|
|
238
|
+
At v19.50.0 (`Documentation/migrations/index.md:62-74`), registering a new
|
|
239
|
+
generation starts **add-only** backfill in the **default namespace's event log
|
|
240
|
+
only**. Other namespaces and sequences are not covered. Existing stored
|
|
241
|
+
representations remain unchanged; changing a migration alone does not launch
|
|
242
|
+
another backfill. Older backfills may already have overwritten originals:
|
|
243
|
+
upgrading cannot recover those. Register new generations **only after every
|
|
244
|
+
kernel silo is upgraded**; an old worker can still overwrite content mid-rollout.
|
|
245
|
+
|
|
216
246
|
## Choose the generation an observer receives
|
|
217
247
|
|
|
218
248
|
`Compatibility` remains the default. With
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: cratis-chronicle-hosting
|
|
3
|
+
description: Run the Chronicle kernel with production storage, certificates, TLS or a private h2c proxy, health probes, clustering and observer recovery configuration. Use when deploying the kernel, moving from development images to production, configuring trusted proxies, or diagnosing kernel startup and topology. Do not use for wiring a .NET application client, implementing Orleans grains, or mutating a live store.
|
|
4
|
+
license: MIT
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<!-- Copyright (c) Cratis. All rights reserved. -->
|
|
8
|
+
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
|
|
9
|
+
|
|
10
|
+
# Host the Chronicle kernel
|
|
11
|
+
|
|
12
|
+
A working development Compose file is not a production deployment. The kernel's
|
|
13
|
+
build, storage, certificates and network topology determine whether it starts
|
|
14
|
+
and whether several nodes actually form one cluster. Inspect configuration
|
|
15
|
+
without exposing secrets; a hosting request does not authorize deleting data,
|
|
16
|
+
rotating keys, clearing quarantine or deploying to an unnamed environment.
|
|
17
|
+
|
|
18
|
+
## Verified product sources
|
|
19
|
+
|
|
20
|
+
Verified at **Cratis/Chronicle v19.50.1**:
|
|
21
|
+
|
|
22
|
+
| Source | Contract |
|
|
23
|
+
| --- | --- |
|
|
24
|
+
| `Documentation/hosting/production.md` | images, DEVELOPMENT, prerequisites, replica sets, ports, backup order, clustering |
|
|
25
|
+
| `Documentation/hosting/configuration/tls.md` | TLS/h2c, authentication limits, immediate proxy trust |
|
|
26
|
+
| `Documentation/hosting/configuration/health-endpoint.md` | dedicated probe port and exclusive routing |
|
|
27
|
+
| `Documentation/hosting/configuration/observers.md` | retries, quarantine, definition evolution |
|
|
28
|
+
| `Source/Kernel/Core/Configuration/{Events,Alerts}.cs` | causation retention and incident metrics |
|
|
29
|
+
| `Source/Kernel/Core/Setup/Authentication/AuthenticationService.cs:170-208` | persisted development application |
|
|
30
|
+
|
|
31
|
+
Reverify these sources before recommending another kernel version. This is the
|
|
32
|
+
operator/kernel surface, not an application-profile layout rule.
|
|
33
|
+
|
|
34
|
+
## Choose the build and storage
|
|
35
|
+
|
|
36
|
+
- `cratis/chronicle:latest` is production; pin a tested release for deployment.
|
|
37
|
+
`latest-development` bundles MongoDB; `latest-development-slim` does not.
|
|
38
|
+
- **`DEVELOPMENT` is a compile-time symbol defined for Debug builds**, not
|
|
39
|
+
`ASPNETCORE_ENVIRONMENT` or `DOTNET_ENVIRONMENT`. Environment variables cannot
|
|
40
|
+
turn the Release image into a development kernel.
|
|
41
|
+
- Production storage defaults to MongoDB but its connection string is empty.
|
|
42
|
+
Set `Cratis__Chronicle__Storage__ConnectionDetails`, and `__Storage__Type` for
|
|
43
|
+
a different backend. Configuration mounts at `/app/chronicle.json`; environment
|
|
44
|
+
keys use the `Cratis__Chronicle__` prefix. `storage.databaseNamePrefix` changes
|
|
45
|
+
database naming; it is not a migration of existing data.
|
|
46
|
+
- MongoDB **must be a replica set**, including single-node development: appends
|
|
47
|
+
use transactions. The current Compose/Aspire default is MongoDB 8.2. Publish
|
|
48
|
+
development database ports on loopback only; a host application needing MongoDB
|
|
49
|
+
must be able to reach port 27017. Do not expose unauthenticated MongoDB.
|
|
50
|
+
|
|
51
|
+
## Supply certificates before starting production
|
|
52
|
+
|
|
53
|
+
Default TLS needs a PFX certificate with a private key:
|
|
54
|
+
`Tls__CertificatePath` / `Tls__CertificatePassword`. Missing/invalid certificates
|
|
55
|
+
fail startup; there is no silent HTTP downgrade. Development generates an
|
|
56
|
+
in-memory self-signed TLS certificate.
|
|
57
|
+
|
|
58
|
+
`EncryptionCertificate__CertificatePath` / `__CertificatePassword` protect the
|
|
59
|
+
internal OAuth authority's keys. Production requires this unless `oAuthAuthority`
|
|
60
|
+
is disabled or an external authority replaces it. Value encryption is separate
|
|
61
|
+
and still requires a certificate on first use. Development falls back to
|
|
62
|
+
ephemeral OAuth keys. Supply passwords from the approved secret mechanism,
|
|
63
|
+
never commit them. Every cluster node needs the same certificate ring.
|
|
64
|
+
|
|
65
|
+
The .NET client uses known development credentials when ClientCredentials has
|
|
66
|
+
both username and password absent (`ChronicleClient.cs:334-345`,
|
|
67
|
+
`Connections/ServiceCollectionExtensions.cs:57-68` at **v19.50.0**). The development
|
|
68
|
+
kernel creates the application **directly in persistent storage**
|
|
69
|
+
(`AuthenticationService.cs:170-208` at **v19.50.0**). Changing to a production
|
|
70
|
+
image does not revoke it. Remove the application and any configuration declaration
|
|
71
|
+
that recreates it before reusing that storage. See **cratis-chronicle-client-dotnet**.
|
|
72
|
+
|
|
73
|
+
## Pick a network topology
|
|
74
|
+
|
|
75
|
+
Default main port **35000** serves gRPC HTTP/2 plus Workbench, REST, OAuth and
|
|
76
|
+
health HTTP/1.1 over TLS using ALPN. Orleans silo **11111** and gateway **30000**
|
|
77
|
+
are internal cluster ports, not public browser endpoints.
|
|
78
|
+
|
|
79
|
+
Explicit `Tls.Enabled=false` is only for a **private HTTP/2-only h2c backend**
|
|
80
|
+
behind an HTTPS-terminating proxy. The kernel warns at startup. Forward **all**
|
|
81
|
+
traffic over h2c; HTTP/1.1 upstream fails. Restrict direct access. With auth enabled,
|
|
82
|
+
use an external HTTPS `authentication.authority`: the internal authority and
|
|
83
|
+
`/connect/token` are unavailable; .NET SDK ClientCredentials cannot use the
|
|
84
|
+
external authority. Independently obtained bearer tokens and Workbench cookie
|
|
85
|
+
login are supported. These claims are at **v19.50.0**,
|
|
86
|
+
`Documentation/hosting/configuration/tls.md`, "Configuration file"/"TLS behavior".
|
|
87
|
+
|
|
88
|
+
At **v19.50.0**, the same file's "Trusted reverse proxies" section specifies:
|
|
89
|
+
|
|
90
|
+
- `X-Forwarded-For/Proto` is trusted from loopback only by default. Add the
|
|
91
|
+
**immediate proxy** IP to `forwardedHeaders.knownProxies` or a restricted
|
|
92
|
+
infrastructure CIDR to `knownNetworks`; env arrays use
|
|
93
|
+
`Cratis__Chronicle__ForwardedHeaders__KnownProxies__0` / `__KnownNetworks__0`.
|
|
94
|
+
- `ASPNETCORE_FORWARDEDHEADERS_ENABLED=true` does **not** widen trust. Never
|
|
95
|
+
configure a wildcard CIDR or client networks as trusted proxy networks.
|
|
96
|
+
- The proxy must **replace**, not relay, client-supplied forwarded headers.
|
|
97
|
+
Forward public HTTPS for HTTPS-sensitive middleware. Do not trust a public
|
|
98
|
+
HTTP scheme while fronting a TLS listener: cookie mutations fail antiforgery.
|
|
99
|
+
|
|
100
|
+
## Probe without opening another API entrance
|
|
101
|
+
|
|
102
|
+
Set `health.port` for a dedicated HTTP/1.1 probe listener. `health.tls=false`
|
|
103
|
+
removes TLS only there; `health.exclusive=true` restricts it to the configured
|
|
104
|
+
health path (`/health` by default). Exclusive is **false by default**, so an
|
|
105
|
+
ordinary plaintext probe port also exposes other HTTP/1.1 endpoints. Keep it
|
|
106
|
+
internal. `health.tls=true` needs the top-level TLS certificate even when main
|
|
107
|
+
TLS is disabled. The production chiseled container has no shell/curl: use an
|
|
108
|
+
orchestrator/external probe, not an in-container shell healthcheck.
|
|
109
|
+
|
|
110
|
+
## Form one cluster, not several over shared data
|
|
111
|
+
|
|
112
|
+
Every node must explicitly set `clustering.type=MongoDB` and share the cluster
|
|
113
|
+
and service ids and MongoDB storage. Default `Localhost` forms isolated
|
|
114
|
+
single-node clusters: sharing a database does not join them. Only MongoDB
|
|
115
|
+
supports multi-node storage; PostgreSQL, SQL Server and SQLite are single-node.
|
|
116
|
+
`Clustering:ResponseTimeout` bounds Orleans transport waiting; increasing observer
|
|
117
|
+
subscriber timeout cannot exceed that transport deadline.
|
|
118
|
+
|
|
119
|
+
Read [recovery and upgrades](references/operations.md) when changing observer
|
|
120
|
+
retry/quarantine settings, definition evolution, retention, alerts, or restoring
|
|
121
|
+
and upgrading a cluster. See **cratis-chronicle-web-workbench** for browser
|
|
122
|
+
exposure and **cratis-chronicle-cli-operations** for authorized live operations.
|
|
123
|
+
|
|
124
|
+
## Verify
|
|
125
|
+
|
|
126
|
+
- The build/image and intended environment agree; no default development
|
|
127
|
+
application remains in reused production storage.
|
|
128
|
+
- Storage is reachable and MongoDB is a replica set; multiple nodes share MongoDB
|
|
129
|
+
membership, cluster id, service id and certificate ring.
|
|
130
|
+
- Certificates load; clients validate production TLS (`skipTlsValidation=false`).
|
|
131
|
+
- A probe observes health without publishing a plaintext Workbench/API port.
|
|
132
|
+
- Proxy upstream protocol and trust are tested from the actual immediate peer.
|
|
133
|
+
- Registration, observer progress and known protected data are checked separately
|
|
134
|
+
from process startup. Report skipped runtime checks; a config review is not a deployment.
|
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
# Recovery, retention and upgrades
|
|
5
|
+
|
|
6
|
+
Verified at **Cratis/Chronicle v19.50.1**:
|
|
7
|
+
`Documentation/hosting/configuration/{observers,events,clustering}.md`,
|
|
8
|
+
`Documentation/hosting/production.md`,
|
|
9
|
+
`Source/Kernel/Core/Configuration/Alerts.cs`, and
|
|
10
|
+
`Source/Kernel/Core/Alerts/`.
|
|
11
|
+
|
|
12
|
+
## Observer behavior
|
|
13
|
+
|
|
14
|
+
`observers.maxRetryAttempts` defaults to 10 per budget (0 is infinite).
|
|
15
|
+
`backoffDelay`, `exponentialBackoffDelayFactor` and `maximumBackoffDelay` bound
|
|
16
|
+
retries. Clearing a partition quarantine starts a new budget and preserves its
|
|
17
|
+
attempt history. Observer quarantine and partition quarantine are separate;
|
|
18
|
+
clearing one does not clear the other. Inspect the cause before authorizing clear
|
|
19
|
+
or retry. Subscriber timeout abandons waiting, not subscriber work: redelivery
|
|
20
|
+
can overlap work that still runs, so side effects must remain idempotent.
|
|
21
|
+
|
|
22
|
+
Quarantine persists through grain deactivation. Watchdog ticks and catch-up/replay
|
|
23
|
+
completion do not end it. An operator clear or a fresh subscription does;
|
|
24
|
+
a kernel restart only helps observers that actually receive a fresh subscription.
|
|
25
|
+
Event-store subscriptions remain quarantined until operator clear. Recovery can
|
|
26
|
+
quarantine again if the cause remains.
|
|
27
|
+
|
|
28
|
+
Projection replay and catch-up each use a **single globally ordered job step**;
|
|
29
|
+
a new catch-up failure stops that step rather than letting other sources proceed.
|
|
30
|
+
Full replay is inactive until completion, then routes to catch-up/live unless
|
|
31
|
+
quarantined. Partition quarantine stops that partition's automatic retries;
|
|
32
|
+
observer quarantine suppresses automatic recovery for the whole observer.
|
|
33
|
+
Sources at v19.50.1: `Documentation/concepts/observers.mdx`,
|
|
34
|
+
`Documentation/projections/registration-lifecycle.md`, and
|
|
35
|
+
`Source/Kernel/Core/Observation/Jobs/{CatchUpObserver,ReplayObserver}.cs`.
|
|
36
|
+
|
|
37
|
+
### Next-event lookup failures
|
|
38
|
+
|
|
39
|
+
At **v19.50.1**, Routing keeps the saved position and defers observation when
|
|
40
|
+
`GetNextSequenceNumberGreaterOrEqualTo` returns a storage error. A watchdog tick
|
|
41
|
+
retries that deferred routing only while subscribed and not quarantined. Its
|
|
42
|
+
active-observer lookup also leaves the cursor unchanged on error. Only
|
|
43
|
+
`GetSequenceNumberError.NotFound` proves there is no relevant event and permits
|
|
44
|
+
fast-forward. Read failures are not "nothing to handle"; preserve and investigate
|
|
45
|
+
the warning. Sources: `Source/Kernel/Core/Observation/States/Routing.cs` and
|
|
46
|
+
`Observer.Watchdog.cs`. This fixes #4770, not the proposed Ordered Lanes design
|
|
47
|
+
or all historical delivery/completion limitations. Do not claim past omissions
|
|
48
|
+
were repaired automatically.
|
|
49
|
+
|
|
50
|
+
`observers.definitionEvolution` governs projection/reducer changes:
|
|
51
|
+
|
|
52
|
+
| Policy | Result |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| Automatic (default) | applies no-action, partial or full replay classification |
|
|
55
|
+
| PartialOnly | applies no-action/partial, recommends full replay |
|
|
56
|
+
| Manual | recommends both replay kinds; no-action creates no recommendation |
|
|
57
|
+
|
|
58
|
+
Changed mappings, key, join, children, filters or reducer fingerprints require
|
|
59
|
+
full replay when independence cannot be proved. Deploying a corrected counter
|
|
60
|
+
or join does not repair historical state without replay. Reactor/webhook replay
|
|
61
|
+
uses `replayOnDefinitionChange` instead; do not confuse the policies.
|
|
62
|
+
|
|
63
|
+
## Causation values and incidents
|
|
64
|
+
|
|
65
|
+
`events.causationPropertyRetention` defaults to `Retain`. `Omit` keeps causation
|
|
66
|
+
type/time but no property values on **new** appends, forwarded events, revisions
|
|
67
|
+
and redactions. It does not rewrite earlier chains. Subject erasure does not
|
|
68
|
+
remove those values: they are not encrypted under the subject key. Assess
|
|
69
|
+
historical chains separately, with **cratis-chronicle-compliance**.
|
|
70
|
+
|
|
71
|
+
Kernel `Alerts.IncidentMetricsEnabled` defaults to true. Open incidents and
|
|
72
|
+
observer failure/quarantine counters support alerting without dumping event
|
|
73
|
+
payloads. Inspect the configured metrics endpoint and incident queries; counters
|
|
74
|
+
are operational evidence, not proof that a failed partition recovered. Do not
|
|
75
|
+
reintroduce high-cardinality partition labels into exported failure metrics.
|
|
76
|
+
|
|
77
|
+
## Upgrade and restore
|
|
78
|
+
|
|
79
|
+
Upgrade every silo together before registering new event generations. Add-only
|
|
80
|
+
generation backfill covers only the default namespace's event log; older workers
|
|
81
|
+
can still overwrite content during rollout, and upgrading cannot recover content
|
|
82
|
+
previously overwritten. See **cratis-chronicle-event-type-migration**.
|
|
83
|
+
|
|
84
|
+
Restore the certificate ring first, then storage (including Data Protection keys),
|
|
85
|
+
then the compliance key store at the storage's point in time. The erasure fence
|
|
86
|
+
is inside the key store: an older key backup can resurrect erased data, or miss
|
|
87
|
+
new keys. Retain retired certificates as long as a backup needs them. Confirm a
|
|
88
|
+
known protected subject remains readable and an erased subject remains erased
|
|
89
|
+
before reopening traffic; see **cratis-chronicle-compliance**.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "cratis-chronicle-hosting",
|
|
3
|
+
"input": "Review a Chronicle production kernel topology without deploying it.",
|
|
4
|
+
"fixtures": [],
|
|
5
|
+
"assertions": [
|
|
6
|
+
{ "kind": "skill-contains", "value": "DEVELOPMENT" },
|
|
7
|
+
{ "kind": "skill-contains", "value": "does **not** widen trust" },
|
|
8
|
+
{ "kind": "skill-contains", "value": "health.exclusive=true" },
|
|
9
|
+
{ "kind": "skill-contains", "value": "clustering.type=MongoDB" },
|
|
10
|
+
{ "kind": "skill-contains", "value": "directly in persistent storage" },
|
|
11
|
+
{ "kind": "skill-contains", "file": "references/operations.md", "value": "single globally ordered job step" },
|
|
12
|
+
{ "kind": "skill-contains", "file": "references/operations.md", "value": "GetSequenceNumberError.NotFound" }
|
|
13
|
+
]
|
|
14
|
+
}
|