diff --git a/test/fixtures/context-budget.json b/test/fixtures/context-budget.json index d352d05bd..10f0c7cf7 100644 --- a/test/fixtures/context-budget.json +++ b/test/fixtures/context-budget.json @@ -14,9 +14,9 @@ "context-save": 9551, "cso": 14524, "design-consultation": 12985, - "design-html": 15001, + "design-html": 12841, "design-review": 23567, - "design-shotgun": 14031, + "design-shotgun": 13028, "devex-review": 14924, "diagram": 3847, "document-generate": 11679, @@ -36,7 +36,7 @@ "landing-report": 8844, "learn": 8514, "make-pdf": 4957, - "office-hours": 21191, + "office-hours": 17468, "open-gstack-browser": 4429, "openclaw/skills/gstack-openclaw-ceo-review": 2764, "openclaw/skills/gstack-openclaw-investigate": 1429, diff --git a/test/fixtures/parity-baseline-v1.69.1.0.json b/test/fixtures/parity-baseline-v1.69.1.0.json index 9dc46a420..b58873a84 100644 --- a/test/fixtures/parity-baseline-v1.69.1.0.json +++ b/test/fixtures/parity-baseline-v1.69.1.0.json @@ -1,10 +1,10 @@ { "tag": "v1.69.1.0", - "capturedAt": "2026-08-25T17:36:29.077Z", - "capturedFromCommit": "706091cb", + "capturedAt": "2026-08-25T18:01:18.758Z", + "capturedFromCommit": "3bc3b5d5", "capturedFromBranch": "prompt-token-load-reduction", "totalSkills": 53, - "totalCorpusBytes": 2810742, + "totalCorpusBytes": 2814663, "estTotalCatalogTokens": 4195, "topHeaviest": [ { @@ -29,10 +29,10 @@ }, { "skill": "office-hours", - "skillMdBytes": 116652, - "skillMdLines": 1322, - "estTokens": 29163, - "tmplBytes": 30566, + "skillMdBytes": 118175, + "skillMdLines": 1134, + "estTokens": 29544, + "tmplBytes": 15409, "descriptionLen": 860, "hasGateEval": true, "hasPeriodicEval": false @@ -221,10 +221,10 @@ }, "design-html": { "skill": "design-html", - "skillMdBytes": 57411, - "skillMdLines": 1122, - "estTokens": 14353, - "tmplBytes": 22567, + "skillMdBytes": 58940, + "skillMdLines": 903, + "estTokens": 14735, + "tmplBytes": 17680, "descriptionLen": 235, "hasGateEval": true, "hasPeriodicEval": false @@ -241,10 +241,10 @@ }, "design-shotgun": { "skill": "design-shotgun", - "skillMdBytes": 53700, - "skillMdLines": 984, - "estTokens": 13425, - "tmplBytes": 13331, + "skillMdBytes": 54569, + "skillMdLines": 915, + "estTokens": 13642, + "tmplBytes": 13378, "descriptionLen": 788, "hasGateEval": true, "hasPeriodicEval": false @@ -431,10 +431,10 @@ }, "office-hours": { "skill": "office-hours", - "skillMdBytes": 116652, - "skillMdLines": 1322, - "estTokens": 29163, - "tmplBytes": 30566, + "skillMdBytes": 118175, + "skillMdLines": 1134, + "estTokens": 29544, + "tmplBytes": 15409, "descriptionLen": 860, "hasGateEval": true, "hasPeriodicEval": false diff --git a/test/helpers/carve-guards.ts b/test/helpers/carve-guards.ts index ed6ae63f9..112af7b7a 100644 --- a/test/helpers/carve-guards.ts +++ b/test/helpers/carve-guards.ts @@ -249,16 +249,17 @@ export const CARVE_GUARDS: Record = { }, 'office-hours': { skill: 'office-hours', - expectedSections: ['design-and-handoff.md'], + expectedSections: ['design-and-handoff.md', 'phase-2a-startup-diagnostic.md', 'phase-2b-builder-brainstorm.md'], + // Phase sections are mode-exclusive (a session runs exactly one of 2A/2B), + // so only the always-reached design/handoff section is a deterministic read. requiredReads: ['design-and-handoff.md'], scenario: 'Run office hours for this product idea through to the end: have the diagnostic conversation, explore alternatives, then write the design doc and run the relationship handoff (Phases 5-6).', staticInvariants: { mustStayInSkeleton: [], - mustMoveToSection: [], - // office-hours is conversational; the design-doc/handoff section has no - // post-STOP review gate in the skeleton. - gateAfterStop: undefined, + mustMoveToSection: ['### The Six Forcing Questions', '### Pushback Patterns', 'Anti-Sycophancy Rules', 'Wild exemplar'], + mustPrecedeStop: ['**Mode mapping:**'], + gateAfterStop: '## Section self-check', }, behavioral: 'prompt', // v1.2.0 activation lift: first-run-guidance section in the shared preamble, @@ -270,8 +271,8 @@ export const CARVE_GUARDS: Record = { // the #538 opt-out + D1 evidence directive — ratio 1.104 measured. // #2499 project-scope MCP jq in the brain-sync block grew every tier-2+ // skeleton ~1.5KB (entry resolution emitted once per SKILL.md). - maxSkeletonBytes: 82_900, // token-reduction Phases 1-2 (v1.69.x branch): preamble bash -> bin/gstack-skill-start, onboarding -> gated emission; measured 82,304 - minUnionBytes: 106_000, // token-reduction Phases 1-2 (v1.69.x branch); measured union 117,855 + maxSkeletonBytes: 68_200, // token-reduction Phase 4 wave 4 (v1.69.x branch): 2A/2B carved out; measured 66,852 + minUnionBytes: 115_800, // Phase 4 wave 4; measured union 118,175 mustContain: ['design doc', 'problem statement'], maxSizeRatio: 1.12, }, @@ -621,6 +622,65 @@ export const CARVE_GUARDS: Record = { minUnionBytes: 66_000, // measured union 73,496 mustContain: ['retrospective', '45-minute gap', 'Ship of the week', 'Praise'], }, + + // ── Token-reduction Phase 4 wave 4 (v1.69.x branch): design doctrine carve ── + // (D3A: read-on-demand doctrine, requiredReads-guarded + loading eval) + 'design-html': { + skill: 'design-html', + expectedSections: ['doctrine.md', 'pretext-patterns.md'], + requiredReads: ['doctrine.md', 'pretext-patterns.md'], + scenario: + 'Walk /design-html in SIMULATION — do not run bash, start servers, launch a browser, or take screenshots. Treat Step 0 as already resolved: no CEO plan, no approved mockup, no variants, no DESIGN.md, no prior finalized.html — freeform mode (Case C option D), screen name "pricing", the user wants a pricing page for a developer-tools SaaS (dark, dense, three tiers, monospace-leaning). Do NOT use AskUserQuestion — proceed with the stated assumptions. Read each pointed section before doing its step, then execute Steps 1-3: produce the implementation spec, state the chosen Pretext tier and why, and generate the complete Pretext-native HTML — include the HTML in your report instead of writing files. Stop there: skip Step 3.5, Step 4, and Step 5.', + staticInvariants: { + mustStayInSkeleton: [ + '## Step 0: Input Detection', + '## Step 2: Smart Pretext API Routing', + '### HTML Generation', + 'AI slop blacklist', + '## Step 4: Preview + Refinement Loop', + '## Important Rules', + ], + mustPrecedeStop: ['## DESIGN SETUP'], + mustMoveToSection: [ + '### The Three Laws of Usability', + '### The Goodwill Reservoir', + '### Pretext Wiring Patterns', + '### Pretext API Reference', + ], + gateAfterStop: undefined, // operational skill, no plan-mode gate + }, + behavioral: 'prompt', + maxSkeletonBytes: 49_900, // Phase 4 wave 4; measured 48,886 + minUnionBytes: 57_500, // Phase 4 wave 4; measured union 58,682 + mustContain: ["Don't make me think", "Users scan, they don't read", 'The Goodwill Reservoir', 'PRETEXT API CHEATSHEET', 'Pattern 3: Text around obstacles'], + }, + 'design-shotgun': { + skill: 'design-shotgun', + expectedSections: ['doctrine.md'], + requiredReads: ['doctrine.md'], + scenario: + 'Walk /design-shotgun in SIMULATION — do not run bash, launch a browser, call the design binary, or spawn agents. Treat Step 0 as NO_PREVIOUS_SESSIONS and Step 1 context as fully gathered: a landing page for an open-source CLI tool, audience = developers evaluating it from a GitHub README link, no DESIGN.md, no taste profile or prior approved.json (Step 2 finds nothing). Do NOT use AskUserQuestion — proceed with the stated assumptions. Read each pointed section before doing its step, then run Step 3a at full depth: write three distinct variant concepts with their full variant-specific generation briefs, apply the anti-convergence check, and produce the concept list plus briefs as the report. Stop before Step 3b.', + staticInvariants: { + mustStayInSkeleton: [ + '## Step 0: Session Detection', + '## Step 2: Taste Memory', + 'Anti-convergence directive', + '### Step 3b: Concept Confirmation', + '## Important Rules', + ], + mustPrecedeStop: ['## DESIGN SETUP'], + mustMoveToSection: [ + '### The Three Laws of Usability', + '### The Goodwill Reservoir', + "Users scan, they don't read", + ], + gateAfterStop: undefined, + }, + behavioral: 'prompt', + maxSkeletonBytes: 50_600, // Phase 4 wave 4; measured 49,578 + minUnionBytes: 53_200, // Phase 4 wave 4; measured union 54,290 + mustContain: ["Don't make me think", "Users scan, they don't read", 'trunk test', '44px minimum'], + }, }; /** Sorted carved-skill names. Consumers derive their lists from this — no parallel lists. */ diff --git a/test/helpers/touchfiles-data.ts b/test/helpers/touchfiles-data.ts index 83c5835bb..cc89724f6 100644 --- a/test/helpers/touchfiles-data.ts +++ b/test/helpers/touchfiles-data.ts @@ -139,7 +139,7 @@ export const E2E_TOUCHFILES: Record = { // devex, office-hours + future PR2 carves). One file iterating CARVE_GUARDS; // the selector sets GSTACK_CARVE_SKILL= to scope cost to the changed // skill (D-CODEX A). Touching the registry/helper or sections.ts runs all. - 'carve-section-loading': ['qa/**', 'browse/**', 'retro/**', 'autoplan/**', 'spec/**', 'setup-gbrain/**', 'review/**', 'codex/**', 'land-and-deploy/**', 'plan-eng-review/**', 'plan-design-review/**', 'plan-devex-review/**', 'office-hours/**', 'document-release/**', 'design-consultation/**', 'cso/**', 'test/helpers/carve-guards.ts', 'scripts/resolvers/sections.ts', 'scripts/gen-skill-docs.ts', 'test/helpers/auq-sdk-capture.ts', 'test/helpers/session-runner.ts'], + 'carve-section-loading': ['design-html/**', 'design-shotgun/**', 'qa/**', 'browse/**', 'retro/**', 'autoplan/**', 'spec/**', 'setup-gbrain/**', 'review/**', 'codex/**', 'land-and-deploy/**', 'plan-eng-review/**', 'plan-design-review/**', 'plan-devex-review/**', 'office-hours/**', 'document-release/**', 'design-consultation/**', 'cso/**', 'test/helpers/carve-guards.ts', 'scripts/resolvers/sections.ts', 'scripts/gen-skill-docs.ts', 'test/helpers/auq-sdk-capture.ts', 'test/helpers/session-runner.ts'], 'autoplan-chain-pty': ['autoplan/**', 'plan-ceo-review/**', 'plan-design-review/**', 'plan-eng-review/**', 'plan-devex-review/**', 'test/fixtures/plans/ui-heavy-feature.md', 'test/helpers/claude-pty-runner.ts', 'test/skill-e2e-autoplan-chain.test.ts'], 'e2e-harness-audit': ['bin/gstack-skill-start', 'bin/gstack-skill-end', 'plan-ceo-review/**', 'plan-eng-review/**', 'plan-design-review/**', 'plan-devex-review/**', 'scripts/resolvers/preamble/generate-completion-status.ts', 'test/helpers/agent-sdk-runner.ts', 'test/helpers/claude-pty-runner.ts'], @@ -415,7 +415,7 @@ export const E2E_TOUCHFILES: Record = { // frontmatter. Touched by anything that changes resolver output, gen // pipeline, detection helper, refresh subcommand, or the on-demand // docs the resolver points to. - 'office-hours-brain-writeback': [ + 'office-hours-brain-writeback': ['office-hours/sections/**', 'scripts/resolvers/gbrain.ts', 'scripts/gen-skill-docs.ts', 'bin/gstack-gbrain-detect',