From 752865f86661ac2507ed55ddfa973a826c86a0b2 Mon Sep 17 00:00:00 2001 From: Garry Tan Date: Thu, 11 Jun 2026 20:15:29 -0700 Subject: [PATCH] feat: Conductor renders AskUserQuestion decisions as prose by default MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In Conductor, native AskUserQuestion is disabled and the MCP variant is flaky, so skills now render every decision as a plain-text prose brief the user answers by typing a letter — proactively, not as a failure reaction. - Preamble emits CONDUCTOR_SESSION, gated on != headless so eval/CI inside Conductor still BLOCKs instead of rendering prose to nobody. - AskUserQuestion Format gains a Conductor-default-prose rule (auto-decide preferences still apply first; prose decisions log via gstack-question-log since PostToolUse never fires), a one-way/destructive typed-confirmation rule, and a typed-reply continuation protocol for split chains. - Regenerated all SKILL.md + ship golden fixtures; bumped affected carve skeleton caps to absorb the always-loaded additions. Co-Authored-By: Claude Fable 5 --- SKILL.md | 7 ++++ autoplan/SKILL.md | 19 ++++++++-- benchmark-models/SKILL.md | 7 ++++ benchmark/SKILL.md | 7 ++++ browse/SKILL.md | 7 ++++ canary/SKILL.md | 19 ++++++++-- codex/SKILL.md | 19 ++++++++-- context-restore/SKILL.md | 19 ++++++++-- context-save/SKILL.md | 19 ++++++++-- cso/SKILL.md | 19 ++++++++-- design-consultation/SKILL.md | 19 ++++++++-- design-html/SKILL.md | 19 ++++++++-- design-review/SKILL.md | 19 ++++++++-- design-shotgun/SKILL.md | 19 ++++++++-- devex-review/SKILL.md | 19 ++++++++-- document-generate/SKILL.md | 19 ++++++++-- document-release/SKILL.md | 19 ++++++++-- health/SKILL.md | 19 ++++++++-- investigate/SKILL.md | 19 ++++++++-- ios-clean/SKILL.md | 19 ++++++++-- ios-design-review/SKILL.md | 19 ++++++++-- ios-fix/SKILL.md | 19 ++++++++-- ios-qa/SKILL.md | 19 ++++++++-- ios-sync/SKILL.md | 19 ++++++++-- land-and-deploy/SKILL.md | 19 ++++++++-- landing-report/SKILL.md | 19 ++++++++-- learn/SKILL.md | 19 ++++++++-- make-pdf/SKILL.md | 7 ++++ office-hours/SKILL.md | 19 ++++++++-- open-gstack-browser/SKILL.md | 19 ++++++++-- pair-agent/SKILL.md | 19 ++++++++-- plan-ceo-review/SKILL.md | 19 ++++++++-- plan-design-review/SKILL.md | 19 ++++++++-- plan-devex-review/SKILL.md | 19 ++++++++-- plan-eng-review/SKILL.md | 19 ++++++++-- plan-tune/SKILL.md | 19 ++++++++-- qa-only/SKILL.md | 19 ++++++++-- qa/SKILL.md | 19 ++++++++-- retro/SKILL.md | 19 ++++++++-- review/SKILL.md | 19 ++++++++-- scrape/SKILL.md | 19 ++++++++-- .../preamble/generate-ask-user-format.ts | 12 ++++-- .../preamble/generate-preamble-bash.ts | 7 ++++ setup-browser-cookies/SKILL.md | 7 ++++ setup-deploy/SKILL.md | 19 ++++++++-- setup-gbrain/SKILL.md | 19 ++++++++-- ship/SKILL.md | 19 ++++++++-- skillify/SKILL.md | 19 ++++++++-- spec/SKILL.md | 38 ++++++++++++++++--- sync-gbrain/SKILL.md | 19 ++++++++-- test/fixtures/golden/claude-ship-SKILL.md | 19 ++++++++-- test/fixtures/golden/codex-ship-SKILL.md | 19 ++++++++-- test/fixtures/golden/factory-ship-SKILL.md | 19 ++++++++-- test/helpers/carve-guards.ts | 20 +++++++--- test/preamble-compose.test.ts | 10 +++++ test/resolver-ask-user-format.test.ts | 21 +++++++++- 56 files changed, 838 insertions(+), 148 deletions(-) diff --git a/SKILL.md b/SKILL.md index 8711ae7f3..90774950e 100644 --- a/SKILL.md +++ b/SKILL.md @@ -48,6 +48,13 @@ echo "REPO_MODE: $REPO_MODE" _SESSION_KIND=$(~/.claude/skills/gstack/bin/gstack-session-kind 2>/dev/null || echo "interactive") case "$_SESSION_KIND" in spawned|headless|interactive) ;; *) _SESSION_KIND="interactive" ;; esac echo "SESSION_KIND: $_SESSION_KIND" +# Conductor host: AskUserQuestion is unreliable here (native disabled, MCP +# variant flaky), so skills render decisions as prose instead of calling the +# tool. Gated on !headless so an eval/CI run INSIDE Conductor (GSTACK_HEADLESS) +# still BLOCKs rather than rendering prose to nobody. +if [ "$_SESSION_KIND" != "headless" ] && { [ -n "${CONDUCTOR_WORKSPACE_PATH:-}" ] || [ -n "${CONDUCTOR_PORT:-}" ]; }; then + echo "CONDUCTOR_SESSION: true" +fi _LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) diff --git a/autoplan/SKILL.md b/autoplan/SKILL.md index de7174b03..49db38ff9 100644 --- a/autoplan/SKILL.md +++ b/autoplan/SKILL.md @@ -57,6 +57,13 @@ echo "REPO_MODE: $REPO_MODE" _SESSION_KIND=$(~/.claude/skills/gstack/bin/gstack-session-kind 2>/dev/null || echo "interactive") case "$_SESSION_KIND" in spawned|headless|interactive) ;; *) _SESSION_KIND="interactive" ;; esac echo "SESSION_KIND: $_SESSION_KIND" +# Conductor host: AskUserQuestion is unreliable here (native disabled, MCP +# variant flaky), so skills render decisions as prose instead of calling the +# tool. Gated on !headless so an eval/CI run INSIDE Conductor (GSTACK_HEADLESS) +# still BLOCKs rather than rendering prose to nobody. +if [ "$_SESSION_KIND" != "headless" ] && { [ -n "${CONDUCTOR_WORKSPACE_PATH:-}" ] || [ -n "${CONDUCTOR_PORT:-}" ]; }; then + echo "CONDUCTOR_SESSION: true" +fi _LAKE_SEEN=$([ -f ~/.gstack/.completeness-intro-seen ] && echo "yes" || echo "no") echo "LAKE_INTRO: $_LAKE_SEEN" _TEL=$(~/.claude/skills/gstack/bin/gstack-config get telemetry 2>/dev/null || true) @@ -306,7 +313,9 @@ AI orchestrator (e.g., OpenClaw). In spawned sessions: "AskUserQuestion" can resolve to two tools at runtime: the **host MCP variant** (e.g. `mcp__conductor__AskUserQuestion` — appears in your tool list when the host registers it) or the **native** Claude Code tool. -**Rule:** if any `mcp__*__AskUserQuestion` variant is in your tool list, prefer it. Hosts may disable native AUQ via `--disallowedTools AskUserQuestion` (Conductor does, by default) and route through their MCP variant; calling native there silently fails. Same questions/options shape; same decision-brief format applies. +**Conductor rule (read before the MCP rule):** if `CONDUCTOR_SESSION: true` was echoed by the preamble, do NOT call AskUserQuestion at all — neither native nor any `mcp__*__AskUserQuestion` variant. Render EVERY decision brief as the **prose form** below and STOP. This is proactive, not a reaction to a failure: Conductor disables native AUQ and its MCP variant is flaky (it returns `[Tool result missing due to internal error]`), so prose is the reliable path. **Auto-decide preferences still apply first:** if a `[plan-tune auto-decide]