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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# ---------- Mock --------------------------------------------------------------
#
# `mock` is the in-process test double. It has two jobs, and they need two
# different kinds of capability row.
#
# 1. Stand in for a CAPABLE route. A host that assembles a production-shaped
# agent turn sends native `tools`, prompt `cache`, structured `output`, and
# images. If the double refuses any of them the turn throws in option
# admission having emitted zero session events, and no full agent loop can
# be exercised offline at all (harn#7693). The `mock*` rows below declare
# that surface explicitly, so the double no longer has to borrow another
# provider's capabilities by model name-shape.
#
# 2. Stand in for a RESTRICTED route, so tests can prove the capability gate
# still refuses what a route does not declare. `mock-minimal*` is that id.
# It is matched first, because capability matching is first-match-wins.
#
# Name-shape spoofing still works and is still useful: `capabilities::lookup`
# falls back to the `anthropic`, `openai`, then `gemini` rule lists when no
# `[[provider.mock]]` row matches, so `mock` + `claude-opus-4-7` keeps
# resolving to the Anthropic capability row (with the native tool-definition
# wire shape pinned to OpenAI). The mock's own rows are simply consulted first,
# which is also what makes a `[[provider.mock]]` override in `harn.toml`
# reachable.
# The deliberately restricted double. Declares no native tools, no prompt
# caching, no structured output, and no vision, so a test can assert the typed
# `option ... is not supported by ...` error still fires. Keep `tool_mode_parity`
# unset: the tool-format steer reads that field, and a parity verdict here would
# rewrite a requested `native` format to `text` before the capability gate could
# refuse it.
[[]]
= "mock-minimal*"
= "openai"
= "openai"
= false
= "text"
= true
= false
= "none"
= "none"
= false
= false
= false
= false
= false
= false
= false
= false
= false
= true
= "none"
# The capable double. Mirrors the surface a current frontier route declares, so
# a production-shaped turn admits offline.
[[]]
= ["mock", "mock-*"]
= "openai"
= "openai"
= true
= "native"
= true
= true
= ["bm25", "regex"]
= 10000
= true
= 1024
= "native"
= "native_json"
# The double replays whatever a scripted response carries, including token
# logprobs, so the rerank helpers can be exercised offline. Declare that here:
# the restricted `mock-minimal*` row above still omits it, which is what keeps
# the "option is not supported" refusal provable.
= ["logprobs", "logit_bias"]
= true
= true
= true
= true
= true
= ["adaptive", "effort"]
= true
= ["low", "medium", "high", "xhigh", "max"]
= true
= true
= false
= false
= false
= false
= true
= "none"
# ---------- provider_family aliases ------------------------------------------