---
name: actors
description: Use for any non-trivial pi-actors operation, diagnosis, or development involving Recipes, persistent tools, Runs, spawn, message, inspect, Trace, Control, capability specialization, or activation.
---

# Actors

## Choose the operation

Start from the intended outcome:

```text
Run a maintained capability once
→ use spawn recipe=<skill>/<recipe>

Make a maintained capability a persistent agent-callable tool
→ use register_tool from=<skill>/<recipe>

Keep the same capability but narrow caller defaults
→ use register_tool from=<skill>/<recipe> defaults={...}

Register a trusted command directly
→ use register_tool template="..."

Build a reusable multi-node execution graph
→ author a Recipe with named imports

Run a long-lived controlled process
→ spawn its async Recipe, then use message and inspect

Coordinate several independent actors or subagents
→ also read the swarm Skill

Choose capability-specific behavior
→ read the owning capability Skill

Diagnose resolution, registration, or activation
→ use Inspect status/doctor flows and stop on contradictory evidence
```

Use [persistent tools](./references/persistent-tools.md), [Recipes](./references/recipes.md), [Runs](./references/runs.md), or [diagnostics](./references/diagnostics.md) only when the selected operation needs that detail.

## Core distinctions

Keep these boundaries explicit:

```text
Skill Recipe ≠ registered tool
spawn ≠ registered-tool invocation
persisted ≠ callable
direct delegation ≠ named import composition
Run Control ≠ actor chat
```

A Skill Recipe is a maintained component addressed by `<skill>/<recipe>`. `spawn` creates a Run from a Recipe. `register_tool from=<skill>/<recipe>` persists compact logical delegation and activates from the resolved effective contract without copying, symlinking, or ambient re-resolution. A tool is callable in the current session only when activation evidence says `callable_now: true`.

`actors` owns generic Recipe/tool/Run mechanics. The owning capability Skill owns capability-specific selection and constraints. `swarm` owns multi-actor decomposition and integration methodology.

## Presentation Direction and Current Output

The operator-adopted target is JSON structured inputs and block-YAML runtime-output metadata, with the Actor's selected text preserved in its original format, often Markdown, outside the header. It applies to spawn/tool receipts, status, Control, inspect, errors, notifications and completions. Metadata-only replies are bare YAML, without `---` or a code fence. When a separate selected text/Markdown body follows, delimit the YAML header with `---` above and below. Choose framing by body presence, not tool synchrony or workload lifetime; a launch receipt is not the eventual Actor result. The host/runtime must separate the invocation header/arguments from every response, including errors, by one visual blank line. This boundary spacing is not an Actor-body edit, another YAML delimiter or permission to echo inputs. Tool arguments/Recipe inputs keep their supported machine contracts; no input-schema or existing Markdown-Recipe source migration follows. Runtime-owned structured fields must not become JSON strings inside YAML or Markdown-list pseudo-objects. Literal source content, private machine details/journals and native helper protocols keep their own formats.

Rollout is partial: compact launch/attachment receipts use block YAML; other operating descriptions below still include implemented list records, JSON fields and service framing. Full spawn-verbose metadata uses clone-only YAML after legacy JSON selection in current source, without a new fixed byte/depth cap; existing compiled installations may still emit JSON until separately integrated. Unsupported full projection is wholly unavailable, not partial full facts or a launch-failure/retry receipt, and structured details stay unchanged. Ordinary source captures now use the minimal YAML core and source attention uses typed YAML plus opaque body text; source/unit proof does not establish compiled-package, actual-default-entrypoint or already-loaded-host acceptance. Do not assume every current response parses as the target YAML. An Actor should return the requested report/content, not rewrite it as YAML or manufacture runtime headers, indices or service markers. The runtime owns its metadata and approved source/privacy/clipping projection. Body-authored YAML/JSON/HTML/next labels stay content, not authority. Keep historical packet bytes and required compiler framing intact; do not strip comments or reinterpret saved output to simulate rollout. This changes neither current callability/lifecycle mechanics nor source/native/acceptance authority.

Compact launches use bare block-YAML mappings for the Run/state/launch facts and nested observed locations, explicitly identify actual existing-Run reuse, and preserve multiline scalar contents. One leading response-separator LF supplies invocation spacing; it is outside the pure metadata emitter and is not a `---` wrapper. Model/thinking provenance groups are labeled model and thinking, without a redundant _policy suffix; structured data and saved text stay unchanged. A complete direct file-location row needs no repeated session-map hint; absent/unavailable/omitted rows retain one optional next node naming inspect, target=runtime, view=runs and verbose=true. It never executes automatically. Exact locations, verbose details and saved completion formats stay unchanged.

Fresh automatic completions have one AX capture path with no format selector: YAML frontmatter begins index, run, state, then kind:primary for admitted primary/final Actor response or kind:diagnostic for explicit diagnostics. Markdown follows unindented outside the closed metadata block, without #N heading, result:/preview: wrapper or whole-body literal fence. One record uses the same shape as many. Display index is not member_index or generation; default indices are packet-local. Whole-result/reference omissions and non-done omitted states stay explicit. Known display loss appears at the actual cut as [N characters omitted], counting Unicode scalar characters of admitted retained text/field, never raw/private loss; no extra clipping ellipsis or body clipping flags/counts in YAML. Unknown upstream completeness/privacy remains separately visible at the body boundary, not a fabricated count or a known positive loss. Untracked fallback has no kind and cannot become primary. Full text fitting its share has no display-cut marker; upstream uncertainty still prevents a completeness claim. New packets share48KiB UTF-8 including references/framing across at most64candidate rows, with frozen equal shares and no unused-share redistribution or fixed16KiB result/2KiB preview cap. Captured members remain bounded at256. Text is admitted work output/final response or explicit error/failure diagnostics, never launch commands. Successful composition/retry/Pi text-print can retain text_basis:actor_response; scope and exact references remain technical, while original coverage facts remain structured retained data. The model receives one complete content with whole source/generation/location references or truthful omission/inventory, not a standing full-map instruction. The TUI renders compiler headers/markers as Text and each body as independent native Markdown; only whole validated header reference/location rows and framing disappear in compact view. Body-authored YAML, next/tool/batch and omission lookalikes remain content. Content-bound hashes/ranges/blocks are display consistency, not authentication, source/read/action or acceptance authority. Invalid/missing hints and expansion reveal full original text, without Run-source IO. Old saved codecs, budgets, labels, excerpts, counts and hints replay exactly with no refresh, repair, ACK/resend or restyling—including earlier #N packets and the first frontmatter encoding. Fresh unavailable indices use quoted YAML "?"; an old saved unquoted value is not silently corrected. Routine successful delivery adds no separate completions/delivery-accepted toast; actual failures and handled-generation fences remain. These source/package rules do not prove that an already loaded session was reloaded. Fresh explicit agent Trace previews append boundary … and [omitted: N chars] from normalized retained turn, with a separate upstream [omitted: unknown]. N counts only display loss after existing session privacy, not discarded original/source text. Short well-formed summaries stay unchanged, including authored older-looking markers; malformed retained text yields Agent turn [omitted: unknown] (malformed retained text), never a guessed count or repaired scalar. This is read-time display only, not a rewrite/version of saved packets or sources. Other legacy clipping is not yet uniformly covered. Follow retained references selectively without inventing completeness or permission. Agent Trace ids reference recorded entry provenance, not aggregate traversal order or chronological event numbers. Native entry keys survive sibling growth; bounded legacy/ambiguous/private-metadata fallbacks are not permanent identities, source immutability or new read/work permission.

Current completion index fields are packet-local, not persistent historical indices; earlier saved #N headings keep their original meaning. Session completion streams are adopted work in progress, not an available action; do not invent a start-stream command, initialize a missing counter or reinterpret old headings. A kernel-only path commits numbered snapshots/counters/activation atomically. Its internal runtime bridge requires trusted fresh-session opt-in plus current manager/generation binding; the default entrypoint does not opt in and no public tool/command exposes it. Unknown state does not fall back to local numbering on that path. Startup/reload/resume, including ambiguous imports, cannot resume a stream automatically; stored numbers remain data, not a new session grant. A pending target or projected scope is not an active stream. Missing state never authorizes bootstrap, and unknown/conflicting delivery never authorizes bypass or reallocation. Saved numbers stay exact; an admitted unavailable counter or unfitting whole range freezes an unknown index (quoted "?" in fresh YAML, #? in older layouts) rather than resetting or partially numbering a packet.

Fresh compact Run/tool/Recipe inspect text uses flat AX records. Run views still show only their run/view header; choose verbose for the existing structured evidence, not a newly available snapshot. Tool status preserves callability/activation/source/usage facts and lists required/optional arguments; schema stays JSON. Recipe registry/focused doctor preserve counts, partiality, portable source and rejection. At most one known read-only Recipe inspect hint becomes typed next; other advice is opaque instruction content, not a parsed/executable command or permission to spawn/update a tool. All next_actions remain in details. These are read-time projections; saved history and machine payloads are not restyled. Runtime status/runs/triage now also uses flat runtime/view records for exactly the existing package/review facts, full owned inventory count and existing pressure/attention counts. It adds no snapshot, duration, default status integration or new read; verbose navigation stays independently bounded. Successful automatic completion delivery is silent outside the result records: no separate completions/delivery-accepted receipt or UI toast. Durable acceptance and handled-generation fencing remain; real callback, delivery, recovery and teardown failures stay reportable in the same field style without changing effects or closure authority. Fresh watcher diagnostics now use watcher/scope/path/diagnostic/recovery fields with whole literal paths; rearm restores watch acceleration, not new terminal/native authority. Automatic retirement notices distinguish a returned stop request, reported cancellation, skipped or failed stop path, always with closure unconfirmed. The stop path includes notification callbacks, so a fallback may follow effects already performed; do not infer an effect-free graceful-stop failure or replay work. Existing attempted/result/error behavior remains, and no discarded lower cause is reconstructed. Inspector layouts remain separate.

Locally authored inspect refusals now use AX records with target_kind/target/tool, result and actual supported-value lists. target_kind names a selector family, not ownership. Only missing registered-tool/schema errors retain one known read-only inspection next; missing tools still forbid substituting spawn for tool invocation. Whole variable fields and next actions fit the shared16KiB text allowance or show explicit field/action omission counts, never shortened targets or inferred character loss. Body-authored labels stay content. Dependency/authorization/session failures keep their owning behavior, without a blanket wrapper or new private-cause disclosure. Discovery/status hooks may already have run before a local refusal; it is not a no-effects receipt or authority to replay.

Runtime validation guidance is limited to pre-dispatch failures. An executor/launcher failure can retain partial effects; matching argument-like wording is not a reason to repeat the invocation. Preserve the original cause and diagnose it instead; this adds no retry or closure guarantee.

Four locally authored Control guard errors use caller target/action/result records and real supported_actions/available_actions sequences. Those lists are diagnostic data, not automatic instructions or readiness/actuation permission. Targets and whole selected lists fit16KiB or show explicit field/entry omissions; malformed selected text is unavailable, not repaired. Omission counts are not private/upstream character counts. Normalizer/session/dependency and actual dispatch failures keep their owning behavior; a guard is no global no-effects receipt or permission to retry.

Local spawn guards identify unsupported state_dir or invalid as with field/result and the selected caller value, not an admitted Run. Whole values fit16KiB or show field omission; malformed text is unavailable, not repaired. The host may reject unsupported state_dir by its own schema before the facade, so not every SDK validation error has AX text. This adds no launch, no-effects receipt, retry permission, generated identity or change to Recipe/session/post-launch failures.

Successful normal register_tool receipts now use flat tool/result/source/callable_now fields and actual argument/warning sequences. A non-template source stays one exact literal; complete warnings take priority under16KiB, and whole-field/list omissions count only selected metadata, not hidden chars. Call advice remains opaque instruction, not automatic invocation; an unverified registration keeps its existing read-only tool-status next. Persistence is not callability: rely on the existing activation evidence, never substitute spawn or infer fresh host readiness from this layout. Transaction/errors/list/delete/draft and saved messages are not restyled by this slice.

Registry name listings now show the same selected sorted names as one list with coverage; an overlarge whole group is omitted rather than mislabeled empty, and malformed text is unavailable without repair. Counts describe selected names, not active/callable or the complete loaded-host registry. Deletion returns tool/result and preserves the manual reload note as opaque instruction: neither a current-map miss nor returned deletion proves full host removal or authorizes automatic reload/retry. Existing partial-effect exceptions and machine details remain unchanged.

Draft-promotion success uses the same field grammar only for its original selected name/new-update/source=draft/callable display and one prior hint. It adds no default/body/argument/path or activation facts and does not become an ordinary registration transaction. A zero, opaque legacy display or unavailable field is not permission to infer readiness or repair callability. Whole scalar/action omissions stay explicit; invocation advice is content and only the existing read-only status hint may be typed. Promotion callbacks/display can still fail after writes with original errors; no automatic rollback/retry/reload follows.

Local register_tool source-mode refusals now identify field/result and actual replacement/reference/source-mode/inherited-field choices. Existing correction advice is instruction content, not automatic retry/update or a no-effects receipt. Supplied values are not echoed. The host owns clone/coercion/schema behavior before the facade, so use the actual outcome rather than assuming every wrong-typed request reaches a local AX guard. Other registry errors and all existing activation/transaction contracts remain unchanged.

Ordinary invalid/reserved-name and new-registration missing-source errors now use AX fields. Reserved-name display is only the old selected value, not ownership or tool-invocation permission; an unfit/malformed value is wholly omitted/unavailable, not repaired. Missing-source choices and prior correction advice do not impose a new source rule on listing or existing-tool updates. Dependency/normalizer/blocker errors keep their own behavior; no retry, overwrite or no-effects authority follows from these records. Ordinary/draft already-registered refusals likewise identify only the original selected name and preserve Use update=true to overwrite as opaque instruction. This layout neither merges their admission policies nor authorizes overwriting, automatic retry or invocation; unfit/malformed name display stays explicitly omitted/unavailable under16KiB. Local template-shape errors now identify nested Recipe-shaped template, empty sequence or unsupported type, with actual string/object/sequence choices and old repair advice as opaque instruction. Supplied values are not echoed; this adds no source mode, global null/undefined rule, retry permission or change to host validation/coercion and dependency errors. Four later authored-Recipe validation errors now likewise identify defaults, description or template with fixed field/result. Their original stages remain: front null can delete, existing source can be inherited, and host schema/earlier source checks may reject or route a request before these local errors. No new value echo, automatic correction, activation or no-effects authority follows. A delegated-source runtime-owned-default refusal now names only its existing first selected key under defaults/key/result with prior advice as opaque instruction. It neither displays supplied values/all reserved keys nor authorizes retry or changes command-template/default admission behavior; original copy faults can still precede the refusal. Draft-path refusals now identify the allowed-root or resolved-path reference as a whole literal, or explicit omission/unavailability when unfit/malformed. Old summary-inspection advice remains opaque instruction, not automatic action or a new guarantee that a summary lists every draft. Existing root/exists checks and unowned faults keep their semantics; this is not filesystem absence, no-effects or native proof. Public from-normalization failures now show the prior displayed source, reason, legacy active-skill summary and doctor advice as AX. Source stays a whole literal or explicit field omission/unavailability; reason/summary/body labels are opaque, and advice remains instruction rather than an automatic call. The legacy summary is not a complete Skill inventory, display is not freshly normalized ownership, and a failure does not grant retry, broader source/cause access or host readiness. Normal candidate-admission refusals now likewise report selected joined diagnostics and, only on the existing source branch, prior displayed source/legacy summary/doctor advice. Diagnostics/summary are opaque values, not complete lists or raw causes; upstream diagnostic clipping remains legacy/unproven. Full fields fit16KiB or have explicit omission/unavailability without repair. This does not alter admission, make failures effect-free/transactional, or authorize automatic correction, retry or invocation. Draft invalid-Recipe refusals now similarly show only the previously selected optional reason or joined diagnostics with draft/result. They add no path/body, source permission, raw cause or rollback guarantee; read/diagnose/admission behavior and legacy upstream limits remain. Whole values fit16KiB or show omission/unavailability without repair, and absent reason is not synthesized. Outer registration transaction failure now also separates old stage, resolution_generation, legacy summary and surfaced error as AX after the original cleanup path. That generation identifies resolution context, not fresh Run identity/epoch. Inner rollback/advice wording remains opaque error content, not proof of complete host rollback/removal or permission to repeat. Original cleanup/formatting faults and partial effects remain; no new cause/source access or transaction guarantee. Registry activation/promotion/deletion UI notices now use report/tool fields with only old selected display. A report is not callable or complete-host-removal proof; original hasUI/callback/post-effect failures remain. Whole well-formed notifier values are not subject to the model16KiB cap, malformed selected name is unavailable without repair, and RPC forwarding is not client handling/visibility proof. Recipe registry watcher warning/refresh reports use AX fields too; their old default-root wording is not a freshly verified actual path, and restart/register_tool advice is only opaque instruction, never automatic action. Startup registry warnings use category sequences with whole opaque selected diagnostics; authored next/tool labels are content, malformed selected text unavailable and old doctor advice only opaque instruction. The reports do not establish callability, full upstream diagnostics or new source permission.

Compact Control receipts now use flat Markdown-list key/value records: run names have no duplicated namespace, action/result/delivery/handling remain distinct, and an optional next node names the inspect tool and its target/view. Multiline values retain their internal Markdown under an outer indentation; they are not extra status fields. This is a presentation of existing facts, not a raw dump or proof of completion. Delivery is not handling; a legacy kill attempt is not full termination. Changed-owner/generation refusals withhold replacement status even in verbose/detail output. Kernel delivery exceptions retain original/later causes and genuinely admitted correlation, but raw cause chains are not a new public message schema or proof that handling failed. Actor-local dispatch exceptions stay errors and report delivery/handling/effects uncertainty with a fresh-owned-inventory hint; they intentionally withhold saved correlation, including verbose, because an admission-era context does not prove current reply scope. Do not interpret this as a handling receipt or no-effect refusal. Do not repeat destructive actions to obtain verbose detail or follow a changed owner/generation blindly. See the Runs reference for this boundary.

The awaited Control facade also preserves its surfaced request failure if lifecycle release subsequently throws, keeping ordered private original/release causes without coercion or flattening. A single request or release-only rejection stays exact; existing handled/delivered facts are not rolled back. This does not unlock transport early, prove release/native closure, expose saved correlation or authorize automatic retry. Generic mutation/replacement paths likewise retain original/later faults without making failed operations effect-free, transactional or safe to repeat. Existing bounded platform write retries do not rerun preparation callbacks.

Manual archive/prune exceptions can follow moved/copied/removed data. A single surfaced rejection stays exact; multiple original, diagnostic-recording and release faults retain ordered private causes without rollback or automatic replay. A queued record alone does not prove retirement ran, and a later failure does not undo an admitted filesystem effect. Cause chains are not a new public receipt or native closure proof; do not assume a pruned Run-local Trace remains readable.

## Persistent capability workflow

To make `music-player/playback` callable as `music_player` with a default source:

```text
register_tool
  name=music_player
  from=music-player/playback
  defaults={"source":"~/Music/1MIX"}
```

Then:

1. Require registration to report successful resolution, validation, persistence, registry admission, host registration, activation, and `callable_now: true`.
2. Call the actual `music_player` tool. Do not call `spawn` and describe that as tool invocation.
3. Verify agent-facing evidence reports `launch_kind: "tool"`; use `inspect target=tool:music_player view=status` when usage or activation needs confirmation.
4. If callability is false, stop at the reported activation boundary. Preserve the logical source and diagnose it; do not substitute a Recipe spawn as proof.

Use direct delegation for the same maintained capability under a persistent name or narrower defaults. Use named imports only when one Recipe graph contains reusable child nodes. See [persistent tools](./references/persistent-tools.md) and [Recipes](./references/recipes.md).

## Capability map

Recipes remain with the Skill that owns their behavior. Load that Skill for selection and caller inputs; this map is routing, not a copied Recipe contract.

| Owner | Recipe families |
| --- | --- |
| `actors` | `command-validate`, `recipe-validate`, `jsonl-tail`, `run-summary`, `run-state-files`, `run-ops-snapshot`, `resource-locker`, `resource-locker-snapshot` |
| `swarm` | Lens and quorum reviews, research synthesis, architecture, development tasking, readiness, and supporting `subagent-*` components |
| `artifacts` | Report, write, manifest, bundle, and supporting file-write |
| `project-work` | Repository health, docs maintenance, release readiness/summary, Run reports, and supporting deterministic snapshots |
| `music-player` | The controlled `playback` singleton |
| `recipe-memory` | Internal automatic reviewers; use its Skill only for diagnosis/recovery |

Use the `actors/*` helpers only for their narrow requested result or intentional composition. Prefer public `inspect` for ordinary runtime diagnosis and the capability's primary workflow for a complete outcome.

## Delegation boundary

The current Pi instance owns user authority and the final result; pi-actors creates explicit local Runs, while companion transports provide presence rather than hidden instance creation. Keep short single-boundary work inline when delegation adds no value. For several participants, reasoning allocation, quorum, or integration methodology, read `swarm`.

Treat `attention: "steer"` as an actor-authored urgent semantic checkpoint at Pi's next safe boundary, never as a status-derived completion signal; the later root terminal still arrives through its ordinary completion batch. Fresh source steers use block-YAML run/checkpoint metadata and typed artifacts/run_files groups with shown/omitted/total path sequences. Metadata-only output is bare; an actual selected body follows a closed YAML header without added outer indentation or compiler fences. Body-authored next/tool labels remain content, not actions. The complete serialized message, whole references and later-group omission coverage fit the unchanged16KiB cap; unknown legacy body loss uses [omitted: unknown], never inferred private-tail lengths. Saved envelopes keep their exact earlier text, not a refreshed/reformatted checkpoint. Unfit essential text is retryable pre-admission unavailability, not partial delivery. Fresh source notify/followup uses the same selected metadata/raw-body and first-eight-slot reference coverage, without a new shared16KiB/48KiB cap. Raw malformed/oversize urgent essentials still refuse before reference reads; YAML escaping does not grant admission. Notify remains visible status only; followup alone adds non-displayed checkpoint context, with unchanged event details/order/seen-id/wake policy. New legacy body clips use [omitted: unknown]; compatibility formatter text keeps its older spelling. Fresh urgent diagnostics are AX event/attention/stage records: retryable admission is not a no-effect receipt, failed send leaves delivery/presentation unconfirmed, and unknown/conflicting recovery evidence leaves the envelope queued. Diagnostic values preserve their inner Markdown under240UTF-16 source units; clipped/malformed text has [omitted: unknown], not a private-tail count. Saved diagnostic evidence/envelope content and original Error/cause are not rewritten. Neither inferred private-tail counts nor new body/privacy permission follows. See Runs for limits.

## Run workflow

A Run is one concrete execution of a Recipe:

```text
Recipe --spawn--> Run
Run = Recipe + Trace + Control
```

1. Spawn with the exact logical Recipe identity and caller-owned values.
2. Retain the returned `run:<id>` and normally wait for the root coordinator's completion batch instead of polling. While Pi is active, ready results arrive together at the next safe model-step boundary after the full tool batch; already-idle Pi wakes through a debounced follow-up. Nested actor completions wait for their complete containing top-level tree and arrive in that one compressed batch; descendant sessions do not need notification options.
3. Inspect `view=trace` when retained observations or attention matter.
4. Inspect `view=control` before diagnosing service readiness, stale work, or saturation.
5. Send `message` only for an action declared and consumed by that controlled Recipe.
6. Use terminal state, result, declared artifacts, and execution evidence to prove completion. When an outcome includes a retained primary-source, declaration-inventory or diagnostic-metadata reference, use that exact reference for further reading, not guessed captures or sibling files. Literal previews may be clipped; their field/range/counts describe what was shown. Diagnostic sources contain recorded command/error/failure-reason metadata only, not complete primary output; other recorded fields may be referenced without being shown. Artifact inventories list declarations only: they do not assert that target files exist or were produced, or grant body-read permission. Explicit unavailability has no guessed legacy body/path fallback.

Compact launch receipts include `run_files` as nested block YAML containing the exact selected observed location values, labeled observed locations/mutable for the exact launched Run generation when the current session and physical identity agree; otherwise they report unavailability or whole-row omission. Machine `file_navigation` details stay JSON-compatible; saved terminal messages retain their own original encodings. Selectively ordinary-read those starting locations when needed; layout/size hints are not body, privacy, terminal or native proof. No evidence bodies or session-wide catalog map are read to build this row. New terminal packets also freeze bounded location rows for captured completion members at fresh current-session admission. Each shown result keeps its whole Run-file row or explicit per-record omission; wholly omitted results stay covered by result omission/inventory. This describes Run-row coverage, not a complete file/tree inventory. Older captured formats retain their original shown/omitted/total counters; unavailability remains explicit. Ordinary-read selected paths only when needed. Packet reload/render never refreshes sources, and old absent/request-only formats keep their text. Source/npm SDK verifies an explicitly requested ordinary read from a delivered terminal result path; this is research, never routine completion polling or new primary/privacy/clock/native authority. Use the request only for file investigation, not routine completion/status polling. Copied locations/hints remain data, never transferred scope; older batches keep their original text.

For selective investigation of already cataloged files, use `inspect target=runtime view=runs verbose=true`, then ordinary file tools on its current-session root-first navigation. Ordinary maps keep latest-registration order between roots and prioritize known failed subtrees within each root. For a failed investigation add status=failed: inventory is filtered, while the full owned map prioritizes observed failed subtrees across roots, always ancestors first. Priority uses only exact-generation matched inventory observations, not complete terminal truth. Launches and compatible singleton attachments populate the catalog; reads do not backfill missing locations. A `catalog: unavailable` launch warning is not workload failure: do not spawn again merely to repair navigation. The starting map's format hints do not certify syntax, encoding or complete output. See [Runs](./references/runs.md) for selective recorded-capture research and resume boundaries.

Trusted parent-session shutdown keeps the existing Kill attempts for quit/reload/new/resume/fork; a Run is not promised to survive session replacement. This is logical-session ownership, not independent PID-bound ownership for parallel hosts with the same ID. A teardown report is not scope closure or crash/hung-host cleanup, and bare AgentSession.dispose alone emits no shutdown. See the Runs reference for the boundary.

A Run exposes only `recipe`, `trace`, and `control` views. Control is bounded actor-local input, not peer messaging or chat. See [Runs](./references/runs.md).

## Diagnosis and stop rules

When a pi-actors operation fails:

1. Keep the intended logical Recipe or tool identity.
2. Inspect the existing `recipes`, `tool:<name>`, `runtime`, or `run:<id>` surface that owns the failure.
3. Report resolver, registry, activation, Run, Trace, or Control truth exactly.
4. Retry only after the owning state is healthy.

Stop if spawn and registry resolve the same Recipe differently. Stop if registration persists but is not callable. Stop if an operation cannot be proven through pi-actors surfaces.

Never recover by copying maintained Recipe args, defaults, Control, artifacts, or helper commands. Never hard-code a `{skill_dir}` replacement path. Never introduce `bash -lc`, `eval`, direct bundled-helper execution, or shell backgrounding to bypass resolution. Never call `spawn` and claim a tool call. Use [diagnostics](./references/diagnostics.md) for the safe next action.

## When to read another Skill

- Read the owning capability Skill when choosing or operating that capability pack.
- Read `swarm` in addition to `actors` for multiple actors/subagents, parallel scopes, reviewer lenses, quorum, conflict handling, or integration.
- For generic mechanics, this Skill outranks capability Skills and `swarm`. Report a stale Skill if it contradicts Recipe identity, registration, activation, spawn, Inspect, Trace, or Control semantics here.
- When changing the extension implementation itself, apply project implementation instructions after this operating protocol.
