From f1e8cda0740f79b3bb42e37e0bc2a3879a40eaed Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sat, 24 Oct 2026 18:59:16 -0500 Subject: [PATCH] fixture fix, untested --- agents/fethry/work/queue-332/BUILD.md | 6 +++++ packages/cli/tests/launcher.test.mjs | 1 + packages/harness/tests/proxy-bundle.test.mjs | 27 +++++++++++++------- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/agents/fethry/work/queue-332/BUILD.md b/agents/fethry/work/queue-332/BUILD.md index 6a4b5d3bf..0800d99d9 100644 --- a/agents/fethry/work/queue-332/BUILD.md +++ b/agents/fethry/work/queue-332/BUILD.md @@ -201,3 +201,9 @@ The omitted-route-only bundle case passed. Five pending failures do not establis Real old-test RED: `row 65 a failed primary preflight launches the fallback on a fixture harness module, recording the route and the reason` (launcher.test.mjs:714). First expected operation `await launcher.launchPm()` throws before the result assertions: `PM launch refused: no-session-credential (fallback fixture: pi needs its own provider key or a session proxy key (primary down: fixture preflight fails))`. Fixture harness re-exports real pi; prepare() recognized literal pi primary/fallback only, so it did not supply the needed own key. Reported to Sage as fethry-resume-0012 before any edit; no fix or rerun authorized/performed. P3 serialization test and all other launcher tests passed. After all runs finished, changed only harness.test.mjs:100 title per sage-4326 to `row 65 pi preflight refuses missing credentials, and its version is the package pin`; assertion unchanged, no rerun for title. Sweep after end23:57:42Z found the same six pre-existing tool services (2699602,2699605,2700525,2700526,2700531,2700931), no test node/chromium leftovers; no process killed. Lane B free. No other source/test fixes in this follow-up. + +## Fixture correction authorized — sage-4327 + +Old-test list addition: launcher.test.mjs row65 fallback test (line714 at e9fc105ac), before: no own pi credential before setup; after: this test alone sets given.f.env.ZAI_API_KEY=fx332-pi immediately before setup. All assertions unchanged; prepare() condition unchanged. Reason: P3 item4 requires pi own/proxy credential; this fixture inherits pi preflight. Prior real RED and first thrown error preserved above. + +New proxy-bundle tests now supply explicit per-test declared tables: Anthropic only, omitted/default only, GLM only, GPT only; privacy/regeneration use Anthropic+GLM and retain every key/mode/no-executable assertion applicable to those routes. Regeneration additionally checks changed GLM endpoint/model. Added expected refusal test for declared Codex with pending build-time API; no production source changes. Only GPT generation test should remain expected-PENDING. Fixture fixes committed untested before exactly two authorized whole-file runs. diff --git a/packages/cli/tests/launcher.test.mjs b/packages/cli/tests/launcher.test.mjs index 7778526ba..bda5702ae 100644 --- a/packages/cli/tests/launcher.test.mjs +++ b/packages/cli/tests/launcher.test.mjs @@ -722,6 +722,7 @@ test("row 65 a failed primary preflight launches the fallback on a fixture harne write("harness", "down", `export * from ${pi};\nexport const preflight = () => ({ code: "fixture-down", message: "fixture preflight fails" });\n`); write("harness", "fixture", `export * from ${pi};\nexport const adapter = () => ${JSON.stringify(given.adapter)};\n`); }); + given.f.env.ZAI_API_KEY = "fx332-pi"; const { f, launcher } = await setup(t, undefined, given, { makeLoader }); const chief = await launcher.launchPm(); assert.deepEqual({ ...chief, run: undefined }, { run: undefined, instance: "chief", harness: "fixture", model: "claude-sonnet-5-5" }); diff --git a/packages/harness/tests/proxy-bundle.test.mjs b/packages/harness/tests/proxy-bundle.test.mjs index c97b9024c..14b9c3782 100644 --- a/packages/harness/tests/proxy-bundle.test.mjs +++ b/packages/harness/tests/proxy-bundle.test.mjs @@ -11,7 +11,7 @@ const models = { z: { provider: 'proxy', model: 'glm-fixture', route: 'glm' }, g: { provider: 'proxy', model: 'gpt-fixture', route: 'codex' }, }; -function build(t, selection, proxy, declared = models) { +function build(t, selection, proxy, declared) { const root = scratch(t, 'p332-'), runDir = join(root, 'run'); mkdirSync(runDir, { mode: 0o700 }); const valid = resolvedFor(t, 'pm'); @@ -33,7 +33,7 @@ function assertSafe(value) { } test('P3 Anthropic route uses messages at proxy root and the declared model id', t => { - const b = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }); + const b = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }, { a: models.a }); const { anthropic } = JSON.parse(b.text).providers; assert.equal(anthropic.api, 'anthropic-messages'); assert.equal(anthropic.baseUrl, 'http://127.0.0.1:12345'); @@ -55,7 +55,7 @@ test('P3 omitted route generates the Anthropic provider at proxy root', t => { }); test('P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibility', t => { - const b = build(t, 'z', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }); + const b = build(t, 'z', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }, { z: models.z }); const glm = JSON.parse(b.text).providers['mosaic-proxy-glm']; assert.equal(glm.api, 'openai-completions'); assert.equal(glm.baseUrl, 'http://127.0.0.1:12345/v1'); @@ -66,21 +66,27 @@ test('P3 GLM route uses completions at proxy /v1 with explicit z.ai compatibilit }); test('P3 GPT route selects a stack-owned provider instead of pi Codex OAuth', t => { - const b = build(t, 'g', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }); + const b = build(t, 'g', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }, { g: models.g }); const providers = JSON.parse(b.text).providers; assert.equal(Object.hasOwn(providers, 'openai-codex'), false); const gpt = providers['mosaic-proxy-codex']; assert.equal(gpt.baseUrl, 'http://127.0.0.1:12345/v1'); assert.deepEqual(gpt.models.map(m => m.id), ['gpt-fixture']); assert.equal(b.env.PI_PROVIDER, 'mosaic-proxy-codex'); - // Assert the one chosen API after the authorized pinned-binary probe, before this file first runs. + // Assert the one chosen API after the authorized pinned-binary probe, before claiming GREEN. +}); + +test('P3 a declared Codex route refuses generation while the build-time API is PENDING', t => { + assert.throws(() => build(t, 'g', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }, { + g: models.g, + }), /proxy GPT API is PENDING build-time evidence/); }); test('P3 models file is private, references the one session key, and stores no executable values or keys', t => { const key = 'fx332-agent-a'; - const b = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key }); + const b = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key }, { a: models.a, z: models.z }); const document = JSON.parse(b.text); - assert.deepEqual(Object.keys(document.providers).sort(), ['anthropic', 'mosaic-proxy-codex', 'mosaic-proxy-glm']); + assert.deepEqual(Object.keys(document.providers).sort(), ['anthropic', 'mosaic-proxy-glm']); for (const provider of Object.values(document.providers)) assert.equal(provider.apiKey, '$ANTHROPIC_API_KEY'); assertSafe(document); assert.ok(!b.text.includes(key)); @@ -92,15 +98,18 @@ test('P3 models file is private, references the one session key, and stores no e }); test('P3 every launch regenerates proxy port, declared models and own key without caching', t => { - const first = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }); + const first = build(t, 'a', { baseUrl: 'http://127.0.0.1:12345', key: 'fx332-agent-a' }, { a: models.a, z: models.z }); const second = build(t, 'a', { baseUrl: 'http://127.0.0.1:23456', key: 'fx332-agent-b' }, { a: { provider: 'proxy', model: 'changed-model-id', route: 'anthropic' }, + z: { provider: 'proxy', model: 'changed-glm-id', route: 'glm' }, }); assert.equal(second.env.ANTHROPIC_API_KEY, 'fx332-agent-b'); assert.ok(!JSON.stringify(second).includes('fx332-agent-a')); const { providers } = JSON.parse(second.text); - assert.deepEqual(Object.keys(providers), ['anthropic']); + assert.deepEqual(Object.keys(providers), ['anthropic', 'mosaic-proxy-glm']); assert.equal(providers.anthropic.baseUrl, 'http://127.0.0.1:23456'); assert.deepEqual(providers.anthropic.models.map(m => m.id), ['changed-model-id']); + assert.equal(providers['mosaic-proxy-glm'].baseUrl, 'http://127.0.0.1:23456/v1'); + assert.deepEqual(providers['mosaic-proxy-glm'].models.map(m => m.id), ['changed-glm-id']); assert.equal(JSON.parse(first.text).providers.anthropic.baseUrl, 'http://127.0.0.1:12345'); });