fix(auq): the interactive fence is quota-silent — it defers to the skill's own decision points

Burn-in calibration: run 1 (fence tail 'when unsure, ask') overshot the
plan-ceo review band at reviewCount=8; run 2 (tail mentioning 'HOW MANY
questions') undershot at 1. Any ask-count language in the fence anchors the
model in one direction or the other. The tail now says only: classify as
interactive, then follow the skill's own decision-point instructions exactly
as written. Pins updated to forbid count language in either direction.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-08-31 20:58:35 +00:00
co-authored by Claude Fable 5
parent c63320023f
commit 5852da35ad
45 changed files with 51 additions and 47 deletions
+7 -3
View File
@@ -275,11 +275,15 @@ describe('generateAskUserFormat — runtime-failure prose fallback', () => {
test('Spawned: absence-safe interactive fence present (CI env / scripted prompts are not markers)', () => {
expect(out).toMatch(/With neither trigger present, the session is interactive/);
expect(out).toMatch(/CI env vars, scripted-looking or pasted prompts[\s\S]{0,120}NOT spawned markers/);
// The fence classifies the session; it must NOT exhort extra asking
// (run 1 of the burn-in overshot the 4-7 review band at 8 with a
// "when unsure, ask" tail — the fence is a default, not a quota nudge).
// The fence classifies the session; it must NOT carry any ask-count
// language in either direction (burn-in run 1 overshot the 4-7 review
// band at 8 with a "when unsure, ask" tail; run 2 undershot at 1 with a
// "HOW MANY questions" mention — the fence defers to the skill's own
// decision-point instructions and stays quota-silent).
expect(out).toMatch(/only classifies the session/);
expect(out).toMatch(/follow the skill's own decision-point instructions/);
expect(out).not.toMatch(/When unsure, ask/);
expect(out).not.toMatch(/HOW MANY/);
});
// Conductor-default-prose contract (the proactive path, distinct from the