@cratis/pi 7.111.0 → 7.113.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/harnesses/copilot/instructions/application-profile.instructions.md +1 -1
- package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +7 -0
- package/package/corpus/harnesses/copilot/instructions/specs.csharp.instructions.md +4 -4
- package/package/corpus/product-sync.json +76 -76
- package/package/corpus/rules/application-profile.md +1 -1
- package/package/corpus/rules/pull-requests.md +7 -0
- package/package/corpus/rules/specs.csharp.md +4 -4
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authproxy.md +26 -0
- package/package/corpus/skills/cratis-arc-react-page/SKILL.md +11 -0
- package/package/corpus/skills/cratis-arc-validation-kotlin/SKILL.md +20 -3
- package/package/corpus/skills/cratis-chronicle-client-elixir/SKILL.md +12 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/decision-reads.md +10 -0
- package/package/corpus/skills/cratis-chronicle-client-go/SKILL.md +12 -2
- package/package/corpus/skills/cratis-chronicle-client-kotlin/SKILL.md +4 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/annotations-and-handlers.md +6 -1
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/fundamentals-migration.md +48 -0
- package/package/corpus/skills/cratis-chronicle-client-typescript/SKILL.md +18 -0
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/lifecycle.md +7 -0
- package/package/corpus/skills/cratis-components-common-controls/SKILL.md +11 -0
- package/package/corpus/skills/cratis-components-data-surfaces/SKILL.md +5 -0
- package/package/corpus/skills/cratis-components-data-surfaces/references/query-table-updates.md +51 -0
- package/package/corpus/skills/cratis-components-schema-editor/references/tree-layout.md +18 -0
- package/package/corpus/skills/cratis-components-stepper-command-dialog/SKILL.md +11 -0
- package/package/corpus/skills/cratis-fundamentals-type-discovery/SKILL.md +13 -0
- package/package/corpus/skills/cratis-release-notes/SKILL.md +23 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md +3 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md +14 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +14 -2
- package/package/corpus/skills/cratis-specifications-csharp/references/running-specs.md +8 -1
- package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +19 -2
- package/package.json +1 -1
|
@@ -67,7 +67,7 @@ Tagged **[contract]** (framework-enforced) or **[convention]** (house default).
|
|
|
67
67
|
|
|
68
68
|
## Implementation Workflow
|
|
69
69
|
|
|
70
|
-
- **Starting a brand-new application:** scaffold it instead of hand-writing the skeleton: `dotnet new install Cratis.Templates`, then `dotnet new cratis -n MyApp -o MyApp` (`--language Kotlin|Java`, `--Database MongoDB|PostgreSQL|MsSql|SQLite`; `cratis-aspire` for Aspire; `cratis-chronicle-console` or `cratis-chronicle-web` for a Chronicle client only). Non-interactive runs need `--allow-scripts yes`; the .NET templates target `net10.0`. The template writes `.cratis/ai.json`; run `cratis ai update` afterwards. Its `SomeModule/SomeFeature/Registration/` slice is the house shape. There is no Go, Python or Elixir template (verified at Cratis.Templates `v1.
|
|
70
|
+
- **Starting a brand-new application:** scaffold it instead of hand-writing the skeleton: `dotnet new install Cratis.Templates`, then `dotnet new cratis -n MyApp -o MyApp` (`--language Kotlin|Java`, `--Database MongoDB|PostgreSQL|MsSql|SQLite`; `cratis-aspire` for Aspire; `cratis-chronicle-console` or `cratis-chronicle-web` for a Chronicle client only). Non-interactive runs need `--allow-scripts yes`; the .NET templates target `net10.0`. The template writes `.cratis/ai.json`; run `cratis ai update` afterwards. Its `SomeModule/SomeFeature/Registration/` slice is the house shape. There is no Go, Python or Elixir template (verified at Cratis.Templates `v1.8.1`). Since 1.8.0 the `cratis` and `cratis-aspire` .NET app projects emit `<CratisReadProtection>On</CratisReadProtection>`: read models supplied to commands and validators guard the append. Existing apps are not changed by reinstalling the templates.
|
|
71
71
|
- **Phase 0 — Find the contract / choose the level.** Before writing slice code, find what the code must match, and choose the level once for the whole scope.
|
|
72
72
|
1. **Look for a Screenplay model** under the model root (opted in per `general.md` "Model first"; where `cratis-screenplay-modeling-lifecycle` is installed, run its `scripts/model-first-status.mjs` for the decision, root and drafts) for the slice, command, event and read-model names.
|
|
73
73
|
2. **Model level** — an accepted model under the root covers the scope, or the repository is opted in and this scope has no model yet. The `.play` slice and its specs are the contract: change the model first (new behavior starts in discovery), verify it (V1–V3), get an independent review, then render with Stage or gap-fill by hand only what the renderer rejects. Hand-written code stays checked against the model (**cratis-application-slice-conformance**). Never edit Stage-managed output, never implement behavior the model does not state, never change the model to match existing code, never weaken protection to make it compile or render. Start with **cratis-screenplay-event-modeling** (decision rule), then **cratis-screenplay-modeling-lifecycle**. If the Screenplay skills are not installed, say so; do not author `.play` from memory.
|
|
@@ -155,6 +155,13 @@ The test is **outward-facing effect, not file location**. A change under `Source
|
|
|
155
155
|
|
|
156
156
|
A non-release pull request must satisfy the relevant required checks like any other. Confirm label acceptance and publication suppression against the current workflow contract; do not assume external CI or API state.
|
|
157
157
|
|
|
158
|
+
### Release-action windows and workflow drift
|
|
159
|
+
|
|
160
|
+
Batching is opt-in; success with `batched` or `nothing-pending` is not publication.
|
|
161
|
+
Read **cratis-release-notes** before configuring windows, handling a pending-major
|
|
162
|
+
hotfix, or recovering a workflow-drift 403. Major confirmation remains required;
|
|
163
|
+
a workflow-drift recovery differs from the concurrent-tag retry above.
|
|
164
|
+
|
|
158
165
|
### Group small related changes into one pull request
|
|
159
166
|
|
|
160
167
|
Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change. Joining an open candidate, folding superseded PRs and the cut are in `cratis-engineering-release-trains`.
|
|
@@ -46,13 +46,13 @@ public class when_combining_parts : Specification
|
|
|
46
46
|
| `void Establish()` | setup, before `Because()` | each class in the chain has its own, run base-first — never call `base.Establish()` |
|
|
47
47
|
| `void Because()` | the single action under test | only in concrete spec files, never in a reusable context |
|
|
48
48
|
| `[Fact] void should_*()` | one assertion per fact | use the `ShouldXxx()` extension methods |
|
|
49
|
-
| `void Destroy()` | teardown
|
|
49
|
+
| `void Destroy()` | teardown once per eligible class by default | after each fact when per-fact lifecycle is selected |
|
|
50
50
|
|
|
51
|
-
The shared lifecycle is the default on xUnit v2 and v3 since 5.0; the package registers the framework, so delete any hand-written `[assembly: Xunit.TestFramework(...)]` (it fails with `CS0579`). Eligible classes derive from `Specification`, have one public
|
|
51
|
+
The shared lifecycle is the default on xUnit v2 and v3 since 5.0; the package registers the framework, so delete any hand-written `[assembly: Xunit.TestFramework(...)]` (it fails with `CS0579`). Eligible classes derive from `Specification`, have one public constructor with no arguments or only framework-managed fixture arguments, and contain only plain facts. Construction, Establish/Because and Destroy run once; all facts share the instance and must not mutate it. `IDisposable` specifications also share the lifecycle since Cratis.Specifications 4.4.0: one construction and one `Dispose` after the last fact. Initialization failure fails every fact. Theories and `ITestOutputHelper` constructors keep per-fact execution; `[PerFactSpecificationLifecycle]` opts a class out. `CRSPEC0008` (a fact modifies the shared context) is an error by default: move the change into `Establish` or `Because`. See the **cratis-specifications-csharp** skill's shared-lifecycle reference.
|
|
52
52
|
|
|
53
53
|
Run specifications as the built executable, not `dotnet test`: restore and build once, then run `bin/<Config>/net10.0/<Project>.Specs`. In a solution that mixes Microsoft.Testing.Platform and VSTest projects, run each project on its own; `dotnet test` on the whole solution does not work there. Filters and the 4.x → 5.0 checklist are in the **cratis-specifications-csharp** skill's [running-specs reference](../../../skills/cratis-specifications-csharp/references/running-specs.md).
|
|
54
54
|
|
|
55
|
-
CRSPEC0001–CRSPEC0007 are warnings
|
|
55
|
+
CRSPEC0001–CRSPEC0007 are warnings. Since 4.5 the analyzers ship only in `Cratis.Specifications`, transitively used by the framework packages; excluding analyzers on a framework package does not remove them. Derived xUnit/NUnit test attributes are recognized since 4.1.2. `Given`/`When` are aliases since 4.4 (declaring both aliases for one phase is CRSPEC0009), but house style stays `Establish`/`Because`. With warnings as errors, a non-`should_` fact, multiple specs per file (given contexts exempt), a fact on a given context, a `should_` without a test attribute, explicit base lifecycle calls, non-public specs with facts, or `Because` on a given context fail the build. Follow **cratis-specification-by-example**; do not suppress these diagnostics.
|
|
56
56
|
|
|
57
57
|
## Reusable layered contexts
|
|
58
58
|
|
|
@@ -95,7 +95,7 @@ async Task Because() => _error = await Catch.Exception(_sut.DoSomething);
|
|
|
95
95
|
|
|
96
96
|
## Assertion extension methods
|
|
97
97
|
|
|
98
|
-
|
|
98
|
+
Since 5.0 assertions live in `Cratis.Specifications`, with types forwarded by each framework package (namespace `Cratis.Specifications`); recompile and keep core/framework packages on the same version: `.ShouldEqual(expected)`, `.ShouldBeTrue()`, `.ShouldBeFalse()`, `.ShouldBeNull()`, `.ShouldNotBeNull()`, `.ShouldBeEmpty()`, `.ShouldNotBeEmpty()`, `.ShouldContain(item)`, `.ShouldNotContain(item)`, `.ShouldContainOnly(items)`, `.ShouldBeOfExactType<T>()`, `.ShouldBeGreaterThan(n)`, `.ShouldBeLessThan(n)`.
|
|
99
99
|
|
|
100
100
|
Additional helpers include `ShouldNotEqual`, `ShouldBeSame`/`ShouldNotBeSame`, `ShouldMatch(Func<T, bool>)`, `ShouldBeInRange`, inclusive comparisons `ShouldBeGreaterThanOrEqual`/`ShouldBeLessThanOrEqual`, `ShouldContainSingleItem`, `ShouldEachConformTo`, ordered collection `ShouldEqual(IEnumerable<T>)`, collection `ShouldContain(Predicate<T>)`, `ShouldBeAssignableFrom<T>`, and string `ShouldContain(substring, StringComparison)`. `Catch.Exception` accepts `Action` or `Func<Task>`; `Catch.Exception<T>(Action)` catches only T.
|
|
101
101
|
|
|
@@ -171,9 +171,9 @@
|
|
|
171
171
|
}
|
|
172
172
|
],
|
|
173
173
|
"synced": {
|
|
174
|
-
"version": "4.
|
|
175
|
-
"date": "2026-10-
|
|
176
|
-
"by": "Cratis/AI#
|
|
174
|
+
"version": "4.245.0",
|
|
175
|
+
"date": "2026-10-25",
|
|
176
|
+
"by": "Cratis/AI#820"
|
|
177
177
|
},
|
|
178
178
|
"covers": {
|
|
179
179
|
"skills": [
|
|
@@ -201,7 +201,7 @@
|
|
|
201
201
|
],
|
|
202
202
|
"rules": []
|
|
203
203
|
},
|
|
204
|
-
"notes": "Cratis/AI#779: reference-runner capability refusals taught as scoped per specification (introduced in v4.213.2, Cratis/Screenplay#897) from the v4.216.0 tool and MCP documentation and plan source: an unadmitted projection (UnsupportedEventContext, UnsupportedProjectionBlock) marks unsupported only the specifications that reach it or its read model, the others run and planIssues lists deferred issues; application-level issues still block every selected specification; no new render/runtime probe. Prior: Cratis/AI#776: PLAY0802 ReservedStoredName (introduced in v4.213.3, Cratis/Screenplay#893) taught from the v4.216.0 compilers and documentation: stored event source `Default` and stored event stream `All` (ordinal, name or `id` pin) refused at authoring time, a pin away from the reserved name valid, PLAY0273 kept as the binding backstop; no new render/runtime probe. Prior: Cratis/AI#784: standalone Screenplay 4.216.0 pinned; compiler contract replaced by the v4.216.0 release asset (adds the propose-repair destinationIntent v1 schema and PLAY0802 ReservedStoredName). Source-checked decision 0096 and the MCP reference for the explicit author-intent PLAY0470 repair: repair-intents discovery, intentActions feature detection, complete per-production selections, retained production-destination report and identity views, explicit apply and refusals. No new render/runtime probe. Prior: Cratis/AI#771: standalone Screenplay 4.213.0 pinned; regenerated compiler contract is byte-identical to the v4.213.0 release asset and unchanged from 4.212.4. Reviewed the full v4.212.4-v4.213.0 delta against tagged decision 0093 and MCP reference: pre-binding container identities and stable binding/migration continuity, own-slice member substitutions, containerIdentities completeness/ambiguity/collision refusals, retained ambiguous notes, explicit semanticRenames/retirements, binding fixes through MCP, exact reopen exception, notes/identity rollback and exact-ID re-add anchoring. No grammar, binder, ESM or diagnostic-code changes; no new render/runtime probe. Prior: Cratis/AI#772: standalone Screenplay 4.212.4 pinned; regenerated compiler contract is byte-identical to the v4.212.4 release asset. Source-checked joined-event automap/no automap overrides and level fallback in executable binding; PLAY0380 covers only all inside children/nested. No new render/runtime probe. Prior: Cratis/AI#769: standalone Screenplay 4.212.3 pinned; regenerated compiler contract is byte-identical to the v4.212.3 release asset. Source-checked both compilers and projection documentation for PLAY0801 DuplicateEventInProjectionScope: shared from/removal/clear set, separate join set, fresh sets per children/nested/variant level, and no two-row update through repeated from blocks with different keys. No new render/runtime probe. Prior: Cratis/AI#768: standalone Screenplay 4.212.2 pinned; regenerated compiler contract is byte-identical to the v4.212.2 release asset (unchanged from the previous contract). Source-checked v4.212.0 split-model dotted note targets, open-workspace applicationIdentity and complete add/reanchor substitutions; unbound container identities are not claimed. v4.212.1 aligns PLAY0535 collection fields, optional parameters and single-result identity inference. v4.212.2 counts read-only query denials for SPEC004, not SPEC006. No new render/runtime probe. Prior: Cratis/AI#762 and #761: source-checked v4.210.0 and v4.211.0 contracts for PLAY0800 CommandHandlerRequiresAttachment (required typed subject, permanent code-attachment requirement, other PLAY0268 families unchanged), independent reference remove/add batches, located same-text ambiguity conflicts and string MCP conflict/move-report document fields. v4.211.1 mapping changes inspected but excluded from this guidance update at the user's request; no typed PLAY0273 property/type arguments are claimed. Standalone Screenplay 4.211.1 and its compiler contract pinned; the contract is a byte-identical copy of the v4.211.1 release asset. No new render/runtime probe. Prior: Standalone 4.205.0 and byte-identical compiler contract pinned. Cratis/AI#746: Uuid ==/!= in command require and produces when (ESM v28): same-concept rule, bare Uuid against a concept, canonical literals, protected read paths in require only; PLAY0268 (different concepts, ordering, Uuid validation and concept rules, read paths in produces when) and PLAY0273 (non-canonical literal) checked against the 4.205.0 compiler, v28 selection read from the MCP executable-model view; Stage admits exact v1-v21 and v23-v26 pairs so v28 is refused STAGE-ESM-016, not probed against a Stage image; CLI 3.74.0 renders through v26. Prior: Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
|
|
204
|
+
"notes": "Cratis/AI#820: reviewed v4.245.0 release; protected-read constraint precedence preserved. Review correction: removed unsupported parser-repair and inbound-public refusal release attributions and the incorrect PLAY0136 event-key claim, restoring prior teaching. Published contract asset is byte-identical to the previous snapshot; pin and compatibility entry advanced together. Prior: Cratis/AI#779: reference-runner capability refusals taught as scoped per specification (introduced in v4.213.2, Cratis/Screenplay#897) from the v4.216.0 tool and MCP documentation and plan source: an unadmitted projection (UnsupportedEventContext, UnsupportedProjectionBlock) marks unsupported only the specifications that reach it or its read model, the others run and planIssues lists deferred issues; application-level issues still block every selected specification; no new render/runtime probe. Prior: Cratis/AI#776: PLAY0802 ReservedStoredName (introduced in v4.213.3, Cratis/Screenplay#893) taught from the v4.216.0 compilers and documentation: stored event source `Default` and stored event stream `All` (ordinal, name or `id` pin) refused at authoring time, a pin away from the reserved name valid, PLAY0273 kept as the binding backstop; no new render/runtime probe. Prior: Cratis/AI#784: standalone Screenplay 4.216.0 pinned; compiler contract replaced by the v4.216.0 release asset (adds the propose-repair destinationIntent v1 schema and PLAY0802 ReservedStoredName). Source-checked decision 0096 and the MCP reference for the explicit author-intent PLAY0470 repair: repair-intents discovery, intentActions feature detection, complete per-production selections, retained production-destination report and identity views, explicit apply and refusals. No new render/runtime probe. Prior: Cratis/AI#771: standalone Screenplay 4.213.0 pinned; regenerated compiler contract is byte-identical to the v4.213.0 release asset and unchanged from 4.212.4. Reviewed the full v4.212.4-v4.213.0 delta against tagged decision 0093 and MCP reference: pre-binding container identities and stable binding/migration continuity, own-slice member substitutions, containerIdentities completeness/ambiguity/collision refusals, retained ambiguous notes, explicit semanticRenames/retirements, binding fixes through MCP, exact reopen exception, notes/identity rollback and exact-ID re-add anchoring. No grammar, binder, ESM or diagnostic-code changes; no new render/runtime probe. Prior: Cratis/AI#772: standalone Screenplay 4.212.4 pinned; regenerated compiler contract is byte-identical to the v4.212.4 release asset. Source-checked joined-event automap/no automap overrides and level fallback in executable binding; PLAY0380 covers only all inside children/nested. No new render/runtime probe. Prior: Cratis/AI#769: standalone Screenplay 4.212.3 pinned; regenerated compiler contract is byte-identical to the v4.212.3 release asset. Source-checked both compilers and projection documentation for PLAY0801 DuplicateEventInProjectionScope: shared from/removal/clear set, separate join set, fresh sets per children/nested/variant level, and no two-row update through repeated from blocks with different keys. No new render/runtime probe. Prior: Cratis/AI#768: standalone Screenplay 4.212.2 pinned; regenerated compiler contract is byte-identical to the v4.212.2 release asset (unchanged from the previous contract). Source-checked v4.212.0 split-model dotted note targets, open-workspace applicationIdentity and complete add/reanchor substitutions; unbound container identities are not claimed. v4.212.1 aligns PLAY0535 collection fields, optional parameters and single-result identity inference. v4.212.2 counts read-only query denials for SPEC004, not SPEC006. No new render/runtime probe. Prior: Cratis/AI#762 and #761: source-checked v4.210.0 and v4.211.0 contracts for PLAY0800 CommandHandlerRequiresAttachment (required typed subject, permanent code-attachment requirement, other PLAY0268 families unchanged), independent reference remove/add batches, located same-text ambiguity conflicts and string MCP conflict/move-report document fields. v4.211.1 mapping changes inspected but excluded from this guidance update at the user's request; no typed PLAY0273 property/type arguments are claimed. Standalone Screenplay 4.211.1 and its compiler contract pinned; the contract is a byte-identical copy of the v4.211.1 release asset. No new render/runtime probe. Prior: Standalone 4.205.0 and byte-identical compiler contract pinned. Cratis/AI#746: Uuid ==/!= in command require and produces when (ESM v28): same-concept rule, bare Uuid against a concept, canonical literals, protected read paths in require only; PLAY0268 (different concepts, ordering, Uuid validation and concept rules, read paths in produces when) and PLAY0273 (non-canonical literal) checked against the 4.205.0 compiler, v28 selection read from the MCP executable-model view; Stage admits exact v1-v21 and v23-v26 pairs so v28 is refused STAGE-ESM-016, not probed against a Stage image; CLI 3.74.0 renders through v26. Prior: Standalone 4.204.0 and byte-identical compiler contract pinned. Cratis/AI#702 and #691: PLAY0690 reducer identity (Screenplay 4.170.0, native compiler only) and the screenplay.json validation gate (Screenplay 4.165.0; cratis screenplay validate reads it from CLI 3.65.0) are taught and probed against the 4.204.0 compiler. Cratis/AI#743: flat composite read-model keys (ESM v27): untyped projection key blocks on root from and remove with, equality-filter lists, single-instance by blocks and per-part fixtures, with PLAY0661/PLAY0662/PLAY0268 refusals checked against the 4.204.0 compiler; Stage origin/main still refuses v27 with STAGE-ESM-016 (stage-rendering.md); Stage v4.135.0 v26 admission (Host and executor run date comparisons; renderer STAGE-ESM-046) was source-checked for this sync; no render or runtime probe. Prior: Standalone 4.201.0 and byte-identical compiler contract pinned. Cratis/AI#733: the ui profile root template, shell options, appearance and new screens default (PLAY0788-PLAY0799, quick fix for the legacy layout line, ui-profiles MCP tool, 44 tools). Cratis/AI#735: chronological Date/DateTime ordering in command conditions and command/property literal validation (ESM v26), UTC tick precision and pre-rule offset validation; then matching remains ordinal. Source-checked Screenplay v4.199.0 commands, diagnostics, interoperability and specifications documentation plus decision 0087. Stage v4.127.1 still refuses v26 with STAGE-ESM-016 (stage-rendering.md and SemanticVersionFeatures.Supports); no render/runtime probe. Cratis/AI#576: prior mechanical compiler catch-up. Language batch #717/#722/#723/#724/#720/#728/#734 teaches atomic reaction batches (v22), described payload handlers (v23), portable linear matching, ordinal text rules (v24), protected command reads (v25), diagnostic arguments and event-source invokes mappings. Facts read at Screenplay v4.198.0 and introducing tags; Stage v4.127.0 admits exact v1-v21 and v23-v25 pairs but refuses v22/v26 and mixed pairs (STAGE-ESM-016), protected reads (044), atomic mode (043) and described handlers (STAGE-IMPL-002), even Stub mode. Stage text rules execute/render; no new renderer/runtime probe or Stage pin uplift. Cratis/AI#706: application navigation regions (module inherit, extend or override), toolbar slice buttons, blueprint template references and sample data packs in cratis-screenplay-ui-composition (references/application-shell.md), with the canonical shell vector and the rejection codes PLAY0710-PLAY0722 and PLAY0740-PLAY0765. Examples moved to the executable-state rules since 4.164: translator reactions in an Automation slice beside the Translate slice (PLAY0694) and the first record of a capture key appended with `when added`. Earlier: Standalone 4.164.0 and byte-identical compiler contract pinned. Cratis/AI#663: one origin per capture (PLAY0687). #668: executable no-event/redelivery v17. #684: concept query-argument validation in every version and query-error assertions v18. #681: executable refusal branches and refusal values v19. #666: proposal summary/severity counts and exact structural source proposals. Generated-concept rules select v20 with PLAY0688/0689 proofs and derived-matches repair; generated secrets and preview strategies remain refused. Release-baseline from-esm admission reads storedName. Standalone binding is not renderer admission: Stage 4.103.0 admits v1-v17 and v19; CLI 3.62.0 bundles Screenplay 4.159.0 / Stage 4.99.0 and renders through v16. Prior evidence remains unless superseded; no new renderer, Docker or browser probe."
|
|
205
205
|
},
|
|
206
206
|
{
|
|
207
207
|
"id": "scene",
|
|
@@ -331,9 +331,9 @@
|
|
|
331
331
|
"repository": "Cratis/Arc.Go",
|
|
332
332
|
"packages": [],
|
|
333
333
|
"synced": {
|
|
334
|
-
"version": "0.1.
|
|
335
|
-
"date": "2026-10-
|
|
336
|
-
"by": "Cratis/AI#
|
|
334
|
+
"version": "0.1.2",
|
|
335
|
+
"date": "2026-10-25",
|
|
336
|
+
"by": "Cratis/AI#820"
|
|
337
337
|
},
|
|
338
338
|
"covers": {
|
|
339
339
|
"skills": [
|
|
@@ -345,7 +345,7 @@
|
|
|
345
345
|
]
|
|
346
346
|
},
|
|
347
347
|
"coverage": "tracked",
|
|
348
|
-
"notes": "
|
|
348
|
+
"notes": "Cratis/AI#820: reviewed v0.1.2 release. Snapshot HEAD handling no longer enumerates bodies; existing root-module guidance promises no HEAD conformance and teaches no body enumeration on HEAD. No teaching update needed; packaging/runtime fix only, no new Go execution evidence."
|
|
349
349
|
},
|
|
350
350
|
{
|
|
351
351
|
"id": "templates",
|
|
@@ -353,9 +353,9 @@
|
|
|
353
353
|
"repository": "Cratis/Templates",
|
|
354
354
|
"packages": [],
|
|
355
355
|
"synced": {
|
|
356
|
-
"version": "1.
|
|
357
|
-
"date": "2026-10-
|
|
358
|
-
"by": "Cratis/AI#
|
|
356
|
+
"version": "1.8.1",
|
|
357
|
+
"date": "2026-10-25",
|
|
358
|
+
"by": "Cratis/AI#820"
|
|
359
359
|
},
|
|
360
360
|
"covers": {
|
|
361
361
|
"skills": [],
|
|
@@ -364,7 +364,7 @@
|
|
|
364
364
|
]
|
|
365
365
|
},
|
|
366
366
|
"coverage": "tracked",
|
|
367
|
-
"notes": "
|
|
367
|
+
"notes": "Cratis/AI#820: reviewed v1.8.0-v1.8.1. Tagged Cratis and CratisAspire app csproj sources enable CratisReadProtection On; application-profile now distinguishes new scaffolds from existing apps. 1.8.1 package metadata has no teaching impact. No scaffold execution claimed."
|
|
368
368
|
},
|
|
369
369
|
{
|
|
370
370
|
"id": "fundamentals",
|
|
@@ -381,9 +381,9 @@
|
|
|
381
381
|
}
|
|
382
382
|
],
|
|
383
383
|
"synced": {
|
|
384
|
-
"version": "7.
|
|
385
|
-
"date": "2026-10-
|
|
386
|
-
"by": "Cratis/AI#
|
|
384
|
+
"version": "7.26.1",
|
|
385
|
+
"date": "2026-10-25",
|
|
386
|
+
"by": "Cratis/AI#820"
|
|
387
387
|
},
|
|
388
388
|
"covers": {
|
|
389
389
|
"skills": [
|
|
@@ -399,7 +399,7 @@
|
|
|
399
399
|
"concepts.md"
|
|
400
400
|
]
|
|
401
401
|
},
|
|
402
|
-
"notes": "Source-checked v7.25.0: IGeneratable/IGeneratableInContext, GenerationContext, UUID/ULID/TypeID/NanoID/bytes and finite GenerateValue.Pattern overloads with optional Checksum, inclusive Int64 Integer, and HasValidChecksum. Pattern date segments use captured UTC time; check digits add no entropy or authorization and do not automatically add validation. No Stage version uplift or generated-secret admission is implied."
|
|
402
|
+
"notes": "Cratis/AI#820: reviewed v7.25.1-v7.26.1, all four releases. Tagged DerivedTypes.For(ITypes) weak per-universe caching and generator build fixes taught in type-discovery; logo and test-package packing are metadata-only. No runtime probe. Prior: Source-checked v7.25.0: IGeneratable/IGeneratableInContext, GenerationContext, UUID/ULID/TypeID/NanoID/bytes and finite GenerateValue.Pattern overloads with optional Checksum, inclusive Int64 Integer, and HasValidChecksum. Pattern date segments use captured UTC time; check digits add no entropy or authorization and do not automatically add validation. No Stage version uplift or generated-secret admission is implied."
|
|
403
403
|
},
|
|
404
404
|
{
|
|
405
405
|
"id": "components",
|
|
@@ -412,9 +412,9 @@
|
|
|
412
412
|
}
|
|
413
413
|
],
|
|
414
414
|
"synced": {
|
|
415
|
-
"version": "4.
|
|
416
|
-
"date": "2026-10-
|
|
417
|
-
"by": "Cratis/AI#
|
|
415
|
+
"version": "4.38.0",
|
|
416
|
+
"date": "2026-10-25",
|
|
417
|
+
"by": "Cratis/AI#820"
|
|
418
418
|
},
|
|
419
419
|
"covers": {
|
|
420
420
|
"skills": [
|
|
@@ -432,7 +432,7 @@
|
|
|
432
432
|
"components.md"
|
|
433
433
|
]
|
|
434
434
|
},
|
|
435
|
-
"notes": "
|
|
435
|
+
"notes": "Cratis/AI#820: reviewed all 15 stable releases v4.27.0-v4.38.0. Tagged docs/source and release notes inform serverQuery, paginator localization, query-state/selection, schema preservation/generated/UUID, GuidField, dialog focus/dismissal, non-modal dates and router integration. Adapter unchecked rendering is a runtime fix; package metadata requires no teaching update. Source review only; prior browser evidence not extended."
|
|
436
436
|
},
|
|
437
437
|
{
|
|
438
438
|
"id": "chronicle-go",
|
|
@@ -440,9 +440,9 @@
|
|
|
440
440
|
"repository": "Cratis/Chronicle.Go",
|
|
441
441
|
"packages": [],
|
|
442
442
|
"synced": {
|
|
443
|
-
"version": "0.
|
|
444
|
-
"date": "2026-10-
|
|
445
|
-
"by": "Cratis/AI#
|
|
443
|
+
"version": "0.11.1",
|
|
444
|
+
"date": "2026-10-25",
|
|
445
|
+
"by": "Cratis/AI#820"
|
|
446
446
|
},
|
|
447
447
|
"covers": {
|
|
448
448
|
"skills": [
|
|
@@ -454,7 +454,7 @@
|
|
|
454
454
|
]
|
|
455
455
|
},
|
|
456
456
|
"coverage": "tracked",
|
|
457
|
-
"notes": "
|
|
457
|
+
"notes": "Cratis/AI#820: reviewed v0.10.0, v0.11.0 and v0.11.1. Teach FastForward, first-registration StartAtTail and kernel-first upgrade to the verified 19.70.0 decision-guard profile. Documentation metadata needs no teaching update; generated occurrences contracts do not establish a new public workflow. No Go execution probe."
|
|
458
458
|
},
|
|
459
459
|
{
|
|
460
460
|
"id": "ante",
|
|
@@ -493,9 +493,9 @@
|
|
|
493
493
|
"repository": "Cratis/Screenplay.CritterStack",
|
|
494
494
|
"packages": [],
|
|
495
495
|
"synced": {
|
|
496
|
-
"version": "0.26.
|
|
497
|
-
"date": "2026-10-
|
|
498
|
-
"by": "Cratis/AI#
|
|
496
|
+
"version": "0.26.1",
|
|
497
|
+
"date": "2026-10-25",
|
|
498
|
+
"by": "Cratis/AI#820"
|
|
499
499
|
},
|
|
500
500
|
"covers": {
|
|
501
501
|
"skills": [
|
|
@@ -504,7 +504,7 @@
|
|
|
504
504
|
"rules": []
|
|
505
505
|
},
|
|
506
506
|
"coverage": "tracked",
|
|
507
|
-
"notes": "
|
|
507
|
+
"notes": "Cratis/AI#820: reviewed v0.26.1. No teaching update needed: NuGet metadata and the repository's Specifications 5/xUnit v3 test runner migration do not change the CritterStack renderer/toolchain contract taught by this family. No backend parity or new execution claim."
|
|
508
508
|
},
|
|
509
509
|
{
|
|
510
510
|
"id": "chronicle-typescript",
|
|
@@ -517,9 +517,9 @@
|
|
|
517
517
|
}
|
|
518
518
|
],
|
|
519
519
|
"synced": {
|
|
520
|
-
"version": "6.
|
|
521
|
-
"date": "2026-10-
|
|
522
|
-
"by": "Cratis/AI#
|
|
520
|
+
"version": "6.53.1",
|
|
521
|
+
"date": "2026-10-25",
|
|
522
|
+
"by": "Cratis/AI#820"
|
|
523
523
|
},
|
|
524
524
|
"covers": {
|
|
525
525
|
"skills": [
|
|
@@ -527,7 +527,7 @@
|
|
|
527
527
|
],
|
|
528
528
|
"rules": []
|
|
529
529
|
},
|
|
530
|
-
"notes": "
|
|
530
|
+
"notes": "Cratis/AI#820: reviewed all five releases v6.51.1-v6.53.1. Teach gRPC limits, FastForward, first-registration StartAtTail, class defaults and child all-event projection fixes with explicit kernel/Fundamentals requirements and replay action. Release review only; no new TypeScript execution evidence."
|
|
531
531
|
},
|
|
532
532
|
{
|
|
533
533
|
"id": "release-action",
|
|
@@ -535,9 +535,9 @@
|
|
|
535
535
|
"repository": "Cratis/release-action",
|
|
536
536
|
"packages": [],
|
|
537
537
|
"synced": {
|
|
538
|
-
"version": "1.
|
|
539
|
-
"date": "2026-10-
|
|
540
|
-
"by": "Cratis/AI#
|
|
538
|
+
"version": "1.5.1",
|
|
539
|
+
"date": "2026-10-25",
|
|
540
|
+
"by": "Cratis/AI#820"
|
|
541
541
|
},
|
|
542
542
|
"covers": {
|
|
543
543
|
"skills": [
|
|
@@ -548,7 +548,7 @@
|
|
|
548
548
|
]
|
|
549
549
|
},
|
|
550
550
|
"coverage": "tracked",
|
|
551
|
-
"notes": "
|
|
551
|
+
"notes": "Cratis/AI#820: reviewed v1.4.3, v1.5.0 and v1.5.1. Skill and PR policy now distinguish workflow-drift 403 recovery from stale-tag retry, opt-in batching/defaults/outputs, combined summaries and corrected pending-major hotfix behavior. No workflow activation or release execution claimed."
|
|
552
552
|
},
|
|
553
553
|
{
|
|
554
554
|
"id": "screenplay-generation",
|
|
@@ -556,9 +556,9 @@
|
|
|
556
556
|
"repository": "Cratis/Screenplay.Generation",
|
|
557
557
|
"packages": [],
|
|
558
558
|
"synced": {
|
|
559
|
-
"version": "0.18.
|
|
560
|
-
"date": "2026-10-
|
|
561
|
-
"by": "Cratis/AI#
|
|
559
|
+
"version": "0.18.2",
|
|
560
|
+
"date": "2026-10-25",
|
|
561
|
+
"by": "Cratis/AI#820"
|
|
562
562
|
},
|
|
563
563
|
"covers": {
|
|
564
564
|
"skills": [
|
|
@@ -567,7 +567,7 @@
|
|
|
567
567
|
"rules": []
|
|
568
568
|
},
|
|
569
569
|
"coverage": "tracked",
|
|
570
|
-
"notes": "
|
|
570
|
+
"notes": "Cratis/AI#820: reviewed v0.18.2. No teaching update needed: package metadata and native .NET 10 Specifications 5 test execution do not change generation APIs or the retained .NET 8/9/10 library targets. No renderer parity or execution uplift inferred."
|
|
571
571
|
},
|
|
572
572
|
{
|
|
573
573
|
"id": "chronicle-elixir",
|
|
@@ -580,9 +580,9 @@
|
|
|
580
580
|
}
|
|
581
581
|
],
|
|
582
582
|
"synced": {
|
|
583
|
-
"version": "3.
|
|
584
|
-
"date": "2026-10-
|
|
585
|
-
"by": "Cratis/AI#
|
|
583
|
+
"version": "3.14.3",
|
|
584
|
+
"date": "2026-10-25",
|
|
585
|
+
"by": "Cratis/AI#820"
|
|
586
586
|
},
|
|
587
587
|
"covers": {
|
|
588
588
|
"skills": [
|
|
@@ -592,7 +592,7 @@
|
|
|
592
592
|
"elixir.md"
|
|
593
593
|
]
|
|
594
594
|
},
|
|
595
|
-
"notes": "Synced to the v3.13.0 tag: decision reads, Chronicle.Testing, captures, discovery drift, standalone constraints, children collections, concurrency scopes and observability."
|
|
595
|
+
"notes": "Cratis/AI#820: reviewed all four releases v3.14.0-v3.14.3. Teach first-registration start_at_tail/kernel floor, client crash-report redaction and decide callback rejection/cleanup. Hex metadata and shared-doc language tabs need no additional API teaching. Tagged reactor/event/testing docs inspected; retained in-memory projection limits still apply. No new execution evidence. Prior: Synced to the v3.13.0 tag: decision reads, Chronicle.Testing, captures, discovery drift, standalone constraints, children collections, concurrency scopes and observability."
|
|
596
596
|
},
|
|
597
597
|
{
|
|
598
598
|
"id": "authproxy",
|
|
@@ -600,9 +600,9 @@
|
|
|
600
600
|
"repository": "Cratis/AuthProxy",
|
|
601
601
|
"packages": [],
|
|
602
602
|
"synced": {
|
|
603
|
-
"version": "2.
|
|
604
|
-
"date": "2026-10-
|
|
605
|
-
"by": "Cratis/AI#
|
|
603
|
+
"version": "2.32.4",
|
|
604
|
+
"date": "2026-10-25",
|
|
605
|
+
"by": "Cratis/AI#820"
|
|
606
606
|
},
|
|
607
607
|
"covers": {
|
|
608
608
|
"skills": [
|
|
@@ -611,7 +611,7 @@
|
|
|
611
611
|
"rules": []
|
|
612
612
|
},
|
|
613
613
|
"coverage": "tracked",
|
|
614
|
-
"notes": "
|
|
614
|
+
"notes": "Cratis/AI#820: reviewed all eight releases v2.31.0-v2.32.4. Teach opt-in multi-host session/callback boundaries, search-index exclusion and invitation placeholders. Existing canonical tenant header guidance remains correct for bearer routes; registration/cookie fixes need no workaround. Package/tooling/test-runner updates have no further identity API teaching delta. Release review, not a deployed ingress probe."
|
|
615
615
|
},
|
|
616
616
|
{
|
|
617
617
|
"id": "fundamentals-go",
|
|
@@ -619,9 +619,9 @@
|
|
|
619
619
|
"repository": "Cratis/Fundamentals.Go",
|
|
620
620
|
"packages": [],
|
|
621
621
|
"synced": {
|
|
622
|
-
"version": "0.3.
|
|
623
|
-
"date": "2026-10-
|
|
624
|
-
"by": "Cratis/AI#
|
|
622
|
+
"version": "0.3.3",
|
|
623
|
+
"date": "2026-10-25",
|
|
624
|
+
"by": "Cratis/AI#820"
|
|
625
625
|
},
|
|
626
626
|
"covers": {
|
|
627
627
|
"skills": [
|
|
@@ -633,7 +633,7 @@
|
|
|
633
633
|
]
|
|
634
634
|
},
|
|
635
635
|
"coverage": "tracked",
|
|
636
|
-
"notes": "
|
|
636
|
+
"notes": "Cratis/AI#820: reviewed v0.3.3. No teaching update needed: pkg.go.dev summary and documentation links change no concept, serialization, validation or Go engineering API. Existing runtime verification remains historical."
|
|
637
637
|
},
|
|
638
638
|
{
|
|
639
639
|
"id": "chronicle-kotlin",
|
|
@@ -646,9 +646,9 @@
|
|
|
646
646
|
}
|
|
647
647
|
],
|
|
648
648
|
"synced": {
|
|
649
|
-
"version": "
|
|
650
|
-
"date": "2026-10-
|
|
651
|
-
"by": "Cratis/AI#
|
|
649
|
+
"version": "7.1.0",
|
|
650
|
+
"date": "2026-10-25",
|
|
651
|
+
"by": "Cratis/AI#820"
|
|
652
652
|
},
|
|
653
653
|
"covers": {
|
|
654
654
|
"skills": [
|
|
@@ -656,7 +656,7 @@
|
|
|
656
656
|
],
|
|
657
657
|
"rules": []
|
|
658
658
|
},
|
|
659
|
-
"notes": "
|
|
659
|
+
"notes": "Cratis/AI#820: reviewed all seven releases v6.13.1-v7.1.0 and tagged concept/correlation/annotation sources. Teach breaking Fundamentals imports/value() and CorrelationId migration, shared thread-bound context, enum ordinals, StartAtTail/FastForward kernel floors and message limits. Maven metadata has no teaching delta. Earlier compile/runtime evidence remains historical."
|
|
660
660
|
},
|
|
661
661
|
{
|
|
662
662
|
"id": "arc-kotlin",
|
|
@@ -669,9 +669,9 @@
|
|
|
669
669
|
}
|
|
670
670
|
],
|
|
671
671
|
"synced": {
|
|
672
|
-
"version": "7.
|
|
673
|
-
"date": "2026-10-
|
|
674
|
-
"by": "Cratis/AI#
|
|
672
|
+
"version": "7.8.1",
|
|
673
|
+
"date": "2026-10-25",
|
|
674
|
+
"by": "Cratis/AI#820"
|
|
675
675
|
},
|
|
676
676
|
"covers": {
|
|
677
677
|
"skills": [
|
|
@@ -684,7 +684,7 @@
|
|
|
684
684
|
],
|
|
685
685
|
"rules": []
|
|
686
686
|
},
|
|
687
|
-
"notes": "
|
|
687
|
+
"notes": "Cratis/AI#820: reviewed v7.7.1, v7.8.0 and v7.8.1 with tagged ConceptAs and validator sources. Teach shared Fundamentals concepts/value(), compatible legacy Arc validators and fixed FundamentalsConceptValidator exclusions. Maven metadata/build dependencies need no further teaching update. No Kotlin execution uplift."
|
|
688
688
|
},
|
|
689
689
|
{
|
|
690
690
|
"id": "prompter",
|
|
@@ -755,9 +755,9 @@
|
|
|
755
755
|
}
|
|
756
756
|
],
|
|
757
757
|
"synced": {
|
|
758
|
-
"version": "
|
|
759
|
-
"date": "2026-10-
|
|
760
|
-
"by": "Cratis/AI#
|
|
758
|
+
"version": "5.0.3",
|
|
759
|
+
"date": "2026-10-25",
|
|
760
|
+
"by": "Cratis/AI#820"
|
|
761
761
|
},
|
|
762
762
|
"covers": {
|
|
763
763
|
"skills": [
|
|
@@ -771,7 +771,7 @@
|
|
|
771
771
|
"specs.md"
|
|
772
772
|
]
|
|
773
773
|
},
|
|
774
|
-
"notes": "
|
|
774
|
+
"notes": "Cratis/AI#820: reviewed all ten stable releases v4.1.2-v5.0.3 and tagged 5.0.2 upgrade/README. The final REST drift check found newly released 5.0.3; teach its separate native-runner class teardown failure outcome. Existing 5.x executable guidance retained; repair contradictory teardown/fixture/analyzer teaching, document ValueTask and aliases, assertion migration and Received.InOrder exception. New runner/resources remain experimental/opt-in. NuGet logo and XML-registration fix need no workflow workaround; TypeScript/scenario families have no API change from this product. No new .NET execution claim."
|
|
775
775
|
},
|
|
776
776
|
{
|
|
777
777
|
"id": "narrator",
|
|
@@ -779,9 +779,9 @@
|
|
|
779
779
|
"repository": "Cratis/Narrator",
|
|
780
780
|
"packages": [],
|
|
781
781
|
"synced": {
|
|
782
|
-
"version": "3.0.
|
|
783
|
-
"date": "2026-10-
|
|
784
|
-
"by": "Cratis/AI#
|
|
782
|
+
"version": "3.0.3",
|
|
783
|
+
"date": "2026-10-25",
|
|
784
|
+
"by": "Cratis/AI#820"
|
|
785
785
|
},
|
|
786
786
|
"covers": {
|
|
787
787
|
"skills": [
|
|
@@ -790,7 +790,7 @@
|
|
|
790
790
|
"rules": []
|
|
791
791
|
},
|
|
792
792
|
"coverage": "tracked",
|
|
793
|
-
"notes": "
|
|
793
|
+
"notes": "Cratis/AI#820: reviewed v3.0.3. No teaching update needed: the Marketplace documentation link changes neither Narrator capture behavior nor the Chronicle CLI operations taught by this family. No new CLI or extension execution evidence."
|
|
794
794
|
},
|
|
795
795
|
{
|
|
796
796
|
"id": "ai-distribution",
|
|
@@ -817,9 +817,9 @@
|
|
|
817
817
|
"repository": "Cratis/Prologue",
|
|
818
818
|
"packages": [],
|
|
819
819
|
"synced": {
|
|
820
|
-
"version": "2.0.
|
|
821
|
-
"date": "2026-10-
|
|
822
|
-
"by": "Cratis/AI#
|
|
820
|
+
"version": "2.0.5",
|
|
821
|
+
"date": "2026-10-25",
|
|
822
|
+
"by": "Cratis/AI#820"
|
|
823
823
|
},
|
|
824
824
|
"covers": {
|
|
825
825
|
"skills": [
|
|
@@ -827,7 +827,7 @@
|
|
|
827
827
|
],
|
|
828
828
|
"rules": []
|
|
829
829
|
},
|
|
830
|
-
"notes": "
|
|
830
|
+
"notes": "Cratis/AI#820: reviewed all five releases v2.0.1-v2.0.5. Teach security upgrade, native arm64 images and repaired no-LLM emission while retaining executable model validation and disclosure safeguards. Package metadata, Fundamentals runtime bump and repository spec migration require no further extraction recipe. No new capture/interpret execution evidence."
|
|
831
831
|
},
|
|
832
832
|
{
|
|
833
833
|
"id": "lens",
|
|
@@ -853,9 +853,9 @@
|
|
|
853
853
|
"repository": "Cratis/Architecture",
|
|
854
854
|
"packages": [],
|
|
855
855
|
"synced": {
|
|
856
|
-
"version": "1.0.
|
|
857
|
-
"date": "2026-10-
|
|
858
|
-
"by": "Cratis/AI#
|
|
856
|
+
"version": "1.0.3",
|
|
857
|
+
"date": "2026-10-25",
|
|
858
|
+
"by": "Cratis/AI#820"
|
|
859
859
|
},
|
|
860
860
|
"covers": {
|
|
861
861
|
"skills": [],
|
|
@@ -864,7 +864,7 @@
|
|
|
864
864
|
]
|
|
865
865
|
},
|
|
866
866
|
"coverage": "tracked",
|
|
867
|
-
"notes": "
|
|
867
|
+
"notes": "Analyzer guidance lives in rules/csharp.md. Cratis/AI#820: reviewed v1.0.3. No teaching update needed: NuGet author, icon, tags, README and documentation link changes alter no Architecture attributes, analyzer rules or C# conventions. No new analyzer execution evidence."
|
|
868
868
|
},
|
|
869
869
|
{
|
|
870
870
|
"id": "dockerfiles",
|
|
@@ -66,7 +66,7 @@ Tagged **[contract]** (framework-enforced) or **[convention]** (house default).
|
|
|
66
66
|
|
|
67
67
|
## Implementation Workflow
|
|
68
68
|
|
|
69
|
-
- **Starting a brand-new application:** scaffold it instead of hand-writing the skeleton: `dotnet new install Cratis.Templates`, then `dotnet new cratis -n MyApp -o MyApp` (`--language Kotlin|Java`, `--Database MongoDB|PostgreSQL|MsSql|SQLite`; `cratis-aspire` for Aspire; `cratis-chronicle-console` or `cratis-chronicle-web` for a Chronicle client only). Non-interactive runs need `--allow-scripts yes`; the .NET templates target `net10.0`. The template writes `.cratis/ai.json`; run `cratis ai update` afterwards. Its `SomeModule/SomeFeature/Registration/` slice is the house shape. There is no Go, Python or Elixir template (verified at Cratis.Templates `v1.
|
|
69
|
+
- **Starting a brand-new application:** scaffold it instead of hand-writing the skeleton: `dotnet new install Cratis.Templates`, then `dotnet new cratis -n MyApp -o MyApp` (`--language Kotlin|Java`, `--Database MongoDB|PostgreSQL|MsSql|SQLite`; `cratis-aspire` for Aspire; `cratis-chronicle-console` or `cratis-chronicle-web` for a Chronicle client only). Non-interactive runs need `--allow-scripts yes`; the .NET templates target `net10.0`. The template writes `.cratis/ai.json`; run `cratis ai update` afterwards. Its `SomeModule/SomeFeature/Registration/` slice is the house shape. There is no Go, Python or Elixir template (verified at Cratis.Templates `v1.8.1`). Since 1.8.0 the `cratis` and `cratis-aspire` .NET app projects emit `<CratisReadProtection>On</CratisReadProtection>`: read models supplied to commands and validators guard the append. Existing apps are not changed by reinstalling the templates.
|
|
70
70
|
- **Phase 0 — Find the contract / choose the level.** Before writing slice code, find what the code must match, and choose the level once for the whole scope.
|
|
71
71
|
1. **Look for a Screenplay model** under the model root (opted in per `general.md` "Model first"; where `cratis-screenplay-modeling-lifecycle` is installed, run its `scripts/model-first-status.mjs` for the decision, root and drafts) for the slice, command, event and read-model names.
|
|
72
72
|
2. **Model level** — an accepted model under the root covers the scope, or the repository is opted in and this scope has no model yet. The `.play` slice and its specs are the contract: change the model first (new behavior starts in discovery), verify it (V1–V3), get an independent review, then render with Stage or gap-fill by hand only what the renderer rejects. Hand-written code stays checked against the model (**cratis-application-slice-conformance**). Never edit Stage-managed output, never implement behavior the model does not state, never change the model to match existing code, never weaken protection to make it compile or render. Start with **cratis-screenplay-event-modeling** (decision rule), then **cratis-screenplay-modeling-lifecycle**. If the Screenplay skills are not installed, say so; do not author `.play` from memory.
|
|
@@ -154,6 +154,13 @@ The test is **outward-facing effect, not file location**. A change under `Source
|
|
|
154
154
|
|
|
155
155
|
A non-release pull request must satisfy the relevant required checks like any other. Confirm label acceptance and publication suppression against the current workflow contract; do not assume external CI or API state.
|
|
156
156
|
|
|
157
|
+
### Release-action windows and workflow drift
|
|
158
|
+
|
|
159
|
+
Batching is opt-in; success with `batched` or `nothing-pending` is not publication.
|
|
160
|
+
Read **cratis-release-notes** before configuring windows, handling a pending-major
|
|
161
|
+
hotfix, or recovering a workflow-drift 403. Major confirmation remains required;
|
|
162
|
+
a workflow-drift recovery differs from the concurrent-tag retry above.
|
|
163
|
+
|
|
157
164
|
### Group small related changes into one pull request
|
|
158
165
|
|
|
159
166
|
Do not open a pull request per task when the tasks belong to the same body of work. Several small merged PRs become several releases, and a stream of near-empty patch releases makes the release history useless for the people it is written for. Collect related work — a set of CI gates, a group of fixes in one area, the steps of one refactor — onto **one branch, as separate commits**, and open **one** pull request. Commits stay one-logical-unit-each; the pull request is the release boundary, and the release boundary should be a coherent, describable change. Joining an open candidate, folding superseded PRs and the cut are in `cratis-engineering-release-trains`.
|
|
@@ -45,13 +45,13 @@ public class when_combining_parts : Specification
|
|
|
45
45
|
| `void Establish()` | setup, before `Because()` | each class in the chain has its own, run base-first — never call `base.Establish()` |
|
|
46
46
|
| `void Because()` | the single action under test | only in concrete spec files, never in a reusable context |
|
|
47
47
|
| `[Fact] void should_*()` | one assertion per fact | use the `ShouldXxx()` extension methods |
|
|
48
|
-
| `void Destroy()` | teardown
|
|
48
|
+
| `void Destroy()` | teardown once per eligible class by default | after each fact when per-fact lifecycle is selected |
|
|
49
49
|
|
|
50
|
-
The shared lifecycle is the default on xUnit v2 and v3 since 5.0; the package registers the framework, so delete any hand-written `[assembly: Xunit.TestFramework(...)]` (it fails with `CS0579`). Eligible classes derive from `Specification`, have one public
|
|
50
|
+
The shared lifecycle is the default on xUnit v2 and v3 since 5.0; the package registers the framework, so delete any hand-written `[assembly: Xunit.TestFramework(...)]` (it fails with `CS0579`). Eligible classes derive from `Specification`, have one public constructor with no arguments or only framework-managed fixture arguments, and contain only plain facts. Construction, Establish/Because and Destroy run once; all facts share the instance and must not mutate it. `IDisposable` specifications also share the lifecycle since Cratis.Specifications 4.4.0: one construction and one `Dispose` after the last fact. Initialization failure fails every fact. Theories and `ITestOutputHelper` constructors keep per-fact execution; `[PerFactSpecificationLifecycle]` opts a class out. `CRSPEC0008` (a fact modifies the shared context) is an error by default: move the change into `Establish` or `Because`. See the **cratis-specifications-csharp** skill's shared-lifecycle reference.
|
|
51
51
|
|
|
52
52
|
Run specifications as the built executable, not `dotnet test`: restore and build once, then run `bin/<Config>/net10.0/<Project>.Specs`. In a solution that mixes Microsoft.Testing.Platform and VSTest projects, run each project on its own; `dotnet test` on the whole solution does not work there. Filters and the 4.x → 5.0 checklist are in the **cratis-specifications-csharp** skill's [running-specs reference](../skills/cratis-specifications-csharp/references/running-specs.md).
|
|
53
53
|
|
|
54
|
-
CRSPEC0001–CRSPEC0007 are warnings
|
|
54
|
+
CRSPEC0001–CRSPEC0007 are warnings. Since 4.5 the analyzers ship only in `Cratis.Specifications`, transitively used by the framework packages; excluding analyzers on a framework package does not remove them. Derived xUnit/NUnit test attributes are recognized since 4.1.2. `Given`/`When` are aliases since 4.4 (declaring both aliases for one phase is CRSPEC0009), but house style stays `Establish`/`Because`. With warnings as errors, a non-`should_` fact, multiple specs per file (given contexts exempt), a fact on a given context, a `should_` without a test attribute, explicit base lifecycle calls, non-public specs with facts, or `Because` on a given context fail the build. Follow **cratis-specification-by-example**; do not suppress these diagnostics.
|
|
55
55
|
|
|
56
56
|
## Reusable layered contexts
|
|
57
57
|
|
|
@@ -94,7 +94,7 @@ async Task Because() => _error = await Catch.Exception(_sut.DoSomething);
|
|
|
94
94
|
|
|
95
95
|
## Assertion extension methods
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
Since 5.0 assertions live in `Cratis.Specifications`, with types forwarded by each framework package (namespace `Cratis.Specifications`); recompile and keep core/framework packages on the same version: `.ShouldEqual(expected)`, `.ShouldBeTrue()`, `.ShouldBeFalse()`, `.ShouldBeNull()`, `.ShouldNotBeNull()`, `.ShouldBeEmpty()`, `.ShouldNotBeEmpty()`, `.ShouldContain(item)`, `.ShouldNotContain(item)`, `.ShouldContainOnly(items)`, `.ShouldBeOfExactType<T>()`, `.ShouldBeGreaterThan(n)`, `.ShouldBeLessThan(n)`.
|
|
98
98
|
|
|
99
99
|
Additional helpers include `ShouldNotEqual`, `ShouldBeSame`/`ShouldNotBeSame`, `ShouldMatch(Func<T, bool>)`, `ShouldBeInRange`, inclusive comparisons `ShouldBeGreaterThanOrEqual`/`ShouldBeLessThanOrEqual`, `ShouldContainSingleItem`, `ShouldEachConformTo`, ordered collection `ShouldEqual(IEnumerable<T>)`, collection `ShouldContain(Predicate<T>)`, `ShouldBeAssignableFrom<T>`, and string `ShouldContain(substring, StringComparison)`. `Catch.Exception` accepts `Action` or `Func<Task>`; `Catch.Exception<T>(Action)` catches only T.
|
|
100
100
|
|
|
@@ -23,6 +23,32 @@ The headers are **not signed**. A backend cannot tell a request that came throug
|
|
|
23
23
|
|
|
24
24
|
`IdentityVerification` on an AuthProxy service defaults to `Required` (fail closed). Only a `2xx` with `"isAuthorized": true` admits the caller. A `404`, an unreachable backend, a timeout (default ten seconds), any other non-`2xx`, an empty or unparseable body, a missing verdict, or `isAuthorized: false` all deny. The earlier `BestEffort` mode denied only on `403`. Consequently your `IProvideIdentityDetails` result is the admission verdict at the proxy, not only display data: return `IsUserAuthorized = false` deliberately, and keep the endpoint reachable and fast. A service can opt back into `BestEffort` explicitly; do not do that to hide a broken identity endpoint.
|
|
25
25
|
|
|
26
|
+
## Multi-host sessions are opt-in
|
|
27
|
+
|
|
28
|
+
Requires AuthProxy 2.32.4 for the multi-host/crawler/invitation contract below; check the deployed version, or retain host-only sessions and the older error-page contract.
|
|
29
|
+
|
|
30
|
+
Defaults stay host-only with cookie name
|
|
31
|
+
`.Cratis.AuthProxy.Auth.v2`, per-host handshakes and relative return URLs.
|
|
32
|
+
`Session:CookieDomain` shares sessions beneath a parent domain;
|
|
33
|
+
`Session:CookieName` isolates independent deployments. `SignIn:CallbackHost`
|
|
34
|
+
centralizes OAuth/OIDC handshakes and requires the cookie domain. Restrict
|
|
35
|
+
`AllowedHosts`; never broaden hosts merely to make shared cookies work.
|
|
36
|
+
|
|
37
|
+
The callback and declared service hosts must lie inside the cookie domain;
|
|
38
|
+
`SubHost` tenant resolution cannot be combined with it. Absolute returns require
|
|
39
|
+
the callback host and an allowed origin inside that domain on the request's
|
|
40
|
+
scheme; otherwise they reduce to a local path. Invitations, credential links and
|
|
41
|
+
registration still start on their original host and need provider callbacks
|
|
42
|
+
there. Use the product's one-proxy/several-hosts migration guide, not an inferred
|
|
43
|
+
cross-domain cookie recipe.
|
|
44
|
+
|
|
45
|
+
`AuthProxy:SearchIndexing:Exclude` optionally serves anonymous
|
|
46
|
+
`robots.txt` and adds `X-Robots-Tag: noindex, nofollow`. It is off by default and
|
|
47
|
+
is a crawler policy, not authorization. Invitation error-page tokens
|
|
48
|
+
`{{invitedEmail}}` and `{{assertedEmail}}` are blank for addresses outside ASCII
|
|
49
|
+
letters, digits and `._+-@`; do not assume these placeholders always contain text.
|
|
50
|
+
Signed-in `/register` forwarding needs no host workaround.
|
|
51
|
+
|
|
26
52
|
## Tenants and services
|
|
27
53
|
|
|
28
54
|
AuthProxy resolves the tenant through ordered strategies under `Cratis:AuthProxy:TenantResolutions` (`Host`, `Claim`, `Route`, `Specified`, `Default`, `SubHost`, `Selection`). The result reaches the backend as `x-cratis-tenant-id`, which is Arc's default tenant header, so an Arc application behind AuthProxy needs no tenancy configuration and the `UseHeaderTenancy("Tenant-ID")` workaround seen in older applications can be removed.
|
|
@@ -45,6 +45,17 @@ import { Dialog } from '@cratis/components/Dialogs';
|
|
|
45
45
|
import { DialogProps, DialogResult, useDialog } from '@cratis/arc.react/dialogs';
|
|
46
46
|
```
|
|
47
47
|
|
|
48
|
+
## Guid command fields
|
|
49
|
+
|
|
50
|
+
Requires Components 4.31.0 and matching Arc/Arc React 22.19.1 for GuidField invalid-draft execution blocking; check `yarn why @cratis/components` and `yarn why @cratis/arc.react`, or keep a host-validated field.
|
|
51
|
+
|
|
52
|
+
Opt into `GuidField` from `@cratis/components/CommandForm`. It binds native
|
|
53
|
+
Fundamentals `Guid` values, accepts partial text drafts and never generates an
|
|
54
|
+
identifier. Register it once through `registerFieldTypeProvider` for
|
|
55
|
+
`AutoCommandForm`; it is not a built-in provider. Invalid drafts clear the bound
|
|
56
|
+
value. Preserve host-set errors and use `resetKey` to discard an unchanged empty
|
|
57
|
+
value's draft.
|
|
58
|
+
|
|
48
59
|
## Initial focus
|
|
49
60
|
|
|
50
61
|
`DialogInitialFocus.Confirm` is the default and arms the confirm button, so a destructive dialog uses `DialogInitialFocus.Cancel`. Read [dialogs.md](references/dialogs.md) for the three options.
|
|
@@ -183,6 +183,21 @@ when omission is invalid for the selected query.
|
|
|
183
183
|
|
|
184
184
|
### `ConceptValidator<TConcept>`
|
|
185
185
|
|
|
186
|
+
Requires Arc.Kotlin 7.8.0 for shared Fundamentals concepts and their validators; check `./gradlew dependencies`, or retain the legacy Arc concepts and validators until upgrading.
|
|
187
|
+
|
|
188
|
+
Prefer `io.cratis.fundamentals.concepts.ConceptAs` for new concepts and
|
|
189
|
+
`FundamentalsConceptValidator<TConcept>` for their rules. It implements
|
|
190
|
+
`ModelValidator<TConcept>` and exposes `conceptType` plus
|
|
191
|
+
`validate(concept): List<ValidationResult>`; read the primitive via `value()`.
|
|
192
|
+
JSON, validation, proxy generation, Spring conversion, Chronicle bridging and
|
|
193
|
+
testing recognize the shared concept type. The old Arc `ConceptAs` extends it
|
|
194
|
+
and is deprecated, as is `ArcCamelCase` (use Fundamentals `toCamelCase`).
|
|
195
|
+
Existing Arc concepts/validators keep compiling and linking unchanged.
|
|
196
|
+
|
|
197
|
+
The legacy Arc concept example below remains valid with `ConceptValidator` and
|
|
198
|
+
its `value` property; do not copy that property shape to a new Fundamentals-only
|
|
199
|
+
concept, whose interface method is `value()`.
|
|
200
|
+
|
|
186
201
|
A reusable invariant on a `ConceptAs<T>` concept type, walked automatically
|
|
187
202
|
wherever that concept type appears — command, nested model, collection,
|
|
188
203
|
array, or map — without each owner repeating the rule. Matching uses
|
|
@@ -206,9 +221,11 @@ Jakarta `Validator` bean. Exclude one direct edge deliberately with
|
|
|
206
221
|
Java record component/field) whose *declared* type implements `ConceptAs`. A
|
|
207
222
|
scalar root, a collection element, or a nested path cannot be excluded this
|
|
208
223
|
way — register the nested owner type and its direct member instead. Excluding
|
|
209
|
-
an edge suppresses
|
|
210
|
-
`
|
|
211
|
-
run.
|
|
224
|
+
an edge suppresses concept-rule execution there, including
|
|
225
|
+
`FundamentalsConceptValidator`; owner rules, exact `ModelValidator` rules,
|
|
226
|
+
Jakarta constraints, and root typed validators still run.
|
|
227
|
+
|
|
228
|
+
Requires Arc.Kotlin 7.8.1 for exclusions to suppress FundamentalsConceptValidator; check `./gradlew dependencies`, or upgrade before relying on a shared-concept exclusion.
|
|
212
229
|
|
|
213
230
|
### `ModelValidator<T>`
|
|
214
231
|
|
|
@@ -103,6 +103,12 @@ channel exists return `{:error, :not_connected}`.
|
|
|
103
103
|
|
|
104
104
|
## Authentication and TLS
|
|
105
105
|
|
|
106
|
+
Requires Chronicle.Elixir 3.14.1 for client crash-report redaction; check `mix deps`, or treat older crash reports as potentially secret-bearing and upgrade before sharing them.
|
|
107
|
+
|
|
108
|
+
The client Logger filter redacts authentication secrets and gRPC/Mint request-header
|
|
109
|
+
state from crash reports; no application-level filter is needed for those client
|
|
110
|
+
reports. This does not authorize logging credentials in your own code.
|
|
111
|
+
|
|
106
112
|
Use `ConnectionString.development()` locally: `default()` supplies **no
|
|
107
113
|
credentials**, so an authentication-required development kernel never lets it
|
|
108
114
|
reach `:registered`. Production uses URL userinfo `client-id:secret@host` or
|
|
@@ -196,6 +202,12 @@ failure.
|
|
|
196
202
|
|
|
197
203
|
### Reactors
|
|
198
204
|
|
|
205
|
+
Requires Chronicle.Elixir 3.14.0, contracts 19.70 and kernel 19.70.0 for start_at_tail; check `mix deps` and the server version, or retain initial catch-up until upgraded.
|
|
206
|
+
|
|
207
|
+
`use Chronicle.Reactors.Reactor, start_at_tail: true` skips history only on first
|
|
208
|
+
registration; an existing reactor keeps its position. `once_only` does not skip
|
|
209
|
+
initial catch-up. An older server ignores the flag and catches up from the beginning.
|
|
210
|
+
|
|
199
211
|
Read [references/reactor-example.md](references/reactor-example.md) when you need a worked reactor module.
|
|
200
212
|
|
|
201
213
|
- **`@handles` is an accumulating module attribute** declaring the subscription;
|
|
@@ -3,6 +3,16 @@
|
|
|
3
3
|
|
|
4
4
|
# Decision reads and the dynamic consistency boundary
|
|
5
5
|
|
|
6
|
+
Requires Chronicle.Elixir 3.14.2 for the rejection/cleanup behavior below; check `mix deps`, or upgrade before relying on a rejected callback to discard buffered events.
|
|
7
|
+
|
|
8
|
+
A `Chronicle.decide/2` callback returning `{:error, reason}` rejects all buffered
|
|
9
|
+
appends and returns that tuple unchanged.
|
|
10
|
+
Migrate matches on `{:ok, {:error, _}}` to `{:error, _}`. A failed commit rolls
|
|
11
|
+
back the unit of work, and both `decide/2` and `with_unit_of_work/2` stop their
|
|
12
|
+
unit-of-work process on return, so later appends from long-lived GenServers or
|
|
13
|
+
Phoenix connections are not trapped in a failed buffer. Spec the rejection and
|
|
14
|
+
failed-commit paths, not only successful decisions.
|
|
15
|
+
|
|
6
16
|
Source: `Cratis/Chronicle.Elixir`: `Source/chronicle/lib/chronicle/read_models/decision_reads.ex`, `decision_read_refused.ex`, `decision_conflict.ex`, `transactions/unit_of_work.ex`, and `Documentation/dynamic-consistency-boundary.md`.
|
|
7
17
|
|
|
8
18
|
Requires `cratis_chronicle` 3.13.0.
|
|
@@ -128,7 +128,15 @@ identity. `delivery.ID()` can key an external idempotency record; it is not an
|
|
|
128
128
|
exactly-once guarantee. Return supported follow-up events rather than manually
|
|
129
129
|
recreating effect dispatch; use projections for materialization, reactors for effects.
|
|
130
130
|
|
|
131
|
-
`
|
|
131
|
+
Requires Chronicle.Go 0.11.0 and kernel 19.70.0 for StartAtTail; check `go list -m github.com/Cratis/Chronicle.Go` and the server version, or retain catch-up behavior until both are upgraded.
|
|
132
|
+
|
|
133
|
+
Opt into `reactors.StartAtTail()` for a new side-effect reactor that must skip
|
|
134
|
+
history. It only changes first registration: existing positions are retained and
|
|
135
|
+
explicit replay still starts at the beginning. Older kernels ignore this option
|
|
136
|
+
and catch up history. `observation.Service.FastForward` and `FastForwardResult`
|
|
137
|
+
move an observer to the tail; this deliberate administrative skip is not recovery.
|
|
138
|
+
|
|
139
|
+
`reactors.OnceOnly()` excludes replay; it does **not** deduplicate failed-partition
|
|
132
140
|
recovery. Effects may repeat after errors, cleanup failures or reconnect. Keep them
|
|
133
141
|
idempotent. The kernel owns recovery/quarantine and progress; do not invent resume
|
|
134
142
|
positions or acknowledge before successful processing and cleanup. Read the
|
|
@@ -137,7 +145,9 @@ for exact effect, replay and registration-readiness limits.
|
|
|
137
145
|
|
|
138
146
|
## Unsupported does not mean success
|
|
139
147
|
|
|
140
|
-
Requires Chronicle kernel 19.
|
|
148
|
+
Requires Chronicle kernel 19.70.0 for the current Go decision-guard profile; check the server version or postpone the client upgrade.
|
|
149
|
+
|
|
150
|
+
Decision guards include compatibility preflight;
|
|
141
151
|
unsupported kernels return `ErrUnsupported`. Protected operations have their own
|
|
142
152
|
kernel capability gates; the client supports qualified protected revisions and
|
|
143
153
|
classified read-model replay routes, not every protected watch/profile.
|
|
@@ -11,6 +11,10 @@ ordinary JVM application that happens to talk to a Chronicle server over gRPC.
|
|
|
11
11
|
There is no framework to inherit from and no application architecture imposed:
|
|
12
12
|
you construct a client, ask it for an event store, and append or observe.
|
|
13
13
|
|
|
14
|
+
For Chronicle.Kotlin 7.x, first read the
|
|
15
|
+
[Fundamentals migration and upgrade notes](references/fundamentals-migration.md):
|
|
16
|
+
`ConceptAs.value()` and the shared correlation type are breaking changes.
|
|
17
|
+
|
|
14
18
|
## Verified product sources
|
|
15
19
|
|
|
16
20
|
Source: `Cratis/Chronicle.Kotlin`, by source symbols and signatures.
|
package/package/corpus/skills/cratis-chronicle-client-kotlin/references/annotations-and-handlers.md
CHANGED
|
@@ -13,7 +13,12 @@ This reference holds the observer annotations, their arguments, filtering annota
|
|
|
13
13
|
| `@Constraint` | `id = ""` | `constraints/Constraint.kt` |
|
|
14
14
|
| `@Seeder` | none | `seeding/Seeder.kt` |
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
Requires Chronicle.Kotlin 6.15.0 and kernel 19.70.0 for StartAtTail; check Gradle dependencies and the server version, or retain initial catch-up.
|
|
17
|
+
|
|
18
|
+
`@StartAtTail` on a reactor class skips initial history only. Existing positions
|
|
19
|
+
are unchanged.
|
|
20
|
+
`@OnceOnly` targets both classes and functions: it skips replay, not initial
|
|
21
|
+
catch-up or redelivery. Handler-level replay override: `@Replay`. Observer filtering: `@Tag`/`@Tags`,
|
|
17
22
|
`@FilterEventsByTag`/`@FilterEventsByTags`, `@EventSequence`,
|
|
18
23
|
`@EventSourceType`, `@EventStreamType`.
|
|
19
24
|
|
package/package/corpus/skills/cratis-chronicle-client-kotlin/references/fundamentals-migration.md
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
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
|
+
# Shared concepts, correlation and observer upgrades
|
|
5
|
+
|
|
6
|
+
## Shared concepts and correlation
|
|
7
|
+
|
|
8
|
+
Requires Chronicle.Kotlin 7.0.0 for the shared concept and correlation type migration below; check Gradle dependencies, or retain the earlier client API until deliberately migrating and recompiling.
|
|
9
|
+
|
|
10
|
+
Import `ConceptAs` from `io.cratis.fundamentals.concepts` and implement `value()`,
|
|
11
|
+
not a property/getter. Java record accessors satisfy this interface directly.
|
|
12
|
+
Import `CorrelationId` from `io.cratis.fundamentals.execution`, use `NOT_SET` and
|
|
13
|
+
`value()`, and recompile consumers. The old Chronicle names are warning-level
|
|
14
|
+
Kotlin typealiases for this major version, not a permanent alternative API.
|
|
15
|
+
Typed source-id overloads consume Fundamentals concepts. Follow the product's
|
|
16
|
+
[migration guide](https://github.com/Cratis/Chronicle.Kotlin/blob/main/Documentation/guides/migrate-to-fundamentals.md).
|
|
17
|
+
|
|
18
|
+
Requires Chronicle.Kotlin 7.1.0 and Fundamentals 0.6.0 for shared ambient correlation context; check Gradle dependencies, or pass correlation explicitly instead of relying on shared ambient state.
|
|
19
|
+
|
|
20
|
+
The module-level `correlationIdManager` delegates to Fundamentals' shared
|
|
21
|
+
`CorrelationIdContext`. Its own API still takes/returns UUIDs; separately
|
|
22
|
+
constructed managers remain independent. State is thread-bound, not
|
|
23
|
+
coroutine-bound: pass correlation explicitly for suspending/thread-hopping work
|
|
24
|
+
and clear ambient context at the boundary. Never assume a pooled thread is a
|
|
25
|
+
request or tenant scope.
|
|
26
|
+
|
|
27
|
+
Event/read-model enum values are written as ordinal numbers to match their
|
|
28
|
+
schemas. Stored names remain readable; undefined ordinals, including numeric
|
|
29
|
+
strings, are rejected. Do not rearrange persisted enum ordinals casually.
|
|
30
|
+
|
|
31
|
+
## Observer and transport upgrades
|
|
32
|
+
|
|
33
|
+
Requires contracts and kernel 19.70.0 for StartAtTail; check the server version, or retain initial catch-up until it is upgraded.
|
|
34
|
+
|
|
35
|
+
`@StartAtTail` applies to reactor classes in Kotlin and Java. It skips history
|
|
36
|
+
only on first registration; existing positions remain. `@OnceOnly` excludes
|
|
37
|
+
replay, not initial catch-up or redelivery. Older servers ignore the tail flag.
|
|
38
|
+
|
|
39
|
+
Requires Chronicle.Kotlin 6.14.0 and kernel 19.56.0 for fastForward; check Gradle dependencies and the server version, or do not offer this administrative operation.
|
|
40
|
+
|
|
41
|
+
`store.observers.fastForward(...)` accepts an identifier or reactor/reducer class
|
|
42
|
+
and returns `FastForwardResult`, with a Java bridge. It deliberately skips work;
|
|
43
|
+
it is not recovery or deduplication.
|
|
44
|
+
|
|
45
|
+
`ChronicleOptions.maxReceiveMessageSize` and `withMaxReceiveMessageSize()` default
|
|
46
|
+
to 100 MB; `null` retains grpc-java's own default. The constructor and `copy()`
|
|
47
|
+
have a trailing parameter; earlier constructor overloads remain. Recompile affected
|
|
48
|
+
calls rather than treating transport capacity as a query bound.
|
|
@@ -186,6 +186,24 @@ before enrollment.
|
|
|
186
186
|
|
|
187
187
|
## Observing
|
|
188
188
|
|
|
189
|
+
Requires Chronicle.TypeScript 6.53.0 and kernel 19.70.0 for startAtTail; check `yarn why @cratis/chronicle` and the server version, or retain catch-up until both are upgraded.
|
|
190
|
+
|
|
191
|
+
`@startAtTail()` skips history only on first registration; existing positions
|
|
192
|
+
stay intact. `@onceOnly()` does not skip initial catch-up. Older servers ignore
|
|
193
|
+
the new flag.
|
|
194
|
+
|
|
195
|
+
Requires Chronicle.TypeScript 6.52.0 and kernel 19.56.0 for fastForward; check the client/server versions, or do not offer the operation.
|
|
196
|
+
|
|
197
|
+
`observers.fastForward(observerId)` returns `FastForwardResult`; it deliberately
|
|
198
|
+
skips to the tail, not a retry mechanism.
|
|
199
|
+
|
|
200
|
+
Requires Chronicle.TypeScript 6.53.1, kernel 19.78.1 and Fundamentals 7.24.1 for the child/default-value behavior below; check installed packages and server version, or upgrade before relying on it.
|
|
201
|
+
|
|
202
|
+
Child/nested `@fromAllEvents` and `@fromEvery` keep root-only mappings off new
|
|
203
|
+
children. Replay affected projections to rebuild already-materialized child
|
|
204
|
+
values. Unset read-model fields retain their class defaults; absent arrays stay
|
|
205
|
+
empty.
|
|
206
|
+
|
|
189
207
|
### Handlers use camelCase names or `@handles(EventType)`
|
|
190
208
|
|
|
191
209
|
The default is the camelCase event class name, **not** parameter-type dispatch.
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Connection lifecycle
|
|
2
2
|
|
|
3
|
+
Requires Chronicle.TypeScript 6.51.1 for message-size options; check `yarn why @cratis/chronicle`, or keep gRPC defaults until upgrading.
|
|
4
|
+
|
|
5
|
+
`ChronicleOptions` and its factory methods accept `maxReceiveMessageSize` and
|
|
6
|
+
`maxSendMessageSize`. Both default to 100 MB; pass `null` to keep gRPC's own
|
|
7
|
+
default. Check payload bounds before increasing limits; a transport allowance is
|
|
8
|
+
not an unbounded-query policy.
|
|
9
|
+
|
|
3
10
|
This reference holds the watchdog, reconnect, keepalive, compatibility check and telemetry behavior.
|
|
4
11
|
|
|
5
12
|
## Lifecycle
|
|
@@ -20,6 +20,17 @@ All claims and prop shapes are from **Cratis/Components** source rather than unc
|
|
|
20
20
|
|
|
21
21
|
Imports are exported by `Source/Common/index.ts`; `Source/package.json` exposes the `Common` subpath. Use **cratis-components-styling** for the provider and CSS setup and **cratis-components-accessibility** for naming/focus. These controls do not replace Arc's generated `InputTextField`/other command fields; use **cratis-arc-react-page** for those bindings.
|
|
22
22
|
|
|
23
|
+
Requires Components 4.38.0 for provider routing and forwarded non-modal calendar fields; check `yarn why @cratis/components`, or retain host navigation and modal dates.
|
|
24
|
+
|
|
25
|
+
Set `CratisComponentsProvider.router` with `navigate` and optional `useHref` to
|
|
26
|
+
integrate `Breadcrumbs` and other link components with the app router. Plain
|
|
27
|
+
clicks navigate client-side; modifier and middle clicks retain native behavior.
|
|
28
|
+
Do not intercept every click in a host `onNavigate`.
|
|
29
|
+
|
|
30
|
+
`DatePickerInput.isNonModal` defaults to `false`; opting in lets an outside click
|
|
31
|
+
both close the calendar and reach the clicked control. The command form's
|
|
32
|
+
`CalendarField` forwards the same prop.
|
|
33
|
+
|
|
23
34
|
## Choose the semantic control first
|
|
24
35
|
|
|
25
36
|
| Need | Control | Controlled contract |
|
|
@@ -132,6 +132,11 @@ Camera/controls contract (`Canvas.tsx`, `CanvasHandle.ts`):
|
|
|
132
132
|
|
|
133
133
|
Persist item edits in the host, not in camera callbacks. Browser-test gestures and dimensions. For jsdom tests provide a `ResizeObserver` substitute where required; Pixi integration still needs a real browser signal.
|
|
134
134
|
|
|
135
|
+
For bound-table server filtering, query-state isolation, refreshed selection and
|
|
136
|
+
localized numbered pagination, read
|
|
137
|
+
[Query table updates](references/query-table-updates.md). Page-local filtering is
|
|
138
|
+
still the default; `serverQuery` is opt-in.
|
|
139
|
+
|
|
135
140
|
## 4. Public Chat: bind the host's messages and outcomes
|
|
136
141
|
|
|
137
142
|
The public `@cratis/components/Chat` exports **`ChatConversation`**, **`ChatSidebar`**, **`ChatSidebarForObservableQueries`**, **`ChatTopicList`** and their types. It does **not** export the Kit `Chat` component or expose a `Chat/Kit` package subpath (`Source/Chat/index.ts`, `Source/package.json`). **`Chat` is exported through `@cratis/components/Canvas`** via the Kit barrel (`Source/Canvas/index.ts`, `Source/Chat/Kit/index.ts`). Prefer the non-spatial Chat subpath for ordinary host-data conversations; importing Canvas brings its Pixi edge.
|
package/package/corpus/skills/cratis-components-data-surfaces/references/query-table-updates.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
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
|
+
# Query tables: server state, selection and pagination
|
|
5
|
+
|
|
6
|
+
Requires Components 4.35.1 for all table features described here, including serverQuery, filteredEmptyMessage, pageLinks and refreshed selection; check `yarn why @cratis/components`, or retain the older table API and host-owned filtering, pagination and selection reconciliation.
|
|
7
|
+
|
|
8
|
+
## Server sorting and filtering are opt-in
|
|
9
|
+
|
|
10
|
+
`DataTableForQuery`, `DataTableForObservableQuery` and `DataPage` accept
|
|
11
|
+
`serverQuery`. Without it, sorting and filtering affect only the
|
|
12
|
+
loaded page, not the complete result set.
|
|
13
|
+
|
|
14
|
+
- Supply `toArguments` to translate search text and column filters to query
|
|
15
|
+
arguments. The backend must apply those arguments itself.
|
|
16
|
+
- Sorting uses Arc `sortBy`/`sortDirection`; `sortFields` maps column names to
|
|
17
|
+
server fields when necessary.
|
|
18
|
+
- Return `IQueryable` or use MongoDB `Observe` so sorting precedes paging.
|
|
19
|
+
- State changes return to page one; search is debounced by 300 ms by default.
|
|
20
|
+
Rows are rendered as the server returns them, not filtered a second time.
|
|
21
|
+
|
|
22
|
+
Do not present a page-local search as a complete-dataset search.
|
|
23
|
+
`filteredEmptyMessage` replaces `emptyMessage` when a search/filter has no rows.
|
|
24
|
+
Provider messages distinguish `filteredEmpty` (this page) from
|
|
25
|
+
`filteredEmptyServer` (server result). `onGlobalFilterChange` reports search text
|
|
26
|
+
as the user types; it does not implement backend search.
|
|
27
|
+
|
|
28
|
+
## Query state and selection
|
|
29
|
+
|
|
30
|
+
With Arc and Arc React 22.122 or later, changing bound query arguments shows
|
|
31
|
+
loading instead of the previous arguments' rows, failure or access-denied state.
|
|
32
|
+
Returning to cached arguments avoids a loading flash. A completed
|
|
33
|
+
unsuccessful result is a failure, not an empty success; unauthorized stays access
|
|
34
|
+
denied. The query-bound chat sidebar also distinguishes these outcomes.
|
|
35
|
+
|
|
36
|
+
Bound tables and `DataPage` reconcile selection against refreshed
|
|
37
|
+
rows by `dataKey`, clearing it when the selected row disappears. A controlled
|
|
38
|
+
selection is reported through `onSelectionChange`, never forcibly overridden.
|
|
39
|
+
Use stable keys and exercise argument changes and removed selections in specs.
|
|
40
|
+
|
|
41
|
+
## Pagination and localization
|
|
42
|
+
|
|
43
|
+
`pageLinks` is off by default. Set it to `true` or `{ siblings, boundaries }` on
|
|
44
|
+
`TablePaginator`, a bound table or `DataPage` for numbered links with ellipses.
|
|
45
|
+
The current button has `aria-current="page"`; the old page-count info is hidden.
|
|
46
|
+
The `pages`, `page`, `ellipsis` parts support styling; `page(n)` and `pages`
|
|
47
|
+
messages name the controls. Provider paginator messages or
|
|
48
|
+
`ariaLabels.range(start, end, total)` localize the range text too.
|
|
49
|
+
|
|
50
|
+
For a custom pager, `paginatorPages` and `PaginatorPageItem` export the same
|
|
51
|
+
windowing logic. Do not hard-code English accessible names in a localized host.
|
|
@@ -36,6 +36,7 @@ the controlled host applies and reports its own changes.
|
|
|
36
36
|
| --- | --- |
|
|
37
37
|
| `concepts: PropertyConcept[]` | Named types with a `PropertyType`; saved as `x-concept`. Overrides a surrounding `PropertyConceptsProvider` |
|
|
38
38
|
| `allowRequired` | Toggle membership in the object's `required` names |
|
|
39
|
+
| `allowGeneratedProperty` | Boolean or per-property predicate; offers the `x-generated` toggle |
|
|
39
40
|
| `allowKeyProperty` | Boolean or `(property, context) => boolean`; `x-key`, one per object |
|
|
40
41
|
| `isPropertyProtected` | Prevent rename/removal, not every possible edit |
|
|
41
42
|
| `validatePropertyName` | `(name, property, siblings) => string \| undefined`, after built-in checks |
|
|
@@ -60,3 +61,20 @@ The subpath exports `PropertyType`, `PropertyConceptsProvider`,
|
|
|
60
61
|
Use the typed property-tree helpers for a controlled host, rather than treating
|
|
61
62
|
`required` as a property boolean. Schema keywords are `x-concept`, `x-key`, and
|
|
62
63
|
the parent object's `required: string[]`.
|
|
64
|
+
|
|
65
|
+
Requires Components 4.35.0 for generated-property preservation, schema keyword bags and unique identifiers; check `yarn why @cratis/components`, or retain the older tree contract.
|
|
66
|
+
|
|
67
|
+
Controlled hosts handle `onSetGeneratedProperty` and carry
|
|
68
|
+
`Property.isGenerated`, `vendorKeywords` and `itemVendorKeywords`; the exported
|
|
69
|
+
`GENERATED_KEYWORD` names `x-generated`. Without an offered toggle, including
|
|
70
|
+
read-only mode, generated properties show a marker styled through `generated`.
|
|
71
|
+
Also carry `schemaKeywords` and `itemSchemaKeywords` for unmodeled
|
|
72
|
+
standard JSON Schema keywords. Dropping these bags in a host loses constraints
|
|
73
|
+
and annotations even though the editor preserves them. Untouched properties now
|
|
74
|
+
round-trip their original shape and order; a type change drops only keywords
|
|
75
|
+
inapplicable to the new type (including old array-item annotations).
|
|
76
|
+
|
|
77
|
+
`PropertyType.UniqueIdentifier` writes a string with `format: uuid`
|
|
78
|
+
and reads either `uuid` or `guid`. Localize it with `typeUniqueIdentifier`.
|
|
79
|
+
`GlyphMenu` and `PropertyTypeGlyph` are exported for host-owned single-choice
|
|
80
|
+
type lists.
|
|
@@ -10,6 +10,17 @@ license: MIT
|
|
|
10
10
|
user moves with Previous and Next; Submit appears on the last step once every
|
|
11
11
|
field across every step is valid.
|
|
12
12
|
|
|
13
|
+
## Dialog dismissal and refusal
|
|
14
|
+
|
|
15
|
+
Requires Components 4.36.0 for independent dismissal controls; check `yarn why @cratis/components`, or use the older `dismissable` contract.
|
|
16
|
+
|
|
17
|
+
`Dialog` and `CommandDialog` accept independent `dismissOnOutsideClick`,
|
|
18
|
+
`closeOnEscape` and `showCloseButton`; each falls back to `dismissable`. Busy
|
|
19
|
+
dialogs cannot be dismissed. The busy confirm remains focusable as
|
|
20
|
+
`aria-disabled` and ignores duplicate activation; a refused confirm restores
|
|
21
|
+
focus and announces the provider's `refused` message. Do not replace it with a
|
|
22
|
+
disabled button that loses focus or close the dialog on validation refusal.
|
|
23
|
+
|
|
13
24
|
## Verified product sources
|
|
14
25
|
|
|
15
26
|
| Package | Verified from |
|
|
@@ -146,6 +146,19 @@ services.AddSingleton<IReportFormatters, ReportFormatters>();
|
|
|
146
146
|
Search for every remaining reference before deleting, so nothing else was
|
|
147
147
|
relying on a registration for a different reason.
|
|
148
148
|
|
|
149
|
+
## Reuse derived-type discovery
|
|
150
|
+
|
|
151
|
+
Requires Fundamentals and its generator 7.26.1 for per-universe caching plus nested-generic/experimental-type generator fixes; check `dotnet list package`, or keep the older construction path until upgrading.
|
|
152
|
+
|
|
153
|
+
Use `Cratis.Serialization.DerivedTypes.For(types)` when several service
|
|
154
|
+
collections share the same `ITypes` instance. It returns one shared `DerivedTypes`
|
|
155
|
+
per universe, held weakly; distinct universes stay isolated. Do not construct one
|
|
156
|
+
per scope or replace a host's explicit universe with `DerivedTypes.Instance`.
|
|
157
|
+
|
|
158
|
+
The generator omits nested open-generic types from referenced Cratis packages
|
|
159
|
+
and handles referenced `[Experimental]` diagnostic IDs. Upgrade the generator
|
|
160
|
+
rather than editing its output to bypass those build failures.
|
|
161
|
+
|
|
149
162
|
## What breaks
|
|
150
163
|
|
|
151
164
|
- **`[Singleton]` does not resolve.** The using directive is
|
|
@@ -111,6 +111,29 @@ Only when asked to fix a release that violates the contract:
|
|
|
111
111
|
only when the request covers closing issues; otherwise list the issues as a
|
|
112
112
|
proposal. Leave an issue open when the release only partly delivered it.
|
|
113
113
|
|
|
114
|
+
## Release-action batching and recovery
|
|
115
|
+
|
|
116
|
+
Requires release-action 1.5.1 for corrected pending-major hotfix handling; check the workflow's `uses` pin, or keep immediate releases on the older contract.
|
|
117
|
+
|
|
118
|
+
`release-window` defaults to `0` (one
|
|
119
|
+
release per PR); a positive minute window batches pending merges once the oldest
|
|
120
|
+
is old enough. The highest intent wins, notes merge by section with one combined
|
|
121
|
+
`## Summary`, and delivered `(#n)` issues still close. Reference definitions are
|
|
122
|
+
preserved; duplicate labels keep the first definition and warn. Missing intent
|
|
123
|
+
labels warn but are not permission to omit required PR labels.
|
|
124
|
+
|
|
125
|
+
`hotfix-labels` defaults to `hotfix` and bypasses the window. With a pending major,
|
|
126
|
+
only the merge run for the hotfix fails; scheduled/other merge runs warn and leave
|
|
127
|
+
the batch pending. A manual run without a version releases everything pending;
|
|
128
|
+
obtain the required human major confirmation first. Inspect `pull-requests` and
|
|
129
|
+
`reason` (`batched` or `nothing-pending`) rather than assuming every successful
|
|
130
|
+
run released. Never turn on batching just to clear a queue without authorization.
|
|
131
|
+
|
|
132
|
+
A release-creation 403 caused by workflow drift names the recovery:
|
|
133
|
+
dispatch the publish workflow from the current default branch with the PR's
|
|
134
|
+
release notes. Re-running the stale commit does not fix this. Other 403s keep
|
|
135
|
+
their original cause; do not treat every permission failure as workflow drift.
|
|
136
|
+
|
|
114
137
|
## Verify before handing over
|
|
115
138
|
|
|
116
139
|
1. Reconcile every version, affected range, capability and API against the
|
package/package/corpus/skills/cratis-screenplay-command-surface/references/protected-reads.md
CHANGED
|
@@ -117,8 +117,9 @@ which is one more reason to keep refused shapes out of read keys.
|
|
|
117
117
|
|
|
118
118
|
Decide records the unfiltered fact-log boundary, read key and handled event types.
|
|
119
119
|
A matching fact after that boundary makes commit return Conflict /
|
|
120
|
-
DecisionStateChanged with no command facts, including publications.
|
|
121
|
-
|
|
120
|
+
DecisionStateChanged with no command facts, including publications. Append constraints
|
|
121
|
+
are checked first: if the same candidate violates a constraint and a protected read,
|
|
122
|
+
the constraint rejection wins. Irrelevant facts do not conflict and remain in the committed world. Even a no-fact command is
|
|
122
123
|
checked. Race cases are evaluator vectors, not a new `.play` specification construct.
|
|
123
124
|
|
|
124
125
|
Specify present/absent state, rule refusal and denial. Assert no new facts and
|
package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/prologue-safety.md
CHANGED
|
@@ -151,6 +151,20 @@ Record in the evidence table: who ran which statements, when, and the verificati
|
|
|
151
151
|
summary.
|
|
152
152
|
|
|
153
153
|
## 5. Capture verification before interpreting
|
|
154
|
+
|
|
155
|
+
Requires Prologue 2.0.5 for the emission/image behavior below; check pinned package/image versions and `cratis --version` against its bundle, or upgrade before relying on it.
|
|
156
|
+
|
|
157
|
+
Upgrade older Extractor installations for the PKCS denial-of-service dependency
|
|
158
|
+
fixes. Extractor, Interpreter and Receiver images support linux/amd64 and
|
|
159
|
+
linux/arm64; Apple Silicon does not need a forced amd64 platform.
|
|
160
|
+
|
|
161
|
+
Heuristics-only interpretation retains each command's own correlated events
|
|
162
|
+
when routes merge, declares shared events once, treats insert-plus-update in one
|
|
163
|
+
transaction as creation, omits text-only `not empty` rules for required numbers
|
|
164
|
+
and declares/key-identifies referenced read models. Do not retain manual
|
|
165
|
+
workarounds for old emitter defects. These repairs do not prove intent or compile
|
|
166
|
+
the output for you: still run executable validation on the emitted model, not
|
|
167
|
+
only parsing, and record remaining diagnostics.
|
|
154
168
|
- Capture files exist for every enabled source.
|
|
155
169
|
- Commands per route match the scenario script; status-code mix matches expected rejections.
|
|
156
170
|
- Fraction of DB transactions correlated to a command (low: concurrency or jobs).
|
package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.245.0
|
|
@@ -44,6 +44,17 @@ Requires `Cratis.Arc.Testing` 22.67.0 for generated-value scenario pinning.
|
|
|
44
44
|
Check the owning product repository before claiming support for
|
|
45
45
|
another version. Never translate an assertion or helper name from memory.
|
|
46
46
|
|
|
47
|
+
Requires Specifications 4.4.0 for Given/When lifecycle aliases across framework packages; check `dotnet list package`, or keep Establish/Because on older packages.
|
|
48
|
+
|
|
49
|
+
`Given`/`When` are lifecycle aliases, but house style remains `Establish`/`Because`;
|
|
50
|
+
declaring both forms of a phase produces CRSPEC0009. Inherited phases execute
|
|
51
|
+
once and preserve the original exception; `ValueTask` is awaited. The native
|
|
52
|
+
runner remains experimental: CRSPEC0010 rejects `async void`, CRSPEC0011 warns
|
|
53
|
+
about trim/AOT-unsafe reflective lifecycle calls. Shared resources/leases, phase
|
|
54
|
+
timings, runtime defaults and parallel NUnit fixtures are opt-ins, not blanket
|
|
55
|
+
recommendations to parallelize a stateful suite. Read the product upgrade guide
|
|
56
|
+
before changing runner or package family.
|
|
57
|
+
|
|
47
58
|
## Route near misses
|
|
48
59
|
|
|
49
60
|
- The specification is TypeScript, React, or a view model: use
|
|
@@ -202,8 +213,9 @@ public class when_<behavior> : Specification
|
|
|
202
213
|
leave no blank line between `should_` methods.
|
|
203
214
|
- Fields are `private` in a concrete specification and `protected` in a `given/`
|
|
204
215
|
context, named `_camelCase`.
|
|
205
|
-
- Any phase may
|
|
206
|
-
once per eligible class by default
|
|
216
|
+
- Any phase may return `Task` or `ValueTask`; both are awaited. Never use `async void`.
|
|
217
|
+
`void Destroy()` is optional teardown, once per eligible class by default
|
|
218
|
+
(shared lifecycle); after each fact in a
|
|
207
219
|
`[PerFactSpecificationLifecycle]` class.
|
|
208
220
|
|
|
209
221
|
`Cratis.Specifications.XUnit.v3` discovers `Establish`, `Because`, and `Destroy` by
|
|
@@ -82,7 +82,14 @@ and record the spec count and outcomes first.
|
|
|
82
82
|
Specifications.
|
|
83
83
|
5. Fix each `CRSPEC0008` error by moving the change into `Establish` or `Because`; use
|
|
84
84
|
`[PerFactSpecificationLifecycle]` only when the fact genuinely needs a fresh instance.
|
|
85
|
-
6.
|
|
85
|
+
6. Change assertion delegates typed as `Predicate<T>` to `Func<T, bool>`; for
|
|
86
|
+
NUnit 4 comparisons that relied on unordered `ShouldEqual(params)`, use
|
|
87
|
+
`ShouldEqualInAnyOrder`. Null actual values now fail, including nullable
|
|
88
|
+
`ShouldNotContain` strings. Assertions live in core with forwarded types;
|
|
89
|
+
rebuild with warnings as errors and fix new nullable warnings. Delete
|
|
90
|
+
`CratisSpecificationsWarnOnSharedContextMutation` (it has no effect in 5).
|
|
91
|
+
Native-runner `async void` facts/phases must return `Task` or `ValueTask`
|
|
92
|
+
instead (CRSPEC0010 is an error).
|
|
86
93
|
7. Run the executable and require the same total, the same passed count and the same
|
|
87
94
|
classes and methods as the baseline (display names may become more readable),
|
|
88
95
|
with no new skips. A different count means a spec was
|
|
@@ -32,18 +32,35 @@ implementations, custom fact test cases and plain xUnit classes keep the per-fac
|
|
|
32
32
|
|
|
33
33
|
Requires Cratis.Specifications 4.4.0 or later for `IDisposable` specifications to share
|
|
34
34
|
the lifecycle; earlier versions use per-fact construction. With shared lifecycle enabled,
|
|
35
|
-
construction happens once and `
|
|
35
|
+
construction happens once, and `Destroy` runs followed by
|
|
36
|
+
one `Dispose` after the last fact, even when `Destroy` fails. Class/collection fixtures remain owned by xUnit,
|
|
37
|
+
with assembly fixtures also supported on v3. Use
|
|
36
38
|
`[PerFactSpecificationLifecycle]` when a fresh instance per fact is needed.
|
|
37
39
|
|
|
38
40
|
`Specification.InitializeAsync()` is idempotent for a single instance. It does not make
|
|
39
41
|
an ineligible class shared or cache instances across classes.
|
|
40
42
|
|
|
43
|
+
## Native runner teardown outcomes
|
|
44
|
+
|
|
45
|
+
Requires Cratis.Specifications.Runner 5.0.3 for separate class teardown results; check `dotnet list package`, or expect the older runner to mark every fact failed after teardown fails.
|
|
46
|
+
|
|
47
|
+
A failing `Destroy`, disposal or scope end produces one separate failed result
|
|
48
|
+
for the specification class and fails the run. Completed facts keep their own
|
|
49
|
+
outcomes, as on xUnit/NUnit. Select the teardown result to rerun its class; passing
|
|
50
|
+
facts do not imply the class or run passed.
|
|
51
|
+
|
|
41
52
|
## CRSPEC0008
|
|
42
53
|
|
|
43
54
|
`CRSPEC0008` is an error by default: a `should_` fact that assigns to or increments an
|
|
44
55
|
instance field or property of the specification, or calls `Add`, `AddRange`, `Remove`,
|
|
45
56
|
`RemoveAt`, `Clear` or `Insert` on one, would make the result depend on fact order.
|
|
46
|
-
|
|
57
|
+
Requires Specifications 5.0.2 for Received.InOrder verification recognition; check `dotnet list package`, or upgrade before relying on this diagnostic exception.
|
|
58
|
+
|
|
59
|
+
Calls inside NSubstitute `Received.InOrder(...)` delegates are recognized as
|
|
60
|
+
verification, but assignments and increments there still mutate state and are
|
|
61
|
+
reported. Theories, per-fact classes/assemblies, immutable collection calls and
|
|
62
|
+
collection calls whose return value is used are excluded. Move actual mutations
|
|
63
|
+
into `Establish` or `Because`:
|
|
47
64
|
|
|
48
65
|
```csharp
|
|
49
66
|
public class when_registering : Specification
|