mirror of
https://github.com/paperclipai/paperclip.git
synced 2026-10-31 22:24:16 +01:00
Align native setup isolation and finish shared runtime pickers
Use the server-resolved sandbox transport for native setup, retaining local and SSH isolation and stripping injected flags. Preserve the complete local and managed E2E roster and existing graders. Replace the remaining scoped native dropdowns with the shared picker without changing saved runner or account choices. Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
1 parent
448db859e3
commit
30bc9e40ce
17 files changed
+299
-112
No files matched your search
@@ -1,17 +1,23 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { runsCompletionUpdateProbe, COMPLETION_QUALITY_CONFIG, completionQualityControls, completionQualityStatus, completionQualityRequest, judgeCompletionQuality, reserveCompletionQuality, validateCompletionQuality } from "./completion-quality.js";
|
||||
import { runnerMatrix } from "./catalog.js";
|
||||
import { MANAGED_FIRST_TASK_CELL } from "./first-task-fixtures.js";
|
||||
const observation = { sourceId: "chat", marker: "REF", worker: { id: "task", title: "Welcome", status: "done", completedAt: "2026-09-01T00:00:00Z" }, documents: [{ id: "doc", issueId: "task", key: "welcome", body: "Welcome to the garden. Meet at 10:30." }], comments: [{ id: "reply", issueId: "chat", authorAgentId: "agent", createdAt: "2026-09-01T00:01:00Z", body: "The note is ready at /issues/task", createdByRunId: "run" }], runs: [] };
|
||||
const criteria = Object.keys(COMPLETION_QUALITY_CONFIG.rubric).map(id => ({ id, passed: true, rationale: "Supported by the saved note and reply", evidenceIds: ["reply", "doc"] }));
|
||||
const reports = [{ replyId: "reply", rationale: "Reports the completed task", completedTaskIdsReferenced: ["task"], resultAccessTaskIds: ["task"], correctsReplyIds: [] as string[] }];
|
||||
describe("completion semantic qualification", () => {
|
||||
it.each(["runner-codex", "runner-acpx-claude"])("requires a completion judge only for accepted work on %s", profile => {
|
||||
const cells = runnerMatrix.filter(e => e.suite.id === "confirmation-replies" && e.profile.id === profile);
|
||||
const cells = runnerMatrix.filter(e => e.suite.id === "confirmation-replies" && e.profile.id === profile && e.environment.id === "local");
|
||||
expect(cells).toHaveLength(6);
|
||||
expect(cells.filter(runsCompletionUpdateProbe).map(e => e.task.id).sort()).toEqual([
|
||||
"interview-plan-accept", "task-card-accept", "task-reply-accept",
|
||||
]);
|
||||
});
|
||||
it("requires the existing completion judge for accepted managed onboarding work", () => {
|
||||
const managed = runnerMatrix.find(e => e.id === MANAGED_FIRST_TASK_CELL);
|
||||
expect(managed).toBeDefined();
|
||||
expect(runsCompletionUpdateProbe(managed!)).toBe(true);
|
||||
});
|
||||
it("retains the completion suite's gate and excludes ordinary chat journeys", () => {
|
||||
const completion = runnerMatrix.filter(e => e.suite.id === "completion-updates");
|
||||
expect(completion).toHaveLength(10);
|
||||
|
||||
@@ -3,7 +3,7 @@ import { describe, expect, it, vi } from "vitest";
|
||||
import { gradeConfirmationReply, assertAmbiguousReplyUnresolved, ambiguousConfirmationFixtures } from "./confirmation-replies.js";
|
||||
import { firstTaskScenario } from "./first-task-cases.js";
|
||||
import type { FirstTaskEvidence } from "./first-task-scoring.js";
|
||||
import { provisionFirstTaskFixtures } from "./first-task-fixtures.js";
|
||||
import { MANAGED_FIRST_TASK_CELL, provisionFirstTaskFixtures } from "./first-task-fixtures.js";
|
||||
import { runnerMatrix } from "./catalog.js";
|
||||
import { parseRunnerSelectors, selectRunnerExecutions } from "./selectors.js";
|
||||
|
||||
@@ -111,7 +111,7 @@ describe("confirmation-reply independent oracle", () => {
|
||||
payload: { questions: [{ prompt, options: [{ label: "Welcome note" }, { label: "Poster" }] }] },
|
||||
}] })).toThrow();
|
||||
});
|
||||
it.each(runnerMatrix.filter(e => e.suite.id === "confirmation-replies" && e.task.flow === "first_task"))("provisions the real onboarding fixture contract for $id", async execution => {
|
||||
it.each(runnerMatrix.filter(e => e.suite.id === "confirmation-replies" && e.task.flow === "first_task" && e.environment.id === "local"))("provisions the real local onboarding fixture contract for $id", async execution => {
|
||||
const get = vi.fn().mockResolvedValue([{ id: "local", driver: "local" }]);
|
||||
const patch = vi.fn().mockResolvedValue({ id: "company" });
|
||||
const postSensitive = vi.fn().mockResolvedValue({ id: "secret" });
|
||||
@@ -137,12 +137,14 @@ describe("confirmation-reply independent oracle", () => {
|
||||
originalIds: ["a", "b"], tasks: [], reply: "", agentId: "agent", answerId: "reply" })).toThrow();
|
||||
});
|
||||
|
||||
it("selects exactly twelve explicit-only cases using production native profiles", () => {
|
||||
it("selects twelve local and one managed explicit-only cases using production native profiles", () => {
|
||||
const cells = runnerMatrix.filter(e => e.suite.id === "confirmation-replies");
|
||||
expect(cells).toHaveLength(12);
|
||||
expect(cells).toHaveLength(13);
|
||||
expect(cells.filter(c => c.environment.id === "local")).toHaveLength(12);
|
||||
expect(cells.filter(c => c.environment.id === "daytona").map(c => c.id)).toEqual([MANAGED_FIRST_TASK_CELL]);
|
||||
expect(new Set(cells.map(c => c.profile.id))).toEqual(new Set(["runner-codex", "runner-acpx-claude"]));
|
||||
expect(new Set(cells.map(c => c.task.id)).size).toBe(6);
|
||||
expect(selectRunnerExecutions(parseRunnerSelectors(["--suite", "confirmation-replies"]))).toHaveLength(12);
|
||||
expect(selectRunnerExecutions(parseRunnerSelectors(["--suite", "confirmation-replies"]))).toHaveLength(13);
|
||||
expect(selectRunnerExecutions(parseRunnerSelectors(["--all"])).some(c => c.suite.id === "confirmation-replies")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
@@ -180,7 +180,7 @@ describe("Pi controls catalog admission", () => {
|
||||
expect(cells).toHaveLength(4); expect(cells.every(c => c.profile.qualificationCandidate === "pi" && c.task.expectedRunCount === 1)).toBe(true);
|
||||
expect(cells.map(c => `${c.environment.id}/${c.task.id}`).sort()).toEqual(["daytona/pending-permission-stop", "daytona/same-turn-steering", "local/pending-permission-stop", "local/same-turn-steering"]);
|
||||
expect(selectRunnerExecutions(parseRunnerSelectors(["--all"])).some(c => c.suite.id === "pi-controls")).toBe(false);
|
||||
expect(validateRunnerCatalog()).toHaveLength(729);
|
||||
expect(validateRunnerCatalog()).toHaveLength(730);
|
||||
for (const cell of cells) expect(buildRunnerE2EProcessEnvironment({}, [cell]).PAPERCLIP_RUNNER_ACPX_QUALIFICATION).toBeUndefined();
|
||||
expect(() => assertRemoteNativeEvidencePrerequisites(cells, {})).toThrow();
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user