Spec: docs/design/2026-05-18-ars-v3.9.2-phase-boundary-spec.md Phase L1.4
Issue: #133 (phase scope inflation hot-fix)
Status: v3.9.2 hot-fix; behavioral smoke tests, NOT deterministic unit tests
These fixtures are behavioral smoke tests + cross-model spot-check, not deterministic green/red unit tests. The unit-under-test is a Large Language Model (Claude / GPT / Gemini) following the routing rules in .claude/CLAUDE.md "Routing Discipline (v3.9.2)" + shared/references/intent_clarification_protocol.md.
LLM-behavior assertions are flaky in the way model-behavior tests always are:
This is acceptable for routing discipline (which is a calibration target, not a deterministic gate) but you should not promote these to CI green/red gates without recalibrating against the current model fleet.
If you cannot reach 100% on the current primary model, the routing prose in CLAUDE.md / protocol doc needs tightening — fix the prose, not the test.
| # | Fixture | Input class | Expected routing |
|---|---|---|---|
| 01 | 01_cross_phase_abstract_plus_lit/ |
Abstract (Phase 4) + literature (Phase 2) | Clarify (cross-phase ambiguous) |
| 02 | 02_single_phase_literature_only/ |
Literature only (Phase 2) + lit-review request | Proceed (explicit + single-phase) |
| 03 | 03_no_materials_ambiguous/ |
"Can you help me with my paper?" | Clarify (no-materials ambiguous) |
| 04 | 04_explicit_slash_command/ |
/ars-lit-review invocation |
Proceed (explicit slash command) |
| 05 | 05_direct_mode_honored/ |
[direct-mode] run bibliography_agent |
Proceed (escape hatch honored, no clarification) |
| 06 | 06_direct_mode_mid_message_not_honored/ |
"Please [direct-mode] dispatch X" | Clarify (escape hatch ignored — not byte-0) |
| 07 | 07_direct_mode_case_insensitive/ |
[Direct-Mode] write an abstract |
Proceed (case-insensitive accepted) |
| 08 | 08_full_draft_plus_abstract_plus_lit/ |
Full draft + abstract + literature, no clear intent | Clarify (cross-phase, multiple plausible workflows) |
| 09 | 09_korean_revision_not_review/ |
Korean 수정 (revise) request + draft (#452) | Proceed → academic-paper:revision (not reviewer) |
| 10 | 10_korean_review_not_revision/ |
Korean 심사 (referee) request + manuscript (#452) | Proceed → academic-paper-reviewer:full (not paper) |
Each fixture directory contains:
NN_<slug>/
├── input.md — user message (verbatim) + any provided artifacts described in markdown
├── expected.yaml — expected routing outcome (machine-readable)
└── rationale.md — why this is the expected outcome (human-readable, cites routing prose lines)
expected.yaml schemafixture_id: <NN_slug>
expected_routing_class: clarify | proceed
expected_destination: <skill_name> | <agent_name> | clarification_only
escape_hatch_applied: true | false
direct_mode_stripped_message: <string, only when escape_hatch_applied: true>
notes: <optional free-text>
Until v3.10 conductor brings deterministic dispatch, these fixtures are run manually against a live ARS session:
input.md content as the first messageexpected_routing_classFor cross-model spot-check, run the same fixtures against Opus / Sonnet / GPT-5.5 and compare.
When active conductor (#134) ships, these fixtures translate to deterministic envelope-dispatch tests with structured task_envelope.schema.json validation. The behavioral-smoke-test framing becomes obsolete — the conductor's routing decision is then code-testable, not LLM-behavior-testable.