Enroll, update, or terminate an agent. Write a JSON file and call happyranch manage-agent --from-file to keep the invocation single-line. Enrollment requires founder approval.
Install
npx skillscat add t-benze/happyranch/runtime-skills-bundled-manage-agent Install via the SkillsCat registry.
Integrated team-move F candidate handoff (THR296seq135)
Founder-controlled teams move capability/preview/apply/show/recover now has
public service/CLI source. F proposes APPLY_AVAILABLE=True with actual native
apply AND recovery readiness gates; whole-feature independent acceptance and
manager guarded merge remain required. Skills/agents gain no execution or
ambient-bearer self-admission authority. Manage-agent retains team/role; transfers use the
separate admitted founder operation. Preview uses only the pure native planner,
not materializers/resets/reservations. Exact normalized client bytes/key are
privately fsynced before POST, including exact saved-file reuse/apply reads;
a complete prior failed-save file requires fresh descriptor/byte validation,
file fsync/close and containing-directory fsync/close. Partial/changed bytes
refuse without overwrite/new key; same-UID limitations remain. Preserve key on
transport loss and use same-key
show, never automatic second apply. HTTP202/CLI3 is in-flight, saved COMPLETE
readback/release alone permits apply200/CLI0; refusal/repair is1, parser2.
Show is read-only; recover explicitly binds SAME ID/revision and native prior
owner/process proof/CAS. Durable daemon tasks survive client disconnect; shutdown
reaps them before DB close without clearing holds. Diagnostic-org read/recovery
uses strict native owners, closes before positive normal attachment and clears
only after successful native map insertion. Native dedup redelivery follows.
Show/recover diagnostics distinguish strict saved bounded code/owner IDs and
original/latest recovery/publisher identities from current native census and
publisher owner observations. Diagnostic-only reads require no ordinary attachment
or preview; unavailable ownership stays unknown. Async failure/secondary close
or attachment facts are safe process-local observations, never durable evidence.
Resolve named dependencies before explicit SAME operation/target/revision recovery;
no automatic retry or TTL takeover. Both show GET forms declare202/CLI3 in-flight.
D staging/history/leases, C1-C3 uncertainty/EMPTY budgets and actual callbacks
remain. Earlier unavailable-E statements below describe historical checkpoints.
Current contract: docs/superpowers/specs/2026-10-14-online-team-move.md and
engineering-owned docs/runbooks/online-team-move.md. F candidate source,
independent acceptance/merge, separately authorized release loading and exact
Founder live operation are distinct. Shared bearer does not prove human presence. Behavior
UNEXECUTED, integration INCLUDING callback SKIPPED24342, units RETIRED; no new
cases/campaign, live operation, deployment or cleanup authority follows.
F native release preparation runs through OrgState.load: strict read-only move
discovery precedes naming preflight, generic compatibility writes, roster
validation, publication and producer admission. After complete native workflow
validation, the DB-owned install_team_move_schema transaction validates exact
existing layout/history/org identity, refuses held/unknown state, installs only
the literal ONE table if absent, and validates before COMMIT. Repeated compatible
attachment is idempotent. Generic Database/runtime-audit, capability/preview/show
and restricted diagnostic recovery never install or repair it. Source delivery
does not call it on production: separately authorized compatible release loading
through the supported launcher performs native preparation; Founder assembles
no files, SQL or offline manifest. Missing schema/owners are engineering release
dependencies. Even an empty installed table requires reader@3. An absent optional
layout remains compatible with generic/older readers; source rollback cannot
undo durable state or grant a downgrade.
F also freezes C2 thread retry initialization explicitly, including EMPTY
budgets. New initial/fallback/nudge phase initialization is distinct from a
frozen zero budget; deferral/reentry cannot replenish it. Old missing facts keep
their original history interpretation but refuse ambiguous new retry/reentry
with team_move_thread_retry_initialization_unknown; no history is backfilled.
Updated shell/Mac launchers require online-team-move@3 (reads old @1/@2), so
earlier supported parsers refuse before startup. Already-running old daemons,
obsolete launchers and unchecked old interpreters remain outside that guard.
All behavioral/installation/recovery/launcher observations remain UNEXECUTED.
Historical task attribution is separate from current launch eligibility. The
complete parent/child/revisit/chain/fanout/workflow closure retains task team keys,
recorded participants and permanent IDs, including retired actors authenticated
by the existing strict naming owner or native INTEGER task/result/SID attribution.
It never resolves settled history through today's manager or requires re-enrollment.
Unknown identity/graph facts remain actionable census blockers without discarding
collected inventory; dependent sessions/jobs/recovery callbacks/workflows remain
joined even for terminal tasks. New execution still requires a current executable
owner. No historical record, team, callback or binding is rewritten.
The SAME INTEGER thread invocation/agent/SID preparation owner spans native
materialization, integrity, repository refresh and launch-spec/cache preparation,
including helper-internal omissions and caught failures. Such uncertainty appends
the existing sticky failed_cleanup fact BEFORE ordinary failure settlement;
backend preparation/cleanup and native workspace/cache failures retain ownership.
Later success/callback/terminal state cannot erase it. Serializer, audit COMMIT,
strict history reader, restart/reentry and census preserve that fact, independently
of frozen EMPTY/nonempty retries. Ordinary stale-claim/agent/breaker or missing
launch-seam refusals before effects retain their native no-effect disposition;
returned failure alone never proves compensation. No new schema/journal/backfill
or generic producer identity is introduced. All behavior remains UNEXECUTED.
Ordinary tasks carry their SAME native TaskInvocation/task/agent/runtime SID
through materialization, integrity (including retries), package omissions,
repository refresh, attachment writes/cleanup, task scratch and builtin/custom
cache/workspace setup. Safe deferred ownership becomes durably prepared before
preparation resumes; this never clears existing uncertainty.
Preparation failure sets the existing local reservation cleanup flag BEFORE the
fallible strict Pause save/COMMIT, then retains execution_unknown/unknown in
the admitted journal. Terminal/callback/quiescent later attempts and safe unrelated
worktree cleanup cannot clear it. Settlement persists that fact before release;
failed saves retain local ownership and original plus persistence errors.
Restart treats unclosed task prepared entries as unknown, including terminal
rows and prepared recovery/retry owners; absence of first launch is no proof of
preparation cleanup. Unknown deferred entries cannot authorize a fresh launch.
Native pre-effect source/artifact validation, repo-scan and missing launch-seam refusals
retain their no-effect disposition. Existing retry/recovery IDs, frozen budgets,
INTEGER callbacks and authority-v2 are preserved. No new field/journal, history
backfill, compensation or clearance writer is introduced. Behavior UNEXECUTED.
D private operation and startup holds (THR296seq135)
The corrected reader is online-team-move@3 (also reads old @1/@2 records); supported
launchers pass --reader-guarded-start=online-team-move@3 and reject earlier D
readers. Per-org open/identity/SQLite errors remain diagnostic-only and survive
startup/switch readback. Restricted recovery preserves the original error on
close failure; standalone close failures retain native classification and holds.
Recovery reconciles only pre-recorded operation staging
intent/acquired identity/terminal disposition in existing audits. Unknown acquired
identity or cleanup stays held even after owner-finished; no glob deletion or
legacy evidence adoption is allowed. Native discovery and publication capture
run outside durable profile/publication mutation leases, with revision/epoch/CAS
revalidation before mutation and at final release. This grants no skill execution,
cleanup, activation, live operation or behavioral-proof authority.
Global/rebind/claim/retry/synchronization profile writers retain diagnostic roots
and refuse without diagnostic filesystem/DB acquisition while leased, even with
EMPTY dependencies.
Adapter removal reports the retained EMPTY-dependency diagnostic refusal as
HTTP409 with detail.code; its bounded ProfileCoordinatorError translation
preserves unrelated exceptions and native removal/audit/compensation.
Native startup/attachment performs positive inspection
outside leases. Matching attachment revalidates its actual already-open DB owner
in the short segment; only successful attachment clears its diagnostic. Other
roots, failed attachment, current holds and malformed history stay held. D's
own-operation/native-identity exception also checks EMPTY dependencies. Public
recovery/reattachment is source-wired by E and gated on actual native owners by F; no skill authority is granted.
D supplies private canonical/context/reset/profile/publication/recovery source.
E supplies public API/CLI source; F proposes reviewed source enablement with
separate actual apply/recovery readiness gates;
no skill or agent may invoke the private owner or use ambient bearer credentials
to self-admit a move. Manage-agent still cannot transfer teams. New startup
schema-owner discovery precedes compatibility writers and partial membership;
unknown/unresolved state keeps that org diagnostic-only and its durable holds.
Only admitted bounded same-operation recovery can reconcile exact owned images
and native owner evidence; no timeout, missing tracker or source rollback releases
it. Updated launchers require the guarded reader protocol; old running daemons
and arbitrary direct old interpreters remain outside that protection. Source
and static checks do not prove behavior. No activation/restart/live move, new
tests/campaign, callback fabrication or cleanup authority follows. Earlier C3
checkpoint text below records that slice only; current D disposition is indocs/superpowers/specs/2026-10-14-online-team-move.md. SAME13 observations stay;
behavior/recovery UNEXECUTED, integration INCLUDING callback SKIPPED24342,
Python units RETIRED. Native permission/execution enforcement is unchanged.
Current names and permanent automation IDs
Fresh prompts may show current Name · ID for this turn. Use the permanent ID
from the injected parameters for callback agent/composer/speaker, task/session/
invocation proofs, configuration and delegate/then/fanout targets. A name is
human-addressing/presentation data, never actor authority. Human destination
arguments and @mentions accept current names or IDs; former names refuse with
the current name and do not forward. Founder is a separate human; recipient
transport remains @founder. Metadata failure gives ID-only context.
Operator identities rename is separate from bound manage-agent. It uses positive expected_name_revision CAS with uncertain-failure readback. Manage-agent name/revision remain canonical ID/definition revision; it gains no rename authority.
manage-agent
Native C3 preparation failure or ordinary process return never proves file,
package or process cleanup. Unknown ownership remains in retained audit census.
New retry budgets explicitly freeze even an empty schedule; missing legacy facts
cannot authorize replenishment/reentry. Schedule runtime SID is pinned through
real preparation/spec/execution and is distinct from provider resume identity.
Custom-skill authority validates before reservations; only explicit native
validation/rollback/temporary-cleanup evidence can settle a refused writer.
No history deletion, automatic recovery, apply or execution authority follows.
Team transfers and manager demotion remain outside manage-agent. Update retains
the existing team/role. Founder THR296seq135 approved a separate coordinated
online consultant move under TASK11345. C1 supplies task/host holds and preserves
real callback/retry/cleanup ownership; it changes no permission generator or
manage-agent admission. D recovery/old-reader closure is still required. No move command/route or apply/COMPLETE writer is available and no live
move is authorized. Later complete source requires founder admission.
Admission refusal preserves pending work. Retry handoff retains each uncertain
attempt separately; provider return is not containment proof. Pause attribution
settles only after workflow reconciliation and an explicit safe outer-cleanup
disposition; failed/unknown cleanup stays attributable. These source contracts
remain behaviorally UNEXECUTED and grant no operational move authority.
Retry attribution stays in the existing validated entry fields, with journal
COMMIT before reservation handoff. Failed-tail reason/process diagnostics append
to existing bounded cleanup suffix lines without erasing earlier facts or
proving quiescence. Persistence refusal retains failed ownership and preserves
an original exception. The closed Pause journal format is unchanged.
C2 now reserves trusted thread/participant/INTEGER invocation/SID ownership before
preparation, then composes final claims and launch with the short gate, DB and
host terminal ordering. All purposes and actual host/direct429, eviction and
bounded-nudge paths participate. The existing thread audit owner stores strict
bounded append-only attempt/deferral evidence; no schema or task-Pause format
changes. Unknown prior retries stay blockers after later clean outcomes.
Captured actual running turns alone may settle under WAITING; no drain label
admits new work. Queue dedup spans queued/in-flight work, typed deferrals release
notification ownership, and complete durable runnable discovery/redelivery keeps
pending tokens/ranges/probe/catchup obligations intact. Native thread recovery
and raw reapers preserve held/C2-owned history. Participant/session writes
cooperate during future forward reset; messages remain admissible. The bounded
thread census/drain and post-release seams are available to D, whose complete
startup/containment/operation/old-reader closure remains absent. No public apply
or COMPLETE writer; APPLY_AVAILABLE stays false. Behavior remains UNEXECUTED,
integration SKIPPED24342; no new product tests/fixtures or activation authority.
Native archive admission precedes delivery discard, BOOTSTRAP reaping, status,
participant resets, their audits and the archive system message in one DB-owned
transaction serialized against a forward decision. Refusal leaves all those
obligations and history unchanged; transcript files/events follow COMMIT.
Authentic provider eviction audit and compare-and-clear of the attempted stale
SID commit before fallback phase selection/admission. Only the actual live
producer's durable launched/settled initial attempt can record that observation
under a winning hold; callback/drain/new-launch and general participant guards
remain unchanged. Watermarks, delivery ranges/tokens and runtime SID are retained;
unknown cleanup remains a blocker. Deferred re-entry cannot reuse the evicted SID.
These archive/eviction/re-entry behavioral observations remain UNEXECUTED.
Do not substitute termination/re-enrollment, direct roster writes or ambient
agent credentials. See docs/superpowers/specs/2026-10-14-online-team-move.md in
the release source; this prose grants no execution/permission change.
For an update, first obtain the target's current revision from the active
agent roster and include that exact value as expected_revision in the
callback payload. A missing, null, malformed, or stale revision is rejected;
reload and deliberately reapply only the intended field change rather than
resubmitting an older whole definition.
Manage the agent roster. You can enroll a new agent (requires founder approval), update an existing agent's system prompt or description, or terminate a non-manager worker (archives its definition and workspace).
Canonical ID and naming ownership
The name argument remains the permanent ID used by frontmatter, teams,
workspaces and callbacks. New ID creation must pass the org's reconciled shared
case-insensitive ASCII naming namespace. Naming-unavailable refuses new creation;
original same-ID update/approve/reject/terminate guards and compensation remain.
Default-only rejected reservations release; chosen/former labels and monotonic
revisions survive absence and same-ID reenrollment. Admitted underscore-leading
IDs retain their defaults/addresses, but editable labels require 1–64 ASCII
letters/digits/underscore/hyphen with letter/digit first, without trimming.
The bounded API provides org-local operator name editing and
read/resolve projections. Agent roster/enrollment name and canonical revision
retain their meanings; addressable_name, name_revision and naming_status are
additive metadata, null/unavailable when names cannot be read. Never use a label
as manage-agent's name, callback actor or expected canonical-definition revision.
C3 now registers dream/wake/schedule/job native source, permanent org/agent and
owning session before preparation, rechecks actual claims and final host/direct
launch, and retains original retry budgets/SID/enqueue age on safe deferral.
Pending work stays native; recurring schedule occurrences retain distinct
history. Existing queue/timer release seams deduplicate redelivery; reapers
preserve held or uncertain owners. Complete C3 causal census covers job waits,
active bindings, remote attempts/workspaces, pending enrollment and writer tails;
terminal rows or missing trackers never prove cleanup. Native profile/workflow,
roster/name/settings/skill/policy/cleanup writers reserve affected IDs and
source/target membership, keeping their original synchronization and journals.
Strict bounded version1 producer/writer audits append in existing audit_log;
earlier uncertainty survives later clean outcomes. No extra table, permission
or auth change, remote engine, move/reset/publication service or COMPLETE writer.
D composes the canonical capture/coherent publication reader and complete early
startup/recovery/old-reader guard; D/E/F remain outstanding. APPLY_AVAILABLE=False.
All behavior/migration/recovery remains UNEXECUTED; integration SKIPPED24342,
Python units RETIRED, no new cases/fixtures or activation/live-operation authority.
Operator rename accepts only addressable_name and positive expected_name_revision,
with raw binding-key denial and the shared bearer limitation. The operator CLI is now described above; no agent-session rename authority is added. Mention delivery, CLI targets, fresh prompts and UI enrichment use current names at human boundaries. Names do not
change allowed tools, execution permissions, task/session principals or workspace
ownership. Coherent naming is not proof that bootstrap/cleanup/rollback succeeded.
Naming readiness follows structural naming admission, never global authority; see the identity-names core spec.
One daemon controls each org; no naming-specific cross-process guard is required.
Authentication paths
The daemon accepts (task_id + session_id) from your current task session. Use this while executing a task.
Usage
Write a JSON file to
/tmp/manage-agent-<unique>.jsonusing the Write tool.Task-path enroll:
{ "action": "enroll", "name": "content_writer", "task_id": "<task_id>", "session_id": "<session_id>", "description": "Writes destination guides and travel articles", "system_prompt": "You are the Content Writer. Your responsibilities are...", "executor": "codex", "repos": {"web-content": "https://github.com/t-benze/web-content.git"}, "allow_rules": ["gh api /repos/{owner}/{repo}/contents"] }Update an existing agent:
{ "action": "update", "name": "content_writer", "task_id": "<task_id>", "session_id": "<session_id>", "expected_revision": "<revision from this agent's GET /agents row>", "description": "Updated description", "system_prompt": "Updated system prompt...", "executor": "claude" }Terminate an agent:
{ "action": "terminate", "name": "content_writer", "task_id": "<task_id>", "session_id": "<session_id>" }Invoke as a single-line command:
happyranch manage-agent --org {ORG_SLUG} --from-file /tmp/manage-agent-<unique>.jsonThe
--from-fileform is mandatory for agent sessions. In Claude sessions,
multi-line bash commands are rejected by theBash(happyranch:*)permission rule
because newlines count as command separators.
Access control
Any team manager may use this skill to manage agents within their own team. The daemon validates the (task_id, session_id) pair matches an active session for a registered team manager. Other agents receive a 403 Forbidden.
Team scoping
Managers may only enroll, update, or terminate agents within their own team:
- enroll: The new agent is assigned to the caller's team by default. Optionally, include
"target_team": "<team>"in the payload — but iftarget_teamdiffers from the caller's team, the request is rejected with403 cross_team_forbidden. - update / terminate: The target agent must already belong to the caller's team. Cross-team update or termination is rejected with
403 cross_team_forbidden. - terminate additional restriction: Only non-manager workers may be terminated. Requests to terminate a team manager are rejected with
409 manager_terminate_forbidden.
This prevents a Content Manager from enrolling agents into the engineering team, and vice versa.
What happens
- enroll: Creates a pending enrollment request.
executoris a registered executor profile name; if omitted, it defaults toclaude. Supported profiles are the built-ins (claude,codex,opencode,pi) and custom profiles whose explicitcommand_adapter_id: custom-adapter:<id>resolves to a registered, conformance-passed, founder-approved adapter (seedocs/agent-guides/agent-executors-and-permissions.md). You may also include"allow_rules": ["curl https://api.example.com", ...]to grant additional Bash prefixes beyond the baselinehappyranchgrant — for example, to allow a specific external API call. The founder must runhappyranch approve-agent --org {ORG_SLUG} <name>before the agent's workspace is bootstrapped and the agent becomes available for delegation. - update: Updates the agent's description, system prompt, executor, model, reasoning_effort, or repos in the enrollment registry. If the system prompt or executor changes, the workspace bootstrap files are regenerated. A real executor change clears the old executor-specific model when
modelis omitted; include an explicitmodelvalue (ornull) to choose the new executor's model (or its CLI default). An unchanged executor preserves omitted model andreasoning_effort; unrelated whole-definition writes preserve effort. A real CLI change clears omitted effort as well. Include explicitreasoning_effort:nullto clear or a valid string to select. Built-ins accept case-preserving[A-Za-z][A-Za-z0-9_-]{0,31}, not static-list membership; custom values must belong to their approved finite declaration. Explicit empty strings refuse. The proposed executor/model/effort pair uses shared token/composition validation, not provider/account acceptance; invalid/unsupported/conflicting selections refuse before replacement. OpenCode explicit effort requires nonempty provider/model slash components, no whitespace/control/NUL, at most one # and a nonempty byte-equal embedded variant. Pi retains its finite recognized suffix set. Custom adapters require ordinary input-v2 opt-in; legacy input-v1 model:null behavior remains. Seedocs/superpowers/specs/2026-10-11-agent-reasoning-effort.md. Only works on approved agents. Dynamic manager update/enrollment remain source-inspected only, NOT VERIFIED at runtime in the THR298 plain-input venue; setters are not substitute endpoint coverage. - terminate: Archives a quiescent, approved non-manager worker. The active agent file is moved to
org/agents/_terminated/<name>.md, the workspace is moved toworkspaces/_terminated/<name>/, and the worker is removed from its team. Historic tasks, audit rows, token records, thread messages/participants, schedules, wakes, dreams, and archived files are preserved. The agent name cannot be re-enrolled while the terminated record exists. Termination is refused when the worker has live work (non-terminal assigned tasks, started thread invocations, firing schedules, running wakes/dreams, or pending/running jobs) or when the target is a manager.
Lasting permission grants (allow_rules)
allow_rules is the only supported lasting-grant channel: an update payload
may carry an allow_rules array that adds Bash prefixes beyond the baselinehappyranch grant. This skill is team-manager gated — the daemon accepts it only
from a manager's active task session, and the target must be in that manager's
team (403 cross_team_forbidden). A worker cannot re-grant itself: the request
routes through its team manager. A manager changing its own rules (or another
manager's) needs a founder escalation. expected_revision must be a fresh
64-hex revision (422 expected_revision_required); a stale value is rejected
(409 stale_agent_revision).
An allow_rules update is not a live permission change on every executor:
| Executor | Effect of an allow_rules update |
|---|---|
| Claude | --allowedTools is rebuilt from allow_rules on every launch, so the new rule is live on the agent's next session. (The generated .claude/settings.json permissions.allow list is not honoured in headless -p mode.) |
| Codex | The effective surface is the CLI sandbox flag; allow_rules is not wired into it. A lasting Codex grant needs a concrete founder escalation to the actual permission-model surface. |
| Pi | PiExecutor has no HappyRanch-managed permission surface. A lasting Pi grant likewise needs a concrete founder escalation — separate from Codex. |
| opencode | The effective surface is the generated opencode.json. An allow_rules-only update does not re-run the workspace bootstrap (regeneration is gated on a system-prompt or executor change), so the grant is inert until a bootstrap-forcing change or happyranch init-agent. This is an open limitation, not repaired here. |
Request the narrowest prefix plus the skill step that needs it and why a
thread-authorized one-off job is insufficient. Authorization of one command
never expands ongoing permissions; no self-edit or new grant endpoint exists.
For a one-off blocked operation, obtain required authorization in a thread
BEFORE submitting an automatic job from an ordinary task session (see the
jobs skill). Omit/set false for review_required; true is refused, never queued.
Agent naming
Agent names must be lowercase with underscores only (e.g. content_writer, seo_agent). No spaces, hyphens, or uppercase.
Error handling
- If
happyranchreturns non-zero, retry once after 1 second. 409(duplicate/terminated name on enroll, non-approved agent on update/terminate, manager target, archive collision, oragent_not_quiescentconflicts) and404(agent not found) are not retryable.422 expected_revision_requiredmeans an update omitted, suppliednull,
or malformed its 64-character revision — read the active roster again and
compose the update from that row's matching canonical content and revision.409 stale_agent_revisionmeans another accepted update won. Read the
active roster again, deliberately reapply only the intended change to its
current content, and send that row's revision. Never fetch a newer revision
merely to bless an already-composed stale whole-definition payload.- Other
422responses usually mean the payload is missing required auth
fields (task_id + session_id) — fix the JSON and retry.
C3 writer disposition follows the actual authority/profile interval through
native naming reconciliation and explicit leading validation. Stale rename or
prompt CAS may settle only after successful native rollback/reconciliation;
unfenced status alone proves nothing. Caught reconciliation/publication/clone
failure, cancellation and partial effects retain unknown ownership. Skill scratch
cleanup requires no-follow lstat ENOENT; surviving entries, inspection errors and
prior uncertainty stay unknown. Cleanup causes are retained; existing unknown
history is never cleared. These are source accounting rules, not behavioral
verification or new execution/activation authority.
Current-main C3 composition preserves automatic job admission: omitted/false
review_required executes through native owner checks; true refuses before allocation,
legacy true pending is inert, and /run remains a tombstone. Authenticated later
prerequisite loss rechecks move/causal ownership in the native Pause transaction
before its failed-before-launch CAS, audit/journal COMMIT and genuine wake. Only
that exact completed no-launch refusal may settle; partial scratch/environment,
output or process effects and earlier uncertainty remain in producer history.
Naming keeps INSTALL-only N-SAC-1 structural admission and actual install-diagnostic
provenance alongside SAME native disposition, rollback and reconciliation rules;
no removed whole-release naming fingerprint is restored.
The scheduled daemon disk worker reserves a global native writer per admitted
org before spawn, through supervision/reap/report. Held/unowned orgs defer with
bounded codes in the existing summary/audit; other admitted orgs continue. On-mode
child admission and prune re-read the actual parent's active global writer ID
through strict append-only history and validate the optional move layout/hold.
An installed layout with missing/unknown ownership refuses before mutation; absent
layout preserves native behavior. Missing/incomplete effect closure, interruption
and partial mutation retain unknown writer evidence; a clean later provider result
cannot erase it. The common1800-second window includes reservation admission.
Off/default dry_run, metadata/process/age/containment safeguards and manual dry-run
remain; no cleanup/activation authority follows. These source changes have no
behavioral/migration/recovery proof; integration INCLUDING callback SKIPPED24342,
Python units RETIRED. That C3 checkpoint had no COMPLETE writer; current D/E/F
source and independent gates are described above. No live capability follows.