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:
garrytan committed 2026-09-29 15:29:46 +00:00
1 parent a41cdb7d7d
commit 4973f96d98
12 files changed
+180 -57

No files matched your search

@@ -1,7 +1,12 @@
/**
* Full office-hours startup workflow, isolated from the generic carve shard.
* Office-hours startup workflow, isolated from the generic carve shard.
* A fixed interview exercises real opinion/design/review/approval/handoff work.
* Free completion regressions live in office-hours-completion.test.ts.
*
* This full start-to-finish workflow (1–3 real spec-review rounds, ~20 min) is
* marathon tier. skill-e2e-office-hours-design-draft.test.ts runs the same
* interview only through the checkpoint that creates the design (~5 min) in
* the periodic lane.
*/
import { test, expect } from 'bun:test';
import * as fs from 'node:fs';
@@ -11,7 +16,7 @@ import { setupSkillDir, skillFromWorktree, captureSectionReads } from './helpers
import { CARVE_GUARDS } from './helpers/carve-guards';
import { validateOfficeHoursCompletion, validateOfficeHoursReviewerHandoffs, validateOfficeHoursReviewArtifacts, validateOfficeHoursReviewPreservation } from './helpers/office-hours-completion';
const describeE2E = describeE2ETier('periodic');
const describeMarathon = describeE2ETier('marathon');
const runId = `office-hours-section-loading-${process.env.EVALS_RUN_ID ?? 'local'}`;
// Full startup diagnosis + outside opinion + up to three spec reviews exceeds
@@ -25,7 +30,7 @@ const runId = `office-hours-section-loading-${process.env.EVALS_RUN_ID ?? 'local
const OFFICE_HOURS_CAPTURE_MS = 1_200_000;
const OFFICE_HOURS_TEST_MS = 1_260_000;
describeE2E('/office-hours full section-loading workflow (periodic)', () => {
describeMarathon('/office-hours full section-loading workflow (marathon)', () => {
test('a real startup review reads its sections and completes the approved design and handoff', async () => {
const guard = CARVE_GUARDS['office-hours'];
const { skillMd, sectionsFrom } = skillFromWorktree(guard.skill);