本文へ移動
cccskills
無料GitHub で公開

orleans

Design Microsoft Orleans systems from each primitive's purpose and failure model. USE FOR: grains, digital twins, state versus databases, transactions, messaging, streams, timers, reminders, Durable Jobs, stateless workers, grain services, startup, and hosting. DO NOT USE FOR: other actor stacks, batches, relational-only CRUD, or advice without an Orleans decision. INVOKES: inspect version and topology, choose the primitive, implement, and validate.

インストール方法を見る

含まれるファイル(17)

  • SKILL.md14.6 KB
  • manifest.json283 B
  • references/anti-patterns.md15.9 KB
  • references/configuration-api.md26.7 KB
  • references/examples.md4.2 KB
  • references/grain-api.md24.5 KB
  • references/grains.md8.2 KB
  • references/hosting.md8.0 KB
  • references/implementation.md20.3 KB
  • references/official-docs-index.md17.8 KB
  • references/patterns.md19.8 KB
  • references/persistence-api.md16.9 KB
  • references/primitive-selection.md4.3 KB
  • references/scheduling-and-services.md13.7 KB
  • references/serialization-api.md7.5 KB
  • references/streaming-api.md11.3 KB
  • references/testing-patterns.md8.4 KB

SKILL.md(原文)

インストールする前に、エージェントに与えられる指示の中身を確認できます。

Microsoft Orleans

Diagnostic Output Budget

Keep native test progress and ANSI visible; use the detected runner's supported flags (--progress on --ansi on for MTP/TUnit), not MTP switches on VSTest. Keep console logs at Warning or higher and one concise final summary. Do not replay progress redraws, successful-test output, or Information/Debug/Trace logs into model context. On failure/crash, show only the failing test/resource, root error, and relevant stack frames; deduplicate and cap each diagnostic response at 80 lines / 8 KiB. Never dump entire console/host/browser logs, HTML, TRX, or crash artifacts. Keep necessary artifacts size-bounded outside context, link them, and inspect exact bounded excerpts. Preserve the runner exit code through capture/filtering; disclose truncation. Silence alone does not establish a hang.

Start With Purpose

Do not begin with an Orleans API. First state:

  1. the business identity that owns the behavior;
  2. the invariant and what must survive activation or cluster failure;
  3. the required consistency, query shape, acknowledgement, durability, replay, fan-out, and timing.

Then select the smallest Orleans primitive whose guarantees match those requirements. Reject Orleans when the problem is primarily shared-memory computation, a finite batch, relational querying, or global coordination with few independent entities.

Inspect package versions for version-sensitive work. Orleans 10.3.1 ships Microsoft.Orleans.DurableJobs* and Microsoft.Orleans.Journaling* as 10.3.1-alpha.1; treat them as experimental until that status changes.

Orleans 10.3 makes Newtonsoft storage enforce the type allow-list, changes RPC telemetry keys, and requires custom grain-context activators to apply configurators before construction. Prefer generated/allowed types over permissive JSON and update affected tests, dashboards, and activators together. 10.3.1 services analyzer contract identities and documents placement hints.

Mental Model

  • A grain is a virtual actor with stable identity, behavior, and optional state, not a process, row, DTO, controller, or background job.
  • A grain reference is a location-transparent address. Getting a reference does not create a durable record or prove that an activation exists.
  • An activation is an ephemeral in-memory execution instance. Orleans creates, places, moves, deactivates, and recreates it. Never equate activation lifetime with entity lifetime.
  • A normal grain has at most one activation in the cluster by default and processes turns one at a time. This makes the grain a natural owner of per-identity invariants.
  • A silo hosts activations. Silos form a cluster; external clients or a co-hosted IGrainFactory call grains.
  • Calls are asynchronous messages even when they look like C# method calls. Network failure, timeout, serialization, retries, and duplicate side effects still matter.
  • A grain can model a digital twin when its identity and behavior map to a real or domain entity; that is a use case, not every grain's definition.
  • Orleans gives logical ownership and turn-based execution. It does not make external side effects transactional, turn arbitrary data into a queryable database, or provide exactly-once execution by default.

Workflow

  1. Inspect the solution, Orleans version, hosting topology, grain interfaces, providers, and tests.
  2. Identify domain identities and invariants. Prefer many independent, bounded entities over global coordinator grains.
  3. Choose state, communication, and time-based work from the tables below.
  4. Keep default non-reentrant scheduling and placement until a measured requirement justifies a change.
  5. Configure providers independently and test the failure model the design depends on.

Choose the State Owner

PrimitivePurposeChoose it whenDo not use it as
Activation fieldsFast, temporary state for one activationThe value is derived, cached, disposable, or safe to rebuild after deactivation/failureDurable truth
IPersistentState<T>Durable current state owned by one grain identityThe grain needs a bounded snapshot loaded on activation and explicitly written after commandsA general query database or cross-grain table
External database/repositoryQueryable, indexed, relational, bulk, shared, or externally owned dataThe system needs joins, search, reporting, set-based updates, independent access, or an existing system of recordA replacement for grain ownership when serialized per-entity decisions are still required
Grain plus database/read modelSeparate command ownership from query/storage concernsA grain owns invariants and a small control snapshot while a database owns large records, history, projections, or reportingTwo competing sources of truth without an explicit contract
JournaledGrain<TState,TEvent>Persist domain events and reconstruct stateAudit history, business-event replay, log consistency, or multi-cluster event-sourced replication is a requirementA default persistence choice for ordinary CRUD state
Orleans.Journaling durable statesReplay durable collection/value operations through a journalThe experimental 10.3 journaling model, durable collections, or durable completion state solves a measured needStable default persistence; it is distinct from JournaledGrain business event sourcing
ITransactionalState<T>ACID, serializable all-or-nothing changes across transactional grain stateA short operation must atomically update multiple grain-owned states and compensation is unacceptableLong-running workflows or atomicity with arbitrary external systems
Saga/process managerDurable progress with compensation across steps and external systemsWork is long-running, spans services, waits for events, or cannot share one transactionInstant atomic commit

Grain State Versus a Database

Use grain state for bounded current state and per-identity invariants. Use a database/read model for joins, search, reporting, bulk work, history, shared access, or an external system of record. When using both, define one authority per field and recovery rules.

Never query or mutate another grain's persistence record behind the grain, or expose provider storage as the public query model merely because it uses SQL/Cosmos/Redis. Before using transactions, try one bounded grain owner; use a saga for external effects or long waits. Read references/persistence-api.md for the full boundary.

Choose Communication

Prefer a direct call for completion to a known owner. Use streams for decoupled provider-backed delivery, response streams for one caller, and broadcast/observers/one-way calls only for loss-tolerant notifications. A timeout does not prove whether an external effect committed; retries require idempotency. Read references/primitive-selection.md for the communication guarantees and execution choices.

Choose Time-Based and Background Work

PrimitivePurposeChoose it whenDo not choose it when
RegisterGrainTimerPeriodic or one-shot work tied to the current activationWork is frequent, local to an active grain, and safe to stop on deactivation or silo failureThe schedule must survive reactivation/restart
ReminderDurable recurring schedule definition associated with a grain identityLow-frequency recurring work must wake the grain after deactivation or cluster restartEvery missed occurrence must be replayed, timing must be precise, or work is high-frequency
Durable JobPersistent one-time future delivery to a target grain with cancellation/retry metadataA delayed command, expiry, notification, or workflow step must execute at least once around a due timeRecurring work, exactly-once side effects, or production work that cannot accept the current alpha package status
[StatelessWorker]Auto-scaled pool of local stateless grain activationsCPU/transform/routing/pre-aggregation work is not tied to one durable entityScheduling or durability; a stateless worker is not a job system
BackgroundServiceContinuous loop owned by each host processA silo/web host must poll or consume an external source and forward work into grainsOne global loop across replicas unless duplicates are safe or externally coordinated
IHostedServiceHost startup/shutdown action or simpler background componentInitialization or bounded host-lifetime work belongs to standard .NET hostingPer-entity durable work
Orleans startup taskFail-fast hook at a specific silo startup stageLegacy/framework integration truly requires Orleans lifecycle orderingGeneral background work; prefer BackgroundService or IHostedService
Silo lifecycle participantOrdered initialization/shutdown of an Orleans componentA provider or runtime service must start at an exact lifecycle stageBusiness scheduling
Grain servicePer-silo, cluster-partitioned runtime support serviceEvery silo hosts a long-lived service and responsibility for grains must be partitioned across silosAn ordinary domain entity, a singleton, or a durable job queue
External scheduler/workflow engineScheduling/orchestration outside OrleansCross-system workflows, cron calendars, human steps, broad operational control, or mature production guarantees dominatePer-grain work already solved by a stable Orleans primitive

Timer, Reminder, or Durable Job

Timer means “while this activation lives”; reminder means “wake this grain on a durable recurring schedule”; Durable Job means “invoke this target once around a future time, at least once.” Reminders persist definitions but miss ticks while the cluster is down. Durable Job handlers must be idempotent, and current alpha.1 packages are an explicit architecture risk.

BackgroundService means one loop per host replica, not one loop per cluster. Use a well-known grain or external lease/leader for one logical collector.

Read references/scheduling-and-services.md before implementing timers, reminders, Durable Jobs, hosted/startup tasks, silo lifecycle participants, or grain services.

Choose Execution and Scaling

Use standard grains for stateful identities and stateless workers for fungible work. Apply narrow interleaving attributes only after auditing invariants across every await; grain turns do not make reentrant workflows race-free. Preserve default placement unless a measured locality or compatibility requirement justifies changing it. See references/primitive-selection.md before changing scheduling or placement.

Hosting and Provider Boundaries

Keep concerns separate: clustering discovers silos; the grain directory locates activations; grain/reminder/transaction/job storage persist different records; stream providers carry events while PubSubStore tracks subscriptions; serialization defines wire and persistence compatibility.

In-memory clustering, storage, reminders, streams, Durable Jobs, and journaling are development/test choices unless loss is explicitly acceptable. Configure production providers, credentials, TLS/networking, server GC, graceful shutdown, and health/readiness for the deployment target. In Aspire, declare backing resources in AppHost and register the keyed clients expected by Orleans providers.

Contract and API Rules

  • Keep grain interfaces coarse-grained and asynchronous: Task, Task<T>, ValueTask<T>, or supported IAsyncEnumerable<T>.
  • Cancellation is cooperative, not proof that work did not finish.
  • Use [GenerateSerializer] and stable [Id(N)] values on messages/state. Use [Alias] for durable type identity and [Immutable] only for genuinely immutable values.
  • Never reuse removed field IDs; write state explicitly and propagate storage failures.
  • Bound external calls and use idempotency plus a saga/outbox when state writes and external effects must be reconciled.

Validate the Chosen Guarantees

  • Grain boundaries follow business identity and avoid hot global coordinators.
  • State is bounded, and the grain-state-versus-database choice is explicit.
  • Every time primitive matches activation, recurrence, durability, and delivery requirements.
  • Durable Job handlers/retried commands are idempotent; reminders tolerate missed ticks.
  • Broadcast channels, observers, and one-way calls carry only loss-tolerant signals.
  • Provider-backed tests prove delivery, ordering, replay, and failover claims.
  • Reentrancy tests cover state across await; transactions use transactional storage, [Reentrant], and PerformRead/PerformUpdate.
  • Hosted services are reviewed for per-replica duplication.
  • Production uses persistent providers, multi-silo tests, and observability wherever the guarantee depends on them.

Load References

Open only the references needed for the selected primitive:

Prefer Learn for stable APIs. For Durable Jobs and Orleans.Journaling, use version-tagged package READMEs/public API because Learn does not yet cover them fully.

レビュー

まだレビューはありません。使ってみた感想をお寄せください。

同じリポジトリのスキル

概要と使いどころ

Route gh-aw workflow design/create/debug/upgrade requests to the right prompts.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

Use a repo-root `.editorconfig` to configure free .NET analyzer and style rules. Use when a .NET repo needs rule severity, code-style options, section layout, or analyzer ownership made explicit. USE FOR: the repo needs a root .editorconfig; analyzer severity and style ownership are unclear; the team wants one source of truth for rule configuration. DO NOT USE FOR: choosing analyzers with no config change; formatting-only execution with no config ownership question. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

Scans .NET code for ~50 performance anti-patterns across async, memory, strings, collections, LINQ, regex, serialization, and I/O with tiered severity classification. Use when analyzing .NET code for optimization opportunities, reviewing hot paths, or auditing allocation-heavy patterns.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

Symbolicate the .NET runtime frames in an Android tombstone file. Extracts BuildIds and PC offsets from the native backtrace, downloads debug symbols from the Microsoft symbol server, and runs llvm-symbolizer to produce function names with source file and line numbers. USE FOR triaging a .NET MAUI or Mono Android app crash from a tombstone, resolving native backtrace frames in libmonosgen-2.0.so or libcoreclr.so to .NET runtime source code, or investigating SIGABRT, SIGSEGV, or other native signals originating from the .NET runtime on Android. DO NOT USE FOR pure Java/Kotlin crashes, managed .NET exceptions that are already captured in logcat, or iOS crash logs. INVOKES Symbolicate-Tombstone.ps1 script, llvm-symbolizer, Microsoft symbol server.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

Symbolicate .NET runtime frames in Apple platform .ips crash logs (iOS, tvOS, Mac Catalyst, macOS). Extracts UUIDs and addresses from the native backtrace, locates dSYM debug symbols, and runs atos to produce function names with source file and line numbers. Automatically downloads .dwarf symbols from the Microsoft symbol server using Mach-O UUIDs. USE FOR triaging a .NET MAUI or Mono app crash from an .ips file on any Apple platform, resolving native backtrace frames in libcoreclr or libmonosgen-2.0 to .NET runtime source code, retrieving .ips crash logs from a connected iOS device or iPhone, or investigating EXC_CRASH, EXC_BAD_ACCESS, SIGABRT, or SIGSEGV originating from the .NET runtime. DO NOT USE FOR pure Swift/Objective-C crashes with no .NET components, or Android tombstone files. INVOKES Symbolicate-Crash.ps1 script, atos, dwarfdump, idevicecrashreport.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

Design or review .NET solution architecture across modular monoliths, clean architecture, vertical slices, microservices, DDD, CQRS, and cloud-native boundaries without over-engineering. USE FOR: .NET architecture choices; layer and domain boundary review; service decomposition; clean architecture, vertical slice, DDD, CQRS, and modular monolith decisions. DO NOT USE FOR: unrelated stacks; generic tasks that do not need this specific guidance. INVOKES: inspect the repository context, edit targeted files, and run relevant build, test, lint, or validation commands when changes are made.

日本語の概要は準備中です。原文の説明を表示しています。

managedcode/dotnet-skills4852026年10月10日 更新

managedcode のスキルをすべて見る

このスキルの問題を報告する