Files
PaperClipAI/maps/feature-map/runs-adapters.md
T
DottaandPaperclip dbff3747b8 feat(server): persist run logs and provider traces in S3 (#18327)
## Thinking Path

> - Paperclip is the open source app people use to manage AI agents for
work.
> - Operators use run logs and restricted provider traces to inspect
agent work.
> - Local log and trace files depend on the web server's persistent
volume.
> - That dependency prevents overlapping volume-backed Railway
deployments.
> - This PR reuses the instance S3 store for batched log and trace
payloads with conditional publication.
> - Existing Postgres rows retain their contracts; native export
recovery reuses events already committed before Runner acknowledgement.
> - S3-configured servers automatically copy and verify retained history
before a later deployment cutover.

## Linked Issues or Issue Description

**Subsystem affected**

Server run logs, restricted provider traces, storage providers, and
migration tooling.

**Problem or motivation**

Replacing the web server and its disk must preserve committed log output
and retained traces. The current S3 mirror can repeatedly upload a
growing file. Moving those payloads into Postgres would add database
writes, WAL, replication, and backup work.

**Proposed solution**

Reuse the existing instance storage configuration, S3-compatible
provider and credential chain. Store new run logs under run-logs/ and
opted-in raw traces under provider-traces/, below the existing prefix.
Cloud keeps its existing bucket and bucket-scoped credentials per stack.
Add no new configuration switches. Store immutable payload segments and
bounded binary range indexes directly in S3. Publish each batch with an
ETag-conditional head. Keep existing database ownership and lifecycle
records. Recover canonical native exports from their existing validated
control event source, checkpointing export progress in S3. Add no new
payload writes to Postgres. Preserve local defaults and migrate settled
history with verified byte counts and digests.

**Alternatives considered**

Postgres payload chunks add control-plane load. Repeated whole-file
mirrors amplify transfer work. The first index prototype left superseded
index nodes; the final binary index keeps all normally published nodes
reachable.

**Roadmap alignment**

This is a storage prerequisite for replacing the main web/API server. It
does not enable deployment overlap, detach a volume, or change native
Runner protocol acknowledgements. The maintainer approved this
implementation scope. ROADMAP.md has no duplicate implementation item.

Related PR: #16770 improves the existing in-flight mirror. This PR
preserves that legacy backend and uses the existing instance S3 profile
for new journals.

## What Changed

- Automatically select S3 segments for new logs and opted-in traces when
instance file storage uses S3. Reuse bucket, endpoint, region, prefix,
path style and credentials. Remove separate backend switches. Keep
local-disk instances local.
- Share the existing storage configuration resolver with product files.
Preserve config-file settings, environment precedence and the existing
root prefix. Keep pre-existing run-log mirror settings for legacy
history.
- Add bounded buffering, conditional ownership fencing, immutable range
reads, stable byte offsets, and completion hashing.
- Dispatch all existing log consumers through the recorded backend.
Coalesce output progress writes and publish live log messages after
storage receipts.
- Recover interrupted canonical native exports from their existing
durable source. Exclude separate credential, cleanup, and reprojection
records. Replay missing callback ranges and deduplicate late delivery.
Repair settled archives after controller lease expiry. Bound shared
repair work and stop it when all readers cancel. Serve the published
prefix when best-effort repair fails.
- Add encrypted optional trace channels, replacement reads, durable
deletion tombstones, and deadline-driven local/external expiry cleanup
independently of heartbeat scheduling. Stream historical source and
remote verification. Propagate worker cancellation through trace open,
conditional-write probing, upload, restore and reads. Fence deletion
even before the first object head exists; abort and drain owned
captures.
- Retry transient storage errors, distinguish 409 from failed
preconditions, and backpressure bounded log admission. Track interrupted
trace imports explicitly so ordinary local deletion stays independent of
S3.
- Automatically migrate retained history through the existing delivery
coordinator. Process one log and one trace per batch. Retry unresolved
history with backoff and stop scans after completion. Keep the
inventory/import command as optional diagnosis and repair. Verify source
and remote bytes before switching references. Verify finalized native
size and digest before setting its export cursor. Require ordered source
coverage when completeness metadata is missing. Preserve original trace
expiry. Block active, missing, corrupt, and unproven sources.
- Preserve identity and run-secret redaction in live and recovered
native logs. Register runtime log redaction secrets once through the
existing encrypted registry. Keep agent private keys in their existing
owner.
- Add storage, migration, retention, UTF-8, and route-privacy coverage,
plus operating documentation and qualification tooling.
- Add no schema, payload table, per-record SQL, production dependency,
or lockfile change.

## Verification

- Final fixes at `b3a44c898e` passed all 116 selected startup,
retention, attribution and cancellation controls. The disabled-scheduler
cleanup and concurrent-repair defects reproduced red before the fixes. A
timed-out repair still prevents later storage reads.
- The merged source passed 124 storage and real-Postgres Cloud
configuration tests. These include automatic history migration, existing
environment/file vault keys, source-directory removal, five real-SDK
stalled-request cancellation cases, shared capability-probe cancellation
and multi-chunk trace ordering. Saved Cloud S3 settings work after the
legacy config file is gone.
- Workspace typecheck and full build passed at the merged parent
`19f702d780`. Server typecheck and build passed again at `b3a44c898e`.
- Actual app acceptance: finish a process-agent run through the normal
API, stage its retained local-file input, then restart. Automatic
migration reports one migrated item and zero blockers. Remove the
original web home and restart at `b3a44c898e` with an empty home, the
existing S3 profile and the existing vault key file. The normal log API
preserves all five producer lines and exactly 788 bytes, with SHA-256
`74d9ae469da28bfe89b9b50a0e132aec24fe9e6d686496ed5e4ffa6167151036`. No
log-specific storage settings are present.
- Actual expiry acceptance: with heartbeat scheduling disabled, a trace
remains unexpired after startup and later reaches its fixture deadline.
The worker marks the row deleted and tombstones both S3 channel heads.
The retained run log stays byte-identical. The process fixture emits no
provider protocol frames, so nonempty encrypted payloads are qualified
separately through the real SDK round trips.
- Isolation tests use identical run identities in two stack buckets.
Cleanup in one existing prefix leaves another prefix, another company
and product files intact. Read-only Cloud source inspection confirms a
bucket and bucket-scoped credentials per stack. Four existing Cloud
storage environment-contract tests passed. No Cloud provisioning changed
and no new live vendor permission probe was performed.
- Earlier qualification passed 1,014 affected storage/native tests and
27 privacy-route tests with isolated Docker Postgres. An abrupt process
test commits 1,000 records, receives receipts, dies by SIGKILL and loses
its directory; another process reads every byte and continues. The real
Rust Runner experiment acknowledges 32 records while the export cursor
is zero, then continues the same Runner PID after controller loss. All
64 records export once with exactly 64 existing control rows. Repeated
snapshot/Stop commands completed in 162/81 ms.
- Emulator workload: 1,000 burst records used two batch PUTs. Eight
steady streams produced 240 records with 104 conditional PUTs and 72
GETs over 6.9 seconds. These are synthetic operation counts, not fleet
sizing or provider prices.
- Failure evidence is retained. Compact native events over 64 KiB,
missing file-key support, disabled-scheduler retention and repair
failure handling all reproduced before their fixes. Fixture repairs
addressed cold module setup, localhost/IPC permissions, the S3
bucket-name limit and a mode-0700 crash-test directory. Full local `pnpm
test:run` was stopped after host PostgreSQL semaphore exhaustion;
affected suites used isolated Docker databases instead. Native package
library symlinks were restored with the package's standard hydration
helper.
- The `19f702d780` browser session-recovery case timed out while saving
a task title. All eight browser shards passed on `b3a44c898e`, including
that case, with no UI behavior or assertion change. Fresh-head CI passed
at `b3a44c898e`: 55 successful checks, three skipped checks and one
neutral check. The branch is conflict-free.
- Map and module-boundary checks passed. Current-head Greptile is 5/5
with zero unresolved review threads.

Reproduce the opt-in storage suites with
`PAPERCLIP_LOG_TEST_S3_ENDPOINT` and a dedicated
`PAPERCLIP_RUN_EVIDENCE_MIGRATION_DATABASE_URL` ending in `_test`. See
`doc/run-evidence-storage.md` for operating limits, automatic migration,
optional diagnostics and rollout qualification.

## Risks

- Keep the existing per-stack bucket, prefix and vault key stable across
replacements. Relocating that storage is a separate whole-instance
operation.
- This release automatically changes new log storage for existing
S3-configured instances. Local-disk instances remain local. Canonical
native source replay is qualified with a deterministic real Runner;
actual remote execution and production-provider qualification remain
rollout gates. Generic server-only diagnostics and optional raw trace
tails without a surviving source can be incomplete after a crash. This
does not establish full zero-downtime deployment.
- Before deploying this release, qualify the actual S3 provider. It must
enforce conditional writes and pass read, version, deletion, workload,
and latency qualification. A capability probe rejects providers which
ignore preconditions. Moto is emulator evidence only.
- Dirty output is bounded and unconfirmed until S3 publication. Storage
failure leaves persistence incomplete while task results and usage can
settle.
- Trace expiry is not yet represented by Cloud's external wake contract.
Outstanding trace deadlines conservatively block sleep.
- Automatic history copying requires the original source volume. Keep it
until all retained resources pass verified import and clean-filesystem
reads. Stop old binaries from creating new local-file runs. Missing or
corrupt history remains blocked and visible in server logs. Rollback
requires a compatible reader against the same external state. Ordinary
object deletion does not erase retained historical object versions or
backups.

## Model Used

OpenAI Codex, `gpt-6.1-sol`, with reasoning, tool use, code execution,
and browser verification. The runtime did not expose a context-window
size.

## Checklist

- [x] I have included a thinking path that traces from project context
to this change
- [x] I have specified the model used (with version and capability
details)
- [x] I have checked ROADMAP.md and confirmed this PR does not duplicate
planned core work
- [x] I have searched GitHub for duplicate or related PRs and linked
them above
- [x] I have either (a) linked existing issues with `Fixes: #` / `Closes
#` / `Refs #` OR (b) described the issue in-PR following the relevant
issue template
- [x] I have not referenced internal/instance-local Paperclip issues or
links (only public GitHub `#NNN` / `github.com/paperclipai/paperclip`
URLs)
- [x] My branch name describes the change (e.g. `docs/...`, `fix/...`)
and contains no internal Paperclip ticket id or instance-derived details
- [x] I have run tests locally and they pass
- [x] I have added or updated tests where applicable
- [x] I have updated relevant documentation to reflect my changes
- [x] I have considered and documented any risks above
- [x] All Paperclip CI gates are green
- [x] Greptile is 5/5 with no open P2s, recommendations, or follow-ups
- [x] I will address all Greptile and reviewer comments before
requesting merge

---------

Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-10-30 15:17:35 -05:00

25 KiB
Raw Blame History

navigation
navigation
section sectionOrder order
Agents and reusable capabilities 30 20

Runs, harnesses, and model accounts

Operators choose an agent harness and model account, inspect execution history and transcripts, and distinguish a working configuration from a successful task result.

Feature ID: runs-adapters.

Implementation: adapter manager, run host, configuration.

Agent access: companion.

Sub-features

  • model-accounts: runs-adapters/model-accounts — configure AI accounts, login attempts, defaults, bindings, usage and pools through delegated connection APIs.
  • availability: runs-adapters/availability — discover installed adapters and available models/accounts.
  • validation: runs-adapters/validation — test an adapter in the selected execution environment and surface authentication failures.
  • runs: runs-adapters/runs — inspect run status, events, output, costs, and the source task.
  • session: runs-adapters/session — preserve or reset execution context through supported lifecycle actions.

How to get to it (user POV)

adapter-setup

Open an agent’s model/adapter configuration or the instance adapter settings page when permitted.

managed-account-setup

Ask an authorized agent to save or connect a managed AI account. Open its saved aiLogin setup link as the responsible human when sign-in or a code is required. The agent can inspect the saved attempt and manage authorized account/pool bindings; human authentication and raw host administration retain their gates.

run-history

Open an agent run at /agents/:agentId/runs/:runId from the agent or task activity. The agent header has one Run now action. Administrators can enable Capture raw provider traces under the agent configuration’s Debugging section for future runs. The header shows Raw tracing on while that setting is enabled.

Managed Git launchers let agents save local commits without a GitHub connection or manual author setup. Verify a fresh checkout and a second shell in the same workspace: both commits should use Paperclip <noreply@paperclip.ing> when no identity is configured. Repository and command settings override this default; an eligible managed identity still takes precedence. Inspect stored commit metadata and confirm the default did not change repository or host configuration. Repeat with unavailable GitHub access; authenticated operations must still obey the existing credential checks. The launcher controls and real-shell staging controls cover this local behavior, separately from live cloud execution and GitHub writes.

Native Runner agents wait for task-bound work. A generic heartbeat interval does not create a taskless run or put an otherwise ready agent into an error state. Assigned tasks, task monitors, routines and task-bound timer wakes keep their existing admission paths; Legacy adapter intervals remain supported. The scheduler and queue regressions exercise this boundary with PostgreSQL and synthetic execution, separately from live task acceptance.

For latency diagnosis with an operator OTLP endpoint, search the hashed run ID without restricting the root span name. Compare workspace preparation with its workspace_<step> intervals. Measure controller readiness separately through controller.startup.<phase>. A recovery pause or deployment drain is not model execution time. See the tracing contract. These source-level diagnostics do not establish a live response-time budget. task.time_to_first_token measures accepted ingress through the first committed text that the task transcript can show, including thinking and completed responses. It includes preparation and startup, and excludes browser latency. Inspect native.controller.<phase> for backend construction, assigned-tool discovery and post-turn cleanup. Compare those intervals with the actual model turn; do not count a nested discovery interval twice.

Driving it with Playwright and the Paperclip CLI

Preconditions: follow the baseline. Record adapter, model, account, native/legacy runtime, and environment. Capabilities vary; one harness result is not a matrix-wide qualification.

managed-account-setup

Automated: actual-auth connection integration exercises account/pool persistence, responsible-user ownership, agent attribution, saved local-login access and native secret-response protection with provider fixtures. Saved handoff UI tests exercise setup routing with mocked APIs. Neither establishes live provider sign-in.

Manual: Start delegated managed-account setup, reload the exact saved human handoff, finish the required login, and inspect the saved account and original task continuation. Bind the account or pool only to authorized agents, reload their configuration, and verify the selected owner and account remain correct. Reject a different user's saved attempt, revoked management authority and Ask/Plan mutations. Qualify a useful model task separately from saving the account.

session

Recover an in-flight remote runner after controller restart, then let it finish with slow instruction collection. Send two follow-ups without resetting its session. Verify that completion does not detach the retained runner and that provider history survives with one turn per wake. Preparation must retain its lease until execution owns renewal; a genuine ownership loss must still detach. The remote continuity regression uses a real Linux runner and deterministic provider. Live provider acceptance is a separate check.

In a fresh sandbox workspace, fetch a different published branch with depth one, then save a local result and finish. Verify export imports the shallow history, retains host-only edits, and completes finalization without another provider turn. Repeat when the host already has that branch history; its ancestry must remain available. The filesystem sandbox regression covers transfer and merge behavior, not live provider acceptance.

For a plugin computer, complete a task, let its warm session suspend, then send two follow-ups within the next warm window. Verify the first resumes the saved session and the second keeps the same provider history without an identity mismatch. After a fresh recovery into a repository-free directory, send another ordinary follow-up. Verify it retains that directory without Core Git worktree preparation. Explicit repository strategies and changed provider owners must remain denied. Executor and workspace-preparation regressions cover control behavior; they do not establish live provider acceptance.

For a remote OpenCode agent configured with per_turn, complete a task, then send two follow-ups without resetting its session. Verify that each continuation restores its external controller checkpoint, retains provider context and saved files, and finishes with no stranded task lock. A missing checkpoint, an active prior owner or a mismatched session must still stop admission. The rejected active-owner attempt must not prevent a later continuation from reading the owner's newer completed checkpoint. The executor controls cover checkpoint restoration and its guards; real-provider acceptance remains separate evidence.

After a completed warm turn, change an agent setting that invalidates its instruction copy, then send a follow-up. Verify the old runner suspends during preparation, saved files remain available, and the follow-up completes once. Repeat with an expired or foreign preparation owner and verify that execution stays held. The checkpoint integration regression covers the ownership boundary; a real provider run remains separate acceptance evidence.

For a repository project that inherits storage-plugin defaults, run a task and send two follow-ups. Start with unset task workspace settings, then repeat with an explicit isolated mode or strategy. Binding must save reuse_existing and the resolved mode without changing the effective policy, session fingerprint, and workspace identity. An actual project-policy change must still reset the session and preserve the stored workspace owner. The session admission regression checks this with PostgreSQL and synthetic provider execution; it is not live warm-process or latency evidence.

For runs-adapters/session, complete a task in a disposable warm sandbox and retain its saved workspace file. Let the warm session close normally and verify that the retained lease has a complete, lease-bound harness backup before injecting sandbox loss. Removing a still-warm sandbox before that checkpoint exercises the separate acquisition safety gate, which must remain blocked. Use a board-authorized session reset, then remove only that fixture's inactive provider sandbox. Send a follow-up that reads the retained file and appends one new line. Verify a replacement sandbox, a new provider session, the exact file contents, successful finalization and no stranded task lock. Send another follow-up and verify ordinary session reuse.

With external controller checkpoints enabled, also admit a fresh session on a reused sandbox lease. Verify startup from canonical controller evidence and reject a marker without a registered controller, changed identity or prior turn activity. An existing remote session directory must retain its recovery gate.

Repeat without resetting the session: its replacement must restore verified history or remain blocked. Missing backup state must not silently start an existing session again. The executor controls cover the bootstrap identity, activity and atomic directory claim; those controls do not establish live provider acceptance.

adapter-setup

Cloud-managed instances load adapters from the release image. Saved external registrations cannot replace built-ins or supply UI parser code. Install, reinstall, reload, remove, and override operations remain platform-managed. The fixture loader controls exercise real packages, import side effects, both managed-instance signals and self-hosted compatibility. The route authorization controls check managed denials before package or registration access. These are local controls, not live Cloud provider qualification.

Automated: adapter validation routes and model refresh cover server behavior.

Claude native setup uses the existing Anthropic API-key or subscription connection flow. Record the selected account separately from successful execution; unavailable models/authentication and unsupported Legacy-only options must fail visibly.

Claude CLI tests and runs also prepare a compatible private executable when a managed sandbox image's default CLI is too old for the selected model. Verify the command used for the hello test and task, reuse of a compatible private installation, and a blocking failure when installation cannot establish a valid version. Local, SSH and explicit custom commands retain operator management. Cloud onboarding must not offer shell commands the customer cannot run.

Manual: Select the intended adapter and account, refresh model choices, and run its environment test. Save, reload, then execute a small task. Repeat with a deliberately unavailable account and verify the failure remains visible.

The explicit-only Antigravity agent journey checks a saved personal subscription, prompt-free native Test and exact low model, then independently correlates two actual downloaded outputs, accepted/committed Done lineage, native conversation continuity and owned runtime retirement. Its first settlement is captured before follow-up reopening; a later coordinator assessment cannot erase that historical Done decision. A failed finish must not mark prior completed file operations failed. The current local macOS ARM64 candidate scope leaves fresh authorization, remote targets and release qualification unproven.

For Legacy Codex, assign a service secret such as SLACK_BOT_TOKEN through agent configuration and run a task that checks its presence without printing its value. Check both ACP and CLI execution. Remove the binding and repeat on the next run. The assigned secret must reach shell tools; an unassigned host token and Codex's own login keys must remain unavailable. Verify the same delivery without an agent identity. Shell-policy metadata must contain names rather than values.

Choose Codex as the harness; the UI displays its name/icon for both runners. Advanced identifies the automatic default and offers Paperclip Runner or Legacy. New Codex agents default to the native runner on supported macOS or GNU/Linux targets; the shared selection contract and runtime prerequisites define the platform/libc boundary. Windows and Alpine/musl remain Legacy. Claude follows its qualified rollout described above. Disabled adapters, external overrides, and selected-target qualification also affect availability.

Choose OpenCode with the native-runner experimental flag off on a qualified macOS or GNU/Linux x64 target. Linux ARM64 must retain Legacy because its pinned OpenCode runtime is not qualified. Advanced should show Paperclip Runner as the automatic default on qualified targets. Save an inactive draft without a model, resume it, select an explicit provider/model, test, finish setup, and reload. Verify the saved provider is opencode. Repeat with explicit Legacy and an existing Legacy agent; neither should migrate on an unrelated edit. Check that saved native permission/lifecycle choices survive resuming setup. Custom commands, arguments, variants, and inherited permissions must give Legacy remediation when native is selected. A live task with the selected account is separate proof from these setup and persistence controls. Repeat with Pi on macOS or GNU/Linux x64 after explicit operator setup of the pinned runtime (paperclipai runtime setup pi). Linux ARM64 retains Legacy. Resume an inactive model-free draft, connect an account, choose a provider/model, and finish setup with the generic native flag off. Verify Pi branding and native ACPX Pi execution by completing a simple assigned task. Preserve saved native thinking/permission/lifecycle settings on resume and unrelated edits. Native thinking supports off, low, high, max; legacy aliases must give remediation, and returning to Legacy must reject settings it cannot honor. On a fresh forced-Kubernetes instance without an environment row, inspect discovery and create with automatic selection. Both must retain Legacy without provisioning; an explicit Paperclip request must give target-qualification guidance. Begin the ordinary task to exercise the existing lazy environment path. This live journey remains separate from the resolver's source controls.

Managed Cloud images default to Paperclip Runner without a saved platform qualification. A platform snapshot update must not change that default or require a separate qualification request before Test. Disabled or overridden adapters still restrict availability, and actual runtime startup can still fail.

For other sandbox defaults, follow the environment probe recipe first. Discovery/creation read company-bound immutable-image evidence without allocating a target. A mutable image or snapshot name does not establish native compatibility. Then test the actual selected runtime with its selected account/model: a legacy CLI or authentication probe alone cannot establish native readiness. For an image-provided Codex harness, verify both final executables after concurrent artifact preparation on an eligible provider. Repeat with a failed runner probe and confirm the harness work has settled before failure returns. Providers without concurrent sync and explicit harness installs remain serial. The real-shell artifact controls cover these source contracts; they do not establish live reply latency. For remote native Codex with managed GitHub access, inspect the controller preparation spans for overlapping GitHub setup and assigned MCP discovery. Provider startup must wait for both. Force either preparation to fail while the other is pending; confirm that the pending operation settles and run-owned access is released before failure returns. Repeat a warm follow-up and retain its actual reply time. The executor controls cover ordering, failure drain and credential projection; they do not qualify a live response-time target. For native OpenCode with assigned connections, inspect the provider tool surface on both local and sandbox execution. It should contain bounded assigned-tool search/call schemas. Confirm the search description states the 1–20 page limit and default of 5. Follow nextOffset to inspect later pages. Discover an allowed tool, call its returned alias, revoke its grant, and confirm discovery and execution enforce that revocation. Repeat in planning/ask mode with a write tool and confirm denial. The controller must retain the assigned gateway URL and token. An older direct-catalog OpenCode checkpoint must refresh without changing another provider's fingerprint. The assigned-tool and executor controls cover source behavior; live sandbox discovery and a real call remain separate acceptance evidence. Missing dependencies, failed authentication, invalid models and incompatible custom settings must remain actionable errors without silent runner switching. Saved unchanged execution can still be tested without applying new selection policy, but runtime/account validation must still run.

Verify an automatic Codex hire and an explicit Legacy control through a useful file artifact, follow-up and reload. Preserve Codex reasoning effort and account isolation; retain explicit Legacy permission choices, including false. Reopen an existing agent, make an unrelated edit, and confirm both its persisted runner and next run stay unchanged. Use hiring/import preservation for approval and portability controls.

Test native Codex with a saved subscription whose setup auth file is a managed link, as well as a regular file and an API-key account. Setup must seed the isolated probe from the checked account without exposing credentials or changing its saved runner. With subscription authentication, an unbound configured CODEX_HOME with linked credentials must fail setup with managed-account or explicit Legacy guidance; it must not claim readiness when task isolation would omit the file. Dangling or incorrectly owned credentials must also fail clearly. A selected CODEX_API_KEY or OPENAI_API_KEY takes precedence over an unrelated subscription file. Test valid, dangling and invalid subscription links with that selected key; setup must test the key without reading or refreshing the unrelated account. The private probe copy must be removed after confirmed retirement following success, failure or cancellation. Unconfirmed shutdown remains a cleanup failure. Exercise an unavailable local daemon and a preparation failure before probe handoff. No owned temporary credential copy may remain, and original account files must be unchanged. A probe whose shutdown is unconfirmed must retain its recovery state; do not treat it as a preparation-only failure. Existing setup controls use fake credentials; real account execution remains a separate acceptance requirement.

run-history

Automated: live run routes and run event sequencing cover run data contracts.

Manual: Start a disposable task, open its running transcript, and follow it to a terminal outcome. Reload and compare task/run IDs, status, output, and cost. Verify a failed run remains distinguishable from a completed run with useful output.

For Legacy OpenCode on a disposable Linux sandbox, run a Bash tool that reads /proc/self/oom_score_adj and its parent's score. The tool should report 1000; OpenCode should retain its original score. Repeat with an operator BASH_ENV and confirm that it takes precedence. Repeat with a linked operator plugins directory; it must remain unchanged, and the uploaded runtime must contain a real plugins directory with the guard and existing plugins. Under controlled memory pressure, record the cgroup OOM counters and verify that a killed tool can return an error while the agent continues. Local and SSH execution must keep their original shell environment. See the adapter contract. These controls do not guarantee that every memory exhaustion preserves the agent.

An explicit runner change starts a configuration revision and invalidates the eligible session. Active runs, restart recovery and historical transcript parsing retain their recorded execution configuration; do not infer their runner from a later edit to the agent. Account/harness branding and execution identity are different observations, both required in the evidence.

For an onboarding child-completion callback, verify actual session/turn events and the source-correlated reply. A succeeded row alone is insufficient: the literal ea6c8eb5e16d61111968f633a66748b397b64a3e managed attempt was marked successful during startup without a provider turn. The recovery correction preserves the existing validated Done-parent handoff; process-death and ownership checks remain active. Its PostgreSQL controls are separate from the required revised-source live onboarding and follow-up proof.

Gotchas

  • Model accounts are managed in Apps and inline agent account controls. /company/settings/connections configures decision/fast-response models, not the general model-account library.

  • Structured run events stay in the instance database. Optional stdout/stderr and raw trace payload storage can use S3; see run evidence storage. Both are separate from first-party Telemetry and operator OpenTelemetry export.

  • Authentication/model discovery does not establish tool, image, steering, or resumption capability parity.

  • Use recovery for interrupted runs and execution environments for local/SSH/sandbox differences.

Native setup retirement joins owned startup before cleanup can be confirmed. Transport ownership controls hold preparation or registration without launching a provider, then check bounded close, rejected duplicate requests, no later launch and retention of unconfirmed state. Readiness observes shutdown; resumed startup cannot reactivate ingress after close. These are lifecycle controls, separate from installed provider proof. The real daemon readiness and recovery controls require their existing native fixtures in hosted CI; passing credential-free controls does not qualify them. A primary setup timeout remains a failure even when teardown also fails.

For remote setup shutdown, verify that each durable-state read respects the remaining suspension deadline. A late result cannot establish suspension or queue a replacement command after that deadline. An intentional ingress close must observe physical socket closure before retiring its connection owner and releasing the endpoint; an unresponsive peer must not extend the setup budget. The existing transport and ingress suites exercise these conditions without a provider. Repeat the actual managed setup and useful task journey separately; the literal 651a3de64fc943216cc414b64b1443809f9499da Test attempt failed cleanup before hire and retains its unconfirmed recovery state.

delegated-configuration

See the canonical delegated configuration guidance and acceptance evidence.