mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-23 09:07:46 +02:00
## Thinking Path > - Paperclip manages work for AI agents. > - Runner can execute in a different environment from Core. > - Core owns provider selection, policy, and resource assignments. > - The execution environment must prepare its own files and paths. > - A shared contract must keep these responsibilities separate. > - This PR adds that contract to the Runner execution driver. ## Linked Issues or Issue Description **Problem or motivation** Runner transport prepares provider files on the controller before launch. An execution owner cannot prepare those files in its own environment through the existing driver. **Proposed solution** Add `prepareLaunch` to the execution driver. Supply versioned Core requirements. Accept a configuration ID, requirements digest, and ordinary provider descriptor. Validate Core policy and assignments before launch. Keep existing provider session checks. **Alternatives considered** Provider-specific ownership flags would spread the boundary across backends. Shell preparation would expose process details in the plugin API. Refs #16993, #16977. Both prerequisites are merged. This PR now targets master. Native plugin integration and execution-host preparation follow separately. PR #16978 contains an earlier, unmerged prototype. Its `persistentAgentHome` mode and skill path-map call will be replaced by this preparation contract before activation. This PR preserves current master callers of the skill helper. ## What Changed - Add the optional preparation callback and an explicit Runner artifact identity. - Keep the built-in preparation path as the default. - Validate provider policy and resource assignment identity. Preserve instruction text when resource locations change. - Persist the attachment seed after an authority epoch rotation, so a later controller restart can recover the same run. - Preserve explicit context removal on a new run. Only an omitted context can reuse the saved context. Remove its registered instruction framing when context is removed. - Save exact requirements and configurations in a private file outside Runner commands. Retain the active record across failed attachments. Use current grants for new runs. Keep incompatible session changes rejected. - Join delayed preparation during startup and warm attachment cleanup. Retain an unsettled checkpoint after a timeout. Prevent work after cancellation. - Use the supplied Runner artifact for interrupted handoff recovery. Restore the exact target configuration at each handoff crash boundary. Check the Runner state when the final ACK may be lost. - Bind the changed shared sources to Copilot profile v51. Preserve the v50 receipt and current integrity checks. ## Verification - Workspace typecheck passed. - All 487 affected Runner transport, control-plane, preparation store, builder, policy, and profile tests passed on commit `eaf8ae8d1`. - Workspace build and typecheck passed again on commit `eaf8ae8d12c7ef2d22d226e4b3f05fdbf79ef4cb`. - Both warm attachment cleanup regressions fail before the fix. They pass after the fix. The tests cover delayed preparation, timeout retention, and concurrent attachment rejection. - The routed handoff regression fails with a missing controller binary before the fix. It passes after the fix. The execution owner launches the real fixture Runner. - The 200,000-byte instruction regression fails before the fix and passes after it. Four prepared handoff crash cases verify exact request and configuration recovery. The store tests verify private file mode, conflicting records, corrupt data, and active-run retention. - A real Runner with a controlled fake provider verifies execution-host paths, exact recovery, warm reuse, incompatible profile rejection, and cancellation. It does not contact an external provider. - The regression found undefined settings in strict PRP command hashing. Requirements now contain only JSON values. The warm transition test passes without changing PRP validation. - The broader root suite on the prerequisite finished with 22,420 passing tests, seven failed tests in unchanged Git and diagnostic code, and two suite setup errors because Cargo was absent from its PATH. This PR does not claim a passing full root suite. - The CI Build job passed compilation and production runtime boot, then its runner received a shutdown signal during the clean public install check. Other jobs reported lost communication with their self-hosted runners. The failed jobs passed on retry on the same commit; successful jobs kept their results. - The current Superagent security scan is inconclusive because its pinned merge-base checkout failed or timed out. GitHub rejected the check rerun request through the available API. This is not a passing security scan. - Standard Greptile and Greptile Apex each returned 5/5 on `eaf8ae8d1`. All review threads are resolved. CI passed on attempt 2. Current checks have 55 successes, four optional skips, and the inconclusive security scan described above. The branch is ready, mergeable, and current with master. - No live provider qualification or deployment was run. ## Risks - A preparation owner must store configurations and keep retries bound to the same task and requirements. - Copilot source binding requires a new profile identity. This PR does not claim fresh live qualification. - The callback is an SDK extension. This PR does not connect it to a plugin task process owner or add a Launcher endpoint. ## Model Used - OpenAI Codex, GPT-6. Reasoning and repository tools. The exact serving model identifier and context size are not exposed in this session. ## 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>
54 lines
2.7 KiB
Markdown
54 lines
2.7 KiB
Markdown
# Runner launch preparation
|
|
|
|
Core selects the provider, model, instructions, tools, and task permissions.
|
|
The execution environment supplies executable paths and filesystem locations.
|
|
|
|
The built-in TypeScript implementation constructs the provider descriptor in
|
|
`createRunnerProviderLaunch`. The transport sends this descriptor with
|
|
`run.prepare`. Provider backends keep their existing validation and session rules.
|
|
|
|
By default, the SDK prepares local files. It stages remote files through the
|
|
existing execution driver.
|
|
|
|
## Environment-owned preparation
|
|
|
|
An execution driver can supply `prepareLaunch`.
|
|
The callback receives `RunnerProviderLaunchRequirements`.
|
|
It returns `PreparedRunnerProviderLaunch`.
|
|
|
|
Requirements contain the selected provider, model, policy, run identity, and
|
|
runtime context. They do not contain task text, process callbacks, provider
|
|
credentials, or controller executable choices. Resource paths identify source
|
|
locations. They do not grant filesystem access on the execution host.
|
|
|
|
The environment resolves its resources and prepares the provider descriptor.
|
|
It can use `bindRunnerLaunchResources` to replace registered context locations.
|
|
It can use `createRunnerProviderLaunch` for the existing descriptor projection.
|
|
The transport does not perform its built-in file preparation in this mode.
|
|
The process owner supplies the Runner artifact and process lifecycle.
|
|
|
|
The result contains a configuration ID, a requirements digest, and a provider
|
|
descriptor. The transport checks Core's selected profile and policy before
|
|
registration and launch. Core still supplies authorized tools and completion
|
|
criteria through PRP. A failed preparation does not enable a fallback launch.
|
|
|
|
The transport saves the exact requirements and prepared configuration in its
|
|
private `launch-preparation.json` file. The file holds at most two records.
|
|
A new attachment keeps the active run's record. Runner commands contain the
|
|
provider descriptor once. They do not contain these recovery records.
|
|
|
|
Recovery within the same run must return the same configuration. This rule also
|
|
applies during an interrupted warm attachment. A new run uses its current
|
|
requirements. For a new run, `runtimeContext: null` removes the assigned context.
|
|
Only an omitted context can reuse the previous context.
|
|
Provider session compatibility checks remain in their existing
|
|
backends. Close waits for preparation within its deadline. A timeout retains an
|
|
unsettled checkpoint and prevents reuse.
|
|
|
|
## Plugin task protocol
|
|
|
|
The [environment task API](plugins/PLUGIN_ENVIRONMENT_TASKS.md#launch-preparation)
|
|
defines the plugin preparation exchange. This callback does not implement a
|
|
plugin task process owner or a Launcher endpoint. Those integrations are
|
|
separate changes.
|