diff --git a/scripts/lib/paid-cases.ts b/scripts/lib/paid-cases.ts index bf186281c..c1b6adcc9 100644 --- a/scripts/lib/paid-cases.ts +++ b/scripts/lib/paid-cases.ts @@ -81,6 +81,7 @@ export const CASE_TEST_NAMES: Record = { 'plan-review-report': '/plan-eng-review writes GSTACK REVIEW REPORT to plan file', 'auq-format-gate': "/plan-ceo-review's first AskUserQuestion is a compliant decision brief (7/7 + substance)", 'autoplan-dual-voice': 'both Claude + Codex voices produce output in Phase 1 (within timeout)', + 'plan-ceo-review-plan-mode': 'first terminal outcome is asked (Step 0 fires before any plan write)', }; export const CASE_KEY_SEPARATOR = '#'; diff --git a/scripts/test-pr-profile.ts b/scripts/test-pr-profile.ts index a48a98537..ef783c524 100644 --- a/scripts/test-pr-profile.ts +++ b/scripts/test-pr-profile.ts @@ -26,12 +26,13 @@ export const PR_PROFILE_CASE_IDS = [ 'gstack-upgrade-happy-path', 'investigate-owned-completion', 'investigate-owned-abort', 'investigate-owned-ending-error', 'ship-coverage-value', 'review-test-value', 'test-audit-report-only', - 'office-hours-auto-mode', + 'office-hours-auto-mode', 'plan-ceo-review-plan-mode', ] as const; /** Audited ownership: unknown/direct-describe files remain broad coverage. */ export const PR_PROFILE_FILES: Record = { 'test/skill-e2e-office-hours-auto-mode.test.ts': ['office-hours-auto-mode'], + 'test/skill-e2e-plan-ceo-plan-mode.test.ts': ['plan-ceo-review-plan-mode'], 'test/skill-e2e-investigate-owned-completion.test.ts': ['investigate-owned-completion'], 'test/skill-e2e-investigate-owned-termination.test.ts': ['investigate-owned-abort', 'investigate-owned-ending-error'], 'test/skill-e2e-hermetic-canary.test.ts': ['hermetic-canary', 'hermetic-sentinel'], diff --git a/test/paid-pr-profile.test.ts b/test/paid-pr-profile.test.ts index 4439e5b59..f057d7a05 100644 --- a/test/paid-pr-profile.test.ts +++ b/test/paid-pr-profile.test.ts @@ -18,7 +18,7 @@ import { resolveModuleSelection } from './helpers/e2e-helpers'; const ROOT = path.resolve(import.meta.dir, '..'); const CEO_FILES = [ 'test/skill-e2e-plan.test.ts', 'test/skill-e2e-ask-user-question-format-compliance.test.ts', - 'test/skill-e2e-retro.test.ts', 'test/skill-llm-eval.test.ts', + 'test/skill-e2e-retro.test.ts', 'test/skill-llm-eval.test.ts', 'test/skill-e2e-plan-ceo-plan-mode.test.ts', ]; const ceoManifest = () => buildRunManifest({ tier: 'gate', profile: 'pr', sliceCount: 1, evalsAll: false, env: {}, changedFiles: ['plan-ceo-review/SKILL.md.tmpl'], discovered: CEO_FILES }); @@ -64,15 +64,16 @@ describe('PR profile paid-runner integration', () => { } }); - test('planner binds E2E and judge IDs and explicitly defers direct-describe broad probes', () => { + test('planner binds E2E and judge IDs and plans the CEO plan-mode probe in the PR lane', () => { const manifest = ceoManifest(); expect(manifest.profile).toBe('pr'); expect(manifest.selection?.e2e).toContain('auq-format-gate'); - expect(manifest.selection?.e2e).not.toContain('plan-ceo-review-plan-mode'); + expect(manifest.selection?.e2e).toContain('plan-ceo-review-plan-mode'); expect(manifest.selection?.judges).toContain('plan-ceo-review/SKILL.md modes'); expect(manifest.entries.find(entry => entry.file.includes('skill-e2e-retro'))?.status).toBe('skipped-by-diff'); expect(manifest.entries.find(entry => entry.file.includes('ask-user-question'))?.status).toBe('planned'); - expect(manifest.prCoverage?.deferred.some(item => item.id === 'plan-ceo-review-plan-mode')).toBe(true); + expect(manifest.prCoverage?.deferred.some(item => item.id === 'plan-ceo-review-plan-mode')).toBe(false); + expect(manifest.entries.find(entry => entry.file === 'test/skill-e2e-plan-ceo-plan-mode.test.ts')?.status).toBe('planned'); expect(parseRunManifest(JSON.stringify(manifest))).toEqual(manifest); const env = paidSelectionEnv('pr', manifest.selection!, manifest.selectionReason); expect(JSON.parse(env.EVALS_SELECTION_JSON!).selected).toEqual(manifest.selection!.e2e);