mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-11-04 19:28:46 +01:00
Merge branch 'codex/claude-runner-default' into codex/claude-runner-platforms
* codex/claude-runner-default: docs: record fresh review fixes and guarded Claude UI evidence fix(runner): retain cancelled Claude setup writes without blocking abort
This commit is contained in:
commit
2646b94533
4 files changed
+56
-5
No files matched your search
@@ -1315,3 +1315,39 @@ stopped on its404 target check before creating an attachment or work product.
|
|||||||
That foreign instance is left untouched. Claude preview recovery must select
|
That foreign instance is left untouched. Claude preview recovery must select
|
||||||
a separate port and the existing Claude data directory; the historical3105
|
a separate port and the existing Claude data directory; the historical3105
|
||||||
link is no longer a usable Claude preview.
|
link is no longer a usable Claude preview.
|
||||||
|
|
||||||
|
|
||||||
|
### Fresh review and cancellation correction — 2026-10-14
|
||||||
|
|
||||||
|
Fresh reviews passed behavior 7069077274 and platforms 6b0cb979d4 at 5/5.
|
||||||
|
Protocol 519e8369a1 received two valid findings: stale profile 23 catalog
|
||||||
|
expectations and an owned Claude settings write that blocked startup abort.
|
||||||
|
Correction dd82936c1d updates the Pi 25 expectations/fingerprint and uses the
|
||||||
|
existing abort-aware admission helper, transferring the unfinished write and
|
||||||
|
lifetime lease to retained cleanup. Both successful and failing late writes
|
||||||
|
return cancellation promptly while rejecting a competing provider. All 55
|
||||||
|
runtime-host tests, 72 Pi evidence controls, runner noemit and profile/manifest
|
||||||
|
checks pass. These are fake-provider controls, not paid execution evidence.
|
||||||
|
|
||||||
|
Hosted jobs 38606914671 and 38606913944 received simultaneous runner shutdown
|
||||||
|
signals at 17:35:06 UTC. One failed-job prerequisite rerun was requested before
|
||||||
|
the new review findings. Credential-free package campaign 38607132186 was
|
||||||
|
canceled once the runtime fix invalidated its source 6b0cb979d4. Completed
|
||||||
|
producer outputs remain historical; no new package qualification is claimed.
|
||||||
|
A replacement package campaign waits for fresh review of the corrected runtime.
|
||||||
|
|
||||||
|
The existing Product E2E browser helper exercised UI source 7069077274 against
|
||||||
|
the retained older backend at 3115 through New Agent, Claude Code and Advanced.
|
||||||
|
The runner shows Paperclip Runner (default); keyboard Legacy/native selection
|
||||||
|
passes. Stable light/dark screenshots at 1440 and 390 px show no horizontal page
|
||||||
|
overflow. The inherited Custom Gateway subtitle clips on 390 px; Claude API-key
|
||||||
|
controls remain visible. Every API mutation was blocked by the browser guard;
|
||||||
|
one local connection-attempt request was intercepted, no agent was created and
|
||||||
|
no setup probe or provider turn was submitted. This establishes UI rendering
|
||||||
|
and controls only, not saved-default persistence or final runtime execution.
|
||||||
|
UI receipt: /private/tmp/claude-current-ui-review-20261014.json.
|
||||||
|
Retained Claude preview: http://127.0.0.1:3115 (historical runtime treatment).
|
||||||
|
The prior reconciliation report was uploaded to its original completed QA task
|
||||||
|
and independently byte-checked: attachment aabe2e7e-a8a0-4408-bc7e-a013e0f7485b,
|
||||||
|
5916 bytes, SHA256 3bd9bcfa64db6a3a7968952122b1a5c2ae27e24f0e4ff336fd47ae374bae8ff1.
|
||||||
|
Paid acceptance and budget/hold changes remain stopped pending human approval.
|
||||||
@@ -264,7 +264,7 @@ describe("ACPX runtime host", () => {
|
|||||||
} finally { await nextOwner.close({ reason: "next owner complete" }); }
|
} finally { await nextOwner.close({ reason: "next owner complete" }); }
|
||||||
});
|
});
|
||||||
|
|
||||||
it("keeps the Claude lifetime lease until an owned settings write settles after cancellation", async () => {
|
it.each([false, true])("cancels Claude startup promptly while retaining its settings write and lease (late failure: %s)", async failWrite => {
|
||||||
const fixture = await hostFixture();
|
const fixture = await hostFixture();
|
||||||
const controller = new AbortController();
|
const controller = new AbortController();
|
||||||
let announceWrite!: () => void;
|
let announceWrite!: () => void;
|
||||||
@@ -280,6 +280,7 @@ describe("ACPX runtime host", () => {
|
|||||||
return { ...sandbox, initializeOwnedConfiguration: async () => {
|
return { ...sandbox, initializeOwnedConfiguration: async () => {
|
||||||
announceWrite();
|
announceWrite();
|
||||||
await writePending;
|
await writePending;
|
||||||
|
if (failWrite) throw new Error("settings write failed after cancellation");
|
||||||
await initialize?.();
|
await initialize?.();
|
||||||
} };
|
} };
|
||||||
};
|
};
|
||||||
@@ -289,6 +290,8 @@ describe("ACPX runtime host", () => {
|
|||||||
try {
|
try {
|
||||||
await writeStarted;
|
await writeStarted;
|
||||||
controller.abort(new Error("settings admission cancelled"));
|
controller.abort(new Error("settings admission cancelled"));
|
||||||
|
await runAcpxOperationAttempt(() => rejected, Date.now() + 1_000);
|
||||||
|
expect(openRuntime).not.toHaveBeenCalled();
|
||||||
await expect(AcpxRuntimeHost.open(options, fixture.dependencies({ openRuntime }))).rejects.toThrow("already has an active lease");
|
await expect(AcpxRuntimeHost.open(options, fixture.dependencies({ openRuntime }))).rejects.toThrow("already has an active lease");
|
||||||
} finally { finishWrite(); }
|
} finally { finishWrite(); }
|
||||||
await rejected;
|
await rejected;
|
||||||
|
|||||||
@@ -483,7 +483,19 @@ export class AcpxRuntimeHost {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
options.signal?.throwIfAborted();
|
options.signal?.throwIfAborted();
|
||||||
await sandbox.initializeOwnedConfiguration?.();
|
const configurationLifetime = credential;
|
||||||
|
await runAbortableAdmissionStage(
|
||||||
|
options.signal,
|
||||||
|
async () => { await sandbox.initializeOwnedConfiguration?.(); },
|
||||||
|
cleanup => {
|
||||||
|
pendingRuntimeOwnsCredential = true;
|
||||||
|
const retained = cleanup.then(() => cleanupAbortedRuntimeAdmission(
|
||||||
|
null, configurationLifetime, "ACPX owned configuration cancelled",
|
||||||
|
));
|
||||||
|
retainRuntimeHostCleanup(retained);
|
||||||
|
dependencies.retainAdmissionCleanup?.(retained);
|
||||||
|
},
|
||||||
|
);
|
||||||
options.signal?.throwIfAborted();
|
options.signal?.throwIfAborted();
|
||||||
assertAcpxProfileEnvironment(options.agent, sandbox.launchEnvironment);
|
assertAcpxProfileEnvironment(options.agent, sandbox.launchEnvironment);
|
||||||
let launchEnvironment = sandbox.launchEnvironment;
|
let launchEnvironment = sandbox.launchEnvironment;
|
||||||
|
|||||||
@@ -189,8 +189,8 @@ describe("Pi controls catalog admission", () => {
|
|||||||
// Extended v3 states the strict file oracle's task-wide Bash limit.
|
// Extended v3 states the strict file oracle's task-wide Bash limit.
|
||||||
const pi = runnerMatrix.find(c => c.profile.qualificationCandidate === "pi")!.profile;
|
const pi = runnerMatrix.find(c => c.profile.qualificationCandidate === "pi")!.profile;
|
||||||
expect(pi.modelQualification?.qualificationId).toBe("pi:0.0.33:1.0.0:openrouter");
|
expect(pi.modelQualification?.qualificationId).toBe("pi:0.0.33:1.0.0:openrouter");
|
||||||
expect(runnerSuites.find(s => s.id === "pi-native")!.definitionMetadata).toMatchObject({ version: 23, remoteProcExit: "separately-confirmed-absence-after-read-failure", taskCreation: "explicit-title-and-creation-response-id", agentMemoryParent: "public-managed-file-seed-before-admission", incompleteTerminalCleanup: "retirement-retained-with-failed-watch", profileVersion: 23, agentMemoryContent: "utf8-nonce-plus-final-lf", agentMemoryPrompt: "single-json-write-and-content-bound-native-read-both-runs", agentMemoryReadAuthority: "local-withheld-or-exact-remote-agent-run-file", taskPromptTransport: "fenced-markdown-paste-and-multiline-literal-escapes", nativeFinish: "current-contract-objective-evidence-refs", providerFaultExecutable: "stable-preinstalled-runner-link-and-snapshot-node-inode-with-held-bootstrap-fd-3-or-7" });
|
expect(runnerSuites.find(s => s.id === "pi-native")!.definitionMetadata).toMatchObject({ version: 23, remoteProcExit: "separately-confirmed-absence-after-read-failure", taskCreation: "explicit-title-and-creation-response-id", agentMemoryParent: "public-managed-file-seed-before-admission", incompleteTerminalCleanup: "retirement-retained-with-failed-watch", profileVersion: 25, agentMemoryContent: "utf8-nonce-plus-final-lf", agentMemoryPrompt: "single-json-write-and-content-bound-native-read-both-runs", agentMemoryReadAuthority: "local-withheld-or-exact-remote-agent-run-file", taskPromptTransport: "fenced-markdown-paste-and-multiline-literal-escapes", nativeFinish: "current-contract-objective-evidence-refs", providerFaultExecutable: "stable-preinstalled-runner-link-and-snapshot-node-inode-with-held-bootstrap-fd-3-or-7" });
|
||||||
expect(runnerSuites.find(s => s.id === "pi-controls")!.definitionMetadata).toMatchObject({ version: 10, remoteProcExit: "separately-confirmed-absence-after-read-failure", taskCreation: "explicit-title-and-creation-response-id", profileVersion: 23,
|
expect(runnerSuites.find(s => s.id === "pi-controls")!.definitionMetadata).toMatchObject({ version: 10, remoteProcExit: "separately-confirmed-absence-after-read-failure", taskCreation: "explicit-title-and-creation-response-id", profileVersion: 25,
|
||||||
remoteProcessIdentity: "observer-pid-startTicks-bootId",
|
remoteProcessIdentity: "observer-pid-startTicks-bootId",
|
||||||
controlPlaneSettlement: "required-scoped-result-and-terminal-after-runner" });
|
controlPlaneSettlement: "required-scoped-result-and-terminal-after-runner" });
|
||||||
expect(runnerSuites.find(s => s.id === "extended-harnesses")!.definitionMetadata).toMatchObject({ version: 5, piFileArtifactTitle: "exact-filename", piFileCommandTransport: "fenced-bash-markdown-paste" });
|
expect(runnerSuites.find(s => s.id === "extended-harnesses")!.definitionMetadata).toMatchObject({ version: 5, piFileArtifactTitle: "exact-filename", piFileCommandTransport: "fenced-bash-markdown-paste" });
|
||||||
@@ -200,7 +200,7 @@ describe("Pi controls catalog admission", () => {
|
|||||||
}
|
}
|
||||||
const hashes = Object.fromEntries(runnerSuites.filter(s => ["pi-native", "native-active-stop", "extended-harnesses", "rich-acp-warm-continuity"].includes(s.id)).map(s => [s.id, suiteDefinitionHash(s)]));
|
const hashes = Object.fromEntries(runnerSuites.filter(s => ["pi-native", "native-active-stop", "extended-harnesses", "rich-acp-warm-continuity"].includes(s.id)).map(s => [s.id, suiteDefinitionHash(s)]));
|
||||||
expect(hashes).toEqual({
|
expect(hashes).toEqual({
|
||||||
"pi-native": "3c77ced7edfb99aa12052f451398da7580466a54abadcaf287d31ee12c16382d",
|
"pi-native": "fca73103d5791b9babe5b51cdbb38629c7b30732687969f4714f8af133803df9",
|
||||||
"native-active-stop": "2d4fdeeb75bd531b309bd1b35cfa5680ceefdeee6b7155b068dd011ce9901980",
|
"native-active-stop": "2d4fdeeb75bd531b309bd1b35cfa5680ceefdeee6b7155b068dd011ce9901980",
|
||||||
"rich-acp-warm-continuity": "331b88d9538a132670789fb7864df7df5f4bf294ae19b62f53d8a02f901774f0",
|
"rich-acp-warm-continuity": "331b88d9538a132670789fb7864df7df5f4bf294ae19b62f53d8a02f901774f0",
|
||||||
"extended-harnesses": "5de4fac78d4d581bc0954f07b5cf2df2862d37f8b0205325eede6d9ef6d9f5e6",
|
"extended-harnesses": "5de4fac78d4d581bc0954f07b5cf2df2862d37f8b0205325eede6d9ef6d9f5e6",
|
||||||
|
|||||||
Reference in new issue
Block a user