[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M78C4WK8STFDVKB26P2AM0P9":3,"skill-same:01M78C4WK8STFDVKB26P2AM0P9":123},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":15,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":13,"repositoryHtmlUrl":27,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":30,"ownerDescription":31,"updatedAt":32,"install":33,"resources":46},"01M78C4WK8STFDVKB26P2AM0P9","cratis-screenplay-automations-and-translations",null,"Model Screenplay Automation and Translate slices: when a reaction is warranted, todo-list work queues, produces versus invokes, the trusted actor behind caller-less invokes, termination, clock and trigger occurrences, outside facts via capture with correlation, dedup and enrich\u002Fignore\u002Finfer, recovery ownership, and what once-only does not prove about external effects. Use when a model has or needs 'when X happens then ...', schedules, work queues, webhooks, API polls, message feeds or imported events. Not for: reaction, trigger or capture grammar (use `cratis-screenplay-captures-and-reactions`).","Cratis\u002FPrologue","Cratis","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16456213?v=4","01M6BXRH290K4C8RS4PTKK3HXQ","01M78C1YXTSPZGP4G1K2ZM6J1N",0,"MIT","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: cratis-screenplay-automations-and-translations\ndescription: \"Model Screenplay Automation and Translate slices: when a reaction is warranted, todo-list work queues, produces versus invokes, the trusted actor behind caller-less invokes, termination, clock and trigger occurrences, outside facts via capture with correlation, dedup and enrich\u002Fignore\u002Finfer, recovery ownership, and what once-only does not prove about external effects. Use when a model has or needs 'when X happens then ...', schedules, work queues, webhooks, API polls, message feeds or imported events. Not for: reaction, trigger or capture grammar (use `cratis-screenplay-captures-and-reactions`).\"\nlicense: MIT\n---\n\u003C!-- cratis-ai-managed: skills\u002Fcratis-screenplay-automations-and-translations\u002FSKILL.md -->\n\n# Automations and translations\n\n## Purpose\nDecide which work the system does on its own, which outside facts it accepts, and what that work\nguarantees. Then write it as `Automation` and `Translate` slices that say truthfully what is\nprotected, what is only recorded, and who acts. Grammar depth is in\n`cratis-screenplay-captures-and-reactions`; this skill owns the decisions.\n\n**Translation crosses an application boundary:** private-to-private follow-up is\nAutomation, even if a reactor realizes it. Keep captures in Translate and reactions\nto their local facts in separate Automation slices. Read\n[public events and direction](references\u002Fpublic-events-and-direction.md) when\nchoosing direction, folding events or specifying publication: it owns the ESM v9\nforms, PLAY0616 and directionless Translate's PLAY0694 split boundary.\nRequires Screenplay 4.176.0 or later (`screenplay --version`) for PLAY0694; older compilers leave that directionless shape unchecked.\nOne `source events` capture reads one origin (event store); split several origins.\nRequires Screenplay 4.155.0 (`screenplay --version`) for PLAY0687; older tools leave it unchecked.\n\nModel behavior first; code implements external calls, adapters, actors and refused\ntarget scope. Follow `cratis-screenplay-modeling-lifecycle` for session discipline\nand `cratis-screenplay-toolchain` for verdicts. Settle input, identity, effect and\npending-work contracts when changing each reaction\u002Fcapture, not at final review.\n\n## Tool and realization facts (read before promising anything)\n- V1, V3, V4 and target rendering are separate; name the compiler and never remove\n  a refused construct. Run `screenplay test` or MCP `run-specifications` for V4.\n- Read [realization and gap-fill](references\u002Frealization-and-gap-fill.md) before\n  promising Automation\u002FTranslate delivery (STAGE-ESM-024).\n- Invokes have no caller without `runs as`. Read captures-and-reactions\n  [invocation identity](..\u002Fcratis-screenplay-captures-and-reactions\u002Freferences\u002Finvocation-identity.md)\n  for the ESM v10 actor and role\u002Fauthenticated versus claim\u002Fopaque admission.\n\n## Atomic production boundaries and source identity\n\nStart new models with application-root `reaction batches atomic` (ESM v22 or later).\nEach trigger occurrence's direct productions and each selected refusal branch are\nseparate all-or-none batches; invoked commands remain independent. Absence retains\nlegacy per-fact behavior even at later versions. Assert no failed-batch facts and\nunchanged views, not only `then error`. Requires Stage 4.139.0 for v22 admission\n(older: -016); atomic mode stays STAGE-ESM-043. Keep as gap-fill.\nRead [atomic batches and source mappings](..\u002Fcratis-screenplay-captures-and-reactions\u002Freferences\u002Fatomic-batches-and-source-mappings.md)\nwhen choosing these boundaries or mapping an invoked identifier from `$eventSourceId`\n(or `$eventContext.eventSourceId`) instead of copying it into event payload.\n\n## Effect guarantees and recovery traps\n| Guarantee | What it promises | What can show it |\n|---|---|---|\n| **once-only fact** | `CertificateSent` exists at most once for an enrolment | `constraint … unique event` on the right stream + a violation spec |\n| **idempotent handling** | asking again gives the caller the same outcome, no new effect | target behaviour (map \"already has the event\" to success where intended); the model shows a rejection |\n| **exactly-once external effect** | the person receives one certificate, the card is charged once | nothing in the model; only the outside system's dedup or a reconciliation can |\n\nA todo list + reaction + unique constraint proves the first. It does **not** prove the third:\nthe send can succeed and the append fail (crash, lost reply, constraint race), and the retry\nsends again.\n\n- A reaction cascade is not one transaction: earlier accepted facts stay when a later invoked\n  command rejects (Screenplay `reactions.md`). Design each step to be retried on its own.\n- Read `references\u002Feffects-and-idempotency.md` when specifying redelivery,\n  `then no events` or refusal disposition; execution is not external deduplication.\n- Replay and recovery redelivery are different. Chronicle `[OnceOnly]` skips replays (rewind,\n  redaction, revision) only, not ordinary catch-up, repeated same-source events or crash\n  redelivery. Recovery runs the handler normally. It is not a per-source run limit or\n  deduplication. A receipt keyed by `ReactorDelivery.Id` identifies the retry. Name both.\n\n## Capture data-protection traps\nA field left out of `map` still passes through the capture's working record: omission is not\nredaction. Check the append mappings and every resulting event property, and record whether\nthe target stores raw or last-seen source records and how they are minimized.\nPersonal data kept in events needs bare `pii` on its concept and a declared purpose\n(see command-surface `references\u002Fcompliance.md`); keep the marker\neven when it blocks binding. Never record bearer tokens, magic links or signed URLs as facts\n(a keyed hash or reference at most), and never put PII on the event-source id.\n\n## Product sources\nRead [references\u002Fproduct-sources.md](references\u002Fproduct-sources.md) when checking a claim against the Screenplay, Stage, Arc or Chronicle sources.\n\nRequires Screenplay 4.125.0 or later (`screenplay --version`) for reaction `runs as system role` (ESM v10).\n\nRequires Arc 20.56.0 or later for `[ExecuteCommandsAsSystem]`.\n\nRequires Arc 22.72.0 or later for a reactor that returns events and commands together; before it, a mixed return is not handled. Stage still refuses a reaction that both `produces` and `invokes` (`STAGE-ESM-037`), so a mixed reaction stays authorized gap-fill whatever the Arc release.\n\nRequires Screenplay 4.105.0 or later (`screenplay --version`) for list queries (`=> Item[]`); before it a list query is refused with PLAY0268.\n\nRequires Screenplay 4.124.0 or later (`screenplay --version`) for `--check privilege` (PLAY0652).\n\nRead `SKILL.md` in `cratis-screenplay-toolchain` when selecting a tool; read the installed versions with `screenplay --version` and `cratis --version`. Reverify before claiming\nanother version behaves the same.\n\n## When \u002F when not\n- Use: \"when X happens, then ...\", schedules, retries, work queues, notifications, webhooks, APIs,\n  files or message feeds, events imported from another context, legacy sync.\n- Not for: reaction, trigger or CDL grammar (`cratis-screenplay-captures-and-reactions`); stream\n  identity and invariants (`cratis-screenplay-streams-and-consistency`); UI interactions such as\n  `on click` (`cratis-screenplay-ui-composition`); hand-written reactors (`cratis-chronicle-reactor`).\n\n## Interview phase\n**Skip if** the user already gave: every external system with its record types, a sanitized sample\nof each, and how each record finds our entity (the correlation strategy); and for automations, the\noccurrence, the effect and who acts. Cite existing answers instead of asking again. Missing\ncorrelation is the most common cause of failed integrations: surface it first.\n\nRead [integration interview prompts](references\u002Fintegration-interview.md) when\nsources, mapping, automation ownership or recovery are unsettled. Ask one group at\na time; treat \"unsure\" as an open question.\n\n**Unattended:** assume visibly. Record each assumption as a labelled open decision in `STATE.md`\n(`.ai-work\u002Fscreenplay\u002F\u003Cmodel-slug>\u002FSTATE.md`), mark the dependent slice open, never write a mapping\nor actor that nobody confirmed. Read `references\u002Fworked-integration.md` when you need a transcript-shaped example of the integration interview, correlation, translation rules, scenarios, and recovery output.\n\n## Procedure\n1. **Inventory.** List every reaction, trigger and external source\u002Ftype in scope; read their\n   declarations, mappings, descriptions and specs. For integrations resolve only the unknowns\n   (`references\u002Fintegration-contracts.md`).\n2. **Is it an automation?** Write four lines: occurrence (event, clock, application trigger), state\n   consulted, condition, effect. Always fires, consults nothing, cannot fail, touches nothing outside:\n   co-production, the command produces both facts. Otherwise continue (`references\u002Fautomation-patterns.md`; a process with waits, approvals, compensation or fan-out: its §10).\n3. **Queue or direct?** A todo list (a read model whose membership is the pending work) when work can\n   wait, retry, fail or need people. Name each opening and closing fact (result, cancellation,\n   supersession), the work-item key and the recovery path. Direct reaction only for an immediate,\n   internal, always-possible effect; say why no pending state is needed. A translation is not\n   automatically infallible.\n4. **Effect and actor.** `produces \u003CFact>` records a decided fact; `invokes \u003CCommand>`\n   requests a decision. Keep its gate and declare the trusted role with reaction\n   `runs as system role \"\u003CRole>\"` (ESM v10). An undeclared actor remains caller-less.\n   CLI\u002FStage realization is a separate gap; a returned-command reactor uses\n   `[ExecuteCommandsAsSystem(\"\u003Crole>\")]` and the matching policy. Never strip a\n   gate or supply `given caller` as a fictional reaction identity. Arc supplies a\n   system principal only to reactors marked `[ExecuteCommandsAsSystem]`; without\n   it there is no principal and `[Authorize]`\u002F`[Roles]` deny. `runs as` covers returned\n   or invoked commands, not imperative pipeline calls, reads, productions or causation.\n   Run `--check privilege --warnaserror` (PLAY0652) for\n   confused-deputy paths: every trigger-event producer must require **all** declared\n   system roles. Ungated commands\u002Fcaptures\u002Freaction productions warn; opaque gates\n   are information, not proven safe. An OR alternative does not require a role.\n   Clock\u002Fapplication triggers have no producer and are silent; still review trust.\n5. **Trace inputs.** Every trigger value, command input, event property and destination needs a\n   supported source; every filter a business reason. Gaps are questions, not invented mappings.\n6. **Repetition and termination.** Identify one logical work occurrence and what a retry is. Guard the\n   result fact with `constraint ... unique event` on the right stream only when once per source is the\n   rule. Name what ends each chain and check cycles. Answer separately how the *external* effect avoids\n   repeating and how replay differs from recovery redelivery (`references\u002Feffects-and-idempotency.md`).\n7. **Translate outside facts** (`references\u002Ftranslation-patterns.md`): enter only via `capture` or a\n   translator reaction, in a `Translate` slice; correlate first; keep the external fact distinct from\n   ours; trace source fields *and* every required target field; decide dedup, ordering and recovery\n   ownership. A reaction to a capture's local fact is a separate Automation, not a\n   second job inside Translate. A worker after translation needs a distinct local decision, obligation or effect.\n8. **Specify and audit.** Work through `references\u002Fcases-to-specify.md` per declaration and hand the\n   named cases to `cratis-screenplay-scenario-coverage`. Produce the audit in `references\u002Faudit-format.md`.\n\n## Rules\n**Compiler contracts** (diagnostics)\n- No inline `produces event` in a reaction (PLAY0474); declare reaction-produced events in the slice.\n- Effects sit under a trigger; `description`, `where` and current `runs as` are reaction-level; one `where` per\n  reaction (PLAY0252); a trigger may not repeat (PLAY0253).\n- Clock triggers take no values (PLAY0450) and no `by` on reads (PLAY0443). `for each \u003CView>` is\n  reserved, not available.\n- Capture `when` cannot mix `and` and `or` (PLAY0089). A capture without `key` does not bind.\n- For `source events`, `key` is a required property on every `from` event (PLAY0700);\n  specs supply `given \u003CEvent>` \u002F `when append \u003CEvent>`, not capture records (PLAY0701).\n- First sight is `added` only. Use `when added` separately for initial facts; seed\n  record updates with `given capture` of the same key. Read captures-and-reactions\n  `references\u002Frecord-capture-specifications.md` for the prerequisite and child\u002Fnested rules.\n- Current V1 warns on undeclared capture\u002Fremoval events (PLAY0166); V3 remains a\n  separate binder check.\n- A trigger with `reads` that `produces` directly fails binding: decide in a command.\n  Command reads can protect with `command reads protected` and admitted shapes (v25);\n  trigger reads cannot. Stage 4.138.0 renders protected reads as Arc read protection (`cratis render` gets it from the first CLI that bundles it; CLI 3.75.0 refuses them with STAGE-ESM-044);\n  semantic execution is separate from generated-app protection.\n- An authorized command exercised in a spec without `given caller` is PLAY0389 at binding.\n- A list query (`=> Item[]`) binds (a snapshot list is not rendered, `STAGE-ESM-010`);\n  a clock sweep that iterates items needs a code body the reference does not run\n  (`references\u002Ftodo-list-example.md`).\n\n**Modeling defaults** (deviate with a recorded reason)\n- A `produces` without `for` lands on the triggering fact's source; clock and trigger occurrences have\n  none, so give `for` (a carried value or a literal).\n- `where` guards every trigger of the reaction and must resolve from each trigger's values: give a clock\n  sweep its own reaction.\n- Malformed or unmappable input becomes a recorded failure fact or dead-letter view, never a dropped\n  record. A fan-out records one outcome per item; partial success is failure at an effect boundary\n  (`cratis-engineering-effect-boundaries`), never a batch \"done\" while members failed.\n- Infrastructure (logging, caching, retries, outbox plumbing) is never a Translate slice.\n- Personal data kept in events needs `pii` on its concept; keep it even when it blocks binding or render.\n- Code bodies (`file`, inline fences) document realization; no local engine runs them.\n\n**Review questions**\n- What stops this from running twice? Forever? When the external call times out?\n- Who is the actor, and could an outsider reach the invoked command?\n- What does a person see while the work is pending or failed?\n- What happens if the outside fact arrives before ours, twice, out of order, or changed?\n\n## Gate\nNot done until, for every affected reaction and capture, there is a line in the audit\n(`references\u002Faudit-format.md`) with a location and a result of complete, open or blocked, and any\nunreviewed scope is named. Open decisions and target requirements are in `STATE.md`. A missing required or\nreferenced queue opening or closing fact is an unresolved dependency, never skipped silently; a\ndirect effect states \"not applicable: no queue\" with its reason (per-chain questions in\n`references\u002Faudit-format.md`).\nNever report a verdict without the tool and version that produced it.\n\n## Verify\n- V1 and V3 per `cratis-screenplay-toolchain`, each with tool and version. When the bundled compiler stops before v6,\n  report \"V3 blocked: PLAY0268 (ESM v6)\". Current admitted scenarios use\n  standalone `screenplay test`\u002FMCP for V4; unsupported or unbound is not passed.\n- For each external source and type: its translation, or an explicit out-of-scope reason; check\n  target-field completeness as well as source-field dispositions.\n- One happy path is not coverage: cite the spec or the missing case for each branch, denial, competing\n  claim and closing event.\n- Every complete example compiles. Read `references\u002Ftodo-list-example.md` when modeling a pending-work automation (its design-only excerpts insert into `assets\u002Fpending-certificates.play` and `assets\u002Fretry-sweep.play`), and `references\u002Ftranslate-example.md` when modeling capture plus translator reactions.\n\n## Route near misses\nRead [references\u002Fneighbouring-skills.md](references\u002Fneighbouring-skills.md) when the work is grammar, streams, specifications, rendering, legacy writes or hand-written reactors.\n\n## Lineage\nRead `references\u002Fprovenance.md` when checking sources, adaptations, attribution, or approaches deliberately not adopted.\n","\u003C!-- cratis-ai-managed: skills\u002Fcratis-screenplay-automations-and-translations\u002FSKILL.md -->\n\n# Automations and translations\n\n## Purpose\nDecide which work the system does on its own, which outside facts it accepts, and what that work\nguarantees. Then write it as `Automation` and `Translate` slices that say truthfully what is\nprotected, what is only recorded, and who acts. Grammar depth is in\n`cratis-screenplay-captures-and-reactions`; this skill owns the decisions.\n\n**Translation crosses an application boundary:** private-to-private follow-up is\nAutomation, even if a reactor realizes it. Keep captures in Translate and reactions\nto their local facts in separate Automation slices. Read\n[public events and direction](references\u002Fpublic-events-and-direction.md) when\nchoosing direction, folding events or specifying publication: it owns the ESM v9\nforms, PLAY0616 and directionless Translate's PLAY0694 split boundary.\nRequires Screenplay 4.176.0 or later (`screenplay --version`) for PLAY0694; older compilers leave that directionless shape unchecked.\nOne `source events` capture reads one origin (event store); split several origins.\nRequires Screenplay 4.155.0 (`screenplay --version`) for PLAY0687; older tools leave it unchecked.\n\nModel behavior first; code implements external calls, adapters, actors and refused\ntarget scope. Follow `cratis-screenplay-modeling-lifecycle` for session discipline\nand `cratis-screenplay-toolchain` for verdicts. Settle input, identity, effect and\npending-work contracts when changing each reaction\u002Fcapture, not at final review.\n\n## Tool and realization facts (read before promising anything)\n- V1, V3, V4 and target rendering are separate; name the compiler and never remove\n  a refused construct. Run `screenplay test` or MCP `run-specifications` for V4.\n- Read [realization and gap-fill](references\u002Frealization-and-gap-fill.md) before\n  promising Automation\u002FTranslate delivery (STAGE-ESM-024).\n- Invokes have no caller without `runs as`. Read captures-and-reactions\n  [invocation identity](..\u002Fcratis-screenplay-captures-and-reactions\u002Freferences\u002Finvocation-identity.md)\n  for the ESM v10 actor and role\u002Fauthenticated versus claim\u002Fopaque admission.\n\n## Atomic production boundaries and source identity\n\nStart new models with application-root `reaction batches atomic` (ESM v22 or later).\nEach trigger occurrence's direct productions and each selected refusal branch are\nseparate all-or-none batches; invoked commands remain independent. Absence retains\nlegacy per-fact behavior even at later versions. Assert no failed-batch facts and\nunchanged views, not only `then error`. Requires Stage 4.139.0 for v22 admission\n(older: -016); atomic mode stays STAGE-ESM-043. Keep as gap-fill.\nRead [atomic batches and source mappings](..\u002Fcratis-screenplay-captures-and-reactions\u002Freferences\u002Fatomic-batches-and-source-mappings.md)\nwhen choosing these boundaries or mapping an invoked identifier from `$eventSourceId`\n(or `$eventContext.eventSourceId`) instead of copying it into event payload.\n\n## Effect guarantees and recovery traps\n| Guarantee | What it promises | What can show it |\n|---|---|---|\n| **once-only fact** | `CertificateSent` exists at most once for an enrolment | `constraint … unique event` on the right stream + a violation spec |\n| **idempotent handling** | asking again gives the caller the same outcome, no new effect | target behaviour (map \"already has the event\" to success where intended); the model shows a rejection |\n| **exactly-once external effect** | the person receives one certificate, the card is charged once | nothing in the model; only the outside system's dedup or a reconciliation can |\n\nA todo list + reaction + unique constraint proves the first. It does **not** prove the third:\nthe send can succeed and the append fail (crash, lost reply, constraint race), and the retry\nsends again.\n\n- A reaction cascade is not one transaction: earlier accepted facts stay when a later invoked\n  command rejects (Screenplay `reactions.md`). Design each step to be retried on its own.\n- Read `references\u002Feffects-and-idempotency.md` when specifying redelivery,\n  `then no events` or refusal disposition; execution is not external deduplication.\n- Replay and recovery redelivery are different. Chronicle `[OnceOnly]` skips replays (rewind,\n  redaction, revision) only, not ordinary catch-up, repeated same-source events or crash\n  redelivery. Recovery runs the handler normally. It is not a per-source run limit or\n  deduplication. A receipt keyed by `ReactorDelivery.Id` identifies the retry. Name both.\n\n## Capture data-protection traps\nA field left out of `map` still passes through the capture's working record: omission is not\nredaction. Check the append mappings and every resulting event property, and record whether\nthe target stores raw or last-seen source records and how they are minimized.\nPersonal data kept in events needs bare `pii` on its concept and a declared purpose\n(see command-surface `references\u002Fcompliance.md`); keep the marker\neven when it blocks binding. Never record bearer tokens, magic links or signed URLs as facts\n(a keyed hash or reference at most), and never put PII on the event-source id.\n\n## Product sources\nRead [references\u002Fproduct-sources.md](references\u002Fproduct-sources.md) when checking a claim against the Screenplay, Stage, Arc or Chronicle sources.\n\nRequires Screenplay 4.125.0 or later (`screenplay --version`) for reaction `runs as system role` (ESM v10).\n\nRequires Arc 20.56.0 or later for `[ExecuteCommandsAsSystem]`.\n\nRequires Arc 22.72.0 or later for a reactor that returns events and commands together; before it, a mixed return is not handled. Stage still refuses a reaction that both `produces` and `invokes` (`STAGE-ESM-037`), so a mixed reaction stays authorized gap-fill whatever the Arc release.\n\nRequires Screenplay 4.105.0 or later (`screenplay --version`) for list queries (`=> Item[]`); before it a list query is refused with PLAY0268.\n\nRequires Screenplay 4.124.0 or later (`screenplay --version`) for `--check privilege` (PLAY0652).\n\nRead `SKILL.md` in `cratis-screenplay-toolchain` when selecting a tool; read the installed versions with `screenplay --version` and `cratis --version`. Reverify before claiming\nanother version behaves the same.\n\n## When \u002F when not\n- Use: \"when X happens, then ...\", schedules, retries, work queues, notifications, webhooks, APIs,\n  files or message feeds, events imported from another context, legacy sync.\n- Not for: reaction, trigger or CDL grammar (`cratis-screenplay-captures-and-reactions`); stream\n  identity and invariants (`cratis-screenplay-streams-and-consistency`); UI interactions such as\n  `on click` (`cratis-screenplay-ui-composition`); hand-written reactors (`cratis-chronicle-reactor`).\n\n## Interview phase\n**Skip if** the user already gave: every external system with its record types, a sanitized sample\nof each, and how each record finds our entity (the correlation strategy); and for automations, the\noccurrence, the effect and who acts. Cite existing answers instead of asking again. Missing\ncorrelation is the most common cause of failed integrations: surface it first.\n\nRead [integration interview prompts](references\u002Fintegration-interview.md) when\nsources, mapping, automation ownership or recovery are unsettled. Ask one group at\na time; treat \"unsure\" as an open question.\n\n**Unattended:** assume visibly. Record each assumption as a labelled open decision in `STATE.md`\n(`.ai-work\u002Fscreenplay\u002F\u003Cmodel-slug>\u002FSTATE.md`), mark the dependent slice open, never write a mapping\nor actor that nobody confirmed. Read `references\u002Fworked-integration.md` when you need a transcript-shaped example of the integration interview, correlation, translation rules, scenarios, and recovery output.\n\n## Procedure\n1. **Inventory.** List every reaction, trigger and external source\u002Ftype in scope; read their\n   declarations, mappings, descriptions and specs. For integrations resolve only the unknowns\n   (`references\u002Fintegration-contracts.md`).\n2. **Is it an automation?** Write four lines: occurrence (event, clock, application trigger), state\n   consulted, condition, effect. Always fires, consults nothing, cannot fail, touches nothing outside:\n   co-production, the command produces both facts. Otherwise continue (`references\u002Fautomation-patterns.md`; a process with waits, approvals, compensation or fan-out: its §10).\n3. **Queue or direct?** A todo list (a read model whose membership is the pending work) when work can\n   wait, retry, fail or need people. Name each opening and closing fact (result, cancellation,\n   supersession), the work-item key and the recovery path. Direct reaction only for an immediate,\n   internal, always-possible effect; say why no pending state is needed. A translation is not\n   automatically infallible.\n4. **Effect and actor.** `produces \u003CFact>` records a decided fact; `invokes \u003CCommand>`\n   requests a decision. Keep its gate and declare the trusted role with reaction\n   `runs as system role \"\u003CRole>\"` (ESM v10). An undeclared actor remains caller-less.\n   CLI\u002FStage realization is a separate gap; a returned-command reactor uses\n   `[ExecuteCommandsAsSystem(\"\u003Crole>\")]` and the matching policy. Never strip a\n   gate or supply `given caller` as a fictional reaction identity. Arc supplies a\n   system principal only to reactors marked `[ExecuteCommandsAsSystem]`; without\n   it there is no principal and `[Authorize]`\u002F`[Roles]` deny. `runs as` covers returned\n   or invoked commands, not imperative pipeline calls, reads, productions or causation.\n   Run `--check privilege --warnaserror` (PLAY0652) for\n   confused-deputy paths: every trigger-event producer must require **all** declared\n   system roles. Ungated commands\u002Fcaptures\u002Freaction productions warn; opaque gates\n   are information, not proven safe. An OR alternative does not require a role.\n   Clock\u002Fapplication triggers have no producer and are silent; still review trust.\n5. **Trace inputs.** Every trigger value, command input, event property and destination needs a\n   supported source; every filter a business reason. Gaps are questions, not invented mappings.\n6. **Repetition and termination.** Identify one logical work occurrence and what a retry is. Guard the\n   result fact with `constraint ... unique event` on the right stream only when once per source is the\n   rule. Name what ends each chain and check cycles. Answer separately how the *external* effect avoids\n   repeating and how replay differs from recovery redelivery (`references\u002Feffects-and-idempotency.md`).\n7. **Translate outside facts** (`references\u002Ftranslation-patterns.md`): enter only via `capture` or a\n   translator reaction, in a `Translate` slice; correlate first; keep the external fact distinct from\n   ours; trace source fields *and* every required target field; decide dedup, ordering and recovery\n   ownership. A reaction to a capture's local fact is a separate Automation, not a\n   second job inside Translate. A worker after translation needs a distinct local decision, obligation or effect.\n8. **Specify and audit.** Work through `references\u002Fcases-to-specify.md` per declaration and hand the\n   named cases to `cratis-screenplay-scenario-coverage`. Produce the audit in `references\u002Faudit-format.md`.\n\n## Rules\n**Compiler contracts** (diagnostics)\n- No inline `produces event` in a reaction (PLAY0474); declare reaction-produced events in the slice.\n- Effects sit under a trigger; `description`, `where` and current `runs as` are reaction-level; one `where` per\n  reaction (PLAY0252); a trigger may not repeat (PLAY0253).\n- Clock triggers take no values (PLAY0450) and no `by` on reads (PLAY0443). `for each \u003CView>` is\n  reserved, not available.\n- Capture `when` cannot mix `and` and `or` (PLAY0089). A capture without `key` does not bind.\n- For `source events`, `key` is a required property on every `from` event (PLAY0700);\n  specs supply `given \u003CEvent>` \u002F `when append \u003CEvent>`, not capture records (PLAY0701).\n- First sight is `added` only. Use `when added` separately for initial facts; seed\n  record updates with `given capture` of the same key. Read captures-and-reactions\n  `references\u002Frecord-capture-specifications.md` for the prerequisite and child\u002Fnested rules.\n- Current V1 warns on undeclared capture\u002Fremoval events (PLAY0166); V3 remains a\n  separate binder check.\n- A trigger with `reads` that `produces` directly fails binding: decide in a command.\n  Command reads can protect with `command reads protected` and admitted shapes (v25);\n  trigger reads cannot. Stage 4.138.0 renders protected reads as Arc read protection (`cratis render` gets it from the first CLI that bundles it; CLI 3.75.0 refuses them with STAGE-ESM-044);\n  semantic execution is separate from generated-app protection.\n- An authorized command exercised in a spec without `given caller` is PLAY0389 at binding.\n- A list query (`=> Item[]`) binds (a snapshot list is not rendered, `STAGE-ESM-010`);\n  a clock sweep that iterates items needs a code body the reference does not run\n  (`references\u002Ftodo-list-example.md`).\n\n**Modeling defaults** (deviate with a recorded reason)\n- A `produces` without `for` lands on the triggering fact's source; clock and trigger occurrences have\n  none, so give `for` (a carried value or a literal).\n- `where` guards every trigger of the reaction and must resolve from each trigger's values: give a clock\n  sweep its own reaction.\n- Malformed or unmappable input becomes a recorded failure fact or dead-letter view, never a dropped\n  record. A fan-out records one outcome per item; partial success is failure at an effect boundary\n  (`cratis-engineering-effect-boundaries`), never a batch \"done\" while members failed.\n- Infrastructure (logging, caching, retries, outbox plumbing) is never a Translate slice.\n- Personal data kept in events needs `pii` on its concept; keep it even when it blocks binding or render.\n- Code bodies (`file`, inline fences) document realization; no local engine runs them.\n\n**Review questions**\n- What stops this from running twice? Forever? When the external call times out?\n- Who is the actor, and could an outsider reach the invoked command?\n- What does a person see while the work is pending or failed?\n- What happens if the outside fact arrives before ours, twice, out of order, or changed?\n\n## Gate\nNot done until, for every affected reaction and capture, there is a line in the audit\n(`references\u002Faudit-format.md`) with a location and a result of complete, open or blocked, and any\nunreviewed scope is named. Open decisions and target requirements are in `STATE.md`. A missing required or\nreferenced queue opening or closing fact is an unresolved dependency, never skipped silently; a\ndirect effect states \"not applicable: no queue\" with its reason (per-chain questions in\n`references\u002Faudit-format.md`).\nNever report a verdict without the tool and version that produced it.\n\n## Verify\n- V1 and V3 per `cratis-screenplay-toolchain`, each with tool and version. When the bundled compiler stops before v6,\n  report \"V3 blocked: PLAY0268 (ESM v6)\". Current admitted scenarios use\n  standalone `screenplay test`\u002FMCP for V4; unsupported or unbound is not passed.\n- For each external source and type: its translation, or an explicit out-of-scope reason; check\n  target-field completeness as well as source-field dispositions.\n- One happy path is not coverage: cite the spec or the missing case for each branch, denial, competing\n  claim and closing event.\n- Every complete example compiles. Read `references\u002Ftodo-list-example.md` when modeling a pending-work automation (its design-only excerpts insert into `assets\u002Fpending-certificates.play` and `assets\u002Fretry-sweep.play`), and `references\u002Ftranslate-example.md` when modeling capture plus translator reactions.\n\n## Route near misses\nRead [references\u002Fneighbouring-skills.md](references\u002Fneighbouring-skills.md) when the work is grammar, streams, specifications, rendering, legacy writes or hand-written reactors.\n\n## Lineage\nRead `references\u002Fprovenance.md` when checking sources, adaptations, attribution, or approaches deliberately not adopted.\n",{"name":5,"license":14,"description":7},"main","feed400071bf3f9f4410a956d73413daa6e1b334",".cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue","https:\u002F\u002Fwww.cratis.io\u002Fprologue\u002F","https:\u002F\u002Fgithub.com\u002FCratis","https:\u002F\u002Fwww.cratis.io","Open-source (MIT) event sourcing and CQRS for .NET and beyond: Chronicle, Arc, Components and Screenplay.","2026-11-14 06:37:10",{"source":8,"skillName":5,"commands":34,"prompt":44,"zipAvailable":45},[35,38,41],{"tool":36,"command":37},"npx","npx skills add Cratis\u002FPrologue --skill cratis-screenplay-automations-and-translations",{"tool":39,"command":40},"bunx","bunx skills add Cratis\u002FPrologue --skill cratis-screenplay-automations-and-translations",{"tool":42,"command":43},"pnpm","pnpm dlx skills add Cratis\u002FPrologue --skill cratis-screenplay-automations-and-translations","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002FSKILL.md",true,[47,53,57,61,67,71,75,79,83,87,91,95,99,103,107,111,115,119],{"path":48,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":51,"sourceHtmlUrl":52},"assets\u002Fpending-certificates.play","ASSET","资产文件",514,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Fassets\u002Fpending-certificates.play",{"path":54,"resourceType":49,"resourceTypeDesc":50,"sizeBytes":55,"sourceHtmlUrl":56},"assets\u002Fretry-sweep.play",533,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Fassets\u002Fretry-sweep.play",{"path":58,"resourceType":58,"resourceTypeDesc":59,"sizeBytes":60,"sourceHtmlUrl":15},"LICENSE","许可证",2353,{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002Faudit-format.md","REFERENCE","参考文档",3948,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Faudit-format.md",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Fautomation-patterns.md",12145,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fautomation-patterns.md",{"path":72,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":73,"sourceHtmlUrl":74},"references\u002Fcases-to-specify.md",7596,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fcases-to-specify.md",{"path":76,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":77,"sourceHtmlUrl":78},"references\u002Feffects-and-idempotency.md",7222,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Feffects-and-idempotency.md",{"path":80,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":81,"sourceHtmlUrl":82},"references\u002Fintegration-contracts.md",7250,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fintegration-contracts.md",{"path":84,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":85,"sourceHtmlUrl":86},"references\u002Fintegration-interview.md",1598,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fintegration-interview.md",{"path":88,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":89,"sourceHtmlUrl":90},"references\u002Fneighbouring-skills.md",865,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fneighbouring-skills.md",{"path":92,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":93,"sourceHtmlUrl":94},"references\u002Fproduct-sources.md",771,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fproduct-sources.md",{"path":96,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":97,"sourceHtmlUrl":98},"references\u002Fprovenance.md",5803,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fprovenance.md",{"path":100,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":101,"sourceHtmlUrl":102},"references\u002Fpublic-events-and-direction.md",9672,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fpublic-events-and-direction.md",{"path":104,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":105,"sourceHtmlUrl":106},"references\u002Frealization-and-gap-fill.md",4752,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Frealization-and-gap-fill.md",{"path":108,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":109,"sourceHtmlUrl":110},"references\u002Ftodo-list-example.md",9794,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Ftodo-list-example.md",{"path":112,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":113,"sourceHtmlUrl":114},"references\u002Ftranslate-example.md",6182,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Ftranslate-example.md",{"path":116,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":117,"sourceHtmlUrl":118},"references\u002Ftranslation-patterns.md",7107,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Ftranslation-patterns.md",{"path":120,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":121,"sourceHtmlUrl":122},"references\u002Fworked-integration.md",7668,"https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fcratis-screenplay-automations-and-translations\u002Freferences\u002Fworked-integration.md",[124,132,140,148,156,164],{"skillNo":125,"name":126,"nameZh":6,"description":127,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":128,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":19},"01M78CCRM9594FCYFMCY5W137G","vectorization","Designs, implements, optimizes, and reviews SIMD code in .NET: vectorizing scalar loops with TensorPrimitives, Vector64, Vector128, Vector256, Vector512, or hardware intrinsics, and reviewing existing SIMD code, including the generic Vector type, for contract equivalence, tail handling, memory safety, portability, fallbacks, and measured performance. Use when a .NET loop or SIMD routine is being written or reviewed. Not for performance work unrelated to SIMD.","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fvectorization\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fvectorization\u002FSKILL.md",[],[],{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":136,"sourceHtmlUrl":137,"categories":138,"keywords":139,"publishedAt":19},"01M78CCJKGDNSDNCMA92PV8GCR","target-authoring","Canonical patterns for writing custom MSBuild targets: DependsOnTargets versus BeforeTargets and AfterTargets, the Build-to-CoreBuild three-level pattern, and the XxxDependsOn chain-extension pattern. Use when diagnosing or fixing custom-target anti-patterns: Directory.Build.targets redefining SDK targets, targets that replace CompileDependsOn instead of extending it, Outputs versus Returns misuse that returns stale results, missing Inputs\u002FOutputs causing needless rebuilds, or missing FileWrites registration. Not for incremental build tuning or general anti-pattern review (use the msbuild skill), or non-MSBuild build systems.","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Ftarget-authoring\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Ftarget-authoring\u002FSKILL.md",[],[],{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":144,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":19},"01M78CCCWS16JZA36AGB5YVMAN","run-tests","Chooses and runs the repository-compatible .NET test command: classic, VSTest, bridged MTP, or native MTP syntax for MSTest, xUnit, NUnit, and TUnit. Use before running .NET tests or answering with a test command or flags: run the tests, one test, class, category, trait or target framework, combined filters, --filter-query, --no-build, --diag, TRX, coverage collection, crash or hang dumps, filter errors, or unrecognized options. Not for platform identification alone (use platform-detection), writing or debugging test code, interpreting a coverage report (use coverage-analysis), CI investigation, migration, or a persistent hot-reload loop.","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Frun-tests\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Frun-tests\u002FSKILL.md",[],[],{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":152,"sourceHtmlUrl":153,"categories":154,"keywords":155,"publishedAt":19},"01M78CC6VC08Y3WTN4T784DYDY","profiling","Uses the free official .NET diagnostics CLI tools for profiling and runtime investigation in a repository: CPU, GC pressure, allocation growth, exception storms, lock contention, and slow code. Use when a .NET application needs performance or runtime profiling. Not for replacing realistic performance or load tests with ad-hoc tracing, production heap collection without a pause-risk plan, crash dumps (use dump-collect), or benchmark design (use microbenchmarking).","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fprofiling\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fprofiling\u002FSKILL.md",[],[],{"skillNo":157,"name":158,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":160,"sourceHtmlUrl":161,"categories":162,"keywords":163,"publishedAt":19},"01M78CC14WNAP1Y77ZMM4VD29A","platform-detection","Identifies a .NET project's test platform, framework, command mode, and SDK-style versus classic project system, resolving global.json, project, packages.config, Directory.Build.props, and Directory.Packages.props precedence for MSTest, xUnit, NUnit, and TUnit. Use when asking \"which test platform or framework?\", \"VSTest or MTP?\", or \"what runner does this project use?\", including bridge settings, UseVSTest opt-outs, and conflicting VSTest\u002FMTP configuration. Not for running or filtering tests, commands, flags, TRX, dumps, or test-command errors (use run-tests), or for hot-reload or migration requests.","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fplatform-detection\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Fplatform-detection\u002FSKILL.md",[],[],{"skillNo":165,"name":166,"nameZh":6,"description":167,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":9,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":168,"sourceHtmlUrl":169,"categories":170,"keywords":171,"publishedAt":19},"01M78CBVQKQZ6C9VZAD48GB8AC","orleans","Designs Microsoft Orleans systems from each primitive's purpose and failure model: grains, digital twins, state versus databases, transactions, messaging, streams, timers, reminders, Durable Jobs, stateless workers, grain services, startup, and hosting. Use when a task needs an Orleans design decision: inspect version and topology, choose the primitive, implement, and validate. Not for other actor stacks, batch processing, relational-only CRUD, or advice without an Orleans decision.","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Forleans\u002FLICENSE","https:\u002F\u002Fgithub.com\u002FCratis\u002FPrologue\u002Fblob\u002Fmain\u002F.cratis\u002Fai\u002Fskills\u002Forleans\u002FSKILL.md",[],[]]