@cratis/pi 7.90.0 → 7.91.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package/corpus/harnesses/copilot/instructions/pull-requests.instructions.md +3 -3
- package/package/corpus/product-sync.json +3 -3
- package/package/corpus/prompts/ship-changes.prompt.md +1 -1
- package/package/corpus/rules/pull-requests.md +3 -3
- package/package/corpus/skills/cratis-screenplay-command-surface/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md +53 -1
- package/package/corpus/skills/cratis-screenplay-legacy-extraction/SKILL.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-loop.md +1 -1
- package/package/corpus/skills/cratis-screenplay-model-authoring/references/mcp-tools.md +32 -4
- package/package/corpus/skills/cratis-screenplay-toolchain/references/language-admission.md +1 -0
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.json +5019 -893
- package/package/corpus/skills/cratis-screenplay-toolchain/references/screenplay-contract.version +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ applyTo: "**/*"
|
|
|
7
7
|
|
|
8
8
|
## The description is the release note
|
|
9
9
|
|
|
10
|
-
**The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up. The same contract applies to release notes typed into a manual workflow run or written straight into a release. Where it is installed, the `verify
|
|
10
|
+
**The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up. The same contract applies to release notes typed into a manual workflow run or written straight into a release. Where it is installed, the `policy / verify` check enforces it on release-bound PRs into the default branch carrying `major`/`minor`/`patch` (it re-runs when the label is added); its release-note step warns on `no-release` and unlabelled PRs, which must still be written this way because any of them may become releasable. `release-action` does not run for a `no-release` PR, so `(#n)` closes nothing there. Editing the description re-runs the check. HTML comments are not shown on the release page and the check ignores them for headings, keywords and placeholders, and `release-action` removes them before publishing, so a `(#n)` only inside a comment closes nothing; the check fails it, so never put an issue reference in a comment. The template's own comment can stay: its `(#123)` examples are inline code, and the comment is not published.
|
|
11
11
|
|
|
12
12
|
### Allowed shape
|
|
13
13
|
|
|
@@ -82,12 +82,12 @@ Arc can now construct Chronicle reactors and reducers through its own dependency
|
|
|
82
82
|
|
|
83
83
|
### Before you create or edit a PR
|
|
84
84
|
|
|
85
|
-
1. Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`. It runs the exact `verify
|
|
85
|
+
1. Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`. It runs the exact `policy / verify` release-note rules plus the label and diff checks, and the Bash hook runs it on `gh pr create` and `gh pr edit`.
|
|
86
86
|
2. Read the body against the forbidden list and the issue table above; delete every hit and verify every issue number.
|
|
87
87
|
3. Sections in order, none empty, at most one summary form; every bullet user-facing.
|
|
88
88
|
4. Test plan, verification and review notes are in a PR comment.
|
|
89
89
|
|
|
90
|
-
If
|
|
90
|
+
If the release-note rules fail, fix the description, not the code.
|
|
91
91
|
|
|
92
92
|
## Commits
|
|
93
93
|
|
|
@@ -51,7 +51,7 @@ The description is published verbatim as the release notes, so it follows the co
|
|
|
51
51
|
- Post reviewer notes (checks run, what was not verified, review provenance, stacking, merge or
|
|
52
52
|
deploy order) right after creating the PR with `gh pr comment <n> --body-file .ai-work/pr-notes.md`.
|
|
53
53
|
Never put them in the description, even for `no-release`.
|
|
54
|
-
- After pushing, if `verify
|
|
54
|
+
- After pushing, if `policy / verify` fails on the release notes, fix it by editing the description; it re-runs on edit.
|
|
55
55
|
|
|
56
56
|
## Cleanup — the last step, never skipped
|
|
57
57
|
|
|
@@ -6,7 +6,7 @@ applyTo: "**/*"
|
|
|
6
6
|
|
|
7
7
|
## The description is the release note
|
|
8
8
|
|
|
9
|
-
**The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up. The same contract applies to release notes typed into a manual workflow run or written straight into a release. Where it is installed, the `verify
|
|
9
|
+
**The PR description is published verbatim as the GitHub release. In repositories released by `cratis/release-action`, it also closes every issue written as `(#n)`; elsewhere, follow the repository's own release and issue-closing process.** Write the note the person upgrading should read, not a development write-up. The same contract applies to release notes typed into a manual workflow run or written straight into a release. Where it is installed, the `policy / verify` check enforces it on release-bound PRs into the default branch carrying `major`/`minor`/`patch` (it re-runs when the label is added); its release-note step warns on `no-release` and unlabelled PRs, which must still be written this way because any of them may become releasable. `release-action` does not run for a `no-release` PR, so `(#n)` closes nothing there. Editing the description re-runs the check. HTML comments are not shown on the release page and the check ignores them for headings, keywords and placeholders, and `release-action` removes them before publishing, so a `(#n)` only inside a comment closes nothing; the check fails it, so never put an issue reference in a comment. The template's own comment can stay: its `(#123)` examples are inline code, and the comment is not published.
|
|
10
10
|
|
|
11
11
|
### Allowed shape
|
|
12
12
|
|
|
@@ -81,12 +81,12 @@ Arc can now construct Chronicle reactors and reducers through its own dependency
|
|
|
81
81
|
|
|
82
82
|
### Before you create or edit a PR
|
|
83
83
|
|
|
84
|
-
1. Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`. It runs the exact `verify
|
|
84
|
+
1. Run `node .cratis/ai/hooks/scripts/cratis-check-pr.mjs --body-file <file> --label <intent>`. It runs the exact `policy / verify` release-note rules plus the label and diff checks, and the Bash hook runs it on `gh pr create` and `gh pr edit`.
|
|
85
85
|
2. Read the body against the forbidden list and the issue table above; delete every hit and verify every issue number.
|
|
86
86
|
3. Sections in order, none empty, at most one summary form; every bullet user-facing.
|
|
87
87
|
4. Test plan, verification and review notes are in a PR comment.
|
|
88
88
|
|
|
89
|
-
If
|
|
89
|
+
If the release-note rules fail, fix the description, not the code.
|
|
90
90
|
|
|
91
91
|
## Commits
|
|
92
92
|
|
|
@@ -272,7 +272,7 @@ Chronicle's constraints enforce **uniqueness only**; use one when two concurrent
|
|
|
272
272
|
## `policy` and `persona`
|
|
273
273
|
|
|
274
274
|
A policy has **exactly one** `require` line (`PLAY0441`) **or** one implementation, never both (`PLAY0440`). Read [references/policy-persona-seed.md](references/policy-persona-seed.md) when
|
|
275
|
-
declaring a policy, a persona, or a `seed` block.
|
|
275
|
+
declaring a policy (including `require anonymous` for a deliberately public command or query), a persona, or a `seed` block.
|
|
276
276
|
|
|
277
277
|
## Event data subject
|
|
278
278
|
|
package/package/corpus/skills/cratis-screenplay-command-surface/references/policy-persona-seed.md
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Policies, personas and seed
|
|
2
2
|
|
|
3
|
+
## Contents
|
|
4
|
+
|
|
5
|
+
- `policy` and `persona`
|
|
6
|
+
- Anonymous policy
|
|
7
|
+
- Policy negation
|
|
8
|
+
- `seed`
|
|
9
|
+
|
|
3
10
|
## `policy` and `persona`
|
|
4
11
|
|
|
5
12
|
```screenplay
|
|
@@ -20,7 +27,7 @@ persona Accountant
|
|
|
20
27
|
policy IsAccountant
|
|
21
28
|
```
|
|
22
29
|
|
|
23
|
-
Condition atoms: `authenticated`, `role "<name>"`, and
|
|
30
|
+
Condition atoms: `authenticated`, `anonymous`, `role "<name>"`, and
|
|
24
31
|
`claim "<name>" matches subject | "<value>" | <path>`. A policy has **exactly one**
|
|
25
32
|
`require` line — continue the condition on deeper-indented lines instead of adding
|
|
26
33
|
a second (`PLAY0441`) — **or** one implementation (a tagged ` ```csharp ` block or
|
|
@@ -29,6 +36,51 @@ runner; a code policy binds as opaque ESM v3 and needs a target to evaluate it.
|
|
|
29
36
|
A `persona` is authoring metadata: the binder reports it as information `PLAY0270`
|
|
30
37
|
(report-only) and it does not block binding; an unknown policy it lists is an error.
|
|
31
38
|
|
|
39
|
+
## Anonymous policy
|
|
40
|
+
|
|
41
|
+
Requires Screenplay 4.231.0 (ESM v31; `screenplay --version`); older compilers reject
|
|
42
|
+
`require anonymous`. A policy with `require anonymous` exposes a public command or
|
|
43
|
+
query, such as sign-up. The condition always holds, for callers with and without an
|
|
44
|
+
identity alike. Only a model that declares one selects v31.
|
|
45
|
+
|
|
46
|
+
```screenplay
|
|
47
|
+
concept SubscriberId : Uuid
|
|
48
|
+
concept EmailAddress : String
|
|
49
|
+
policy PublicAccess
|
|
50
|
+
require anonymous
|
|
51
|
+
module Newsletter
|
|
52
|
+
feature Signup
|
|
53
|
+
slice StateChange SubscribeToNewsletter
|
|
54
|
+
command SubscribeToNewsletter
|
|
55
|
+
subscriberId SubscriberId identifier
|
|
56
|
+
email EmailAddress
|
|
57
|
+
authorize PublicAccess
|
|
58
|
+
produces event SubscriberSignedUp
|
|
59
|
+
email EmailAddress = email
|
|
60
|
+
specification SubscribingWithoutAnIdentity
|
|
61
|
+
when SubscribeToNewsletter
|
|
62
|
+
subscriberId = "3fa85f64-5717-4562-b3fc-2c963f66afa6"
|
|
63
|
+
email = "ada@example.com"
|
|
64
|
+
then SubscriberSignedUp
|
|
65
|
+
email = "ada@example.com"
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
`anonymous` must be the command's or query's whole effective authorization:
|
|
69
|
+
|
|
70
|
+
| Code | Refused |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| PLAY0804 | combined with another condition in `require` |
|
|
73
|
+
| PLAY0805 | negated; write `authenticated` instead |
|
|
74
|
+
| PLAY0806 | combined with another policy in `authorize` |
|
|
75
|
+
| PLAY0807 | under or above another module, feature, command or query gate |
|
|
76
|
+
|
|
77
|
+
A specification of such a command or query may omit `given caller`; every other
|
|
78
|
+
authorized specification still needs one (`PLAY0389`).
|
|
79
|
+
|
|
80
|
+
**Security:** `anonymous` declares a public surface on purpose. Never use it to make a
|
|
81
|
+
model compile or to silence a missing-`authorize` or caller finding; model the real
|
|
82
|
+
policy instead, because a generated application renders it as an open endpoint.
|
|
83
|
+
|
|
32
84
|
## Policy negation
|
|
33
85
|
|
|
34
86
|
`not <condition>` is a portable ESM v7 policy-condition
|
|
@@ -133,7 +133,7 @@ chain per slice before handoff (`references/evidence-table-template.md`, "Tracea
|
|
|
133
133
|
`cratis-screenplay-slice-design` for slices, `cratis-screenplay-streams-and-consistency` for
|
|
134
134
|
identity and invariants). To move an already authored slice or feature to its right parent, use
|
|
135
135
|
the MCP `propose-move` tool (identity-preserving; it refuses identity loss, collisions and
|
|
136
|
-
|
|
136
|
+
name capture (a reference that would resolve to a different declaration); it also moves a single declaration between slices from Screenplay 4.230.0) rather than retyping the declarations (`cratis-screenplay-model-authoring`):
|
|
137
137
|
- one StateChange per decision a person or system makes; events are facts experts recognise;
|
|
138
138
|
consequences (counters, denormalised copies) become projections; an automation only when
|
|
139
139
|
evidence shows a separate decision; no generic names (`Update/Edit/Save<Noun>`, `<Noun>Updated`): split by intent;
|
|
@@ -218,7 +218,7 @@ connection. Passing `open-workspace.path` does **not** avoid it, because the err
|
|
|
218
218
|
| Edit class | Examples | Route |
|
|
219
219
|
| --- | --- | --- |
|
|
220
220
|
| Address-preserving | descriptions; bodies of rules and expressions; mappings between members that already exist; any edit that adds, removes or renames no addressed element. Also every edit in a model with no `.screenplay/identities.json` except persisted names | bounded text edit of the `.play` file, then compile the folder; or `propose-ast` |
|
|
221
|
-
| Catalog-changing (identity file present) | add, remove or rename a declaration (slice, command, event, read model, projection, ...), a property of a command, event, read model, composite type or trigger, a query, a query argument or a specification; create, delete, rename or move a mapped `.play` document (McpState refuses reopening with `IdentityMappingConflict`; use document operations in `propose-ast`); rename, remove or move an event, command, read model, constraint, module, feature or slice; move declarations between files (slices and features across logical parents: `propose-move`); contract evolution of a persisted event (new generation, property added, removed or retyped) | `propose-rename` or a reviewed `propose-ast`; never a blind text rename. Renaming a constraint resets its uniqueness index: ask first unless the request names it, then report the reset. A persisted event rename needs `id "OldName"` (added by default) |
|
|
221
|
+
| Catalog-changing (identity file present) | add, remove or rename a declaration (slice, command, event, read model, projection, ...), a property of a command, event, read model, composite type or trigger, a query, a query argument or a specification; create, delete, rename or move a mapped `.play` document (McpState refuses reopening with `IdentityMappingConflict`; use document operations in `propose-ast`); rename, remove or move an event, command, read model, constraint, module, feature or slice; move declarations between files (slices and features across logical parents, and single declarations between slices: `propose-move`); contract evolution of a persisted event (new generation, property added, removed or retyped) | `propose-rename` or a reviewed `propose-ast`; never a blind text rename. Renaming a constraint resets its uniqueness index: ask first unless the request names it, then report the reset. A persisted event rename needs `id "OldName"` (added by default) |
|
|
222
222
|
| Concept `generate` | set/change/remove strategy and modifiers | `propose-ast` replaces `ConceptSyntax.generation` (`GenerationSyntax`; omit/null to remove), or reviewed `propose-source`; never hand-edit `generate` text. Preserve other concept members and inspect executable diagnostics: sequence PLAY0682, generated secrets PLAY0268, generated-rule proofs PLAY0688/0689, finite-support failures PLAY0691/0692. Pattern/random/rule and checksum validation bind as ESM v21 (Requires Screenplay 4.172.0, `screenplay --version`; older compilers refuse PLAY0268). Read `mcp-tools.md#concept-generation` for `arguments`, exact support and `rules[]`, not parsed diagnostic prose. |
|
|
223
223
|
| Repair | `PLAY0166`, `0478`, `0469`, `0471`, `0479`, `0516`, `0563`, `0564`, `0565`, `0614`, `0653`, `0683`, `0684` (and recipe-only `0397`); `PLAY0470` only with author intent ([destination intent repair](destination-intent-repair.md)) | `propose-repair` with `formatting`; PLAY0166/0478 may pin attachment evidence (`pinRepairEvidence` and `expectedRepairEvidenceRevision`), never fix-all PLAY0478 |
|
|
224
224
|
| Inline event extraction | `produces event ...` to a declared event | `propose-extract-inline-event` |
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
- Formatting and recovery limits
|
|
26
26
|
- Code attachments
|
|
27
27
|
|
|
28
|
-
The standalone MCP server lists
|
|
28
|
+
The standalone MCP server lists 46 tools from Screenplay 4.228.0 (including the MCP-Apps visualization tool); `tools/list` is the authority for the installed server, and the CLI-bundled MCP (`cratis screenplay mcp`) can be an older Screenplay that lacks newer tools.
|
|
29
29
|
|
|
30
30
|
The supported CLI launch is `cratis screenplay mcp <model-root>`, or `cratis screenplay mcp`
|
|
31
31
|
alone inside a project, where the CLI locates the model (the project's `.play` files, else
|
|
@@ -50,16 +50,26 @@ the [MCP loop](mcp-loop.md).
|
|
|
50
50
|
| Group | Tools | Intent |
|
|
51
51
|
| --- | --- | --- |
|
|
52
52
|
| Understanding | `describe-application`, `search-declarations`, `find-declaration`, `declaration-details` | Navigate logical hierarchy and inspect bounded details |
|
|
53
|
-
| References and examples | `find-references`, `dependencies`, `dependency-graph`, `find-fixtures`, `find-assertion-gaps`, `find-specification-obligations`, `find-modeling-smells`, `semantic-diff` | Inspect declared relationships and authored examples, not executed coverage |
|
|
53
|
+
| References and examples | `find-references`, `dependencies`, `dependency-graph`, `find-fixtures`, `find-assertion-gaps`, `find-specification-obligations`, `find-modeling-smells`, `trace-lineage`, `semantic-diff` | Inspect declared relationships and authored examples, not executed coverage |
|
|
54
54
|
| Source and validation | `diagnostics`, `ui-profiles`, `read-document`, `merged-document`, `syntax-schema` | Read exact source or typed structure and diagnose problems |
|
|
55
55
|
| Workspace inspection | `open-workspace`, `read-workspace`, `read-ast`, `workspace-state`, `export-workspace`, `repair-capabilities` | Obtain current identities, handles, readiness, code attachment requirements, source-map locations, durable-state status and the repair catalog |
|
|
56
56
|
| Visual (MCP-Apps hosts only) | `visualize-model` | Draw the board for the model or a `proposalId`; its `sketch` argument previews a what-if of whole documents. Reads only |
|
|
57
|
-
| Planning | `propose-source`, `propose-ast`, `propose-rename`, `propose-move`, `propose-repair`, `propose-property`, `propose-number-enum-members`, `propose-extract-inline-event`, `propose`, `recommend-layout`, `expand-layout` | Produce validated, reviewable candidates without writing them |
|
|
57
|
+
| Planning | `propose-source`, `propose-ast`, `propose-rename`, `propose-move`, `propose-repair`, `propose-property`, `propose-number-enum-members`, `propose-extract-inline-event`, `propose-inline-event`, `propose`, `recommend-layout`, `expand-layout` | Produce validated, reviewable candidates without writing them |
|
|
58
58
|
| Review | `read-proposal`, `discard-proposal` | Inspect exact changes, dropped comments and proposed attachments, or abandon a connection-local proposal |
|
|
59
59
|
| Reference execution | `run-specifications` | Run the workspace or a retained proposal candidate read-only; not attached code or target tests |
|
|
60
60
|
| Effects | `apply`, `recover-workspace` | Apply an accepted plan or explicitly recover an interrupted write |
|
|
61
61
|
|
|
62
|
-
`propose-move` moves a slice to another feature,
|
|
62
|
+
`propose-move` moves a slice to another feature, a feature to another module or feature, or a single command, event, read model, projection, query, reaction or capture to another slice, keeping identities: copy the `target` and `newParent` `{kind, parts}` addresses from the identity inventory (`newParent` is the destination slice for a declaration) and pass `expectedRevision` and `expectedCatalogRevision`. It repairs qualified references and `depends on`, and refuses identity loss, collisions, descendant destinations, name capture (a reference that would resolve to a different declaration), inherited authorization or screen-interaction changes and glob imports; review `moveReport` (`identityMigrations`, `referenceRepairs`, `fragmentsMoved`, and `specificationsCarried` for a declaration). It does not rename events, change pins or move files. Use it for legacy re-slicing instead of retyping declarations. Its report document fields are plain strings, not nested identity objects.
|
|
63
|
+
|
|
64
|
+
A declaration move follows these rules:
|
|
65
|
+
|
|
66
|
+
- A specification that covers only the moved declaration moves with it. A specification covers a declaration when it is a matching specification of one of its `find-specification-obligations` obligations, or when its `when` step names it; a `given` or `then` reference alone is not coverage.
|
|
67
|
+
- The move is refused when a specification also covers a declaration that stays, when an obligation the source slice met would no longer be met or the move would introduce an unmet obligation, on a name collision, for an inline declaration (such as an inline `produces event`), a declaration written in more than one fragment, a standalone specification, screen, constraint or module, and when an unqualified reference would resolve differently. Qualify that reference first.
|
|
68
|
+
- Screen `execute`, `refresh` and `navigate to` targets that name the declaration are repaired, not moved.
|
|
69
|
+
- Slice-level events named by `produces` do not travel with a command, and a projection's `from` may name an event declared in another slice; move such an event with its own `propose-move` only when it should change slices. A command's inline events go with it.
|
|
70
|
+
- Event names and pins stay untouched, and assigned identities follow the declaration.
|
|
71
|
+
|
|
72
|
+
Requires Screenplay 4.230.0 (`screenplay --version`) for declaration moves; older servers move only slices and features.
|
|
63
73
|
|
|
64
74
|
Requires Screenplay 4.211.0 (`screenplay --version`) for string conflict/move-report document fields and independent reference-edit batches; older servers can emit objects and refuse independent remove/add batches. Upgrade before relying on this contract.
|
|
65
75
|
|
|
@@ -347,6 +357,24 @@ tags and identities survive; canonical ESM must stay byte-identical and every
|
|
|
347
357
|
comment must survive exactly once. Extract before adding `generation`, not after
|
|
348
358
|
making the document parser-invalid. This is a refactoring, not a diagnostic repair.
|
|
349
359
|
|
|
360
|
+
Requires Screenplay 4.228.0 (`screenplay --version`) for `propose-inline-event`.
|
|
361
|
+
|
|
362
|
+
`propose-inline-event` is the inverse: it folds a slice-level event with exactly one
|
|
363
|
+
production into an inline event on that production, takes the same `subject`,
|
|
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).
|
|
368
|
+
|
|
369
|
+
Requires Screenplay 4.223.0 (`screenplay --version`) for `trace-lineage`.
|
|
370
|
+
|
|
371
|
+
`trace-lineage` takes a read-model property `address` and returns a paged tree
|
|
372
|
+
(`limit`, `offset`) from the property through projection or reducer mappings, joins and
|
|
373
|
+
child mappings to the event property, then to the producing command property or capture
|
|
374
|
+
source. A broken hop is reported where the chain breaks, several sources appear as
|
|
375
|
+
branches and code the model cannot see into is marked opaque. It is read-only and
|
|
376
|
+
advisory.
|
|
377
|
+
|
|
350
378
|
Requires Screenplay 4.153.0 or later (`screenplay --version`) for `propose-rename` to consult release-baseline mutability; before it, `propose-rename` pins the previous effective name without a baseline.
|
|
351
379
|
|
|
352
380
|
`propose-rename` consults release-baseline mutability: without a
|
|
@@ -18,6 +18,7 @@ exact language/semantic pairs; binding, reference execution and rendering are se
|
|
|
18
18
|
| v28 | `==`/`!=` between Uuid values in command `require` and `produces when` | Uuid properties, Uuid concepts and identities, canonical literals; protected read paths in `require` only | v28 refused STAGE-ESM-016 |
|
|
19
19
|
| v29 | `decimals <= N`; `add`/`subtract` by `a * b`; a concept mapped to another concept over the same primitive (decision 0098) | Decimal-places rule on a Decimal concept or property; the exact decimal product; the conversion is admitted only when the target declares no rule or compliance the source does not, never for enums, composites or optional into required | v29 refused until Stage admits it |
|
|
20
20
|
| v30 | A command `produces ... for <required scalar property>` (several event sources); a specification `given generated <Command>.<property> = <value>` (decision 0098) | Several sources in one accepted command; pinned generated values for reaction-invoked commands, taken in authored order | v30 refused until Stage admits it |
|
|
21
|
+
| v31 | A policy `require anonymous` for a public command or query | A deliberately public surface; the policy is the whole effective authorization | v31 refused until Stage admits it |
|
|
21
22
|
|
|
22
23
|
Constructs of decision 0098 with no executable-model content need no version: application-level toolbar buttons in the layout's `navigation topbar` region (`button <id> title "..." slice <Slice>` with an optional indented `authorize <Policy>`), a command specification that states the public event its outbound Translate slice publishes (no more false `PLAY0285`), and a capture over events that copies a list (`lines = $.lines`) or fans out with `children lines identified by sku`. Check `screenplay --version` against the release that admitted v29 and v30 before relying on them.
|
|
23
24
|
|