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
+19 -2
View File
@@ -225,8 +225,25 @@ describe('generateAskUserFormat — runtime-failure prose fallback', () => {
expect(out).toMatch(/must be sent as tool_use, not prose — unless the documented failure fallback/);
});
test('OV2: the self-check "not writing prose" line carries the fallback qualifier', () => {
expect(out).toMatch(/not writing prose — unless the documented failure fallback applies/);
test('OV2: the self-check "not writing prose" line carries the Conductor + fallback qualifiers', () => {
// After the Conductor-default-prose change, the exception is two-pronged:
// CONDUCTOR_SESSION makes prose the default, OR the documented failure fallback.
expect(out).toMatch(/not writing prose — unless `CONDUCTOR_SESSION: true`[\s\S]*OR the documented failure fallback applies/);
});
// Conductor-default-prose contract (the proactive path, distinct from the
// failure fallback). Guards the Tool-resolution rule + self-check wording.
test('Conductor: do-not-call rule present in Tool resolution', () => {
expect(out).toMatch(/CONDUCTOR_SESSION: true/);
expect(out).toMatch(/do NOT call AskUserQuestion at all/);
expect(out).toMatch(/Auto-decide preferences still apply first/);
expect(out).toMatch(/gstack-question-log/);
});
test('Conductor: one-way prose rule + continuation protocol present', () => {
expect(out).toMatch(/one-way\b[\s\S]*typed confirmation/i);
expect(out).toMatch(/never proceed on a vague/i);
expect(out).toMatch(/Continuation — mapping a typed reply/);
});
});