mirror of
https://github.com/garrytan/gstack.git
synced 2026-10-04 02:16:56 +02:00
test: move the full office-hours workflow to marathon; add a periodic design-draft checkpoint
The full startup workflow runs 1–3 real spec-review rounds (~280s each) and hit its 1200s capture in run 36385945043 at finalize. Review depth is the product's loop, so the case cannot fit a blocking lane without cutting rounds. It is now marathon tier with every assertion unchanged. skill-e2e-office-hours-design-draft.test.ts (periodic) runs the same fixed interview only through the Write that creates the design (269s in that run) and applies the full validator's design-draft checks, the required section reads and the launch/foreign-skill-read guards. validateOfficeHoursDesignDraft is extracted from validateOfficeHoursCompletion, which still applies it. Selection: office-hours-design-draft is registered periodic; the marathon-only file is already excluded from the gate and periodic plans by the B5 planner rule. Tier-alignment regexes and the valid-tier check accept 'marathon'. A type-only cast in plan-scope-selection.test.ts removes a diagnostic whose union print order made the ratchet identity unstable; baseline tightened.
This commit is contained in:
1 parent
a41cdb7d7d
commit
4973f96d98
12 files changed
+180
-57
No files matched your search
@@ -3,7 +3,7 @@ import { describe, expect, test } from 'bun:test';
|
||||
import * as fs from 'node:fs';
|
||||
import * as path from 'node:path';
|
||||
import * as os from 'node:os';
|
||||
import { validateOfficeHoursCompletion, validateOfficeHoursReviewerHandoffs, validateOfficeHoursReviewArtifacts, validateOfficeHoursReviewPreservation, validateOfficeHoursSpecSummary, type OfficeHoursCompletionEvidence } from './helpers/office-hours-completion';
|
||||
import { validateOfficeHoursCompletion, validateOfficeHoursDesignDraft, validateOfficeHoursReviewerHandoffs, validateOfficeHoursReviewArtifacts, validateOfficeHoursReviewPreservation, validateOfficeHoursSpecSummary, type OfficeHoursCompletionEvidence } from './helpers/office-hours-completion';
|
||||
import { E2E_TOUCHFILES } from './helpers/touchfiles-data';
|
||||
import { selectTests } from './helpers/test-selection';
|
||||
|
||||
@@ -72,6 +72,21 @@ describe('office-hours fixture completion', () => {
|
||||
expect(instructions).toContain('A failed command remains a failure');
|
||||
});
|
||||
|
||||
test('the design-draft checkpoint applies the full validator\'s design and opinion checks alone', () => {
|
||||
const draftDesign = design.replace('Status: APPROVED', 'Status: DRAFT').replace(/## Reviewer Concerns[\s\S]*$/, '');
|
||||
const draft = { designPath, designContent: draftDesign, toolCalls: completed().toolCalls.slice(0, 2) };
|
||||
expect(validateOfficeHoursDesignDraft(draft)).toEqual({ designPath, repoPath: 'docs/designs/roster-check.md', firstDesignWrite: 1 });
|
||||
expect(() => validateOfficeHoursDesignDraft({ ...draft, toolCalls: draft.toolCalls.slice(1) }))
|
||||
.toThrow('Office-hours design draft: no independent Agent/Task opinion');
|
||||
expect(() => validateOfficeHoursDesignDraft({ ...draft, toolCalls: [...draft.toolCalls].reverse() }))
|
||||
.toThrow('no independent Agent/Task opinion');
|
||||
expect(() => validateOfficeHoursDesignDraft({ ...draft, designContent: draftDesign.replace(/## Success Criteria\n[^\n]+\n/, '') }))
|
||||
.toThrow('repo design lacks substantive Success Criteria');
|
||||
expect(() => validateOfficeHoursDesignDraft({ ...draft, designContent: null })).toThrow('repo design is missing');
|
||||
expect(() => validateOfficeHoursCompletion({ ...completed(), toolCalls: completed().toolCalls.slice(1) }))
|
||||
.toThrow('Office-hours completion: no independent Agent/Task opinion');
|
||||
});
|
||||
|
||||
test('accepts a completed approved design with unresolved reviewer concerns', () => {
|
||||
const review = validateOfficeHoursCompletion(completed());
|
||||
expect(review?.report).toBe(report);
|
||||
@@ -695,6 +710,7 @@ describe('office-hours completion eval selection', () => {
|
||||
test('office-hours source selects its dedicated workflow instead of the generic carve file', () => {
|
||||
const { selected } = selectTests(['office-hours/sections/design-and-handoff.md.tmpl'], E2E_TOUCHFILES);
|
||||
expect(selected).toContain('office-hours-section-loading');
|
||||
expect(selected).toContain('office-hours-design-draft');
|
||||
expect(selected).not.toContain('carve-section-loading');
|
||||
});
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user