feat(design): ask once before downloading impeccable's engine

When the probe prints DESIGN_DETECTOR_INSTALL_OFFER the design skills ask the
user one AskUserQuestion, in interactive sessions only (spawned or headless
runs never install and never ask; Conductor gets the prose brief), before
any other step: install the engine now, not now, never ask again
(design_detector_install_prompted), or turn the detector off. A yes runs the
receipted, checksum-pinned install and the skill continues with a READY probe.
The brief says what impeccable is, what the one file is, where it goes, how
it is verified and logged, and that no skill or hook comes with it; users who
want the /impeccable skill run npx impeccable install themselves.

design-review carries the brief inline (it is not carved). design-html keeps
its skeleton small: the probe block points at a new read-on-demand section,
sections/detector-install-offer.md, registered in its manifest and carve
guard; its skeleton ceiling is re-measured (55,262) and its eager ceiling
set to the measured 13,767. The review and ship passes state that they never
offer an install. NOTICE.md, README, docs/skills.md, the interop design doc,
and the CHANGELOG describe the new posture: gstack still never runs
impeccable's installer or launcher; the one download is consented, pinned,
and receipted. Ship goldens refreshed for the review-pass wording.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-09-09 04:51:14 +00:00
co-authored by Claude Fable 5.1
parent 3b7a2775ee
commit 92f85f1ba8
19 changed files with 168 additions and 24 deletions
+1 -1
View File
@@ -14,7 +14,7 @@
"context-save": 10234,
"cso": 15919,
"design-consultation": 16897,
"design-html": 13276,
"design-html": 13767,
"design-review": 31319,
"design-shotgun": 13828,
"devex-review": 19755,
+1 -1
View File
@@ -1737,7 +1737,7 @@ source <($GSTACK_BIN/gstack-diff-scope <base> 2>/dev/null)
**If `SCOPE_FRONTEND=true`:**
0. **Mechanical pass first.** Probe for a design detector the user installed (gstack never installs one):
0. **Mechanical pass first.** Probe for a design detector the user installed (this pass never offers to install one; the design skills ask, once):
```bash
bun --no-env-file run $GSTACK_BIN/gstack-design-detect.ts probe --host codex
+1 -1
View File
@@ -1744,7 +1744,7 @@ source <($GSTACK_BIN/gstack-diff-scope <base> 2>/dev/null)
**If `SCOPE_FRONTEND=true`:**
0. **Mechanical pass first.** Probe for a design detector the user installed (gstack never installs one):
0. **Mechanical pass first.** Probe for a design detector the user installed (this pass never offers to install one; the design skills ask, once):
```bash
bun --no-env-file run $GSTACK_BIN/gstack-design-detect.ts probe --host factory
+6
View File
@@ -1884,6 +1884,12 @@ describe('DESIGN_DETECTOR resolver', () => {
const c = designReview();
expect(c).toContain('gstack-design-detect.ts probe --host claude');
expect(c).toContain('IMPECCABLE_READY');
// the consent-gated install: offered once, only on the probe's say-so, never in spawned sessions, never via npx
expect(c).toContain('DESIGN_DETECTOR_INSTALL_OFFER');
expect(c).toContain('gstack-design-detect.ts install --host claude');
expect(c).toContain("Install impeccable's design detector engine?");
expect(c).toContain('gstack-config set design_detector_install_prompted true');
expect(c).toContain('`SESSION_KIND: spawned` or a headless run, never install and never ask');
expect(c).toContain('**Phase 0: mechanical scan**');
expect(c).toContain('scan --changed <base> --format gstack --host claude');
expect(c).toContain('### DOM dump (DOM mode only');
+2 -2
View File
@@ -655,7 +655,7 @@ export const CARVE_GUARDS: Record<string, CarveGuard> = {
// (D3A: read-on-demand doctrine, requiredReads-guarded + loading eval)
'design-html': {
skill: 'design-html',
expectedSections: ['doctrine.md', 'pretext-patterns.md'],
expectedSections: ['doctrine.md', 'pretext-patterns.md', 'detector-install-offer.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.',
@@ -678,7 +678,7 @@ export const CARVE_GUARDS: Record<string, CarveGuard> = {
gateAfterStop: undefined, // operational skill, no plan-mode gate
},
behavioral: 'prompt',
maxSkeletonBytes: 54_700, // measured 54,545 (2026-09-08): review-cycle trust prose in the probe block (config ignores are evidence, the scan JSON is untrusted), the Slop Gate's Decisions-Log clause, the blacklist header's override sentence
maxSkeletonBytes: 55_400, // measured 55,262 (2026-09-09): the detector install offer pointer + its sections-table row (the brief itself lives in sections/detector-install-offer.md); before that 54,545 for the review-cycle trust prose, the Slop Gate's Decisions-Log clause, and the blacklist header's override sentence
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'],
},