@cratis/pi 7.30.0 → 7.32.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/skills/cratis-chronicle-client-dotnet/SKILL.md +14 -0
- package/package/corpus/skills/cratis-chronicle-client-dotnet/references/pinned-generation-delivery.md +92 -0
- package/package/corpus/skills/cratis-chronicle-event-type-migration/SKILL.md +24 -2
- package/package/corpus/skills/cratis-chronicle-event-type-migration/references/pinned-generations.md +114 -0
- package/package/corpus/skills/cratis-screenplay-command-surface/references/compliance.md +40 -0
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +4 -2
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md +71 -3
- package/package.json +1 -1
|
@@ -204,6 +204,20 @@ from `string` (`:158`) and a `Redacted` form for logging (`:152`).
|
|
|
204
204
|
|
|
205
205
|
Read [references/hosting.md](references/hosting.md) when wiring Chronicle into a worker or ASP.NET Core host, or when `AddCratisChronicle` or a namespace resolver does not resolve.
|
|
206
206
|
|
|
207
|
+
## Pin event generations for delivery
|
|
208
|
+
|
|
209
|
+
`ChronicleOptions.EventGenerationDelivery` defaults to `Compatibility`. Opt in
|
|
210
|
+
with `EventGenerationDelivery.Pinned` (`Cratis.Chronicle.Observation`) **before
|
|
211
|
+
connecting**. Reactors and reducers then receive their handler's CLR event
|
|
212
|
+
generation (Chronicle **19.41.0+**); typed materialized projections use each
|
|
213
|
+
clause's declared CLR event generation (**19.48.0+**). These additions are
|
|
214
|
+
verified separately against those release tags, not the baseline above.
|
|
215
|
+
|
|
216
|
+
Read [references/pinned-generation-delivery.md](references/pinned-generation-delivery.md)
|
|
217
|
+
for compiling standalone/host configuration, registration constraints, and the
|
|
218
|
+
Compatibility-only surfaces. For migration, PDL pin persistence, and integration
|
|
219
|
+
test requirements, use **cratis-chronicle-event-type-migration**.
|
|
220
|
+
|
|
207
221
|
## The client and the server check each other
|
|
208
222
|
|
|
209
223
|
The client runs the server-side compatibility check automatically inside `Connect()`; a genuine mismatch throws `IncompatibleServerException`, while a transport error is logged and ignored by design.
|
|
@@ -0,0 +1,92 @@
|
|
|
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
|
+
# Pin event generations before connecting
|
|
5
|
+
|
|
6
|
+
Requires Chronicle **19.41.0+** for client reactors/reducers and **19.48.0+** for
|
|
7
|
+
typed materialized projections. Upgrade every kernel silo before enabling the
|
|
8
|
+
option. `Compatibility` remains the default; adding a generation alone does not
|
|
9
|
+
opt consumers in.
|
|
10
|
+
|
|
11
|
+
## Standalone client
|
|
12
|
+
|
|
13
|
+
This configuration excerpt uses `Cratis.Chronicle` **19.48.0** and a running
|
|
14
|
+
local development kernel. Keep the client alive for observation; supply logging
|
|
15
|
+
and a service provider when the application's observers need them (see the main
|
|
16
|
+
skill's standalone checklist).
|
|
17
|
+
|
|
18
|
+
```csharp
|
|
19
|
+
using Cratis.Chronicle;
|
|
20
|
+
using Cratis.Chronicle.Connections;
|
|
21
|
+
using Cratis.Chronicle.Observation;
|
|
22
|
+
|
|
23
|
+
var options = new ChronicleOptions(ChronicleConnectionString.Development)
|
|
24
|
+
{
|
|
25
|
+
EventGenerationDelivery = EventGenerationDelivery.Pinned
|
|
26
|
+
};
|
|
27
|
+
using var client = new ChronicleClient(options);
|
|
28
|
+
var eventStore = await client.GetEventStore("People");
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Host integration
|
|
32
|
+
|
|
33
|
+
`AddCratisChronicle` extends `IHostApplicationBuilder` (an `IHostBuilder`
|
|
34
|
+
overload also exists), **not** `IServiceCollection`. Its `ChronicleClientOptions` inherits the delivery option.
|
|
35
|
+
This worker-host configuration excerpt uses `Cratis.Chronicle` **19.48.0** and
|
|
36
|
+
`Microsoft.Extensions.Hosting`; add the application's hosted worker and start
|
|
37
|
+
the host as usual.
|
|
38
|
+
|
|
39
|
+
```csharp
|
|
40
|
+
using Cratis.Chronicle.Observation;
|
|
41
|
+
using Microsoft.Extensions.Hosting;
|
|
42
|
+
|
|
43
|
+
var builder = Host.CreateApplicationBuilder();
|
|
44
|
+
builder.AddCratisChronicle(options =>
|
|
45
|
+
{
|
|
46
|
+
options.EventStore = "People";
|
|
47
|
+
options.EventGenerationDelivery = EventGenerationDelivery.Pinned;
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Scope and registration
|
|
52
|
+
|
|
53
|
+
- Reactors and reducers pin the generation of the handler's CLR event type.
|
|
54
|
+
Typed materialized projections (fluent, model-bound, or explicitly registered)
|
|
55
|
+
pin each clause's declared CLR event generation. Live, catch-up, and replay
|
|
56
|
+
(and, for reactors and reducers, partition retry) use kernel generation
|
|
57
|
+
selection and schema-guided release.
|
|
58
|
+
- Projection pins cover `From`, `Join`, children, nested objects, removals,
|
|
59
|
+
event-content keys, and parent keys. Stored join/parent-event lookups select
|
|
60
|
+
and release through the same boundary as incoming events.
|
|
61
|
+
- **One generation per event identifier per observer/projection**, across every
|
|
62
|
+
handler or clause, including children and nested objects. Different
|
|
63
|
+
identifiers may pin different generations. Client validation throws
|
|
64
|
+
`Cratis.Chronicle.Observation.MultipleGenerationsOfEventTypeInObserver` for
|
|
65
|
+
conflicting pins; the kernel rejects them with
|
|
66
|
+
`ObserverPinsMultipleGenerationsOfEventType`. Kernel observer subscription
|
|
67
|
+
rejects an unregistered generation with
|
|
68
|
+
`EventTypeGenerationNotRegisteredForObserver`; projection schema resolution
|
|
69
|
+
can reject an unavailable pin with `PinnedEventTypeGenerationUnavailable`.
|
|
70
|
+
- Immediate/passive and wildcard (`all`/`FromAll`) projections stay
|
|
71
|
+
`Compatibility` when built through the .NET client. A definition explicitly
|
|
72
|
+
submitted as both wildcard and `Pinned` is unsupported and rejected by the
|
|
73
|
+
kernel with `EventGenerationDeliveryNotSupported`; the option does not make
|
|
74
|
+
wildcard pinning work.
|
|
75
|
+
- Ad-hoc queries/event reads are not opted in. Neither are webhooks, captures,
|
|
76
|
+
or event-store subscriptions. Do not generalize this option to every read
|
|
77
|
+
path, or to unreleased generation-delivery work.
|
|
78
|
+
|
|
79
|
+
For delivery-time migration, persisted PDL pins, and testing limits, read
|
|
80
|
+
[the migration reference](../../cratis-chronicle-event-type-migration/references/pinned-generations.md).
|
|
81
|
+
|
|
82
|
+
## Product sources
|
|
83
|
+
|
|
84
|
+
Verified at `Cratis/Chronicle` **v19.48.0**:
|
|
85
|
+
`Source/Clients/DotNET/ChronicleOptions.cs`,
|
|
86
|
+
`Observation/EventGenerationDelivery.cs`,
|
|
87
|
+
`ChronicleHostApplicationBuilderExtensions.cs`,
|
|
88
|
+
`Projections/ProjectionGenerationDeliveryValidation.cs`, and
|
|
89
|
+
`Source/Kernel/Core/Projections/Engine/ProjectionFactory.cs`.
|
|
90
|
+
The option and reactor/reducer validation also exist at **v19.41.0**.
|
|
91
|
+
|
|
92
|
+
See [Chronicle's pinned observer delivery documentation](https://github.com/Cratis/Chronicle/blob/v19.48.0/Documentation/concepts/event-type-migrations.mdx#opt-in-to-pinned-observer-delivery).
|
|
@@ -51,8 +51,9 @@ public sealed class EventTypeAttribute(string id = "", uint generation = 1) : At
|
|
|
51
51
|
|
|
52
52
|
`id` defaults to the CLR type name and `generation` starts at `1`. The attribute
|
|
53
53
|
is not repeatable, so two generations are always two distinct CLR types.
|
|
54
|
-
Chronicle
|
|
55
|
-
|
|
54
|
+
Chronicle chains adjacent migrations to produce another generation. This is a
|
|
55
|
+
possible upcast path, **not a promise that every observer receives the latest
|
|
56
|
+
generation**; delivery policy is described below:
|
|
56
57
|
|
|
57
58
|
```text
|
|
58
59
|
Generation 1 (stored) -> Migration 1->2 -> Migration 2->3 -> Current (Generation 3)
|
|
@@ -212,6 +213,23 @@ Migrations are discovered by convention — nothing is registered. They are
|
|
|
212
213
|
activated through the service provider, so a migration may take constructor
|
|
213
214
|
dependencies.
|
|
214
215
|
|
|
216
|
+
## Choose the generation an observer receives
|
|
217
|
+
|
|
218
|
+
`Compatibility` remains the default. With
|
|
219
|
+
`ChronicleOptions.EventGenerationDelivery = EventGenerationDelivery.Pinned`,
|
|
220
|
+
reactors and reducers receive the generation of their handler's CLR event type
|
|
221
|
+
(verified at **19.41.0**). Typed materialized projection clauses receive the
|
|
222
|
+
generation they declare (verified at **19.48.0**), including joins, children,
|
|
223
|
+
removals, and event-content keys on live, catch-up, and replay.
|
|
224
|
+
|
|
225
|
+
Read [references/pinned-generations.md](references/pinned-generations.md) for
|
|
226
|
+
missing-generation migration, release and revision behavior, registration
|
|
227
|
+
rejections, persisted PDL pins, and testing limits. Configure the opt-in through
|
|
228
|
+
**cratis-chronicle-client-dotnet**; do not invent generation-qualified Screenplay
|
|
229
|
+
syntax. `ReadModelScenario` and `ReactorScenario` do **not** emulate the kernel's
|
|
230
|
+
pinned-generation migration and release; prove delivery with real-client
|
|
231
|
+
integration, not a scenario-only assertion.
|
|
232
|
+
|
|
215
233
|
## Do not model absence with a nullable property
|
|
216
234
|
|
|
217
235
|
**CHR0012** (warning) flags a nullable property on an `[EventType]` record.
|
|
@@ -246,3 +264,7 @@ is expected, since the prior generation records history rather than new intent.
|
|
|
246
264
|
outstanding.
|
|
247
265
|
- Old-generation events replay into the current shape through the read-model
|
|
248
266
|
specifications for the affected observers.
|
|
267
|
+
- With `EventGenerationDelivery.Pinned`, real-client integration also verifies
|
|
268
|
+
old-generation events on live delivery, catch-up, and replay into each
|
|
269
|
+
observer's pinned generation; in-process read-model/reactor scenarios alone
|
|
270
|
+
do not prove kernel migration and release.
|
package/package/corpus/skills/cratis-chronicle-event-type-migration/references/pinned-generations.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
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
|
+
# Migrations and pinned delivery
|
|
5
|
+
|
|
6
|
+
## Contents
|
|
7
|
+
|
|
8
|
+
- What a pinned consumer receives
|
|
9
|
+
- PDL pins are resolved once, when saved
|
|
10
|
+
- Verify delivery through a real client
|
|
11
|
+
- Product sources
|
|
12
|
+
|
|
13
|
+
Verified against Chronicle **v19.48.0**. Reactor/reducer opt-in shipped in
|
|
14
|
+
**19.41.0**; typed materialized projection opt-in shipped in **19.48.0**.
|
|
15
|
+
Configure `ChronicleOptions.EventGenerationDelivery` before connecting; see
|
|
16
|
+
[standalone and host examples](../../cratis-chronicle-client-dotnet/references/pinned-generation-delivery.md).
|
|
17
|
+
|
|
18
|
+
## What a pinned consumer receives
|
|
19
|
+
|
|
20
|
+
The kernel selects the pinned generation's content and hash, and releases
|
|
21
|
+
protected values using **that generation's schema**. A reactor or reducer pins
|
|
22
|
+
its handler's CLR event generation. A typed materialized projection uses the
|
|
23
|
+
CLR generation each clause declares, including joins, children, nested objects,
|
|
24
|
+
removals, event-content keys, and parent keys. Incoming live, catch-up, and replay
|
|
25
|
+
events and stored join/parent-event lookups use the same release boundary.
|
|
26
|
+
|
|
27
|
+
`EventContext.EventType.Generation` is the delivered generation;
|
|
28
|
+
`EventContext.AppendedGeneration` is the original append generation, or null for
|
|
29
|
+
legacy events where it is unknown. Do not infer the append generation from the
|
|
30
|
+
handler type.
|
|
31
|
+
|
|
32
|
+
If the pinned generation's content is missing from storage, Chronicle releases
|
|
33
|
+
the known appended generation (or the highest stored generation for legacy
|
|
34
|
+
events), then runs the adjacent `EventTypeMigration` upcast/downcast chain to the
|
|
35
|
+
pin **for this delivery only**. It neither persists that result nor caches
|
|
36
|
+
plaintext. The delivered hash is `EventHash.NotSet` because no durable hash
|
|
37
|
+
exists for that migrated content. Erased PII stays erased through migration.
|
|
38
|
+
An unavailable registered pin or an unreachable migration target fails with
|
|
39
|
+
`PinnedEventTypeGenerationUnavailable`, rather than silently substituting a
|
|
40
|
+
schema.
|
|
41
|
+
|
|
42
|
+
Revised events use their **latest revision**, migrating it to the pin when
|
|
43
|
+
needed. The revision's stored hash is retained only when its generation already
|
|
44
|
+
matches the pin; otherwise the delivered hash is `EventHash.NotSet`. SQL
|
|
45
|
+
revisions from before this release cannot be distinguished from original
|
|
46
|
+
content and retain existing generation-selection behavior until revised again.
|
|
47
|
+
|
|
48
|
+
Every observer/projection may pin **only one generation per event identifier**
|
|
49
|
+
across all handlers/clauses, including children and nested objects. Different
|
|
50
|
+
identifiers may pin different generations. See the client reference for the
|
|
51
|
+
client and kernel registration exception names. Changing a reactor/reducer's
|
|
52
|
+
pin or delivery mode does not itself trigger replay; request replay when prior
|
|
53
|
+
state needs rebuilding.
|
|
54
|
+
|
|
55
|
+
## PDL pins are resolved once, when saved
|
|
56
|
+
|
|
57
|
+
For a PDL definition saved with `GenerationDelivery = Pinned`, a bare reference
|
|
58
|
+
such as `from PersonRegistered` resolves to the **highest registered generation
|
|
59
|
+
at registration time**. The definition persists that resolved pin. Join and
|
|
60
|
+
removal references, including children and nested references, follow the same
|
|
61
|
+
rule.
|
|
62
|
+
|
|
63
|
+
Registering a later generation does **not** advance an existing saved pin.
|
|
64
|
+
Re-saving the declaration resolves bare names again against the generations
|
|
65
|
+
registered at that time. Keep this distinction when deploying migrations: a
|
|
66
|
+
saved declaration is not a moving "latest" subscription.
|
|
67
|
+
|
|
68
|
+
PDL is owned by Screenplay and has **no generation-qualified event reference
|
|
69
|
+
syntax**. Never invent `PersonRegistered+2` or `Event+N`. When an explicit pin is
|
|
70
|
+
needed, use .NET fluent or model-bound builders with that generation's CLR event
|
|
71
|
+
type: for example, a `From<TEvent>` clause or `[FromEvent<TEvent>]` whose
|
|
72
|
+
`TEvent` carries the intended `[EventType]` or `[EventTypeGenerationFor<T>]`.
|
|
73
|
+
Do not mix two generations of the same identifier in different clauses.
|
|
74
|
+
|
|
75
|
+
Compatibility PDL retains bare-name generation **1** and identifier-only
|
|
76
|
+
dispatch. Immediate/passive and wildcard projections remain Compatibility;
|
|
77
|
+
ad-hoc queries are not opted in by this change. Do not use their results as
|
|
78
|
+
proof of pinned delivery.
|
|
79
|
+
|
|
80
|
+
## Verify delivery through a real client
|
|
81
|
+
|
|
82
|
+
`ReadModelScenario` and `ReactorScenario` do **not** emulate kernel pinned
|
|
83
|
+
migration and protected-value release. The projection scenario preserves a
|
|
84
|
+
seeded event's generation, but that is not the kernel selecting or migrating
|
|
85
|
+
stored content. A scenario that feeds the desired CLR type only proves local
|
|
86
|
+
handling/mapping for that type.
|
|
87
|
+
|
|
88
|
+
Keep local decision/mapping specifications, and add **real-client integration**
|
|
89
|
+
against a matching kernel to prove generation delivery:
|
|
90
|
+
|
|
91
|
+
- Register both generations and their adjacent migration; use one pin per
|
|
92
|
+
identifier. Assert that conflicting pins are rejected.
|
|
93
|
+
- Append another generation and assert delivered content and
|
|
94
|
+
`EventContext.EventType.Generation` on reactors/reducers, plus projected state
|
|
95
|
+
for typed materialized projections. Check `AppendedGeneration` separately.
|
|
96
|
+
- Cover live delivery, catch-up, and replay; exercise contributing joins,
|
|
97
|
+
children, removals, and event-content/parent keys when the projection uses
|
|
98
|
+
them. Include missing stored generations and protected values when relevant.
|
|
99
|
+
- For saved PDL, verify that adding a generation preserves the old pin and that
|
|
100
|
+
re-saving resolves the bare reference anew.
|
|
101
|
+
|
|
102
|
+
Kernel specs provide product-level proof; in-process application scenarios are
|
|
103
|
+
not a replacement for real-client integration of this option.
|
|
104
|
+
|
|
105
|
+
## Product sources
|
|
106
|
+
|
|
107
|
+
`Source/Kernel/Core/Events/EventGenerationRelease.cs` selects stored content,
|
|
108
|
+
releases with the selected schema, and migrates missing/revised generations.
|
|
109
|
+
`Source/Kernel/Core/Projections/ProjectionGenerationDeliveryValidation.cs`
|
|
110
|
+
validates all clauses; `Engine/DefinitionLanguage/ProjectionEventTypeReference.cs`
|
|
111
|
+
resolves PDL bare names. `Source/Clients/Testing/ReadModels/ProjectionReadModelProcessor.cs`
|
|
112
|
+
and `Reactors/ReactorScenario.cs` define the scenario boundary.
|
|
113
|
+
|
|
114
|
+
See [Chronicle's event type migration documentation](https://github.com/Cratis/Chronicle/blob/v19.48.0/Documentation/concepts/event-type-migrations.mdx#opt-in-to-pinned-observer-delivery).
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
## Contents
|
|
7
7
|
|
|
8
8
|
- Classify the value on its concept
|
|
9
|
+
- Recover classification from C# with Arc 22.70.0
|
|
9
10
|
- Declare the use separately
|
|
10
11
|
- Identify the person, not the stream
|
|
11
12
|
|
|
@@ -63,6 +64,45 @@ This mapping is not admission: either marker, including qualifiers and scopes,
|
|
|
63
64
|
still blocks executable binding with PLAY0268. Subject lineage is a different
|
|
64
65
|
role, described below.
|
|
65
66
|
|
|
67
|
+
## Recover classification from C# with Arc 22.70.0
|
|
68
|
+
|
|
69
|
+
Reverse generation is not the C# provider mapping above. Source authority: Arc
|
|
70
|
+
`v22.70.0:Documentation/backend/csharp/generating-a-screenplay.md` (Operational
|
|
71
|
+
secrets), `Source/DotNET/Screenplay/Emission/Concepts/ConceptSyntaxBuilder.cs`
|
|
72
|
+
and `Source/DotNET/Screenplay/Analysis/Types/PersonalDataMarkings.cs`.
|
|
73
|
+
Check the generator package actually loaded; the CLI's bundle may be older.
|
|
74
|
+
|
|
75
|
+
- Both `[Encrypted]` and `[NotAudited]` must be on the concept to recover
|
|
76
|
+
`secret`. Partial or member-specific markings report SP0058 (Information),
|
|
77
|
+
without adding `secret`; existing `pii` remains.
|
|
78
|
+
- For `[Encrypted(EncryptionScope.Namespace)]` or Global plus `[NotAudited]`,
|
|
79
|
+
default output keeps bare `secret` and reports SP0061 (Information), naming
|
|
80
|
+
the unstated scope. It therefore implies Subject, not the source scope.
|
|
81
|
+
Set `ScreenplayOptions.AuthoringOnlyConstructs = true` (CLI adapter flag
|
|
82
|
+
`--authoring-only-constructs`) to state `secret scope namespace` or
|
|
83
|
+
`secret scope global` in the concept body. Subject stays implicit. Scope
|
|
84
|
+
is syntax-only: it raises no ESM version and grants no executable admission.
|
|
85
|
+
`pii secret` gets no scope because the providers ignore it.
|
|
86
|
+
- A property or positional constructor parameter marked `[PII]` on a non-concept
|
|
87
|
+
type reports SP0062 (Information); the marking is not stated and no concept
|
|
88
|
+
is invented. Preserve the source protection, record the loss, and introduce a
|
|
89
|
+
personal-data concept in source or the intentional candidate.
|
|
90
|
+
- Member `[PII]` promotes an existing concept to `pii` across all its uses.
|
|
91
|
+
SP0063 (Information) lists unmarked analyzed uses when the concept itself
|
|
92
|
+
lacks `[PII]`. Review that widening: explicitly classify the concept if the
|
|
93
|
+
meaning is shared, or separate personal and nonpersonal meanings into distinct
|
|
94
|
+
concepts. No SP0063 is reported if the concept is marked or all analyzed uses
|
|
95
|
+
are marked. Never remove protection merely to silence the diagnostic.
|
|
96
|
+
- Protected identity concepts keep their identities/routes but lose their
|
|
97
|
+
annotations with SP0059 (Information, now worded `pii/secret`); record the
|
|
98
|
+
protection loss and use a surrogate identity, not a declassified payload value.
|
|
99
|
+
|
|
100
|
+
Reasons, special/criminal qualifiers and purposes are not inferred. Changing
|
|
101
|
+
scope for persisted events still needs a new generation. Every diagnostic is a
|
|
102
|
+
loss or review item, including Information; see legacy-extraction
|
|
103
|
+
[generate notes](../../cratis-screenplay-legacy-extraction/references/generate-notes.md)
|
|
104
|
+
for the self-check contract and compiler-upgrade handling.
|
|
105
|
+
|
|
66
106
|
## Declare the use separately
|
|
67
107
|
|
|
68
108
|
```screenplay
|
|
@@ -41,6 +41,7 @@ v19.32.0): `cratis-screenplay-toolchain` `references/versions.md`. Checked at th
|
|
|
41
41
|
| --- | --- |
|
|
42
42
|
| `generate` options, no default-file certainty (stdout when `--file` is absent), spec-project exclusion by name, `CLI0005/0009/0014-0017` | cli `v3.28.2:Source/Cli/Commands/Screenplay/{GenerateScreenplayCommand,GenerateScreenplaySettings,ScreenplayProjectSelection,ScreenplayDiagnosticCodes}.cs` |
|
|
43
43
|
| `SP0016` (rule in code, computed message, `When`/`Unless` written as unconditional), `SP0024` (source did not compile) | Arc `v22.50.5:Source/DotNET/Screenplay/ScreenplayDiagnosticCodes.cs`, `Documentation/backend/csharp/generating-a-screenplay.md` |
|
|
44
|
+
| Non-default secret scope in authoring mode, SP0061–SP0063, self-check contract on compiler upgrades | Arc `v22.70.0:Documentation/backend/csharp/generating-a-screenplay.md`, `Source/DotNET/Screenplay/Verification/ExpectedBindingDiagnostics.cs`; `references/generate-notes.md` |
|
|
44
45
|
| `prologue start` is an interactive wizard that writes `cratis-prologue.json`; `interpret` resolves its language model from the Prologue file, then the global CLI configuration (cli#241 open) | cli `v3.28.2:Source/Cli/Commands/Prologue/{StartPrologueCommand,LlmOptionsResolver}.cs`, `Documentation/reference/prologue.md` |
|
|
45
46
|
| Extractor effects (CDC enable, publication and replication slot), POST/PUT/DELETE only, 2 s correlation window, interpret payload (uncapped model outline and names, observed lists capped at 50, schema tables capped per schema observation), existing slot/publication reused; cleanup missing (Prologue#37) | Prologue `ad4bbe7:Source/Extractor/Sources/**`, `Source/Configuration/*`, `Source/Interpretation/EvidenceFormatter.cs` |
|
|
46
47
|
| `then error`, `then denied`, `unique ... released by` | Screenplay `v4.66.0:Documentation/screenplay/{specifications,constraints}.md` |
|
|
@@ -154,8 +155,9 @@ chain per slice before handoff (evidence template); never manufacture references
|
|
|
154
155
|
`unique ... on <every event that sets it>` with `released by`
|
|
155
156
|
(`references/rule-modeling.md`);
|
|
156
157
|
- preserve personal-data/secret protection and authorization found in code,
|
|
157
|
-
using
|
|
158
|
-
|
|
158
|
+
using `pii` / `secret` and evidenced secret scope; Arc 22.70.0 recovery
|
|
159
|
+
losses (SP0061–SP0063) need review (`references/generate-notes.md`).
|
|
160
|
+
Deprecated marker repairs keep legal notes intact, never guess a purpose or basis. Derive purpose/use/retention
|
|
159
161
|
declarations only from evidence or expert decisions; run `--check purposes`
|
|
160
162
|
and inspect the processing record as prompts, not a legal verdict. Keep
|
|
161
163
|
hand-joined legacy ids scalar; never infer composite parts by splitting text.
|
package/package/corpus/skills/cratis-screenplay-legacy-extraction/references/generate-notes.md
CHANGED
|
@@ -7,6 +7,8 @@
|
|
|
7
7
|
- Coverage (what a provider reads)
|
|
8
8
|
- Diagnostics are the loss list
|
|
9
9
|
- Arc recovery and authoring-only options
|
|
10
|
+
- Arc 22.70.0 compliance recovery
|
|
11
|
+
- Generated-document self-check on compiler upgrades
|
|
10
12
|
- Reading the output cheaply
|
|
11
13
|
|
|
12
14
|
Flags verified with `cratis screenplay generate --help` on the version recorded in
|
|
@@ -17,9 +19,16 @@ cratis-screenplay-toolchain `references/versions.md`; behaviour from the cratis
|
|
|
17
19
|
Screenplay.CritterStack `v0.24.0`. Version-specific capability facts belong in cratis-screenplay-toolchain
|
|
18
20
|
`references/versions.md`.
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
22
|
+
For the current standalone compiler and CLI bundle, use the toolchain's
|
|
23
|
+
[version table](../../cratis-screenplay-toolchain/references/versions.md).
|
|
24
|
+
The compliance and self-check sections below are source-checked at Arc 22.70.0
|
|
25
|
+
(`Documentation/backend/csharp/generating-a-screenplay.md`,
|
|
26
|
+
`Analysis/Types/{ConceptRegistry,PersonalDataMarkings,TypesTheDocumentCannotName}.cs`,
|
|
27
|
+
`Emission/Concepts/ConceptSyntaxBuilder.cs`, `Emission/ProtectedIdentityAnnotations.cs`
|
|
28
|
+
and `Verification/ExpectedBindingDiagnostics.cs` under `Source/DotNET/Screenplay/`).
|
|
29
|
+
They require that generator release, not an older bundled adapter;
|
|
30
|
+
a standalone compiler upgrade does not upgrade the generator.
|
|
31
|
+
|
|
23
32
|
Option/admission evidence checked at CLI 3.41.0: released
|
|
24
33
|
`GenerateScreenplaySettings.cs`, `ArcScreenplayGeneration.cs`, v7 planning specs
|
|
25
34
|
and `Documentation/reference/screenplay.md`; older diagnostic probes below keep
|
|
@@ -107,6 +116,65 @@ Handler/reaction bodies, unresolved conditions and unproven origins still need
|
|
|
107
116
|
source review. Do not infer generation/evolution/absence-assertion coverage from
|
|
108
117
|
a package upgrade; read diagnostics and reconcile each recovered scenario.
|
|
109
118
|
|
|
119
|
+
## Arc 22.70.0 compliance recovery
|
|
120
|
+
|
|
121
|
+
A concept with both `[Encrypted]` and `[NotAudited]` becomes `secret`.
|
|
122
|
+
Encryption or audit suppression alone, or only on a member, does not establish
|
|
123
|
+
that concept-wide contract: SP0058 (Information) reports the partial marking
|
|
124
|
+
without adding `secret`; an existing `pii` classification remains.
|
|
125
|
+
|
|
126
|
+
- Subject scope, omitted or explicit, stays bare `secret`.
|
|
127
|
+
- `[Encrypted(EncryptionScope.Namespace)]` plus `[NotAudited]` on the concept
|
|
128
|
+
emits bare `secret` by default and SP0061 (Information) names the unstated
|
|
129
|
+
`namespace` scope: the document instead implies Subject scope. Global behaves
|
|
130
|
+
the same way. Set `ScreenplayOptions.AuthoringOnlyConstructs = true` (CLI
|
|
131
|
+
adapter option `--authoring-only-constructs`) to emit `secret scope namespace`
|
|
132
|
+
or `secret scope global` in the concept body. Scope is syntax-only and does
|
|
133
|
+
not raise the ESM version; it does not make protected concepts executable.
|
|
134
|
+
- A concept also marked `[PII]` becomes `pii secret`, with no emitted scope:
|
|
135
|
+
the C# providers render only `[PII]`; Chronicle rejects `[PII]` combined with
|
|
136
|
+
`[Encrypted]`. Do not add a scope the provider ignores.
|
|
137
|
+
|
|
138
|
+
Member `[PII]` is read from properties and matching positional constructor
|
|
139
|
+
parameters. Two losses that previously needed manual detection now have
|
|
140
|
+
Information diagnostics:
|
|
141
|
+
|
|
142
|
+
| Code | What the document says or loses | Resolve in source or the intentional candidate |
|
|
143
|
+
| --- | --- | --- |
|
|
144
|
+
| SP0062 | `[PII]` on a non-concept member (for example, a String) is not stated; the diagnostic names `Type.Member`. No concept is invented. | Introduce a personal-data concept with evidence-backed meaning; keep the original protection and record the lost marking until resolved. |
|
|
145
|
+
| SP0063 | A member marking promotes its concept to `pii` everywhere; the diagnostic lists unmarked analyzed uses that acquire that classification. | Review every listed use. If all carry personal data, make the concept-wide classification explicit; if meanings differ, separate the concepts rather than remove `pii`. |
|
|
146
|
+
|
|
147
|
+
SP0063 is absent when the concept itself has `[PII]` or every analyzed use is
|
|
148
|
+
marked. Its list covers analyzed uses, not proof of all runtime use sites.
|
|
149
|
+
Reasons, special/criminal qualifiers and processing purposes are not inferred.
|
|
150
|
+
|
|
151
|
+
SP0059 (Information) reports that an identity concept's `pii/secret` annotations
|
|
152
|
+
were left off because Screenplay rejects protected identifiers, destinations and
|
|
153
|
+
stream ids (PLAY0515). The identity/route is retained, not the protection. Record
|
|
154
|
+
that loss and design a surrogate identity; never treat the generated omission as
|
|
155
|
+
authority to remove source protection. SP0058/SP0059 now say `secret` and
|
|
156
|
+
`pii/secret`, not the deprecated `sensitive`/`@pii` vocabulary.
|
|
157
|
+
See command-surface [compliance](../../cratis-screenplay-command-surface/references/compliance.md)
|
|
158
|
+
for classification and persisted-event scope changes.
|
|
159
|
+
|
|
160
|
+
## Generated-document self-check on compiler upgrades
|
|
161
|
+
|
|
162
|
+
Arc compiles and binds its printed document. `ExpectedBindingDiagnostics` tolerates
|
|
163
|
+
only exact known admission-limit messages (PLAY0268) and the permitted legacy
|
|
164
|
+
consistency messages (PLAY0271), not every diagnostic with those codes.
|
|
165
|
+
The loaded compiler's contract must list the code as neither retired nor reserved
|
|
166
|
+
and include Error among its supported severities. A missing, retired, reserved or
|
|
167
|
+
non-error-only code loses the exemption even if an old message still matches.
|
|
168
|
+
Changed or unknown messages also fail closed.
|
|
169
|
+
|
|
170
|
+
After upgrading Screenplay, rerun generation and inspect the self-check instead
|
|
171
|
+
of carrying forward an old waiver. Unexpected binding errors become SP0056
|
|
172
|
+
(Warning for standalone generation, Information for embedded generation); Arc's
|
|
173
|
+
end-to-end gate rejects any SP0056 regardless of severity. Resolve a changed
|
|
174
|
+
admission contract or report a generator defect; do not strip protection or widen
|
|
175
|
+
the exemption. This check is distinct from a clean source-validation result and
|
|
176
|
+
does not prove the model renders or executes.
|
|
177
|
+
|
|
110
178
|
## Reading the output cheaply
|
|
111
179
|
1. V1 on `.ai-work/screenplay/<model-slug>/legacy/static` (folder mode) with the tool and
|
|
112
180
|
command `cratis-screenplay-toolchain` selects, named with its version; record counts, do
|