Use released provider admission in deployment qualification

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip committed 2026-11-04 01:53:15 -06:00
1 parent e9aae9cfb9
commit 9cbec30a4f
6 files changed
+20 -12

No files matched your search

+3 -3
View File
@@ -312,11 +312,11 @@ describe("runner E2E catalog", () => {
expect(localIntegrityTasks).toHaveLength(2); expect(localIntegrityTasks).toHaveLength(2);
expect(openRouterBreadthTasks).toHaveLength(3); expect(openRouterBreadthTasks).toHaveLength(3);
expect(runnerSuites.map((suite) => suite.expectedMatrixSize)).toEqual([ expect(runnerSuites.map((suite) => suite.expectedMatrixSize)).toEqual([
1, 1, 4, 2, 1, 3, 2, 2, 4, 4, 4, 4, 4, 4, 8, 10, 6, 63, 12, 6, 4, 2, 4, 2, 30, 3, 16, 16, 20, 2, 1, 6, 8, 46, 2, 23, 15, 52, 6, 6, 20, 26, 52, 5, 28, 18, 2, 6, 6, 13, 10, 4, 48, 16, 10, 2, 1, 1, 4, 116, 2, 1, 2, 1, 9, 9, 4, 2, 1, 3, 2, 2, 4, 4, 4, 4, 4, 4, 8, 10, 6, 63, 12, 6, 4, 2, 4, 2, 30, 3, 16, 16, 20, 2, 1, 6, 8, 46, 2, 23, 15, 52, 6, 6, 20, 26, 52, 5, 28, 18, 2, 6, 6, 13, 10, 4, 48, 16, 10, 2, 1, 1, 4, 116, 2, 1, 2,
]); ]);
expect(validateRunnerCatalog()).toHaveLength(802); expect(validateRunnerCatalog()).toHaveLength(819);
expect(new Set(runnerMatrix.map((entry) => entry.id)).size).toBe(802); expect(new Set(runnerMatrix.map((entry) => entry.id)).size).toBe(819);
expect( expect(
runnerMatrix.filter((entry) => entry.suite.id === "core-compatibility"), runnerMatrix.filter((entry) => entry.suite.id === "core-compatibility"),
).toHaveLength(48); ).toHaveLength(48);
+3 -2
View File
@@ -1241,9 +1241,10 @@ export const kimiRunnerProfile = nativeProfile({
}); });
const rollingDeploymentProfiles = [...runnerProfiles, ...extendedHarnessProfiles, kimiRunnerProfile] const rollingDeploymentProfiles = [...runnerProfiles, ...extendedHarnessProfiles, kimiRunnerProfile]
.filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")) .filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")
&& (!profile.qualificationCandidate || QUALIFIED_ACPX_PROFILES[profile.qualificationCandidate].qualificationStatus !== "pending"))
.map(original => { .map(original => {
const profile = productionStoryProfile(original); const { qualificationCandidate: _candidate, ...profile } = productionStoryProfile(original);
return { ...profile, buildAgent(input: AgentFixtureBuildInput) { return { ...profile, buildAgent(input: AgentFixtureBuildInput) {
const agent = profile.buildAgent(input); const agent = profile.buildAgent(input);
const adapterConfig = { ...(agent.adapterConfig as Record<string, unknown>) }; const adapterConfig = { ...(agent.adapterConfig as Record<string, unknown>) };
@@ -1,3 +1,4 @@
import { QUALIFIED_ACPX_PROFILES } from "../../packages/paperclip-runner/src/drivers/acpx/qualified-profiles.js";
import { describe, expect, it } from "vitest"; import { describe, expect, it } from "vitest";
import { rollController, validControllerRollingDeploymentReceipt } from "./controller-rolling-deployment.js"; import { rollController, validControllerRollingDeploymentReceipt } from "./controller-rolling-deployment.js";
import { validControllerReplacementReceipt } from "./controller-replacement.js"; import { validControllerReplacementReceipt } from "./controller-replacement.js";
@@ -56,11 +57,12 @@ describe("rolling controller qualification", () => {
const [outage] = selectRunnerExecutions(parseRunnerSelectors(["--suite", "remote-workspace-storage"])); const [outage] = selectRunnerExecutions(parseRunnerSelectors(["--suite", "remote-workspace-storage"]));
expect(controllerOutageForExecution(outage!, {})).toEqual({ signal: "SIGKILL", holdMs: 300_000 }); expect(controllerOutageForExecution(outage!, {})).toEqual({ signal: "SIGKILL", holdMs: 300_000 });
}); });
it("requires both lifecycle modes for every registered native sandbox profile", () => { it("requires both lifecycle modes for every production-qualified native sandbox profile", () => {
const executions = ["rolling-web-deployment", "rolling-web-deployment-warm"] const executions = ["rolling-web-deployment", "rolling-web-deployment-warm"]
.flatMap(suite => selectRunnerExecutions(parseRunnerSelectors(["--suite", suite]))); .flatMap(suite => selectRunnerExecutions(parseRunnerSelectors(["--suite", suite])));
const native = [...runnerProfiles, ...extendedHarnessProfiles, kimiRunnerProfile] const native = [...runnerProfiles, ...extendedHarnessProfiles, kimiRunnerProfile]
.filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")); .filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")
&& (!profile.qualificationCandidate || QUALIFIED_ACPX_PROFILES[profile.qualificationCandidate].qualificationStatus !== "pending"));
const kind = (profile: (typeof native)[number]) => { const kind = (profile: (typeof native)[number]) => {
const provider = profile.expectedRuntimeMetadata.provider; const provider = profile.expectedRuntimeMetadata.provider;
const harness = "acpxAgent" in profile ? profile.acpxAgent const harness = "acpxAgent" in profile ? profile.acpxAgent
@@ -68,12 +70,14 @@ describe("rolling controller qualification", () => {
return `${provider}:${harness}`; return `${provider}:${harness}`;
}; };
const registeredKinds = new Set(runnerSuites.flatMap(suite => suite.profiles) const registeredKinds = new Set(runnerSuites.flatMap(suite => suite.profiles)
.filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")) .filter(profile => profile.generation === "native" && profile.supportedEnvironments.includes("daytona")
&& (!profile.qualificationCandidate || QUALIFIED_ACPX_PROFILES[profile.qualificationCandidate].qualificationStatus !== "pending"))
.map(kind)); .map(kind));
expect(new Set(native.map(kind))).toEqual(registeredKinds); expect(new Set(native.map(kind))).toEqual(registeredKinds);
for (const profile of native) { for (const profile of native) {
const cells = executions.filter(execution => execution.profile.id === profile.id); const cells = executions.filter(execution => execution.profile.id === profile.id);
expect(cells).toHaveLength(2); expect(cells).toHaveLength(2);
expect(cells.every(cell => !cell.profile.qualificationCandidate)).toBe(true);
expect(new Set(cells.map(cell => cell.environment.configurationKey ?? "per_turn"))) expect(new Set(cells.map(cell => cell.environment.configurationKey ?? "per_turn")))
.toEqual(new Set(["per_turn", "warm-controller-outage-v1"])); .toEqual(new Set(["per_turn", "warm-controller-outage-v1"]));
} }
+3 -2
View File
@@ -1,3 +1,4 @@
import { isRollingWebDeployment } from "./controller-rolling-deployment.js";
import { execFileSync } from "node:child_process"; import { execFileSync } from "node:child_process";
import { createHash } from "node:crypto"; import { createHash } from "node:crypto";
import { chmod, lstat, mkdtemp, mkdir, readFile, realpath, rm, symlink, writeFile } from "node:fs/promises"; import { chmod, lstat, mkdtemp, mkdir, readFile, realpath, rm, symlink, writeFile } from "node:fs/promises";
@@ -7,7 +8,7 @@ import { afterEach, beforeEach, expect, it, vi } from "vitest";
import { runnerMatrix } from "./catalog.js"; import { runnerMatrix } from "./catalog.js";
import { assertInstalledCliSelection, installedCliKeys, probeInstalledCodexStartup, verifyInstalledCli } from "./installed-cli.js"; import { assertInstalledCliSelection, installedCliKeys, probeInstalledCodexStartup, verifyInstalledCli } from "./installed-cli.js";
import { buildPaperclipServerEnvironment, buildRunnerE2EProcessEnvironment } from "./harness-env.js"; import { buildPaperclipServerEnvironment, buildRunnerE2EProcessEnvironment } from "./harness-env.js";
const cells = runnerMatrix.filter(e => e.profile.id === "runner-acpx-pi"); const cells = runnerMatrix.filter(e => !isRollingWebDeployment(e) && e.profile.id === "runner-acpx-pi");
const roots: string[] = []; const roots: string[] = [];
// pnpm's source test wrapper sets NODE_PATH; the disposable public-install fixture must start closed. // pnpm's source test wrapper sets NODE_PATH; the disposable public-install fixture must start closed.
beforeEach(() => { vi.stubEnv("NODE_PATH", undefined); vi.stubEnv("NODE_OPTIONS", undefined); }); beforeEach(() => { vi.stubEnv("NODE_PATH", undefined); vi.stubEnv("NODE_OPTIONS", undefined); });
@@ -46,7 +47,7 @@ it("admits existing Codex onboarding, useful-file revision and restart journeys
}); });
it("admits only the 20 agreed Copilot cells through normal installed resolution with no qualification override", async () => { it("admits only the 20 agreed Copilot cells through normal installed resolution with no qualification override", async () => {
const { env, server } = await fixture(); const { env, server } = await fixture();
const selected = runnerMatrix.filter(e => e.profile.id === "runner-acpx-copilot"); const selected = runnerMatrix.filter(e => !isRollingWebDeployment(e) && e.profile.id === "runner-acpx-copilot");
expect(selected).toHaveLength(20); expect(selected).toHaveLength(20);
expect(selected.filter(e => e.environment.id === "local")).toHaveLength(10); expect(selected.filter(e => e.environment.id === "local")).toHaveLength(10);
expect(selected.filter(e => e.environment.id === "daytona")).toHaveLength(10); expect(selected.filter(e => e.environment.id === "daytona")).toHaveLength(10);
@@ -1,3 +1,4 @@
import { isRollingWebDeployment } from "./controller-rolling-deployment.js";
import { execFileSync } from "node:child_process"; import { execFileSync } from "node:child_process";
import { createHash } from "node:crypto"; import { createHash } from "node:crypto";
import { readFileSync } from "node:fs"; import { readFileSync } from "node:fs";
@@ -36,7 +37,7 @@ it("admits pinned published plugin and resolved SDK graph without claiming a ful
}); });
it("admits all ten Copilot Daytona cells only with the pinned normal plugin graph", async () => { it("admits all ten Copilot Daytona cells only with the pinned normal plugin graph", async () => {
const f = await fixture(); const f = await fixture();
const selected = runnerMatrix.filter(e => e.profile.id === "runner-acpx-copilot" && e.environment.id === "daytona"); const selected = runnerMatrix.filter(e => !isRollingWebDeployment(e) && e.profile.id === "runner-acpx-copilot" && e.environment.id === "daytona");
expect(selected).toHaveLength(10); expect(selected).toHaveLength(10);
for (const selectedCell of selected) { for (const selectedCell of selected) {
expect(await verifyInstalledDaytonaPlugin(f.env, [selectedCell])).toMatchObject({ packageRoot: f.authority.plugin.root, sourceFallback: false, fullGraphVerified: false, completeGraphAuthorityRequired: true }); expect(await verifyInstalledDaytonaPlugin(f.env, [selectedCell])).toMatchObject({ packageRoot: f.authority.plugin.root, sourceFallback: false, fullGraphVerified: false, completeGraphAuthorityRequired: true });
+2 -1
View File
@@ -1,3 +1,4 @@
import { isRollingWebDeployment } from "./controller-rolling-deployment.js";
import { execFile } from "node:child_process"; import { execFile } from "node:child_process";
import { promisify } from "node:util"; import { promisify } from "node:util";
import { createHash } from "node:crypto"; import { createHash } from "node:crypto";
@@ -206,7 +207,7 @@ describe("Pi edit, validation and public artifact oracle", () => {
expect(prompt).toContain(`title ${artifact.name},`); expect(prompt).toContain(`title ${artifact.name},`);
} }
} }
expect(runnerMatrix.filter(c => c.profile.qualificationCandidate === "pi")).toHaveLength(26); expect(runnerMatrix.filter(c => !isRollingWebDeployment(c) && c.profile.qualificationCandidate === "pi")).toHaveLength(26);
}); });
it.each(["local", "daytona"] as const)("seeds once and collects public %s evidence", async environment => { it.each(["local", "daytona"] as const)("seeds once and collects public %s evidence", async environment => {
const root = await mkdtemp(join(tmpdir(), "pi-file-evidence-")); const root = await mkdtemp(join(tmpdir(), "pi-file-evidence-"));