@cratis/pi 7.3.0 → 7.3.1
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/slice-implementer.md +1 -1
- package/package/corpus/prompts/add-business-rule.prompt.md +1 -1
- package/package/corpus/prompts/add-concept.prompt.md +1 -1
- package/package/corpus/prompts/add-ef-migration.prompt.md +1 -1
- package/package/corpus/prompts/add-projection.prompt.md +1 -1
- package/package/corpus/prompts/add-reactor.prompt.md +1 -1
- package/package/corpus/prompts/add-reducer.prompt.md +1 -1
- package/package/corpus/prompts/new-vertical-slice.prompt.md +2 -2
- package/package/corpus/prompts/scaffold-feature.prompt.md +2 -2
- package/package/corpus/prompts/write-specs.prompt.md +1 -1
- package/package/corpus/rules/application-profile.md +1 -1
- package/package/corpus/rules/framework.md +1 -1
- package/package/corpus/rules/frontend-testing.md +1 -1
- package/package/corpus/rules/specs.csharp.md +2 -2
- package/package/corpus/rules/specs.scenarios.csharp.md +1 -1
- package/package/corpus/rules/vertical-slices.md +9 -9
- package/package.json +1 -1
|
@@ -38,7 +38,7 @@ A new vertical slice (State Change, State View, Automation, Translation), or a n
|
|
|
38
38
|
## Workflow — phase gates; don't start the next until the current passes
|
|
39
39
|
|
|
40
40
|
### Phase 1 — Plan
|
|
41
|
-
For new behavior, unclear event names/stream boundaries, or multi-slice flows, run the
|
|
41
|
+
For new behavior, unclear event names/stream boundaries, or multi-slice flows, run the **cratis-chronicle-event-modeling** skill first. Confirm Module/Feature/slice name + type, the behavior in one sentence, whether a UI surface is needed, and the event/read-model/scenario outline. Ask only when a real product/domain choice can't be answered from the repo.
|
|
42
42
|
|
|
43
43
|
### Phase 2 — Backend
|
|
44
44
|
Write `<Module>/<Feature>/<Slice>/<Slice>.cs` with all backend artifacts (declaration order per `general.md`). **Gate:** build clean in **Debug and Release** (zero errors/warnings — Debug validates `#if DEBUG` spec code and regenerates the TypeScript proxies; build Release with `-p:CratisProxiesOutputPath=` to skip re-running proxy generation).
|
|
@@ -5,7 +5,7 @@ description: Add a business rule or event-store constraint to an existing comman
|
|
|
5
5
|
|
|
6
6
|
# Add a Business Rule or Constraint
|
|
7
7
|
|
|
8
|
-
Enforce a new rule on an existing command. Invoke the **
|
|
8
|
+
Enforce a new rule on an existing command. Invoke the **cratis-arc-command-validation** skill, or the **cratis-chronicle-event-constraints** skill for uniqueness and other append-time constraints, and follow `.cratis/ai/rules/vertical-slices.md` (the decision matrix).
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Create a strongly-typed Concept for a primitive domain value or an
|
|
|
5
5
|
|
|
6
6
|
# Add a Concept
|
|
7
7
|
|
|
8
|
-
Create a strongly-typed concept to replace a raw primitive. Invoke the **
|
|
8
|
+
Create a strongly-typed concept to replace a raw primitive. Invoke the **cratis-fundamentals-concept** skill and follow `.cratis/ai/rules/concepts.md`.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Add or update an Entity Framework Core DbContext, table column, or
|
|
|
5
5
|
|
|
6
6
|
# Add an EF Core Migration
|
|
7
7
|
|
|
8
|
-
Make a database schema change via EF Core. Invoke the **
|
|
8
|
+
Make a database schema change via EF Core. Invoke the **cratis-arc-ef-core-migration** skill and follow `.cratis/ai/rules/efcore.md` (+ `.cratis/ai/rules/efcore.specs.md`).
|
|
9
9
|
|
|
10
10
|
> Applies only to projects that use EF Core.
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Add a Chronicle projection to an existing read model slice.
|
|
|
5
5
|
|
|
6
6
|
# Add a Projection
|
|
7
7
|
|
|
8
|
-
Add a Chronicle projection that populates a read model from events. Invoke the **
|
|
8
|
+
Add a Chronicle projection that populates a read model from events. Invoke the **cratis-chronicle-projection** skill and follow `.cratis/ai/rules/vertical-slices.md` (projections). For reactors, use the **add-reactor** prompt instead.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Add a Chronicle reactor (automation or translation) that reacts to
|
|
|
5
5
|
|
|
6
6
|
# Add a Reactor
|
|
7
7
|
|
|
8
|
-
Add a reactor that observes events and produces side effects. Invoke the **
|
|
8
|
+
Add a reactor that observes events and produces side effects. Invoke the **cratis-chronicle-reactor** skill and follow `.cratis/ai/rules/reactors.md`.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Add a Chronicle reducer to a read model when model-bound and fluent
|
|
|
5
5
|
|
|
6
6
|
# Add a Reducer
|
|
7
7
|
|
|
8
|
-
Add an `IReducerFor<T>` reducer — the last-resort escape hatch for a "current state + event → next state" transition that model-bound projection attributes and fluent `IProjectionFor<T>` cannot express. Invoke the **
|
|
8
|
+
Add an `IReducerFor<T>` reducer — the last-resort escape hatch for a "current state + event → next state" transition that model-bound projection attributes and fluent `IProjectionFor<T>` cannot express. Invoke the **cratis-chronicle-reducer** skill and follow `.cratis/ai/rules/vertical-slices.md`. For ordinary projections, use the **add-projection** prompt instead.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -5,7 +5,7 @@ description: Scaffold a complete vertical slice (backend + specs + frontend) for
|
|
|
5
5
|
|
|
6
6
|
# New Vertical Slice
|
|
7
7
|
|
|
8
|
-
Implement a complete **vertical slice** end-to-end.
|
|
8
|
+
Implement a complete **vertical slice** end-to-end. Follow the Implementation Workflow in `.cratis/ai/rules/application-profile.md` exactly; for a full backend + specs + frontend slice you may hand the work to the **Slice Implementer** agent.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -15,4 +15,4 @@ Implement a complete **vertical slice** end-to-end. Invoke the **new-vertical-sl
|
|
|
15
15
|
|
|
16
16
|
## How it runs
|
|
17
17
|
|
|
18
|
-
Backend → build (Debug + Release) → specs (the in-process `*Scenario` family) → frontend → compose/route, with each quality gate green before the next phase. The authoritative rules are `.cratis/ai/rules/general.md` and `.cratis/ai/rules/vertical-slices.md`; the
|
|
18
|
+
Backend → build (Debug + Release) → specs (the in-process `*Scenario` family) → frontend → compose/route, with each quality gate green before the next phase. The authoritative rules are `.cratis/ai/rules/general.md` and `.cratis/ai/rules/vertical-slices.md`; the rules carry the step-by-step detail. Do not duplicate that detail here.
|
|
@@ -5,7 +5,7 @@ description: Scaffold a new feature — folder structure, composition page, rout
|
|
|
5
5
|
|
|
6
6
|
# Scaffold a Feature
|
|
7
7
|
|
|
8
|
-
Scaffold a brand-new feature folder (composition page, routing, navigation) — ready for slices. Invoke the **
|
|
8
|
+
Scaffold a brand-new feature folder (composition page, routing, navigation) — ready for slices. Follow the Project Layout in `.cratis/ai/rules/application-profile.md` exactly, and Phase 3 of its Implementation Workflow plus the Composition section of `.cratis/ai/rules/react.md` for the composition page and routing. Invoke the **cratis-arc-react-page** skill for the page itself.
|
|
9
9
|
|
|
10
10
|
## Confirm first
|
|
11
11
|
|
|
@@ -13,4 +13,4 @@ Scaffold a brand-new feature folder (composition page, routing, navigation) —
|
|
|
13
13
|
- **Route path** — kebab-case (e.g. `/projects`)
|
|
14
14
|
- **Navigation label** and **icon** (from `react-icons/md`)
|
|
15
15
|
|
|
16
|
-
The feature folder lives directly under the app source root (or under an optional `<Module>/`) — there is no top-level `Features/` wrapper. After scaffolding, add behavior with the **new-vertical-slice** prompt
|
|
16
|
+
The feature folder lives directly under the app source root (or under an optional `<Module>/`) — there is no top-level `Features/` wrapper. After scaffolding, add behavior with the **new-vertical-slice** prompt. The rules carry the step-by-step detail; don't duplicate it here.
|
|
@@ -5,7 +5,7 @@ description: Write comprehensive BDD specs for an existing vertical slice comman
|
|
|
5
5
|
|
|
6
6
|
# Write Specs
|
|
7
7
|
|
|
8
|
-
Write **comprehensive specs** for an existing slice. Invoke the **
|
|
8
|
+
Write **comprehensive specs** for an existing slice. Invoke the **cratis-application-slice-specifications** skill (and **cratis-chronicle-event-specifications** / **cratis-chronicle-read-model-specifications** for constraints and projections); follow `.cratis/ai/rules/specs.md` and `.cratis/ai/rules/specs.csharp.md`.
|
|
9
9
|
|
|
10
10
|
## What to provide
|
|
11
11
|
|
|
@@ -50,7 +50,7 @@ Tagged **[contract]** (framework-enforced) or **[convention]** (house default).
|
|
|
50
50
|
|
|
51
51
|
## Implementation Workflow
|
|
52
52
|
|
|
53
|
-
- **Phase 0 — Model.** Confirm Module/Feature, slice name, slice type, domain rules; for new behavior or unclear event vocabulary run the **event-modeling** skill first.
|
|
53
|
+
- **Phase 0 — Model.** Confirm Module/Feature, slice name, slice type, domain rules; for new behavior or unclear event vocabulary run the **cratis-chronicle-event-modeling** skill first.
|
|
54
54
|
- **Phase 1 — Backend.** Implement a coherent slice change. **Gate:** incremental Debug build of the affected project (regenerates proxies, compiles `#if DEBUG` spec code).
|
|
55
55
|
- **Phase 2 — Specs.** Mandatory for every slice type, in-process scenario family first (`CommandScenario<T>`, `EventScenario`, `ReadModelScenario<T>`, `ReactorScenario<T>`). **Gate:** tests pass.
|
|
56
56
|
- **Phase 3 — Frontend.** Build from the generated proxies, register in the composition page, wire routing. **Gate:** lint, conditional test, build.
|
|
@@ -11,7 +11,7 @@ The framework repos are **libraries**, not event-sourced applications. The appli
|
|
|
11
11
|
|
|
12
12
|
## What still applies (universal rules)
|
|
13
13
|
|
|
14
|
-
Everything tagged `profile: universal` holds in framework repos exactly as in apps: **C# conventions** (`csharp.md`), **TypeScript conventions** (`typescript.md`), **code quality** (`code-quality*.md`), **specs** (`specs.md` / `specs.csharp.md` / `specs.typescript.md` — `Cratis.Specifications` is how the framework tests itself, using the plain `Specification` base + NSubstitute against the classes under test — this is the dominant mode in framework repos. The in-process `*Scenario` family lives in `specs.scenarios.csharp.md` (`profile: application`); it is the *application* default, and a framework repo reaches for it only to test the very engine it provides — Arc → `CommandScenario`, Chronicle → `EventScenario`/`ReadModelScenario`/`ReactorScenario` — not as a general testing mode. The **
|
|
14
|
+
Everything tagged `profile: universal` holds in framework repos exactly as in apps: **C# conventions** (`csharp.md`), **TypeScript conventions** (`typescript.md`), **code quality** (`code-quality*.md`), **specs** (`specs.md` / `specs.csharp.md` / `specs.typescript.md` — `Cratis.Specifications` is how the framework tests itself, using the plain `Specification` base + NSubstitute against the classes under test — this is the dominant mode in framework repos. The in-process `*Scenario` family lives in `specs.scenarios.csharp.md` (`profile: application`); it is the *application* default, and a framework repo reaches for it only to test the very engine it provides — Arc → `CommandScenario`, Chronicle → `EventScenario`/`ReadModelScenario`/`ReactorScenario` — not as a general testing mode. The **cratis-application-slice-specifications** skill is application-oriented), **documentation**, **git-commits**, **pull-requests**, **concepts** (`ConceptAs<T>` / `EventSourceId<T>` are Fundamentals/Chronicle primitives the framework defines and uses), and **American English**.
|
|
15
15
|
|
|
16
16
|
## What does NOT apply
|
|
17
17
|
|
|
@@ -123,4 +123,4 @@ Run the project's frontend test gate (e.g. `yarn test`) for frontend changes; it
|
|
|
123
123
|
- [react.md](./react.md) — MVVM, view-model testability, Arc hooks.
|
|
124
124
|
- [frontend-quality.md](./frontend-quality.md) — the engineering bar these specs serve.
|
|
125
125
|
- [specs.md](./specs.md) — the backend BDD language this mirrors.
|
|
126
|
-
- skill: **
|
|
126
|
+
- skill: **cratis-application-react-specifications** — the step-by-step workflow that applies these conventions.
|
|
@@ -10,8 +10,8 @@ paths:
|
|
|
10
10
|
Extends the base [specs.md](./specs.md) (folder structure, naming, philosophy) with C#-specific conventions. This file is the **universal foundation** used in **both** profiles — the `Cratis.Specifications` pattern (`Establish → Because → should_`) with NSubstitute.
|
|
11
11
|
|
|
12
12
|
> **Which spec surface?**
|
|
13
|
-
> - **Framework / library code** (Chronicle kernel, Arc pipeline, source generators, Fundamentals): the `Specification` base + NSubstitute in this file is the dominant mode — unit-test the classes under test in isolation. Reach for a `*Scenario` helper (in [specs.scenarios.csharp.md](./specs.scenarios.csharp.md)) **only** when testing the very engine your repo provides — Arc → `CommandScenario`, Chronicle → the event/projection/reactor scenarios. The **
|
|
14
|
-
> - **Event-sourced applications on Cratis** (commands, projections, reducers, reactors, constraints): use this base **plus** the in-process scenario family — see **[specs.scenarios.csharp.md](./specs.scenarios.csharp.md)** (`profile: application`) and the **
|
|
13
|
+
> - **Framework / library code** (Chronicle kernel, Arc pipeline, source generators, Fundamentals): the `Specification` base + NSubstitute in this file is the dominant mode — unit-test the classes under test in isolation. Reach for a `*Scenario` helper (in [specs.scenarios.csharp.md](./specs.scenarios.csharp.md)) **only** when testing the very engine your repo provides — Arc → `CommandScenario`, Chronicle → the event/projection/reactor scenarios. The **cratis-application-slice-specifications** skill is application-oriented, not for general framework specs.
|
|
14
|
+
> - **Event-sourced applications on Cratis** (commands, projections, reducers, reactors, constraints): use this base **plus** the in-process scenario family — see **[specs.scenarios.csharp.md](./specs.scenarios.csharp.md)** (`profile: application`) and the **cratis-application-slice-specifications** skill.
|
|
15
15
|
|
|
16
16
|
`Cratis.Specifications` keeps the approach of Machine.Specifications (MSpec): `Establish → Because → should_` maps to "Given → When → Then" and keeps each spec focused on *one setup, one action, one set of assertions*.
|
|
17
17
|
|
|
@@ -184,4 +184,4 @@ These supplement the universal conventions in [specs.csharp.md](./specs.csharp.m
|
|
|
184
184
|
- [specs.csharp.md](./specs.csharp.md) — the universal `Specification` + NSubstitute base this builds on (and what framework specs use).
|
|
185
185
|
- [vertical-slices.md](./vertical-slices.md) — what each artifact promises (the contract under spec).
|
|
186
186
|
- [efcore.specs.md](./efcore.specs.md) — `DbContext` specs with SQLite in-memory.
|
|
187
|
-
- skills: **
|
|
187
|
+
- skills: **cratis-application-slice-specifications**, **cratis-chronicle-event-specifications**, **cratis-chronicle-read-model-specifications**.
|
|
@@ -65,11 +65,11 @@ public record AuthorName(string Value) : ConceptAs<string>(Value)
|
|
|
65
65
|
}
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
**[convention] Placement:** slice-specific concept → in the slice file; feature-shared → feature folder; module-shared → module folder; app-wide → `Common/`. Scan `Common/` and the feature folder before creating a new concept. See [concepts.md](./concepts.md) for full patterns, or invoke the **
|
|
68
|
+
**[convention] Placement:** slice-specific concept → in the slice file; feature-shared → feature folder; module-shared → module folder; app-wide → `Common/`. Scan `Common/` and the feature folder before creating a new concept. See [concepts.md](./concepts.md) for full patterns, or invoke the **cratis-fundamentals-concept** skill.
|
|
69
69
|
|
|
70
70
|
## Commands
|
|
71
71
|
|
|
72
|
-
The command carries input from the caller. `Handle()` is defined directly on the record — never a separate handler class. For step-by-step creation, invoke the **cratis-command** skill.
|
|
72
|
+
The command carries input from the caller. `Handle()` is defined directly on the record — never a separate handler class. For step-by-step creation, invoke the **cratis-arc-command** skill.
|
|
73
73
|
|
|
74
74
|
> This application is event-sourced, so the guidance below assumes a command's `Handle()` returns event(s) that Arc+Chronicle appends. Arc itself is a standalone CQRS framework (see [general.md](./general.md)) — a command may legitimately return a response or `void` and do its work through injected services when a slice isn't event-sourced; the return-shape and "never inject `IEventLog`" rules are the event-sourced default, not universal Arc laws.
|
|
75
75
|
|
|
@@ -86,7 +86,7 @@ The command carries input from the caller. `Handle()` is defined directly on the
|
|
|
86
86
|
| Uniqueness | Chronicle `[Unique]` / `IConstraint` (race-safe) — not a read-model pre-check |
|
|
87
87
|
| Genuinely exceptional failure (bug, missing infra) | `throw` a domain exception |
|
|
88
88
|
|
|
89
|
-
**Do not throw for normal business rejection.** A thrown exception (from `Provide()` or `Handle()`) surfaces as an exception/HTTP 500, *not* a validation result. Recoverable, user-facing rejections are validation: `ValidationResult.Error(...)` via a validator or `Result<,>`. (For step-by-step business-rule placement, invoke the **
|
|
89
|
+
**Do not throw for normal business rejection.** A thrown exception (from `Provide()` or `Handle()`) surfaces as an exception/HTTP 500, *not* a validation result. Recoverable, user-facing rejections are validation: `ValidationResult.Error(...)` via a validator or `Result<,>`. (For step-by-step business-rule placement, invoke the **cratis-arc-command-validation** skill.)
|
|
90
90
|
|
|
91
91
|
### Causation — what a command records **[contract]**
|
|
92
92
|
|
|
@@ -185,7 +185,7 @@ Apply authorization attributes on the `[Command]` record or query method. **[con
|
|
|
185
185
|
|
|
186
186
|
`[EventType]` records are the schema-bound truth of the system.
|
|
187
187
|
|
|
188
|
-
- **[contract] No arguments for new events** — the type name is the identifier. Use `generation:`/id only when evolving an existing contract (invoke the **event-type-
|
|
188
|
+
- **[contract] No arguments for new events** — the type name is the identifier. Use `generation:`/id only when evolving an existing contract (invoke the **cratis-chronicle-event-type-migration** skill).
|
|
189
189
|
- **[contract] Past-tense, one-purpose names** (`AuthorRegistered`, not `Updated`/`FormSubmitted`) — Chronicle requires past-tense, single-purpose facts. Self-describing without slice context.
|
|
190
190
|
- **[contract] Avoid nullable properties** — Chronicle's analyzer warns on nullable event members; model optional facts as a separate event, or resolve a nullable command input to a non-null sentinel before constructing the event.
|
|
191
191
|
- **[contract] Never carry the event-source id** — it's implicit in the event context.
|
|
@@ -210,13 +210,13 @@ public record AuthorRegistered(AuthorName Name);
|
|
|
210
210
|
|
|
211
211
|
## Read Models and Queries
|
|
212
212
|
|
|
213
|
-
**[contract]** `[ReadModel]` records expose queries as `public static` methods; dependencies are plain method parameters (no `[FromServices]`). Default to model-bound projection shape; drop to fluent only when needed. For step-by-step creation, invoke the **cratis-
|
|
213
|
+
**[contract]** `[ReadModel]` records expose queries as `public static` methods; dependencies are plain method parameters (no `[FromServices]`). Default to model-bound projection shape; drop to fluent only when needed. For step-by-step creation, invoke the **cratis-chronicle-read-model** skill.
|
|
214
214
|
|
|
215
215
|
### Query return shapes **[contract]**
|
|
216
216
|
|
|
217
217
|
Stay within analyzer-supported shapes: the read model, `T?`, a collection/array/`IQueryable<T>` of it, `Task<...>` of those, `IAsyncEnumerable<T>`, or `ISubject<...>` of read model/collection.
|
|
218
218
|
|
|
219
|
-
- **`IQueryable<TReadModel>`** → automatic server-side paging/sorting (frontend `useWithPaging` — see the **query-paging** skill). Use it whenever a list can grow.
|
|
219
|
+
- **`IQueryable<TReadModel>`** → automatic server-side paging/sorting (frontend `useWithPaging` — see the **cratis-arc-query-paging** skill). Use it whenever a list can grow.
|
|
220
220
|
- **`ISubject<...>`** → live/observable queries. Return it directly — **never** `Task<ISubject<...>>`.
|
|
221
221
|
- **[contract] Custom paths use `[Path("...")]`** (`PathAttribute`), not ASP.NET `[Route]`. Reserve `[Route]` for controller endpoints (which this convention avoids).
|
|
222
222
|
|
|
@@ -257,7 +257,7 @@ Ladder, first that fits: (1) direct read-model (DCB) injection — only when key
|
|
|
257
257
|
|
|
258
258
|
## Projections **[contract]**
|
|
259
259
|
|
|
260
|
-
Projections build read models from **events** (never from other read models). Use the ladder — for adding one to an existing model, invoke the **
|
|
260
|
+
Projections build read models from **events** (never from other read models). Use the ladder — for adding one to an existing model, invoke the **cratis-chronicle-projection** skill:
|
|
261
261
|
|
|
262
262
|
1. **Model-bound attributes** on the `[ReadModel]`: `[FromEvent<T>]`, `[SetFrom<T>]`, `[SetFromContext<T>]`, `[ChildrenFrom<T>]`, `[RemovedWith<T>]`, `[Nested]`, `[ClearWith<T>]`, counters, `[FromAll]`.
|
|
263
263
|
2. **Fluent `IProjectionFor<T>`** for joins, composite/constant keys, parent-key extraction, context mapping, `.NotRewindable()`, or supported conditional setters. Declarative metadata only — no DI side effects, no imperative `Define()` body, builder lambdas are member access only.
|
|
@@ -280,7 +280,7 @@ Group multi-event constraints under a shared name constant (`<Module>ConstraintN
|
|
|
280
280
|
|
|
281
281
|
## Reactors **[contract]**
|
|
282
282
|
|
|
283
|
-
`IReactor` is a marker interface; dispatch is by the first parameter type. Reactors live only in Automation/Translation slices. See [reactors.md](./reactors.md) for full rules, or invoke the **
|
|
283
|
+
`IReactor` is a marker interface; dispatch is by the first parameter type. Reactors live only in Automation/Translation slices. See [reactors.md](./reactors.md) for full rules, or invoke the **cratis-chronicle-reactor** skill.
|
|
284
284
|
|
|
285
285
|
```csharp
|
|
286
286
|
public Task AuthorRegistered(AuthorRegistered @event, EventContext context) => ...
|
|
@@ -340,4 +340,4 @@ Frontend commands run through the Cratis dialogs — never a vendor or hand-roll
|
|
|
340
340
|
- [concepts.md](./concepts.md) — `ConceptAs<T>` / `EventSourceId<T>` full patterns.
|
|
341
341
|
- [reactors.md](./reactors.md) — reactor signatures and side-effect rules.
|
|
342
342
|
- [specs.md](./specs.md) — `CommandScenario` / `EventScenario` / `ReadModelScenario` / `ReactorScenario`.
|
|
343
|
-
- skills: **event-modeling**, **
|
|
343
|
+
- skills: **cratis-chronicle-event-modeling**, **cratis-arc-command**, **cratis-chronicle-read-model**, **cratis-fundamentals-concept**, **cratis-chronicle-projection**, **cratis-chronicle-reactor**, **cratis-arc-command-validation**, **cratis-chronicle-event-type-migration**, **cratis-arc-command-execution**, **cratis-arc-query-paging**, **cratis-chronicle-multi-tenancy**.
|