mirror of
https://github.com/garrytan/gstack.git
synced 2026-11-01 22:45:02 +01:00
test: follow finding apply items in approval-class and Captain flow tests; bind run-api limit to DEFAULT_MAX_TOKENS
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
This commit is contained in:
1 parent
6a7f991304
commit
ec83ea8f60
3 files changed
+10
-8
No files matched your search
@@ -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 <dir>.*must attest "for data-repair@[0-9a-f]{12}"/);
|
||||
fs.appendFileSync(path.join(good.out, 'plan.md'), '\nsrc/commands/repair/later.ts\n');
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
|
||||
Reference in new issue
Block a user