@cratis/pi 7.91.0 → 7.92.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.
@@ -171,9 +171,9 @@
171
171
  }
172
172
  ],
173
173
  "synced": {
174
- "version": "4.231.0",
174
+ "version": "4.232.0",
175
175
  "date": "2026-10-19",
176
- "by": "Cratis/AI#808"
176
+ "by": "Cratis/AI#823"
177
177
  },
178
178
  "covers": {
179
179
  "skills": [
@@ -80,6 +80,9 @@ MCP can declare a missing produced event (`PLAY0166`), add explicit routing
80
80
  (`PLAY0478`), remove a redundant pin (`PLAY0471`), or remove an inline identifier
81
81
  copy (`PLAY0469`). The last **changes the event contract**, retires a property,
82
82
  refuses affected consumers/opaque implementations and is not fix-all. It does
83
- not establish that stored data is safe to migrate. Use
83
+ not establish that stored data is safe to migrate; for a contract that may have been
84
+ stored, `propose-property` `remove` with `newGeneration: true` extracts the event and
85
+ drafts a new generation (a source draft, never deployment ready; requires Screenplay
86
+ 4.232.0, `screenplay --version`). Use
84
87
  `cratis-screenplay-model-authoring` for discovery, preview, extraction and rename.
85
88
 
@@ -175,7 +175,7 @@ Choose formatting and disclose dropped comments before apply:
175
175
 
176
176
  ## Repair or extract before rewriting
177
177
 
178
- Read `read-workspace` with `view: "repairs"` at the same revision as diagnostics and pass the repair to `propose-repair`; use `propose-extract-inline-event` before adding generations. `PLAY0469` changes the event contract, so ask about stored contracts first. No automatic generation-evolution repair ships. `PLAY0479`: migrate optionality spelling with `PreserveTrivia`. `eventNeverPersisted: true` cannot unfreeze admitted revisions. Differing event pins carry `storedName` in ESM v16, shared by all generations and unique (PLAY0472). Read [references/repairs.md](references/repairs.md) when fixing `PLAY0166`, `PLAY0478`, `PLAY0516` or `PLAY0683`, or admitting a [release baseline](references/release-baseline.md). Read [references/destination-intent-repair.md](references/destination-intent-repair.md) when `PLAY0470` needs a repair.
178
+ Read `read-workspace` with `view: "repairs"` at the same revision as diagnostics and pass the repair to `propose-repair`; use `propose-extract-inline-event` before adding generations, or let a `remove` with `newGeneration: true` extract the inline event itself, as [property links](references/property-links.md) describes. `PLAY0469` changes the event contract, so ask about stored contracts first. No automatic generation-evolution repair ships. `PLAY0479`: migrate optionality spelling with `PreserveTrivia`. `eventNeverPersisted: true` cannot unfreeze admitted revisions. Differing event pins carry `storedName` in ESM v16, shared by all generations and unique (PLAY0472). Read [references/repairs.md](references/repairs.md) when fixing `PLAY0166`, `PLAY0478`, `PLAY0516` or `PLAY0683`, or admitting a [release baseline](references/release-baseline.md). Read [references/destination-intent-repair.md](references/destination-intent-repair.md) when `PLAY0470` needs a repair.
179
179
 
180
180
  ## Choose a readable layout
181
181
 
@@ -319,7 +319,7 @@ with `view: "diagnostics"`, then `view: "repairs"` at the current revision.
319
319
  | `PLAY0166` | Declare a missing command-produced event in its slice. Infer known command-path types (retaining concepts) or `$context.occurred` as `DateTime`; refuse uncertain/conflicting shapes, imports, existing declarations, cross-file producers and parser-invalid workspaces. |
320
320
  | `PLAY0478` | Add `for <identifier>` to a plain production. Both models must be executable; refuse a version change or retargeting another production. This changes routing: accept only if the identifier, not allocation, is intended; `canFixAll: false`. |
321
321
  | `PLAY0471` | Remove a redundant event id only with unchanged executable model, catalog and comments. |
322
- | `PLAY0469` | Remove an inline same-source identifier property and mapping, retiring its semantic address. This changes the contract; `canFixAll` is false. Refuse other consumers, opaque impact, changed routing or comment loss. Plain contracts get guidance only. |
322
+ | `PLAY0469` | Remove an inline same-source identifier property and mapping, retiring its semantic address. This changes the contract; `canFixAll` is false. Refuse other consumers, opaque impact, changed routing or comment loss. Plain contracts get guidance only. For a contract that may have been stored, use `propose-property` `remove` with `newGeneration: true` instead. |
323
323
  | `PLAY0479` | Migrate one optional type spelling, or all in a document, preserving syntax and trivia. Exclude `query Q => observable?`. |
324
324
  | `PLAY0563/0564` | Expand a one-line interaction alternative / turn a strict item `where` into one block-form `when`. Individual review, canonical formatting, no pinned evidence; refuse comment loss. Opaque non-item-condition text has no PLAY0564 repair. |
325
325
  | `PLAY0614` | Declare Translate direction only when exactly one inbound/outbound interpretation fits public metadata; never change event visibility to make a repair fit. |
@@ -362,9 +362,12 @@ Requires Screenplay 4.228.0 (`screenplay --version`) for `propose-inline-event`.
362
362
  `propose-inline-event` is the inverse: it folds a slice-level event with exactly one
363
363
  production into an inline event on that production, takes the same `subject`,
364
364
  revisions and `formatting: "CanonicalizeTouchedDocuments"`, and preserves executable
365
- bytes and identities. It refuses when the fold could change meaning (a conditional
366
- production, public or external event, cross-slice use, handlers, lost comments or any
367
- other reference to the event).
365
+ bytes and identities. Use it to undo an extraction when the event has one producer and
366
+ no other consumer. It refuses when the fold could change meaning: a conditional
367
+ production (`when`), incomplete mappings, generations, an external origin or public
368
+ event, cross-slice or cross-document use, opaque or handler text, comments that would
369
+ be lost, or any reference other than the single production. Read the refusal and
370
+ leave the event standalone; never work around it with text edits.
368
371
 
369
372
  Requires Screenplay 4.223.0 (`screenplay --version`) for `trace-lineage`.
370
373
 
@@ -8,6 +8,7 @@
8
8
  - Address and query
9
9
  - Read evidence, not just a count
10
10
  - Propose a property change
11
+ - Remove from an inline event
11
12
  - Add with explicit sources and fixtures
12
13
 
13
14
  Property-path evidence in `find-references` and `dependencies` is read-only inspection.
@@ -140,8 +141,10 @@ with `expectedRevision`, `expectedCatalogRevision`, `action: "rename"|"remove"`,
140
141
  or `alsoRemove` entries are `{ "target": <handle>, "expectedName": <name> }`.
141
142
  Select only intended command, current-event and non-key read-model properties:
142
143
  chain membership establishes eligibility, not permission to edit every field.
143
- Off-chain selections refuse atomically (`HopNotOnChain`). Historical generations, inline events,
144
+ Off-chain selections refuse atomically (`HopNotOnChain`). Historical generations,
144
145
  keys, opaque or incomplete links and unsupported spans refuse rather than guess.
146
+ Inline events refuse `InlineEventRequiresExtraction` unless the action is `remove`
147
+ with `newGeneration: true` (see [inline events](#remove-from-an-inline-event)).
145
148
 
146
149
  Rename repairs proven references and fixtures. Renaming only a command input
147
150
  keeps the event payload name; broken AutoMap links become explicit mappings.
@@ -175,6 +178,24 @@ have equal revisions. `[]` means no accepted planned event edits, not success;
175
178
  there is no singular `property.generation`. `deployableWithoutTransformation`
176
179
  and `esmVersionKnown` are independent of authoring acceptance.
177
180
 
181
+ ## Remove from an inline event
182
+
183
+ Requires Screenplay 4.232.0 (`screenplay --version`) for inline-event removal;
184
+ older releases refuse inline events.
185
+
186
+ `action: "remove"` with `newGeneration: true` on an inline event extracts it to its
187
+ owning slice in the same proposal (explicit `CanonicalizeTouchedDocuments` consent
188
+ required) and drafts generation N+1 without the member and its mappings. Generation N
189
+ keeps the member; the contract identity and property identities stay. This is how to
190
+ retire a command identifier copied into a stored event payload (`PLAY0469`).
191
+ Without `newGeneration`, an inline event still refuses `InlineEventRequiresExtraction`:
192
+ extract it first with `propose-extract-inline-event`.
193
+
194
+ The report adds `evolutionDraft` (true when any selected event uses `newGeneration`)
195
+ and `extractedInlineEvents` (always an array). An evolution draft is source only: no
196
+ migrator is declared and `deployableWithoutTransformation` stays false. Never present
197
+ it as migration, deployment or replay ready; Chronicle still needs a transformation.
198
+
178
199
  ## Add with explicit sources and fixtures
179
200
 
180
201
  Read the declaration's original `read-ast` handle. Send `action: "add"`, both
@@ -19,8 +19,11 @@ from silently changing the reviewed candidate.
19
19
  new timeline findings; evidence pinning is unsupported for this repair.
20
20
  - `PLAY0469` removes an inline identifier payload copy: it **changes the event
21
21
  contract**, refuses consumer/opaque impact, has no fix-all, and the catalog does
22
- not prove events were persisted, so ask about stored contracts first.
23
- No automatic generation-evolution repair ships.
22
+ not prove events were persisted, so ask about stored contracts first. For a
23
+ contract that may have been stored, use `propose-property` `remove` with
24
+ `newGeneration: true` instead: it drafts a new generation (see
25
+ [property planning](property-links.md#remove-from-an-inline-event)).
26
+ The repair itself never drafts a generation.
24
27
  - `PLAY0479`: migrate optionality spelling with `PreserveTrivia`; document scope
25
28
  migrates all occurrences together. Keep the `query Q => observable?` exception.
26
29
  - `PLAY0470` is repaired only from an author-supplied destination intent, never
@@ -63,7 +63,10 @@ model's behalf.
63
63
  refused change needs a `then error` spec; each command missing from the table is investigated.
64
64
  5. **Lineage and completeness** (phase 3). Backward: every read-model field to an event field,
65
65
  `$eventSourceId`, literal or documented derivation, to a command input, `$context`, capture field
66
- or literal, to the screen, reaction or integration that supplies it. AutoMap fills same-named
66
+ or literal, to the screen, reaction or integration that supplies it. Trace a field with the
67
+ `screenplay` MCP server's `trace-lineage` tool (paged tree, breaks, branches and opaque hops
68
+ are reported) rather than stitching `dependencies` calls; confirm each hop in the model.
69
+ Requires Screenplay 4.223.0 (`screenplay --version`); on older releases use `dependencies`. AutoMap fills same-named
67
70
  fields silently: count them. Forward: every event to a consumer or a terminal reason; every
68
71
  command input to an event field or a rule. Before calling data missing, search the model.
69
72
  6. **Phased checklist** (phases 4-10): ownership, event quality, events versus views, rules and
@@ -173,7 +173,7 @@ Nebulit (`provenance.md`).
173
173
  | G4 | A command invoked by a reaction is not gated by a caller policy, unless a trusted-path decision is recorded | reactions, `authorize` | D (silent = major) |
174
174
  | G5 | Row scoping (whose data) is part of the view, not a filter the caller supplies | queries | D |
175
175
  | G6 | Every persona Cannot line resolves to an executable gate (`authorize` policy, or ownership `claim "x" matches subject\|<command property>`, or a Uuid `require <command property> == <protected read path>`) and a `then denied` spec whose caller is synthesized with `given caller as <Persona>` or explicitly carries the effective-gate roles/claims; otherwise recorded as a gap. Persona text is intent only | personas, policies, specs | D |
176
- | G7 | Every command and query under an inherited module/feature `authorize` has its own `then denied` spec; authorization shared by a feature is declared at feature/module level so new paths inherit it | policies, specs | D |
176
+ | G7 | Every command and query under an inherited module/feature `authorize` has its own `then denied` spec; authorization shared by a feature is declared at feature/module level so new paths inherit it. `require anonymous` is flagged on anything the business did not name public; it must be the whole authorization, preferably in a separate public module, and is not the same as omitting `authorize` | policies, specs | D (major when it exposes another person's data) |
177
177
  | G8 | Ownership/claim targets are a supported scalar (text, Uuid, Date or DateTime render; a numeric or Boolean target is always denied; other shapes and a command without exactly one identifier are STAGE-ESM-015): noted | policies | C (renderable mode) |
178
178
 
179
179
  ## Phase 10. Views, queries and screens (4 checks, H1-H4)
@@ -77,6 +77,11 @@ query ListInvoices => InvoiceListReadModel[]
77
77
  authorize IsAuthenticated
78
78
  ```
79
79
 
80
+ A deliberately public query (no identity needed) uses a policy with `require anonymous`
81
+ as its whole authorization, ideally in a separate public module; leaving `authorize` off
82
+ is not the same thing. Rules and diagnostics:
83
+ [anonymous policy](../cratis-screenplay-command-surface/references/policy-persona-seed.md#anonymous-policy).
84
+
80
85
  **Name the compiler and renderer.** Optional keyed queries and collection queries
81
86
  bind, including `observable`. Caller-supplied equality
82
87
  filters on collections bind as ESM v14; `from`, single-result filters, `scoped to`,
@@ -305,7 +310,7 @@ binding failures are errors.
305
310
  - [ ] `observable` is present exactly where the caller should see changes without
306
311
  asking again.
307
312
  - [ ] Every authorized query has a specification with `given caller`, including a
308
- `then denied` case.
313
+ `then denied` case (a query authorized only by an anonymous policy may omit `given caller`).
309
314
  - [ ] Each read model has exactly one builder and every field traces to an event.
310
315
  - [ ] A reducer-built view's `by` type matches its events' event-source identity (`PLAY0690`).
311
316
  - [ ] No screen reference is left ambiguous or unresolved.
@@ -54,6 +54,10 @@ The complete model with these specifications is in read-surface `references/name
54
54
 
55
55
  ## Parse and binding diagnostics
56
56
 
57
+ A command or query authorized only by an anonymous policy may omit `given caller`;
58
+ every other authorized specification needs one (PLAY0389). See
59
+ [anonymous policy](../../cratis-screenplay-command-surface/references/policy-persona-seed.md#anonymous-policy).
60
+
57
61
  PLAY0358 is a syntax error; PLAY0388 also occurs at parse time for extra text
58
62
  after `then denied`. PLAY0350, PLAY0352, PLAY0388 for mixed outcomes, PLAY0389 and
59
63
  the one-rejection rule PLAY0273 occur only at binding. Source validation alone
@@ -100,7 +100,9 @@ Unattended work takes the conservative option and marks it `ASSUMED` in model
100
100
  ## Rules
101
101
  **Compiler contracts** (diagnostics; capability per tool in the toolchain `references/executable-subset.md`)
102
102
  - `identifier` on an event property is PLAY0019; the source id is never payload by declaration.
103
- Copying it as a payload value is PLAY0469 (information, warning for inline events).
103
+ Copying it as a payload value is PLAY0469 (information, warning for inline events);
104
+ for a possibly stored contract, retire it as an evolution draft with `propose-property`
105
+ `remove` + `newGeneration: true`, not by editing the event in place (model-authoring [property planning](../cratis-screenplay-model-authoring/references/property-links.md#remove-from-an-inline-event)).
104
106
  - In the executable model a production's `for` must resolve to the command's scalar identifier:
105
107
  one command writes one stream declaratively; described handlers bind v23 but
106
108
  their payload-only contract does not grant arbitrary destinations.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cratis/pi",
3
- "version": "7.91.0",
3
+ "version": "7.92.0",
4
4
  "description": "Configuration-aware Cratis AI integration for Pi",
5
5
  "type": "module",
6
6
  "files": [