1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
//! Tests for the §9.4 picker's pure half. Split by concern: the generic
//! [`fields`](super::grammar::entry_field) access every rewrite shares, the
//! block [`grammar`](super::grammar) over `roles:`, the roster
//! [`query`](super::query), the
//! composed [`plan`](super::plan) + the sentences the surface paints, the
//! conversation [`header`](super::header) line and its apart clause,
//! the [`remedy`](super::remedy) a credential-shaped roster failure routes to,
//! and the protocol-`capability` gate that keeps a row brazen ships but cannot
//! serve a role out of both config files (bl-3d22). The `models:` grammar and
//! its read-back went with the table (bl-9c8a).
/// brazen's effective table as the fixtures need it: one row per name, keyless,
/// on a dialect that **carries tools** (bl-3d22). A fixture of bare names could
/// not exercise the pick gate at all — the gate asks two questions of the table
/// and only one of them is answerable from a name.
pub
/// The same table on a named dialect — the seam the capability tests aim a
/// `claude_code` row, and a column that answers nothing, through. The `tools`
/// column carries the answer brazen's own listing gives that dialect (bl-b6c9):
/// `claude_code` declines, everything else carries them, and a protocol this
/// table names with no column answers nothing.
pub
/// `providers.yaml` exactly as litany's own `template/providers.yaml` writes
/// it — the shape the grammar is defined over (§9.4). Every rewrite test reads
/// this back, so a template change upstream fails here rather than in the UI.
pub const TEMPLATE_PROVIDERS: &str = "roles:\n worker:\n provider: codex\n model: gpt-5.4\n \
tools: [bash, read_file, load_skill]\n compactor:\n provider: codex\n model: gpt-5.4-mini\n";