feat: Conductor renders AskUserQuestion decisions as prose by default

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 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-06-11 20:15:29 -07:00
parent d74a8744e4
commit 752865f866
56 changed files with 838 additions and 148 deletions
+10
View File
@@ -70,3 +70,13 @@ describe('Preamble composition order', () => {
expect(out).not.toContain('## AskUserQuestion Format');
});
});
describe('Conductor signal (preamble bash)', () => {
test('claude preamble emits CONDUCTOR_SESSION, gated on != headless (Issue 8)', () => {
const out = generatePreamble(makeCtx('claude', 2, 'claude'));
expect(out).toContain('echo "CONDUCTOR_SESSION: true"');
// The emission must be suppressed when the session is headless (eval/CI
// inside Conductor must BLOCK, not render prose to nobody).
expect(out).toMatch(/"\$_SESSION_KIND" != "headless"[\s\S]*CONDUCTOR_WORKSPACE_PATH[\s\S]*CONDUCTOR_PORT[\s\S]*CONDUCTOR_SESSION: true/);
});
});