@cratis/pi 7.34.0 → 7.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/agents/security-reviewer.md +1 -0
- package/package/corpus/agents/spec-writer.md +1 -1
- package/package/corpus/harnesses/pi/extensions/shared/rules.ts +3 -1
- package/package/corpus/hooks/scripts/cratis-nuget-pins.txt +7 -6
- package/package/corpus/hooks/scripts/cratis-release-notes-reviewed.cjs +7 -6
- package/package/corpus/hooks/scripts/cratis-store-mutations.json +7 -3
- package/package/corpus/product-sync.json +896 -0
- package/package/corpus/prompts/add-business-rule.prompt.md +1 -1
- package/package/corpus/prompts/ship-changes.prompt.md +2 -2
- package/package/corpus/rules/ai-distribution.md +31 -3
- package/package/corpus/rules/application-profile.md +2 -1
- package/package/corpus/rules/components.md +66 -7
- package/package/corpus/rules/concepts.md +11 -3
- package/package/corpus/rules/csharp.md +3 -1
- package/package/corpus/rules/dialogs.md +9 -0
- package/package/corpus/rules/efcore.md +1 -1
- package/package/corpus/rules/elixir.md +49 -0
- package/package/corpus/rules/framework.md +5 -3
- package/package/corpus/rules/general.md +1 -0
- package/package/corpus/rules/glossary.md +4 -4
- package/package/corpus/rules/go-engineering.md +60 -0
- package/package/corpus/rules/go.md +115 -0
- package/package/corpus/rules/java.md +5 -2
- package/package/corpus/rules/kotlin.md +7 -5
- package/package/corpus/rules/orleans.md +65 -9
- package/package/corpus/rules/profiles.md +43 -6
- package/package/corpus/rules/pull-requests.md +3 -3
- package/package/corpus/rules/react.md +8 -1
- package/package/corpus/rules/reactors.md +27 -3
- package/package/corpus/rules/specs.csharp.md +11 -4
- package/package/corpus/rules/specs.scenarios.csharp.md +35 -4
- package/package/corpus/rules/specs.typescript.md +2 -1
- package/package/corpus/rules/storybook.md +1 -1
- package/package/corpus/rules/typescript.md +1 -1
- package/package/corpus/rules/vertical-slices.md +37 -5
- package/package/corpus/skills/cratis-application-react-specifications/SKILL.md +4 -2
- package/package/corpus/skills/cratis-application-slice-specifications/SKILL.md +18 -8
- package/package/corpus/skills/cratis-application-slice-specifications/references/query-and-decision-scenarios.md +65 -0
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/SKILL.md +53 -57
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authentication.md +38 -42
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authorization.md +18 -7
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/authproxy.md +30 -0
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/frontend.md +12 -9
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/local-development.md +9 -9
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/observable-emission-guards.md +8 -5
- package/package/corpus/skills/cratis-arc-authentication-authorization-and-identity/references/tenancy.md +20 -4
- package/package/corpus/skills/cratis-arc-command/SKILL.md +32 -10
- package/package/corpus/skills/cratis-arc-command/references/command-result.md +12 -5
- package/package/corpus/skills/cratis-arc-command/references/decisions-and-routing.md +95 -0
- package/package/corpus/skills/cratis-arc-command/references/generated-values.md +3 -2
- package/package/corpus/skills/cratis-arc-command/references/handler-shapes.md +8 -8
- package/package/corpus/skills/cratis-arc-command/references/proxy-generation.md +22 -3
- package/package/corpus/skills/cratis-arc-command/references/read-model-injection.md +13 -1
- package/package/corpus/skills/cratis-arc-command-execution/SKILL.md +19 -9
- package/package/corpus/skills/cratis-arc-command-kotlin/SKILL.md +44 -18
- package/package/corpus/skills/cratis-arc-command-kotlin/references/read-model-naming.md +29 -0
- package/package/corpus/skills/cratis-arc-command-operation/SKILL.md +10 -9
- package/package/corpus/skills/cratis-arc-command-operation/references/execution-and-recovery.md +2 -2
- package/package/corpus/skills/cratis-arc-command-operation/references/testing.md +4 -3
- package/package/corpus/skills/cratis-arc-command-typescript/SKILL.md +42 -22
- package/package/corpus/skills/cratis-arc-command-typescript/references/chronicle-events.md +36 -5
- package/package/corpus/skills/cratis-arc-command-typescript/references/command-operations.md +114 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/hosting-and-storage.md +37 -16
- package/package/corpus/skills/cratis-arc-command-typescript/references/identity-and-introspection.md +88 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/observability-and-host-scopes.md +25 -0
- package/package/corpus/skills/cratis-arc-command-typescript/references/proxy-generation.md +35 -4
- package/package/corpus/skills/cratis-arc-command-typescript/references/slice-layout.md +11 -0
- package/package/corpus/skills/cratis-arc-command-typescript/verification.json +8 -1
- package/package/corpus/skills/cratis-arc-command-validation/SKILL.md +49 -19
- package/package/corpus/skills/cratis-arc-ef-core-migration/SKILL.md +12 -6
- package/package/corpus/skills/cratis-arc-go/SKILL.md +148 -0
- package/package/corpus/skills/cratis-arc-go/references/queries.md +80 -0
- package/package/corpus/skills/cratis-arc-hosting/SKILL.md +96 -0
- package/package/corpus/skills/cratis-arc-hosting/references/integrations-and-publish.md +80 -0
- package/package/corpus/skills/cratis-arc-identity-and-tenancy-kotlin/SKILL.md +137 -0
- package/package/corpus/skills/cratis-arc-observable-query-http/SKILL.md +20 -2
- package/package/corpus/skills/cratis-arc-query-kotlin/SKILL.md +26 -6
- package/package/corpus/skills/cratis-arc-query-paging/SKILL.md +25 -20
- package/package/corpus/skills/cratis-arc-query-typescript/SKILL.md +32 -6
- package/package/corpus/skills/cratis-arc-query-typescript/references/storage-observation-and-compliance.md +66 -0
- package/package/corpus/skills/cratis-arc-query-typescript/verification.json +5 -1
- package/package/corpus/skills/cratis-arc-react-page/SKILL.md +24 -13
- package/package/corpus/skills/cratis-arc-react-page/references/data-page.md +20 -10
- package/package/corpus/skills/cratis-arc-react-page/references/data-tables.md +17 -3
- package/package/corpus/skills/cratis-arc-react-page/references/dialogs.md +14 -3
- package/package/corpus/skills/cratis-arc-react-page/references/from-screenplay.md +6 -1
- package/package/corpus/skills/cratis-arc-react-page/references/provenance.md +1 -1
- package/package/corpus/skills/cratis-arc-react-page/references/queries-and-commands.md +11 -1
- package/package/corpus/skills/cratis-arc-react-page/verification.json +6 -1
- package/package/corpus/skills/cratis-arc-spring-data-kotlin/SKILL.md +163 -0
- package/package/corpus/skills/cratis-arc-testing-kotlin/SKILL.md +131 -0
- package/package/corpus/skills/cratis-arc-validation-kotlin/SKILL.md +44 -11
- package/package/corpus/skills/cratis-arc-validation-typescript/SKILL.md +5 -3
- package/package/corpus/skills/cratis-chronicle-cli-operations/SKILL.md +79 -25
- package/package/corpus/skills/cratis-chronicle-cli-operations/references/command-effects.md +57 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/SKILL.md +87 -99
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/additional-surfaces.md +65 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/client-construction.md +42 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/compatibility-check.md +12 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/discovery.md +43 -19
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/hosting.md +29 -1
- package/package/corpus/skills/cratis-chronicle-client-elixir/SKILL.md +158 -162
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/append-api.md +36 -15
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/compliance.md +32 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/connections.md +56 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/event-sources.md +64 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/pitfalls.md +25 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/projections.md +48 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/upgrading.md +34 -0
- package/package/corpus/skills/cratis-chronicle-client-elixir/references/variants.md +13 -5
- package/package/corpus/skills/cratis-chronicle-client-elixir/verification.json +23 -0
- package/package/corpus/skills/cratis-chronicle-client-go/SKILL.md +162 -0
- package/package/corpus/skills/cratis-chronicle-client-go/references/projections.md +73 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/SKILL.md +87 -88
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/connection-lifecycle.md +13 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/discovery-and-registration.md +14 -4
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/event-sources.md +65 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/options.md +29 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/spring-boot.md +13 -0
- package/package/corpus/skills/cratis-chronicle-client-kotlin/references/variants.md +5 -4
- package/package/corpus/skills/cratis-chronicle-client-typescript/SKILL.md +165 -156
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/read-models-and-projections.md +54 -11
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/testing.md +126 -0
- package/package/corpus/skills/cratis-chronicle-client-typescript/references/variants.md +3 -5
- package/package/corpus/skills/cratis-chronicle-client-typescript/verification.json +19 -0
- package/package/corpus/skills/cratis-chronicle-compliance/SKILL.md +36 -13
- package/package/corpus/skills/cratis-chronicle-decision-reads/SKILL.md +110 -0
- package/package/corpus/skills/cratis-chronicle-decision-reads/references/admission-and-ownership.md +57 -0
- package/package/corpus/skills/cratis-chronicle-decision-reads/verification.json +12 -0
- package/package/corpus/skills/cratis-chronicle-event-constraints/SKILL.md +58 -19
- package/package/corpus/skills/cratis-chronicle-event-constraints/references/closing-streams.md +73 -0
- package/package/corpus/skills/cratis-chronicle-event-modeling/SKILL.md +32 -3
- package/package/corpus/skills/cratis-chronicle-event-specifications/SKILL.md +18 -5
- package/package/corpus/skills/cratis-chronicle-event-type-migration/SKILL.md +32 -2
- package/package/corpus/skills/cratis-chronicle-hosting/SKILL.md +134 -0
- package/package/corpus/skills/cratis-chronicle-hosting/references/operations.md +89 -0
- package/package/corpus/skills/cratis-chronicle-hosting/verification.json +14 -0
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/SKILL.md +93 -66
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/blocked-tools.md +21 -7
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/deployment.md +77 -0
- package/package/corpus/skills/cratis-chronicle-mcp-inspection/references/observational-tools.md +46 -4
- package/package/corpus/skills/cratis-chronicle-multi-tenancy/SKILL.md +15 -1
- package/package/corpus/skills/cratis-chronicle-projection/SKILL.md +44 -10
- package/package/corpus/skills/cratis-chronicle-projection/references/fluent-builder.md +7 -1
- package/package/corpus/skills/cratis-chronicle-projection/references/model-bound-attributes.md +8 -0
- package/package/corpus/skills/cratis-chronicle-reactor/SKILL.md +85 -105
- package/package/corpus/skills/cratis-chronicle-reactor/references/slice-delivery-checklist.md +1 -1
- package/package/corpus/skills/cratis-chronicle-reactor/references/specifications.md +20 -1
- package/package/corpus/skills/cratis-chronicle-read-model/SKILL.md +2 -2
- package/package/corpus/skills/cratis-chronicle-read-model/references/queries.md +35 -16
- package/package/corpus/skills/cratis-chronicle-read-model-specifications/SKILL.md +15 -3
- package/package/corpus/skills/cratis-chronicle-reducer/SKILL.md +23 -4
- package/package/corpus/skills/cratis-chronicle-web-workbench/SKILL.md +40 -15
- package/package/corpus/skills/cratis-cli-terminal-workbench/SKILL.md +20 -6
- package/package/corpus/skills/cratis-code-review/SKILL.md +25 -3
- package/package/corpus/skills/cratis-components-accessibility/SKILL.md +20 -4
- package/package/corpus/skills/cratis-components-schema-editor/SKILL.md +40 -28
- package/package/corpus/skills/cratis-components-schema-editor/references/tree-layout.md +62 -0
- package/package/corpus/skills/cratis-components-schema-editor/verification.json +14 -0
- package/package/corpus/skills/cratis-components-stepper-command-dialog/SKILL.md +16 -8
- package/package/corpus/skills/cratis-components-styling/SKILL.md +57 -20
- package/package/corpus/skills/cratis-components-styling/verification.json +13 -0
- package/package/corpus/skills/cratis-components-toolbar/SKILL.md +37 -7
- package/package/corpus/skills/cratis-components-toolbar/verification.json +12 -0
- package/package/corpus/skills/cratis-engineering-csharp-conventions/SKILL.md +6 -0
- package/package/corpus/skills/cratis-engineering-csharp-conventions/references/exceptions-logging-and-di.md +5 -3
- package/package/corpus/skills/cratis-fundamentals-concept/SKILL.md +19 -6
- package/package/corpus/skills/cratis-fundamentals-concept/references/typescript-concepts.md +97 -0
- package/package/corpus/skills/cratis-fundamentals-concept/verification.json +4 -1
- package/package/corpus/skills/cratis-fundamentals-concept-go/SKILL.md +112 -0
- package/package/corpus/skills/cratis-fundamentals-type-discovery/SKILL.md +54 -17
- package/package/corpus/skills/cratis-fundamentals-type-discovery/verification.json +14 -0
- package/package/corpus/skills/cratis-lens-browser-extension/SKILL.md +55 -28
- package/package/corpus/skills/cratis-performance-review/SKILL.md +5 -2
- package/package/corpus/skills/cratis-release-notes/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/SKILL.md +5 -4
- package/package/corpus/skills/cratis-screenplay-automations-and-translations/references/realization-and-gap-fill.md +1 -1
- package/package/corpus/skills/cratis-screenplay-captures-and-reactions/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +5 -6
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +25 -7
- package/package/corpus/skills/cratis-screenplay-command-surface/references/enum-numbers.md +4 -2
- package/package/corpus/skills/cratis-screenplay-command-surface/references/generated-values-and-responses.md +4 -1
- package/package/corpus/skills/cratis-screenplay-event-modeling/SKILL.md +4 -3
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/nine-steps.md +1 -1
- package/package/corpus/skills/cratis-screenplay-event-modeling/references/parsed-not-runnable.md +2 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +3 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +34 -4
- package/package/corpus/skills/cratis-screenplay-model-authoring/SKILL.md +5 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/language-reference.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +4 -2
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/property-links.md +42 -3
- package/package/corpus/skills/cratis-screenplay-model-authoring/verification.json +3 -1
- package/package/corpus/skills/cratis-screenplay-modeling-lifecycle/references/vocabulary-map.md +2 -2
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/SKILL.md +6 -6
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/drift-and-ledger.md +1 -1
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/gap-fill-handoff.md +6 -4
- package/package/corpus/skills/cratis-screenplay-render-and-gap-fill/references/renderability-gate.md +1 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/SKILL.md +3 -1
- package/package/corpus/skills/cratis-screenplay-scenario-coverage/references/invoicing-dues-design.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-slice-design/references/rule-layers.md +2 -2
- package/package/corpus/skills/cratis-screenplay-slice-design/references/worked-example.md +1 -1
- package/package/corpus/skills/cratis-screenplay-specifications/references/examples-and-routes.md +48 -0
- package/package/corpus/skills/cratis-screenplay-specifications/verification.json +3 -1
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/SKILL.md +7 -5
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/chronicle-boundaries.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/consistency-and-concurrency.md +2 -2
- package/package/corpus/skills/cratis-screenplay-streams-and-consistency/references/streams-example.md +5 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/SKILL.md +8 -6
- package/package/corpus/skills/cratis-screenplay-toolchain/references/cheat-sheet-example.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/diagnostics.md +4 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/doc-contradictions.md +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/executable-subset.md +16 -11
- package/package/corpus/skills/cratis-screenplay-toolchain/references/renderable-subset.md +8 -5
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +1329 -32
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package/corpus/skills/cratis-screenplay-toolchain/references/verdicts.md +2 -2
- package/package/corpus/skills/cratis-screenplay-toolchain/references/versions.md +23 -7
- package/package/corpus/skills/cratis-screenplay-toolchain/verification.json +1 -1
- package/package/corpus/skills/cratis-screenplay-ui-composition/SKILL.md +2 -0
- package/package/corpus/skills/cratis-screenplay-ui-composition/references/screen-composition-contract.md +27 -9
- package/package/corpus/skills/cratis-security-review/SKILL.md +9 -3
- package/package/corpus/skills/cratis-security-review/references/arc-boundaries.md +59 -0
- package/package/corpus/skills/cratis-specification-by-example/SKILL.md +7 -0
- package/package/corpus/skills/cratis-specifications-csharp/SKILL.md +43 -11
- package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md +16 -4
- package/package/corpus/skills/cratis-specifications-csharp/references/csharp-patterns.md +18 -5
- package/package/corpus/skills/cratis-specifications-csharp/references/integration-specs.md +21 -0
- package/package/corpus/skills/cratis-specifications-csharp/references/shared-lifecycle.md +34 -0
- package/package/corpus/skills/cratis-specifications-csharp/verification.json +13 -0
- package/package/corpus/skills/cratis-specifications-typescript/SKILL.md +14 -5
- package/package/corpus/skills/cratis-specifications-typescript/verification.json +12 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/SKILL.md +11 -5
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/admission.md +7 -4
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/rendered-application.md +10 -1
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/references/scene-runtime.md +75 -0
- package/package/corpus/skills/cratis-stage-rendering-and-sandbox/verification.json +6 -1
- package/package/corpus/skills/cratis-studio-mcp-safety-guidance/SKILL.md +14 -1
- package/package/profile-catalog.json +68 -1
- package/package.json +1 -1
- package/src/index.ts +3 -1
package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.141.0
|
|
@@ -53,7 +53,7 @@ V3 are read from the MCP server or from a render, V1 and V5 from the CLIs.
|
|
|
53
53
|
Needs an MCP connection (V2 and V3 belong to the session that owns MCP; a subagent without
|
|
54
54
|
MCP reports `V2 not run: no MCP in this agent` unless the brief supplies fresh output). Without
|
|
55
55
|
MCP, a binding check exists: `cratis screenplay validate --executable <root>` binds with the
|
|
56
|
-
**bundled** compiler (CLI 3.53.1 bundles Screenplay 4.137.0, not the standalone 4.
|
|
56
|
+
**bundled** compiler (CLI 3.53.1 bundles Screenplay 4.137.0, not the standalone 4.141.0), never
|
|
57
57
|
renders or writes files, and exits 5 with "The model does not bind into an executable semantic
|
|
58
58
|
model" when it does not. Report it as `V3 (bundled 4.137.0 via cratis validate --executable)`; it
|
|
59
59
|
gives binding errors, not the V2 `executable-diagnostics` view, so V2 stays MCP-only.
|
|
@@ -68,7 +68,7 @@ gives binding errors, not the V2 `executable-diagnostics` view, so V2 stays MCP-
|
|
|
68
68
|
source revision).
|
|
69
69
|
4. Report the codes with counts, blocking (error severity) apart from informational. A list
|
|
70
70
|
with blocking entries is a valid V2 result (`V2 read: 6 blocking, PLAY0268 x3 filter query,
|
|
71
|
-
|
|
71
|
+
enum compliance ...`); it is the evidence for a "V3 blocked" report. The view also lists
|
|
72
72
|
information-severity diagnostics (PLAY0269 deferred UI, PLAY0270 authoring metadata such as
|
|
73
73
|
descriptions, personas and screens) on models that bind; they do not block.
|
|
74
74
|
|
|
@@ -17,16 +17,23 @@ probe; older probes retain their original labels in the other references.
|
|
|
17
17
|
|
|
18
18
|
| Source | Pin | Evidence |
|
|
19
19
|
| --- | --- | --- |
|
|
20
|
-
| Screenplay language, standalone tool and MCP | **4.
|
|
20
|
+
| Screenplay language, standalone tool and MCP | **4.141.0** (`8ce785e3`) | Released tag `v4.141.0` and its unchanged published contract; concept compliance/ESM v13 and the property-change planner |
|
|
21
21
|
| cratis CLI | **3.53.1** | Released tag `v3.53.1`; source-checked, not a new render/browser probe |
|
|
22
22
|
| Screenplay bundled by CLI | **4.137.0** | CLI `v3.53.1:Directory.Packages.props`; enum-number authoring, not v12 binding |
|
|
23
23
|
| Stage bundled by CLI | **4.73.1** | Same file; Stage's own `Directory.Packages.props` also pins Screenplay 4.137.0 |
|
|
24
|
+
| Latest standalone Stage released when this was checked | **4.76.0** (Screenplay 4.139.0) | Released tag `v4.76.0`; no cli release bundles Stage 4.74.0 to 4.76.0, so a cli user observes none of it. It admits ESM v1 to v12 (v11 from 4.75.0, v12 from 4.76.0), renders UUID-concept generated values and responses (4.74.0) and explicit enum numbers (4.76.0). Its scaffold pins match 4.73.1 (Arc 22.68.0, Chronicle 19.45.0, frontend pins); `Directory.Packages.props` takes Scene 4.21.0 |
|
|
25
|
+
| Screenplay.Generation / CritterStack / Prologue bundled by CLI | **0.18.0 / 0.24.0 / 2.0.0** | CLI `v3.53.1:Directory.Packages.props`. Latest released: Generation 0.18.1, CritterStack 0.26.0, Prologue 2.0.0 (no release after 2.0.0); the newer Generation and CritterStack releases are not in a cli |
|
|
24
26
|
| Cratis.Arc.Screenplay bundled by CLI | **22.54.0** | Same file; this is the generator package, not a blanket rendered-app dependency pin |
|
|
25
27
|
| Chronicle / Fundamentals bundled by CLI | **19.32.0 / 7.22.8** | Same file |
|
|
26
|
-
| Latest Arc / Chronicle / Fundamentals released when this was checked | **22.
|
|
27
|
-
| Stage 4.73.1 rendered backend and frontend | **Arc 22.68.0 / Chronicle 19.45.0**;
|
|
28
|
+
| Latest Arc / Chronicle / Fundamentals released when this was checked | **22.76.0 / 19.51.0 / 7.23.0** | Released tags; newer than the CLI bundle and than Stage's scaffold. Arc 22.72.0 and later run a reactor returning events and commands (absent through 22.71.0); the Stage 4.73.1 scaffold pins Arc 22.68.0, whose command handler accepts a collection only when every element is a command, so a rendered app needs a proven dependency override to 22.72.0 or later |
|
|
29
|
+
| Stage 4.73.1 rendered backend and frontend | **Arc 22.68.0 / Chronicle 19.45.0**; `@cratis/components` 4.26.2, `@cratis/scene.*` 4.21.0, `@cratis/arc` 22.58.2, Fundamentals 7.22.8 | Stage `v4.73.1:Source/Rendering.Cratis/Scaffolding/CratisBackendApplicationScaffoldProfile.cs` and `CratisFrontendPackageSet.cs` (`Current`); not the latest releases and not bumped by hand |
|
|
28
30
|
| Historical Stage 4.51.3 rendered backend | **Arc 22.50.5 / Chronicle 19.32.0** | Stage `v4.51.3:Source/Rendering.Cratis/Scaffolding/CratisBackendApplicationScaffoldProfile.cs`; client/testing/image match; scaffold disables embedded reverse extraction |
|
|
29
31
|
|
|
32
|
+
Scene's family id denotes the six scaffold packages listed in
|
|
33
|
+
`cratis-stage-rendering-and-sandbox/references/rendered-application.md`, not a
|
|
34
|
+
package named `@cratis/scene`. The Components skills verify the latest 4.26.4
|
|
35
|
+
surface; that does not upgrade Stage's managed scaffold pin.
|
|
36
|
+
|
|
30
37
|
The published `screenplay-contract.json` beside this reference is the machine-readable authority for PLAY codes, MCP tools and parameters, and standalone CLI commands/options. Its unchanged release bytes are pinned by `screenplay-contract.version` to the standalone version above. Before adding a claim, search this large JSON file by exact `code` in `diagnostics`, or by exact `name` in `mcpTools`/`cliCommands`, and inspect that object's retirement flag, parameters or options; do not load the full file into context. For example, search for `"code": "PLAY0029"` or `"name": "read-workspace"`; `screenplay-contract-exceptions.json` preserves explicitly reasoned historical statements, not current-release exceptions. Coverage gaps are mention inventories, not proof that a skill teaches a feature.
|
|
31
38
|
|
|
32
39
|
Check the actual executable before relying on this table: `screenplay --version`,
|
|
@@ -46,7 +53,7 @@ or renderer probes below as results from the newer bundle.
|
|
|
46
53
|
|
|
47
54
|
## Two compilers, one rule
|
|
48
55
|
|
|
49
|
-
Standalone Screenplay 4.
|
|
56
|
+
Standalone Screenplay 4.141.0 and CLI 3.53.1's 4.137.0 bundle are different releases.
|
|
50
57
|
Prefer standalone for the current language checks; CLI owns generation, Prologue
|
|
51
58
|
and rendering. Name the tool/version with every verdict. No verdict transfers
|
|
52
59
|
between differing compilers without checking the same inputs there.
|
|
@@ -78,8 +85,8 @@ for identity-stable selection.
|
|
|
78
85
|
|
|
79
86
|
## Admission boundaries
|
|
80
87
|
|
|
81
|
-
Screenplay `v4.
|
|
82
|
-
schema pairs through
|
|
88
|
+
Screenplay `v4.141.0:Source/DotNET/Screenplay/Semantics/Versions.cs` supports
|
|
89
|
+
schema pairs through v13. Admission selects by use:
|
|
83
90
|
|
|
84
91
|
- v7: generated values/responses and policy negation.
|
|
85
92
|
- v8: sources/streams and command/specification routes.
|
|
@@ -110,6 +117,14 @@ schema pairs through v12. Admission selects by use:
|
|
|
110
117
|
with mismatched length, duplicates, non-int32 entries or positional numbers
|
|
111
118
|
(non-canonical). Consumers must admit v12 explicitly. Authoring shipped in
|
|
112
119
|
4.137.0 (decision 0065); syntax/example: command-surface `references/enum-numbers.md`.
|
|
120
|
+
- **Published v13 in 4.141.0:** concept `pii`/`secret`, personal qualifiers and
|
|
121
|
+
secret scopes bind as optional concept `compliance`. Unmarked models retain
|
|
122
|
+
their exact bytes/version/revision. Reference execution outcomes stay unchanged;
|
|
123
|
+
it proves no storage encryption or erasure. Enum/identity compliance and an
|
|
124
|
+
event combining personal or explicitly subject-scoped secret values with an
|
|
125
|
+
explicit `subject` mark refuse PLAY0268. See command-surface
|
|
126
|
+
`references/compliance.md` and Screenplay decision 0068. Stage 4.76.0 admits
|
|
127
|
+
only through v12; no current cli bundles this compiler or admits v13.
|
|
113
128
|
|
|
114
129
|
Decision 0066 freezes a version when any exposing NuGet/npm package is published,
|
|
115
130
|
including prereleases. Later byte-changing features take the next version at
|
|
@@ -157,7 +172,8 @@ The Stage skill teaches the version-gated examples.
|
|
|
157
172
|
|
|
158
173
|
At 4.127.0, `$identity` aliases built-in caller paths; declared identity details
|
|
159
174
|
remain metadata and their executable reads report PLAY0268. Bare `pii`/`secret`
|
|
160
|
-
|
|
175
|
+
bind as v13 on standalone 4.141.0, but still block binding on CLI 3.53.1's
|
|
176
|
+
4.137.0 bundle; `personal` aliases `pii`. Legacy markers are accepted with
|
|
161
177
|
PLAY0565 information, duplicates warn PLAY0653. Event `subject` and processing
|
|
162
178
|
purposes are report-only metadata (PLAY0270); purpose checks/reports do not prove
|
|
163
179
|
lawfulness or enforce retention. See command-surface context/compliance references.
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
{ "kind": "skill-contains", "value": "Composite read-model keys/query blocks are also still PLAY0268", "file": "references/versions.md" },
|
|
11
11
|
{ "kind": "skill-contains", "value": "the **whole source, stream and stream id**", "file": "references/production-routes-and-filters.md" },
|
|
12
12
|
{ "kind": "play-compiles" },
|
|
13
|
-
{ "kind": "skill-contains", "value": "4.
|
|
13
|
+
{ "kind": "skill-contains", "value": "4.141.0" },
|
|
14
14
|
{ "kind": "skill-contains", "value": "Published v12" },
|
|
15
15
|
{ "kind": "skill-contains", "value": "PLAY0671", "file": "references/diagnostics.md" },
|
|
16
16
|
{ "kind": "skill-contains", "value": "PLAY0653", "file": "references/diagnostics.md" },
|
|
@@ -35,6 +35,8 @@ Current pins: toolchain `references/versions.md`; UI statements were re-read at
|
|
|
35
35
|
(`screens.md`, `contributions.md`, `forms.md`, `templates.md`, `ui-profile.md`, `fixtures/screen-release-ui.play`). Older provenance:
|
|
36
36
|
`4.31.0` (original parser evidence), main `fd18129` (cancellation routing, `optional`), `4.66.0` (`c89198b`: `PLAY0269`).
|
|
37
37
|
|
|
38
|
+
Scene runtime sources: scaffold Scene tag, `Source/JavaScript/**`.
|
|
39
|
+
|
|
38
40
|
The update follows `commands.md`, `events.md`, `queries.md` and decision 0023
|
|
39
41
|
at that main commit (after v4.52.0). It does not verify UI rendering.
|
|
40
42
|
|
|
@@ -37,9 +37,10 @@ Keep those three lines separate in reports. Correct an old limitation only when
|
|
|
37
37
|
the package/version you are using proves the new level. Historical verified vector:
|
|
38
38
|
CLI 3.43.0 with its default `cratis/stage:4.52.0` and bundled Screenplay 4.127.0;
|
|
39
39
|
the executed vector renders on Scene 4.15.0. Packages published since are newer than
|
|
40
|
-
that vector and are not claimed verified
|
|
41
|
-
|
|
42
|
-
|
|
40
|
+
that vector and are not claimed browser-verified. Scene 4.17.0 was the earlier
|
|
41
|
+
source-checked runtime summary, not a new executed vector. Scene runtime capabilities
|
|
42
|
+
below were source-checked at the current scaffold's Scene tag; this does not
|
|
43
|
+
re-label the historical execution result. Current pins:
|
|
43
44
|
`cratis-screenplay-toolchain/references/versions.md`.
|
|
44
45
|
All three levels hold for the canonical `ScreenComposition` corpus on the historical vector:
|
|
45
46
|
|
|
@@ -238,11 +239,28 @@ when a single screen owns the button. A parameter that reads a selection is a ty
|
|
|
238
239
|
data-context path). A dialog destination must state every input with a typed `with`/`parameter`
|
|
239
240
|
binding; a runtime default is not an authored contract.
|
|
240
241
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
admission
|
|
244
|
-
release
|
|
245
|
-
|
|
242
|
+
Scene 4.21 runtime capabilities (source-checked at the Scene tag in the
|
|
243
|
+
scaffold pin table, not a browser run). Authoring acceptance, executable
|
|
244
|
+
admission and runtime support stay separate — a Scene release is not a Stage
|
|
245
|
+
release. Stage 4.73.1 pins that Scene release; never upgrade managed files by hand:
|
|
246
|
+
|
|
247
|
+
- **Hierarchy and routes.** `Screen.path` and `NavigationItem.hierarchy` carry
|
|
248
|
+
module/feature paths, outermost first. Browser/hash history
|
|
249
|
+
(`createBrowserSceneHistory`, `createHashSceneHistory`) supports deep links;
|
|
250
|
+
dialogs are history entries closed with `closeDialog(result)`.
|
|
251
|
+
- **Bindings.** Inputs publish a `value` output through `useValueOutput`;
|
|
252
|
+
command arguments resolve `component.<id>.<output>` through
|
|
253
|
+
`resolveArgumentSource`. `useBoundQuery` reruns on argument changes, aborts
|
|
254
|
+
prior runs and discards stale answers; clearing/failing removes old data.
|
|
255
|
+
- **Descriptors and packages.** Object descriptors carry nested `properties`
|
|
256
|
+
and `open`. `ApprovedPackageSet`, `loadApprovedPackages` and
|
|
257
|
+
`resolveApprovedPackageHost` align planning declarations with runtime bundles;
|
|
258
|
+
executable imports require host approval.
|
|
259
|
+
- **Master/detail.** The default blueprint supplies `MasterDetail`.
|
|
260
|
+
- **Core toolbar.** `core:toolbar` holds `core:toolbarItem` entries. Action items
|
|
261
|
+
announce `cratis.scene.command` with resolved parameters; Navigate/Dialog
|
|
262
|
+
items execute through the navigation host (or announce a navigation event
|
|
263
|
+
outside one). This is not a promise that the command executes without a host.
|
|
246
264
|
- **Nested outlets.** A `core:outlet` component declares a named nested outlet on a
|
|
247
265
|
screen. A destination into it opens its screen there and keeps the declaring
|
|
248
266
|
screen on the page; the opened screen may declare outlets of its own, so
|
|
@@ -269,7 +287,7 @@ claim: confirm it from the render receipt and diagnostics before reporting it.
|
|
|
269
287
|
## Design-time generation results
|
|
270
288
|
|
|
271
289
|
Design-time actions belong to component packages, not to the model and not to an
|
|
272
|
-
agent. Scene 4.15 (
|
|
290
|
+
agent. Scene 4.15 (re-verified at the current scaffold Scene tag) declares them as data (`PackageDesignTimeMetadata`) and ships
|
|
273
291
|
their code in an optional design-time bundle; a runtime host that does not set
|
|
274
292
|
`loadDesignTime` loads none of it, so nothing a design-time action does can exist
|
|
275
293
|
only at runtime. The one Cratis action today is **Generate fields**
|
|
@@ -16,12 +16,14 @@ first.
|
|
|
16
16
|
|
|
17
17
|
| Package | Version | Purpose |
|
|
18
18
|
| --- | --- | --- |
|
|
19
|
-
| `Cratis.Arc.Chronicle` | `22.
|
|
19
|
+
| `Cratis.Arc.Chronicle` | `22.75.0` | `[NotAudited]` in `Cratis.Arc.Chronicle.Commands`; the `ARCCHR0009` analyzer |
|
|
20
20
|
| `Cratis.Chronicle` | `18.3.0` | `[PII]`, `[Subject]`, redaction, namespace isolation |
|
|
21
21
|
| `Cratis.Chronicle` | `19.32.0` | `[Encrypted]` in `Cratis.Chronicle.ProtectedValues`; analyzers `CHR0052`, `CHR0053` |
|
|
22
|
-
| `Cratis.Arc.Core` | `22.
|
|
22
|
+
| `Cratis.Arc.Core` | `22.75.0` | Authorization filters, `CommandResult.Unauthorized` |
|
|
23
23
|
|
|
24
|
-
>
|
|
24
|
+
> Arc security boundaries rechecked at v22.75.0; every added check is cited in
|
|
25
|
+
> references/arc-boundaries.md. Arc depends on Chronicle 19.39.1; separately
|
|
26
|
+
> version-qualified Chronicle security claims retain their original verification.
|
|
25
27
|
|
|
26
28
|
Reverify against the owning product repository before asserting a framework
|
|
27
29
|
guarantee this file does not already state.
|
|
@@ -97,6 +99,10 @@ command's properties as well as grepping them.
|
|
|
97
99
|
must not be able to assert who it is through a command property.
|
|
98
100
|
- Note that an unauthorized command result maps to HTTP **403**, not 401 — a
|
|
99
101
|
reviewer reading logs for 401s will miss authorization failures.
|
|
102
|
+
- Review [Arc-specific security boundaries](references/arc-boundaries.md) when
|
|
103
|
+
the diff touches hosting, identity, policies, discovery, streams or system actors.
|
|
104
|
+
It pins the checks to Arc v22.75.0; do not assume a clean analyzer run proves
|
|
105
|
+
those deployment boundaries.
|
|
100
106
|
|
|
101
107
|
## Step 4 — Data exposure
|
|
102
108
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# Arc security checks
|
|
2
|
+
|
|
3
|
+
<!-- Copyright (c) Cratis. All rights reserved. -->
|
|
4
|
+
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->
|
|
5
|
+
|
|
6
|
+
Verified at **Arc v22.75.0**. Each source below is pinned to that tag.
|
|
7
|
+
|
|
8
|
+
- Enable `TrustForwardedIdentityHeaders` only behind an authenticating ingress
|
|
9
|
+
that strips caller identity headers, replaces them and prevents direct backend
|
|
10
|
+
access. Headers are unsigned, not proof of identity. Without the explicit
|
|
11
|
+
host-wide opt-in Arc ignores them. Custom handlers must honor the same flag.
|
|
12
|
+
[Secure defaults](https://github.com/Cratis/Arc/blob/v22.75.0/Documentation/upgrading/secure-defaults.mdx).
|
|
13
|
+
- Application code must not read `.cratis-identity`. The backend derives identity
|
|
14
|
+
from the authenticated principal; the JS client only falls back to the legacy
|
|
15
|
+
cookie on 404, never on 401/403. Use `clearCache()` on logout. Browser identity
|
|
16
|
+
remains display state, not server authorization.
|
|
17
|
+
[Backend provider](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Identity/IdentityProvider.cs),
|
|
18
|
+
[JS provider](https://github.com/Cratis/Arc/blob/v22.75.0/Source/JavaScript/Arc/identity/IdentityProvider.ts).
|
|
19
|
+
- Test all discovery routes outside Development. Default access is authenticated
|
|
20
|
+
there, or 404 when the host cannot authenticate. Explicit
|
|
21
|
+
`RequireAuthentication=false` opens discovery in every environment;
|
|
22
|
+
`Enabled=false` removes catalogs, not identity discovery. Disable both switches
|
|
23
|
+
when neither is needed. `[ExcludeFromDiscovery]` hides documentation/catalogs,
|
|
24
|
+
not invocation or authorization.
|
|
25
|
+
[Introspection](https://github.com/Cratis/Arc/blob/v22.75.0/Documentation/backend/csharp/introspection/index.md).
|
|
26
|
+
- Check ARC0019/0020/0021: conflicting declarations, Microsoft attributes without
|
|
27
|
+
the ASP.NET integration, and schemes on the standalone host. Microsoft
|
|
28
|
+
`[Authorize]` is enforced only by the ASP.NET host; policies/schemes fail closed
|
|
29
|
+
on supported hosts. A method declaration **replaces** the type declaration.
|
|
30
|
+
Guest access requires every policy in the declaration to opt in
|
|
31
|
+
(`evaluatesAnonymous`), without roles/schemes. Since 22.44.2 guest endpoints are
|
|
32
|
+
reachable through HTTP even with an authenticated fallback policy. Keep an
|
|
33
|
+
intentional `IFallbackAuthorizationEvaluator` baseline; it is separate from
|
|
34
|
+
ASP.NET's `FallbackPolicy`.
|
|
35
|
+
[Authorization descriptors](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core.CodeAnalysis/DiagnosticDescriptors.cs),
|
|
36
|
+
[guest endpoint specs](https://github.com/Cratis/Arc/tree/v22.75.0/Source/DotNET).
|
|
37
|
+
- The embedded `/.cratis/event-model` viewer defaults to Debug **and** Development.
|
|
38
|
+
Explicit `Enabled=true` overrides that default: check that deployed hosts have
|
|
39
|
+
not enabled it, rather than claiming Production can never map it.
|
|
40
|
+
[Exposure implementation](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Screenplay.Embedded/Hosting/EventModelViewerExposure.cs).
|
|
41
|
+
- Generated identifiers are not secrets, authorization proofs or idempotency
|
|
42
|
+
keys. [Generated values](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Commands/ModelBound/GeneratedValueAttribute.cs).
|
|
43
|
+
- Arc telemetry records type/name/outcome metadata and correlation/tenant ids,
|
|
44
|
+
not command/query/event payload values or validation/exception messages. Do not
|
|
45
|
+
widen it with sensitive payloads or mistake this for a promise of no ids.
|
|
46
|
+
[Telemetry names](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/WellKnownTelemetryNames.cs).
|
|
47
|
+
- Returned reactor commands marked `[ExecuteCommandsAsSystem]` use a narrow
|
|
48
|
+
disposed system scope. The caller-principal leak before 22.72.0 is fixed;
|
|
49
|
+
manually executing commands still needs explicit actor ownership.
|
|
50
|
+
[Executor](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Chronicle/Reactors/CommandSideEffectExecutor.cs).
|
|
51
|
+
- Revocable observable data needs `IGuardObservableQueryEmission`; it applies to
|
|
52
|
+
plain HTTP snapshots/waits/long polls too. Suppression withholds data; denial
|
|
53
|
+
terminates/returns unauthorized. Never read the producer's ambient principal.
|
|
54
|
+
[HTTP processing](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/ObservableQueryHttp.cs).
|
|
55
|
+
- Query health remains explicitly anonymous and returns connection health. Audit
|
|
56
|
+
exposure of connection user ids (tracked by Arc#2873), not just catalogs:
|
|
57
|
+
discovery restrictions are not blanket protection of `/.cratis/*`.
|
|
58
|
+
[QueryHealth](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/QueryHealth.cs),
|
|
59
|
+
[subscription client UserId](https://github.com/Cratis/Arc/blob/v22.75.0/Source/DotNET/Arc.Core/Queries/QuerySubscriptionClientInfo.cs).
|
|
@@ -39,6 +39,13 @@ In a language without those analyzers the same rules hold; the reviewer enforces
|
|
|
39
39
|
them instead of the compiler. Reverify against the owning product repository
|
|
40
40
|
before claiming behavior for another version.
|
|
41
41
|
|
|
42
|
+
The `Cratis.Synopsis.Tool` dotnet tool (verified at `v1.1.3`) reads these
|
|
43
|
+
names statically, never running code, and writes one HTML or JSON behavior
|
|
44
|
+
document from C#, TypeScript, Gherkin and Screenplay specifications:
|
|
45
|
+
`dotnet tool install --global Cratis.Synopsis.Tool`, then `synopsis . --open`
|
|
46
|
+
(or `synopsis . --format both --output Artifacts/synopsis.html`). Good names are
|
|
47
|
+
the documentation it produces.
|
|
48
|
+
|
|
42
49
|
## Route near misses
|
|
43
50
|
|
|
44
51
|
- Writing the C# mechanics — the `Specification` base, `Establish`/`Because`,
|
|
@@ -12,14 +12,21 @@ Specifications are executable documentation. The folder tree reads like a table
|
|
|
12
12
|
of contents, and each file states one setup, one action, and one or more
|
|
13
13
|
focused assertions.
|
|
14
14
|
|
|
15
|
+
Read [query and decision scenarios](../cratis-application-slice-specifications/references/query-and-decision-scenarios.md)
|
|
16
|
+
when specifying query emissions, routed conflicts or protected projection reads.
|
|
17
|
+
Call `UseDecisionReads()` before seeding actual events; pinned models cannot
|
|
18
|
+
supply a guard. `Perform`/`Observe` need configured services/principal, and
|
|
19
|
+
MongoDB observations still need real infrastructure.
|
|
20
|
+
|
|
15
21
|
## Verified product sources
|
|
16
22
|
|
|
17
23
|
This skill is verified against these exact public releases:
|
|
18
24
|
|
|
19
25
|
| Package | Version | Purpose |
|
|
20
26
|
| --- | --- | --- |
|
|
21
|
-
| `Cratis.Specifications` | `4.1.1` | `Specification` base,
|
|
22
|
-
| `Cratis.
|
|
27
|
+
| `Cratis.Specifications.XUnit` | `4.1.1` | `Specification` base, lifecycle discovery, `ShouldXxx` assertions, optional shared lifecycle |
|
|
28
|
+
| `Cratis.Specifications` | `4.1.1` | `Catch.Exception`, `SpecificationMethods` (dependency of the XUnit package) |
|
|
29
|
+
| `Cratis.Arc.Testing` | `22.76.0` (caller registrations); `22.75.0` (other scenario assertions) | `CommandScenario<TCommand>` preserves explicit principal/override/policy services from 22.75.1; see application-scenarios |
|
|
23
30
|
| `Cratis.Chronicle.Testing` | `18.3.0` | `EventScenario`, `ReadModelScenario<T>`, `ReactorScenario<T>` |
|
|
24
31
|
|
|
25
32
|
Reactor read-model seeding/absence, synchronous handler exceptions and the
|
|
@@ -27,8 +34,13 @@ Reactor read-model seeding/absence, synchronous handler exceptions and the
|
|
|
27
34
|
and require **19.46.0+**; see the ReactorScenario section in
|
|
28
35
|
[application-scenarios.md](references/application-scenarios.md).
|
|
29
36
|
|
|
37
|
+
Per-context in-process MongoDB host isolation is verified at
|
|
38
|
+
`Cratis.Chronicle.XUnit.Integration` **19.51.0** (`ChronicleFixture.cs`,
|
|
39
|
+
`ChronicleClientFixture.cs`, `MongoDBContextStorage.cs`); it is opt-in and does
|
|
40
|
+
not isolate out-of-process/remote kernels. See [integration-specs.md](references/integration-specs.md).
|
|
41
|
+
|
|
30
42
|
Generated-value scenario pinning is verified separately against
|
|
31
|
-
`Cratis.Arc.Testing` **22.
|
|
43
|
+
`Cratis.Arc.Testing` **22.75.0** (introduced in **22.67.0**).
|
|
32
44
|
|
|
33
45
|
Reverify against the owning product repository before claiming support for
|
|
34
46
|
another version. Never translate an assertion or helper name from memory.
|
|
@@ -61,6 +73,7 @@ another version. Never translate an assertion or helper name from memory.
|
|
|
61
73
|
| Pure `Handle()` / `Handle(providedValue)`, reducer logic or reactor decision (default) | Plain method call with `Specification` |
|
|
62
74
|
| Isolated class, collaborators can be substituted | `Specification` + NSubstitute |
|
|
63
75
|
| Arc command pipeline (validators, `Provide()`, `Handle()`, appended events) | `CommandScenario<TCommand>` |
|
|
76
|
+
| Arc query conversion, validation, authorization and interceptors | `QueryScenario<TReadModel>` (`Cratis.Arc.Testing.Queries`) |
|
|
64
77
|
| Chronicle append semantics, constraints, concurrency | `EventScenario` |
|
|
65
78
|
| Projection or reducer state from a sequence of events | `ReadModelScenario<TReadModel>` |
|
|
66
79
|
| Reactor invocation and its side effects | `ReactorScenario<TReactor>` |
|
|
@@ -76,11 +89,10 @@ one. Out-of-process integration specifications are an advanced case reserved for
|
|
|
76
89
|
boundaries the scenario helpers cannot reach — see
|
|
77
90
|
[integration-specs.md](references/integration-specs.md).
|
|
78
91
|
|
|
79
|
-
> **
|
|
80
|
-
>
|
|
81
|
-
>
|
|
82
|
-
>
|
|
83
|
-
> for that case put the command's specifications in a small xUnit `[Collection]`.
|
|
92
|
+
> **Historical validator-state order-sensitivity:** observed at 22.16-era Arc.
|
|
93
|
+
> Process-wide provider replacement was fixed in 22.23.2; later releases isolated
|
|
94
|
+
> scenario stores/services. Reproduce at 22.75.0 before applying the old
|
|
95
|
+
> direct-validator/small `[Collection]` workaround; it is not verified here.
|
|
84
96
|
|
|
85
97
|
⚠️ `EventScenario` wires a strategy that always answers `ConcurrencyScope.None`,
|
|
86
98
|
which the validator skips, so an append that lets the strategy choose the scope
|
|
@@ -96,7 +108,13 @@ build it, even if passive. Missing setup throws
|
|
|
96
108
|
resolved read-model key. See the ReactorScenario reference for diagnostics,
|
|
97
109
|
exception capture and UTC occurrence-time defaults.
|
|
98
110
|
|
|
99
|
-
Specification projects are named `<Source>.Specs
|
|
111
|
+
Specification projects are named `<Source>.Specs`. Add a `PackageReference` to
|
|
112
|
+
`Cratis.Specifications.XUnit` 4.1.1, not just `Cratis.Specifications`; the C#
|
|
113
|
+
namespace stays `Cratis.Specifications`. The house runner is xUnit **2.x**
|
|
114
|
+
(2.9.3 at this tag), not xUnit v3. Supported targets are net8.0/net9.0/net10.0;
|
|
115
|
+
net48 was dropped in 4.0.0 (retain 3.x for that target).
|
|
116
|
+
`Cratis.Specifications.NUnit` 4.0.0+ is an alternative with the same base pattern,
|
|
117
|
+
`[Test]` instead of `[Fact]`, and **public** test methods.
|
|
100
118
|
|
|
101
119
|
### Pin server-generated Handle values
|
|
102
120
|
|
|
@@ -182,11 +200,17 @@ public class when_<behavior> : Specification
|
|
|
182
200
|
leave no blank line between `should_` methods.
|
|
183
201
|
- Fields are `private` in a concrete specification and `protected` in a `given/`
|
|
184
202
|
context, named `_camelCase`.
|
|
185
|
-
- Any phase may be `async Task`. `void Destroy()` is
|
|
203
|
+
- Any phase may be `async Task`. `void Destroy()` is optional teardown, after
|
|
204
|
+
each fact by default; once per eligible class with the shared lifecycle opt-in.
|
|
186
205
|
|
|
187
|
-
`Cratis.Specifications` discovers `Establish`, `Because`, and `Destroy` by
|
|
206
|
+
`Cratis.Specifications.XUnit` discovers `Establish`, `Because`, and `Destroy` by
|
|
188
207
|
convention — there are no attributes on them.
|
|
189
208
|
|
|
209
|
+
Keep the stock per-fact lifecycle by default. Read
|
|
210
|
+
[shared-lifecycle.md](references/shared-lifecycle.md) when deliberately opting
|
|
211
|
+
into one instance and one Establish/Because execution per specification class.
|
|
212
|
+
Facts must not mutate that shared context.
|
|
213
|
+
|
|
190
214
|
## Step 4 — Extract a reusable context
|
|
191
215
|
|
|
192
216
|
When several specifications share setup, layer it under `given/`:
|
|
@@ -272,6 +296,14 @@ between collaborators. That is where defects hide.
|
|
|
272
296
|
|
|
273
297
|
## Verify
|
|
274
298
|
|
|
299
|
+
CRSPEC0001–CRSPEC0007 ship as **warnings** in `Cratis.Specifications`, `.XUnit`,
|
|
300
|
+
and `.NUnit` 4.0.0+. A warnings-as-errors build enforces them: `should_` names,
|
|
301
|
+
one specification per file (given contexts exempt), no facts on given contexts,
|
|
302
|
+
test attributes on `should_` methods, no explicit base lifecycle calls, public
|
|
303
|
+
specification classes, and no `Because` on given contexts. See
|
|
304
|
+
`cratis-specification-by-example` for the diagnostic-by-diagnostic checklist.
|
|
305
|
+
Do not suppress these warnings to pass the gate.
|
|
306
|
+
|
|
275
307
|
- Every specification file states one `Establish`, one `Because`, and one or
|
|
276
308
|
more `should_` facts.
|
|
277
309
|
- `Because()` appears only in concrete specifications, never in a `given/`
|
package/package/corpus/skills/cratis-specifications-csharp/references/application-scenarios.md
CHANGED
|
@@ -15,12 +15,17 @@ validation, constraints or projections matter; a pure decision (`Handle()`,
|
|
|
15
15
|
call. A library or framework repository reaches for a scenario only to test the
|
|
16
16
|
very engine it provides.
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
18
|
+
Arc scenarios verified at **v22.75.0** (Chronicle dependency 19.39.1).
|
|
19
|
+
Separate Chronicle-only scenario claims retain their version-qualified sources.
|
|
20
|
+
Read [query and decision scenarios](../../cratis-application-slice-specifications/references/query-and-decision-scenarios.md)
|
|
21
|
+
when using `QueryScenario<T>`, buffered emissions or `UseDecisionReads()`.
|
|
22
|
+
Guarded decisions need actual seeded events, not pinned models; their given
|
|
23
|
+
state and appends share one in-process log, unlike legacy dictionary seeding.
|
|
20
24
|
|
|
21
25
|
| Helper | Exercises | Use for |
|
|
22
26
|
| --- | --- | --- |
|
|
23
27
|
| `CommandScenario<TCommand>` | Authorization, validators, `Provide()`, `Handle()`, appended events | State Change behavior |
|
|
28
|
+
| `QueryScenario<TReadModel>` | Argument conversion, authorization, validation, interceptors and buffered observations | Query pipeline behavior |
|
|
24
29
|
| `EventScenario` | Chronicle append semantics without the command pipeline | Constraints, raw sequencing, concurrency |
|
|
25
30
|
| `ReadModelScenario<TReadModel>` | Projection or reducer state from a sequence of events | State View behavior |
|
|
26
31
|
| `ReactorScenario<TReactor>` | Reactor invocation and its side effects | Automation and Translation behavior |
|
|
@@ -85,10 +90,17 @@ from `Cratis.Arc.Chronicle.Testing`.
|
|
|
85
90
|
pass against a read-model shape the projection never produces.
|
|
86
91
|
- **Validator and `Provide()` dependencies** are registered in
|
|
87
92
|
`_scenario.Services`; the concrete validator is discovered automatically.
|
|
93
|
+
- **Caller setup (Arc 22.75.1+, re-verified at 22.76.0):** register a substituted
|
|
94
|
+
`ICurrentPrincipalAccessor`, `ICurrentPrincipalOverride` or
|
|
95
|
+
`IAuthorizationPolicyRuntime` in `Services` before first execution. The scenario
|
|
96
|
+
preserves these registrations instead of replacing them with Arc defaults,
|
|
97
|
+
so role/policy success and denial specs run as the caller you supplied.
|
|
98
|
+
Source: `Testing/ScenarioServices.cs` and `Testing/Commands/CommandScenario.cs`
|
|
99
|
+
under `Source/DotNET/`.
|
|
88
100
|
|
|
89
101
|
### Pin generated values
|
|
90
102
|
|
|
91
|
-
Verified at **Arc v22.
|
|
103
|
+
Verified at **Arc v22.75.0**, available in `Cratis.Arc.Testing` **22.67.0+**.
|
|
92
104
|
For the `AllocateCartId` command from `cratis-arc-command`, whose
|
|
93
105
|
`Handle([GeneratedValue("cart")] CartId cartId)` returns that id, specify the
|
|
94
106
|
pipeline with a known concept pin. Import `Cratis.Arc.Commands` and
|
|
@@ -153,7 +165,7 @@ public class and_value_is_pinned : Specification
|
|
|
153
165
|
A direct-call decision spec supplies the known argument to `Handle()` itself.
|
|
154
166
|
|
|
155
167
|
Guide: [Pin generated values in command specs](/arc/backend/csharp/testing/generated-values/).
|
|
156
|
-
Source: **Arc v22.
|
|
168
|
+
Source: **Arc v22.75.0**, `Source/DotNET/Testing/Commands/CommandScenarioGeneratedValueExtensions.cs`,
|
|
157
169
|
`ScenarioGeneratedValueFixture.cs`, `ScenarioGeneratedValues.cs` and
|
|
158
170
|
`GeneratedValuesCommandScenarioExtender.cs`;
|
|
159
171
|
`Source/DotNET/Testing.Specs/Commands/for_CommandScenario/generated_values/when_pinning_a_value.cs`.
|
|
@@ -11,8 +11,9 @@
|
|
|
11
11
|
- One outcome per file
|
|
12
12
|
|
|
13
13
|
Detail for the plain `Cratis.Specifications` surface: phases, substitution,
|
|
14
|
-
assertions, and exception capture. Verified against `Cratis.Specifications`
|
|
15
|
-
`4.1.1` and
|
|
14
|
+
assertions, and exception capture. Verified against `Cratis.Specifications.XUnit`
|
|
15
|
+
`4.1.1` (base and assertions) and its `Cratis.Specifications` dependency (`Catch`).
|
|
16
|
+
NSubstitute is a separate collaborator-substitution dependency.
|
|
16
17
|
|
|
17
18
|
## Phases
|
|
18
19
|
|
|
@@ -21,7 +22,7 @@ assertions, and exception capture. Verified against `Cratis.Specifications`
|
|
|
21
22
|
| `void Establish()` | Setup, before `Because()` | One per class in the chain, run base-first. Never call `base.Establish()` |
|
|
22
23
|
| `void Because()` | The single action under test | Only in a concrete specification, never in a `given/` context |
|
|
23
24
|
| `[Fact] void should_*()` | One assertion per fact | Expression-body form, no blank lines between facts |
|
|
24
|
-
| `void Destroy()` | Teardown after each
|
|
25
|
+
| `void Destroy()` | Teardown after each fact by default | Optional; once per eligible class with [shared lifecycle](shared-lifecycle.md) |
|
|
25
26
|
|
|
26
27
|
Every phase may be `async Task`.
|
|
27
28
|
|
|
@@ -91,7 +92,7 @@ _<collaborator>.<Method>(Arg.Any<<ArgumentType>>())
|
|
|
91
92
|
|
|
92
93
|
## Assertion extension methods
|
|
93
94
|
|
|
94
|
-
From `Cratis.Specifications`:
|
|
95
|
+
From the `Cratis.Specifications.XUnit` package, namespace `Cratis.Specifications`:
|
|
95
96
|
|
|
96
97
|
| Method | Example |
|
|
97
98
|
| --- | --- |
|
|
@@ -103,6 +104,16 @@ From `Cratis.Specifications`:
|
|
|
103
104
|
| `.ShouldContainOnly(items)` | `_items.ShouldContainOnly(<expectedItems>)` |
|
|
104
105
|
| `.ShouldBeOfExactType<T>()` | `_event.ShouldBeOfExactType<<EventType>>()` |
|
|
105
106
|
| `.ShouldBeGreaterThan(n)` / `.ShouldBeLessThan(n)` | `_count.ShouldBeGreaterThan(0)` |
|
|
107
|
+
| `.ShouldNotEqual(expected)` | Value inequality |
|
|
108
|
+
| `.ShouldBeSame(expected)` / `.ShouldNotBeSame(expected)` | Reference identity |
|
|
109
|
+
| `.ShouldMatch(Func<T, bool>)` | Value predicate |
|
|
110
|
+
| `.ShouldBeInRange(low, high)` | Inclusive range |
|
|
111
|
+
| `.ShouldBeGreaterThanOrEqual(n)` / `.ShouldBeLessThanOrEqual(n)` | Inclusive comparison |
|
|
112
|
+
| `.ShouldContainSingleItem()` / `.ShouldEachConformTo(predicate)` | Collection cardinality / each-item predicate |
|
|
113
|
+
| Collection `.ShouldEqual(IEnumerable<T>)` | Ordered sequence equality |
|
|
114
|
+
| Collection `.ShouldContain(Predicate<T>)` | At least one matching item |
|
|
115
|
+
| `.ShouldBeAssignableFrom<T>()` | Actual object is assignable to T |
|
|
116
|
+
| String `.ShouldContain(substring, StringComparison)` | Explicit string comparison |
|
|
106
117
|
|
|
107
118
|
Assert on values and types. Do not assert on presentation message strings by
|
|
108
119
|
default; assert exact text only when that wording is the specified behavior,
|
|
@@ -121,7 +132,9 @@ async Task Because() => _error = await Catch.Exception(_<sut>.<Action>);
|
|
|
121
132
|
```
|
|
122
133
|
|
|
123
134
|
Use `Catch.Exception` rather than a `try`/`catch` in `Because()`; the captured
|
|
124
|
-
exception is the outcome the facts assert on.
|
|
135
|
+
exception is the outcome the facts assert on. Overloads accept `Action` and
|
|
136
|
+
`Func<Task>`; `Catch.Exception<T>(Action)` captures only T and lets other
|
|
137
|
+
exception types propagate.
|
|
125
138
|
|
|
126
139
|
## Usings
|
|
127
140
|
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
- Command execution overloads
|
|
8
8
|
- Assertion helpers
|
|
9
9
|
- Asynchronous follow-ups
|
|
10
|
+
- In-process MongoDB context isolation (19.51.0)
|
|
10
11
|
- Rules
|
|
11
12
|
|
|
12
13
|
Reserve these for the host, transport, serialization, or real-infrastructure
|
|
@@ -125,6 +126,26 @@ void Destroy() => _collector.Dispose();
|
|
|
125
126
|
`IEventAppendCollection` is part of the Chronicle testing API. The timeout is a
|
|
126
127
|
deadline, not a sleep — it turns a hang into a named failure.
|
|
127
128
|
|
|
129
|
+
## In-process MongoDB context isolation (19.51.0)
|
|
130
|
+
|
|
131
|
+
For an **in-process MongoDB** suite using `Cratis.Chronicle.XUnit.Integration`,
|
|
132
|
+
override `ChronicleFixture.UsesPerContextMongoDBHost` to return `true`. It defaults
|
|
133
|
+
to `false`: consumers otherwise retain shared-host behavior. Each context gets a
|
|
134
|
+
fresh host and unique database prefix, so writes flushed by an earlier host after
|
|
135
|
+
shutdown cannot alter the next context's events or projections.
|
|
136
|
+
|
|
137
|
+
The default storage configuration applies the prefix. If your client fixture
|
|
138
|
+
overrides `GetStorageConfigurator`, pass its `DatabaseNamePrefix` to `WithMongoDB`
|
|
139
|
+
as `databaseNamePrefix`. Context teardown awaits host disposal without wiping its
|
|
140
|
+
databases in place; collection teardown drops only prefixes it issued. Starting
|
|
141
|
+
one host per context costs time. This does not isolate out-of-process or remote
|
|
142
|
+
kernels, which retain kernel reset.
|
|
143
|
+
|
|
144
|
+
Source-verified at Chronicle `v19.51.0:Source/Clients/XUnit.Integration/ChronicleFixture.cs`,
|
|
145
|
+
`ChronicleClientFixture.cs`, `MongoDBContextStorage.cs`,
|
|
146
|
+
`ChronicleOrleansInProcessWebApplicationFactory.cs`, and
|
|
147
|
+
`Documentation/contributing/integration-tests.md` (per-context storage isolation).
|
|
148
|
+
|
|
128
149
|
## Rules
|
|
129
150
|
|
|
130
151
|
- `context` is an inner `public class` inheriting `given.an_http_client(fixture)`.
|
|
@@ -0,0 +1,34 @@
|
|
|
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
|
+
# Optional shared xUnit lifecycle
|
|
5
|
+
|
|
6
|
+
Verified against `Cratis.Specifications.XUnit` 4.1.1,
|
|
7
|
+
`SpecificationTestFramework.cs`, `SpecificationTestClassRunner.cs`, and
|
|
8
|
+
`Specification.cs`. Introduced in 4.1.0. The house default remains stock xUnit
|
|
9
|
+
per-fact execution.
|
|
10
|
+
|
|
11
|
+
## Opt in
|
|
12
|
+
|
|
13
|
+
Add this assembly attribute to the specification project:
|
|
14
|
+
|
|
15
|
+
```csharp
|
|
16
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
17
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
18
|
+
|
|
19
|
+
[assembly: Xunit.TestFramework("Cratis.Specifications.SpecificationTestFramework", "Cratis.Specifications.XUnit")]
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
For eligible classes, construction, `Establish`, and `Because` happen once.
|
|
23
|
+
All facts share the instance; `Destroy` runs once after the last fact, including
|
|
24
|
+
when initialization failed. A throwing `Establish` or `Because` fails every fact
|
|
25
|
+
in that class. Facts must only assert, never mutate shared context.
|
|
26
|
+
|
|
27
|
+
A class is eligible only when it derives from `Specification`, has a single
|
|
28
|
+
public parameterless constructor, does not implement `IDisposable`, and has only
|
|
29
|
+
plain facts. Theories, custom fact test cases, fixture/output-helper constructors,
|
|
30
|
+
and plain xUnit classes keep the stock per-fact lifecycle. This is not xUnit v3
|
|
31
|
+
support; the package uses xUnit 2.x.
|
|
32
|
+
|
|
33
|
+
`Specification.InitializeAsync()` is idempotent for a single instance. It does
|
|
34
|
+
not make an ineligible class shared or cache instances across classes.
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
{
|
|
2
|
+
"skill": "cratis-specifications-csharp",
|
|
3
|
+
"input": "Set up a C# specification project and choose its lifecycle.",
|
|
4
|
+
"fixtures": [],
|
|
5
|
+
"assertions": [
|
|
6
|
+
{ "kind": "skill-contains", "value": "Cratis.Specifications.XUnit" },
|
|
7
|
+
{ "kind": "skill-contains", "value": "xUnit **2.x**" },
|
|
8
|
+
{ "kind": "skill-contains", "value": "stock per-fact lifecycle by default" },
|
|
9
|
+
{ "kind": "skill-contains", "value": "shared-lifecycle.md" },
|
|
10
|
+
{ "kind": "skill-contains", "value": "CRSPEC0001–CRSPEC0007" },
|
|
11
|
+
{ "kind": "skill-contains", "value": "Do not suppress these warnings" }
|
|
12
|
+
]
|
|
13
|
+
}
|
|
@@ -14,7 +14,9 @@ base: setup is separated from the action, and each `it()` verifies one outcome.
|
|
|
14
14
|
|
|
15
15
|
## Verified product sources
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
Helper and setup patterns are verified against Fundamentals **v7.23.0**
|
|
18
|
+
(`for_JsonSerializer/given/given.ts`, `vitest.setup.ts`) and Arc **v22.75.0**
|
|
19
|
+
(`Source/JavaScript/Arc/given.ts`). The execution stack is:
|
|
18
20
|
|
|
19
21
|
| Framework | Role |
|
|
20
22
|
| --- | --- |
|
|
@@ -23,10 +25,17 @@ This skill is verified against the frameworks these specifications run on:
|
|
|
23
25
|
| Chai | Assertions, always through the `.should` fluent interface |
|
|
24
26
|
| Sinon | Stubbing and call verification |
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
`given()` is a small **local file** inside the package under specification, not
|
|
29
|
+
a published package export. Import it with a relative path to that file; create
|
|
30
|
+
it if absent. Fundamentals constructs a parameterless context; Arc passes the
|
|
31
|
+
Mocha `Suite` to the context constructor and binds the callback's `this` to it.
|
|
32
|
+
Match the owning package's helper signature rather than assuming one import path.
|
|
33
|
+
|
|
34
|
+
Configure Vitest to load a setup file that calls `chai.should()` and registers
|
|
35
|
+
`sinon-chai` and `chai-as-promised`; otherwise `.should` is undefined or plugin
|
|
36
|
+
assertions are unavailable. Load the reflection polyfill when specifying
|
|
37
|
+
metadata-dependent code (Fundamentals' setup imports its local `reflection`
|
|
38
|
+
entry). The Specifications repository publishes no TypeScript helper.
|
|
30
39
|
|
|
31
40
|
## Route near misses
|
|
32
41
|
|