diff --git a/test/approval-classes.test.ts b/test/approval-classes.test.ts index a1a903564..357cfb2e9 100644 --- a/test/approval-classes.test.ts +++ b/test/approval-classes.test.ts @@ -16,7 +16,7 @@ import { EXIT } from '../lib/headless-artifacts'; import { extractReceipt } from '../lib/ship-receipt'; import { evaluateApprovals, parseCitations } from '../lib/approval-citations'; import { scopeOf, type ApprovalHit } from '../lib/approval-classes'; -import { autoplan, runPhase } from './helpers/autoplan-run-fixture'; +import { autoplan, recCarrying, runPhase } from './helpers/autoplan-run-fixture'; import { BASE_POLICY, cleanup, makeFixtureRepo, runBin, type FixtureRepo } from './helpers/restamp-fixture'; const repos: FixtureRepo[] = []; @@ -228,7 +228,7 @@ describe('gstack-ship-receipt write enforces declared classes (APPROVAL_CITATION expect(autoplan(['next', '--out', out, '--plan', path.join(dir, 'plan.md'), '--no-ui']).status).toBe(0); runPhase(out, 'ceo'); runPhase(out, 'eng'); - if (approve) expect(autoplan(['answer', '--by', 'human', '--out', out, '--gate-rev', '1', '--reply', 'all']).stdout).toMatch(/^APPROVED: gate_rev=1/m); + if (approve) expect(autoplan(['answer', '--by', 'human', '--out', out, '--gate-rev', '1', '--reply', recCarrying(out)]).stdout).toMatch(/^APPROVED: gate_rev=1/m); const sha = JSON.parse(fs.readFileSync(path.join(out, 'run.json'), 'utf8')).artifacts['plan.md'].sha256 as string; return { out, sha: sha.slice(0, 8) }; }; @@ -237,11 +237,11 @@ describe('gstack-ship-receipt write enforces declared classes (APPROVAL_CITATION const other = run('docs-plan', 'Rewrite the quickstart in docs/quickstart.md with a shorter first step. Tests cover the links.', true); const ok = write(repo, `Approved by Garry 2026-10-16 via ${good.sha}\n`, ['--approval-run', other.out, '--approval-run', good.out]); expect(ok.status, ok.err).toBe(EXIT.ok); - expect(JSON.parse(ok.out).approval.classes[0]).toMatchObject({ class: 'data-repair', citation: 'verified', binding: 'paths', via: good.sha, evidence: expect.stringMatching(/^plan run-\d+ gate_rev=1 p1=a answered_by=human$/) }); + expect(JSON.parse(ok.out).approval.classes[0]).toMatchObject({ class: 'data-repair', citation: 'verified', binding: 'paths', via: good.sha, evidence: expect.stringMatching(/^plan run-\d+ gate_rev=1 p1=b answered_by=human$/) }); const notApproved = write(repo, `Approved by Garry 2026-10-16 via ${pending.sha}\n`, ['--approval-run', pending.out]); expect(notApproved.err).toMatch(/holds this plan but its gate is not APPROVED \(status gate_pending, p1 unanswered\).*\(APPROVAL_CITATION_MISSING\)$/m); const unrelated = write(repo, `Approved by Garry 2026-10-16 via ${other.sha}\n`, ['--approval-run', other.out]); - expect(unrelated.err).toMatch(/plan run-\d+ gate_rev=1 p1=a answered_by=human names neither/); + expect(unrelated.err).toMatch(/plan run-\d+ gate_rev=1 p1=b answered_by=human names neither/); const noRun = write(repo, `Approved by Garry 2026-10-16 via ${good.sha}\n`); expect(noRun.err).toMatch(/plan sha [0-9a-f]{8}: pass the autoplan run with --approval-run .*must attest "for data-repair@[0-9a-f]{12}"/); fs.appendFileSync(path.join(good.out, 'plan.md'), '\nsrc/commands/repair/later.ts\n'); diff --git a/test/autoplan-run-api.test.ts b/test/autoplan-run-api.test.ts index 8a8cddc5b..b35cc2c3c 100644 --- a/test/autoplan-run-api.test.ts +++ b/test/autoplan-run-api.test.ts @@ -9,6 +9,7 @@ import { afterAll, beforeAll, describe, expect, test } from 'bun:test'; import * as fs from 'node:fs'; import * as os from 'node:os'; import * as path from 'node:path'; +import { DEFAULT_MAX_TOKENS } from '../lib/outside-voice-api'; import { AUTOPLAN, ROOT, SMALL_PLAN, env } from './helpers/autoplan-run-fixture'; const TMP = fs.mkdtempSync(path.join(os.tmpdir(), 'autoplan-run-api-')); @@ -72,7 +73,7 @@ describe('gstack-autoplan run --native-runner api --runner api', () => { expect(ledger.settled.length).toBe(4); for (const s of ledger.settled) expect(s.usd).toBeGreaterThan(0); expect(openaiLimits.length).toBeGreaterThan(0); - for (const limit of openaiLimits) expect(limit).toBe(16_384); + for (const limit of openaiLimits) expect(limit).toBe(DEFAULT_MAX_TOKENS); calls = 0; const zero = await run('zero-cap', ['--spend-cap', '0']); expect(zero.status).toBe(3); diff --git a/test/capy-captain-flow.test.ts b/test/capy-captain-flow.test.ts index f022e557b..9e5c9ec83 100644 --- a/test/capy-captain-flow.test.ts +++ b/test/capy-captain-flow.test.ts @@ -11,7 +11,7 @@ import { afterAll, describe, expect, test } from 'bun:test'; import { spawnSync } from 'node:child_process'; import * as fs from 'node:fs'; import * as path from 'node:path'; -import { ROOT, resultOf } from './helpers/autoplan-run-fixture'; +import { ROOT, recCarrying, resultOf } from './helpers/autoplan-run-fixture'; import { capyRunner, phaseVia, writePlan } from './helpers/autoplan-capy'; const r = capyRunner(); @@ -69,7 +69,8 @@ describe('Capy Captain flow', () => { expect(j.brief).toStartWith('**Decision needed:** approve the plan "Retry backoff for the webhook worker".'); for (const h of ['### Before → after', '### Why it matters', '### What caused this work', '### Big decisions', '### What we need from you']) expect(j.brief).toContain(h); - const answer = r.ap(['answer', '--out', out, '--gate-rev', String(j.gate_rev), '--reply', 'rec', '--rec-hash', j.rec_hash, '--by', 'agent:GSTA-1', '--owner-reply', 'rec']); + const reply = recCarrying(out, 'rec'); + const answer = r.ap(['answer', '--out', out, '--gate-rev', String(j.gate_rev), '--reply', reply, '--rec-hash', j.rec_hash, '--by', 'agent:GSTA-1', '--owner-reply', reply]); expect(answer.status, answer.stderr + answer.stdout).toBe(0); expect(answer.stdout).toMatch(/^APPROVED: gate_rev=1/m); @@ -84,7 +85,7 @@ describe('Capy Captain flow', () => { expect(bin('gstack-approvals', ['import', '--autoplan', out, '--by', 'Garry'], env, repo).stdout).toMatch(/^APPROVAL_IMPORTED: n=0 skipped=1 /); const table = bin('gstack-approvals', ['render'], env, repo).stdout; expect(table).toContain('Approve the plan "Retry backoff for the webhook worker"'); - expect(table).toContain('“rec” (Garry, relayed by agent:GSTA-1) | approved |'); + expect(table).toContain(`“${reply}” (Garry, relayed by agent:GSTA-1) | approved |`); expect(fs.readdirSync(path.join(mirror, 'acme-worker')).length).toBe(1); });