AFM Assertion Test Report

Model: mlx-community/Qwen3.5-35B-A3B-4bit · Tier: full · Grammar: false
Server: http://127.0.0.1:9998
Date: 2026-03-19 19:36:13
237
Passed
0
Failed
100%
Pass Rate
114s
Total Time
#TestGroupCoverageStatusDurationDetails
1 findPrefix: no child for next token — miss at root UnitTest unit smoke standard full PASS 0.0s
pass
2 Eviction with debugLogging UnitTest unit smoke standard full PASS 0.0s
pass
3 findPrefix: empty cache — miss XMLParsing unit smoke standard full PASS 0.0s
pass
4 findPrefix: query shorter than cached edge UnitTest unit smoke standard full PASS 0.0s
pass
5 Conversation fork: both branches survive and are findable UnitTest unit smoke standard full PASS 0.0s
pass
6 StreamChunk carries timing info UnitTest unit smoke standard full PASS 0.0s
pass
7 RequestSlot appendContent accumulates text UnitTest unit smoke standard full PASS 0.0s
pass
8 findPrefix: partial edge match divergence mid-edge — returns cached state UnitTest unit smoke standard full PASS 0.0s
pass
9 findPrefix: miss with matched > 0 and debugLogging UnitTest unit smoke standard full PASS 0.0s
pass
10 insert: partial edge split with remaining tokens XMLParsing unit smoke standard full PASS 0.0s
pass
11 insert: multiple inserts grow the tree (multi-turn) UnitTest unit smoke standard full PASS 0.0s
pass
12 findPrefix: exact match returns full prefix UnitTest unit smoke standard full PASS 0.0s
pass
13 RadixNode isLeaf and hasCachedState UnitTest unit smoke standard full PASS 0.0s
pass
14 findPrefix: deepest cached node wins over shallower UnitTest unit smoke standard full PASS 0.0s
pass
15 insert: partial edge split at exact split point UnitTest unit smoke standard full PASS 0.0s
pass
16 findPrefix: query longer than cached — partial prefix hit UnitTest unit smoke standard full PASS 0.0s
pass
17 LRU eviction at capacity evicts oldest UnitTest unit smoke standard full PASS 0.0s
pass
18 insert: new edge (no matching child) UnitTest unit smoke standard full PASS 0.0s
pass
19 Count tracks insertions, evictions, and invalidation UnitTest unit smoke standard full PASS 0.0s
pass
20 findPrefix: miss with matched == 0 and debugLogging UnitTest unit smoke standard full PASS 0.0s
pass
21 BaseKVCache truncateToOffset is safe no-op on MambaCache UnitTest unit smoke standard full PASS 0.0s
pass
22 KVCacheEntry stores tokens and layerStates UnitTest unit smoke standard full PASS 0.0s
pass
23 Multiple evictions on single insert (maxEntries=1) UnitTest unit smoke standard full PASS 0.0s
pass
24 invalidateAll clears everything UnitTest unit smoke standard full PASS 0.0s
pass
25 StreamChunk defaults: only text, everything else nil UnitTest unit smoke standard full PASS 0.0s
pass
26 findPrefix with debugLogging exercises all log branches UnitTest unit smoke standard full PASS 0.0s
pass
27 StreamChunk carries cached token count UnitTest unit smoke standard full PASS 0.0s
pass
28 BatchScheduler default max concurrent is 8 UnitTest unit smoke standard full PASS 0.0s
pass
29 RequestSlot initializes with unique ID and zero content UnitTest unit smoke standard full PASS 0.0s
pass
30 returns unchanged when tools is nil UnitTest unit smoke standard full PASS 0.0s
pass
31 RequestSlot IDs are unique across instances UnitTest unit smoke standard full PASS 0.0s
pass
32 findPrefix: traverses nodes but no cached node found UnitTest unit smoke standard full PASS 0.0s
pass
33 insert: exact match — node had no prior cache UnitTest unit smoke standard full PASS 0.0s
pass
34 insert: empty tokens is no-op XMLParsing unit smoke standard full PASS 0.0s
pass
35 MLXServiceError.noModelLoaded has descriptive message UnitTest unit smoke standard full PASS 0.0s
pass
36 KVCacheEntry touch updates access time UnitTest unit smoke standard full PASS 0.0s
pass
37 insert with debugLogging exercises log branches UnitTest unit smoke standard full PASS 0.0s
pass
38 decodeXMLEntities handles empty string XMLParsing unit smoke standard full PASS 0.0s
pass
39 invalidateAll with debugLogging UnitTest unit smoke standard full PASS 0.0s
pass
40 coerceStringValue returns nil for non-numeric string with integer type XMLParsing unit smoke standard full PASS 0.0s
pass
41 truncateToOffset on empty cache is no-op XMLParsing unit smoke standard full PASS 0.0s
pass
42 decodeJSONEscapes unescapes literal \n and \" when no real newlines present XMLParsing unit smoke standard full PASS 0.0s
pass
43 does not coerce non-string values XMLParsing unit smoke standard full PASS 0.0s
pass
44 MLXServiceError.serviceShuttingDown has descriptive message UnitTest unit smoke standard full PASS 0.0s
pass
45 decodeJSONEscapes preserves values that already have real newlines XMLParsing unit smoke standard full PASS 0.0s
pass
46 coerces string to negative integer XMLParsing unit smoke standard full PASS 0.0s
pass
47 decodeXMLEntities passes through strings without entities XMLParsing unit smoke standard full PASS 0.0s
pass
48 coerceStringValue coerces '0' to Int 0 for integer type XMLParsing unit smoke standard full PASS 0.0s
pass
49 coerces whole-number string to Int for 'number' type XMLParsing unit smoke standard full PASS 0.0s
pass
50 coerceStringValue returns nil for unknown schema type XMLParsing unit smoke standard full PASS 0.0s
pass
51 decodeXMLEntities handles consecutive entities XMLParsing unit smoke standard full PASS 0.0s
pass
52 toJinjaCompatible() strips null elements from arrays NullableSchema unit smoke standard full PASS 0.0s
pass
53 decodeJSONEscapes handles only \" without \n XMLParsing unit smoke standard full PASS 0.0s
pass
54 does NOT coerce 'yes'/'no'/'1'/'0' to boolean XMLParsing unit smoke standard full PASS 0.0s
pass
55 returns unchanged when arguments JSON is invalid XMLParsing unit smoke standard full PASS 0.0s
pass
56 decodeJSONEscapes handles \t escapes XMLParsing unit smoke standard full PASS 0.0s
pass
57 returns unchanged when tools is empty XMLParsing unit smoke standard full PASS 0.0s
pass
58 empty <tool_call></tool_call> block returns no calls XMLParsing unit smoke standard full PASS 0.0s
pass
59 returns nil for content without <function=...> tag XMLParsing unit smoke standard full PASS 0.0s
pass
60 returns empty array and original text when no tool calls found XMLParsing unit smoke standard full PASS 0.0s
pass
61 does not coerce when property not in schema XMLParsing unit smoke standard full PASS 0.0s
pass
62 parses basic XML tool call XMLParsing unit smoke standard full PASS 0.0s
pass
63 JSON-in-XML with invalid JSON falls through XMLParsing unit smoke standard full PASS 0.0s
pass
64 multiple parameters with same non-empty value keeps first XMLParsing unit smoke standard full PASS 0.0s
pass
65 regex fallback handles bare < in parameter value XMLParsing unit smoke standard full PASS 0.0s
pass
66 insert: exact match update — node already has cache UnitTest unit smoke standard full PASS 0.0s
pass
67 coerceStringValue returns nil for invalid JSON with array type XMLParsing unit smoke standard full PASS 0.0s
pass
68 Touch via findPrefix prevents eviction UnitTest unit smoke standard full PASS 0.0s
pass
69 decodes XML entities in parameter values via XMLParser XMLParsing unit smoke standard full PASS 0.0s
pass
70 toJinjaCompatible() result survives ToolSpec → Jinja Value round-trip NullableSchema unit smoke standard full PASS 0.0s
pass
71 decodeXMLEntities handles multiple &lt; in Python code XMLParsing unit smoke standard full PASS 0.0s
pass
72 XMLParser path drops unclosed parameter (no bare < to trigger fallback) XMLParsing unit smoke standard full PASS 0.0s
pass
73 text content before and after tool call is preserved XMLParsing unit smoke standard full PASS 0.0s
pass
74 bash tool with JSON-escaped command gets decoded XMLParsing unit smoke standard full PASS 0.0s
pass
75 bare JSON that's not a tool call doesn't match XMLParsing unit smoke standard full PASS 0.0s
pass
76 JSON-in-XML with missing name returns no tool calls XMLParsing unit smoke standard full PASS 0.0s
pass
77 write tool with real newlines is NOT affected by decodeJSONEscapes XMLParsing unit smoke standard full PASS 0.0s
pass
78 handles multiple tool calls XMLParsing unit smoke standard full PASS 0.0s
pass
79 parses bare JSON tool call without wrapper tags XMLParsing unit smoke standard full PASS 0.0s
pass
80 coerceStringValue handles empty string for all types XMLParsing unit smoke standard full PASS 0.0s
pass
81 coerceStringValue returns nil for non-numeric string with number type XMLParsing unit smoke standard full PASS 0.0s
pass
82 mixed: write content has real newlines, edit oldString has escaped — both decoded correctly XMLParsing unit smoke standard full PASS 0.0s
pass
83 coerceStringValue handles negative numbers XMLParsing unit smoke standard full PASS 0.0s
pass
84 coerceStringValue returns nil for invalid JSON with object type XMLParsing unit smoke standard full PASS 0.0s
pass
85 skips empty parameter values XMLParsing unit smoke standard full PASS 0.0s
pass
86 decodeXMLEntities handles double-encoded entities: &amp;lt; → &lt; XMLParsing unit smoke standard full PASS 0.0s
pass
87 decodeJSONEscapes full edit oldString from real Qwen3-Coder output XMLParsing unit smoke standard full PASS 0.0s
pass
88 leaves already-correct types alone (string stays string) UnitTest unit smoke standard full PASS 0.0s
pass
89 decodeXMLEntities passes through bare & without entity suffix XMLParsing unit smoke standard full PASS 0.0s
pass
90 toAny() result in ToolSpec — Jinja throws (proves the bug) NullableSchema unit smoke standard full PASS 0.0s
pass
91 JSON-in-XML with no arguments key still parses name XMLParsing unit smoke standard full PASS 0.0s
pass
92 strips <think></think> tags from remaining text XMLParsing unit smoke standard full PASS 0.0s
pass
93 toAny() wraps null as NSNull — Jinja throws on it NullableSchema unit smoke standard full PASS 0.0s
pass
94 toJinjaCompatible() strips null keys from dicts — Jinja accepts it NullableSchema unit smoke standard full PASS 0.0s
pass
95 handles parameter values with special characters in Python code XMLParsing unit smoke standard full PASS 0.0s
pass
96 coerceStringValue returns nil for float string with integer type XMLParsing unit smoke standard full PASS 0.0s
pass
97 bare JSON with 'parameters' key instead of 'arguments' XMLParsing unit smoke standard full PASS 0.0s
pass
98 compactUpward merges single-child node after sibling eviction UnitTest unit smoke standard full PASS 0.0s
pass
99 decodeXMLEntities handles entities at string boundaries XMLParsing unit smoke standard full PASS 0.0s
pass
100 decodeJSONEscapes handles empty string XMLParsing unit smoke standard full PASS 0.0s
pass
101 coerces string to object XMLParsing unit smoke standard full PASS 0.0s
pass
102 toJinjaCompatible() preserves all non-null types NullableSchema unit smoke standard full PASS 0.0s
pass
103 parses Mistral [TOOL_CALLS] with multiple items in array XMLParsing unit smoke standard full PASS 0.0s
pass
104 write file with Python containing comparison operators (OpenCode pattern) XMLParsing unit smoke standard full PASS 0.0s
pass
105 coerces string to integer XMLParsing unit smoke standard full PASS 0.0s
pass
106 handles duplicate parameters (keeps first non-empty) XMLParsing unit smoke standard full PASS 0.0s
pass
107 parses JSON-in-XML format with 'arguments' key XMLParsing unit smoke standard full PASS 0.0s
pass
108 coerces string to array XMLParsing unit smoke standard full PASS 0.0s
pass
109 EBNF grammar handles tool with no required params XMLParsing unit smoke standard full PASS 0.0s
pass
110 coerceStringValue coerces '0.0' to Int 0 for number type (whole number) XMLParsing unit smoke standard full PASS 0.0s
pass
111 handles multiline parameter values XMLParsing unit smoke standard full PASS 0.0s
pass
112 decodeJSONEscapes passes through plain text without escapes XMLParsing unit smoke standard full PASS 0.0s
pass
113 bash tool with special characters XMLParsing unit smoke standard full PASS 0.0s
pass
114 toJinjaCompatible() deeply nested nulls — Jinja accepts them NullableSchema unit smoke standard full PASS 0.0s
pass
115 returns unchanged when tool name not found in tools list UnitTest unit smoke standard full PASS 0.0s
pass
116 handles multiple parameters with mixed string and JSON types XMLParsing unit smoke standard full PASS 0.0s
pass
117 toAny() dict with null value — Jinja throws NullableSchema unit smoke standard full PASS 0.0s
pass
118 EBNF grammar generates named required param rules for bash tool XMLParsing unit smoke standard full PASS 0.0s
pass
119 does not fill non-required missing params XMLParsing unit smoke standard full PASS 0.0s
pass
120 parses Mistral [TOOL_CALLS] func_name[ARGS]{...} format XMLParsing unit smoke standard full PASS 0.0s
pass
121 parses Mistral [TOOL_CALLS] JSON array format XMLParsing unit smoke standard full PASS 0.0s
pass
122 requiredParamNames preserves client schema order (not alphabetical) XMLParsing unit smoke standard full PASS 0.0s
pass
123 JSON format switch mid-conversation (Qwen3-Coder-Next common error) XMLParsing unit smoke standard full PASS 0.0s
pass
124 edit tool with JSON-escaped oldString gets decoded (model pre-escaping bug) XMLParsing unit smoke standard full PASS 0.0s
pass
125 requiredParamNames returns empty for tool with no required array XMLParsing unit smoke standard full PASS 0.0s
pass
126 regex fallback salvages unclosed parameter (max_tokens truncation) XMLParsing unit smoke standard full PASS 0.0s
pass
127 EBNF grammar allows extra optional params after required ones XMLParsing unit smoke standard full PASS 0.0s
pass
128 preserves JSON array parameter values XMLParsing unit smoke standard full PASS 0.0s
pass
129 EBNF grammar generates named required param rules for edit tool XMLParsing unit smoke standard full PASS 0.0s
pass
130 decodeJSONEscapes preserves real backslashes (\\n stays as \n literal) XMLParsing unit smoke standard full PASS 0.0s
pass
131 coerces boolean case-insensitively (TRUE, True, FALSE) XMLParsing unit smoke standard full PASS 0.0s
pass
132 preserves content outside tool calls XMLParsing unit smoke standard full PASS 0.0s
pass
133 decodeXMLEntities decodes all 5 standard entities XMLParsing unit smoke standard full PASS 0.0s
pass
134 coerces string to number (float) XMLParsing unit smoke standard full PASS 0.0s
pass
135 preserves JSON object parameter values XMLParsing unit smoke standard full PASS 0.0s
pass
136 EBNF grammar param_value uses permissive pv_char rule XMLParsing unit smoke standard full PASS 0.0s
pass
137 question tool: array of objects with typed fields (OpenCode pattern) XMLParsing unit smoke standard full PASS 0.0s
pass
138 handles mixed XML and JSON in separate <tool_call> blocks XMLParsing unit smoke standard full PASS 0.0s
pass
139 parses JSON-in-XML format with 'parameters' key XMLParsing unit smoke standard full PASS 0.0s
pass
140 does NOT fill missing required string param (let client report missing) XMLParsing unit smoke standard full PASS 0.0s
pass
141 fills missing required integer param with 0 XMLParsing unit smoke standard full PASS 0.0s
pass
142 coerces string to boolean true and false XMLParsing unit smoke standard full PASS 0.0s
pass
143 fills missing required boolean param with false XMLParsing unit smoke standard full PASS 0.0s
pass
144 mixed coercion: some params coerced, some left alone XMLParsing unit smoke standard full PASS 0.0s
pass
145 RequestSlot is thread-safe under concurrent writes XMLParsing unit smoke standard full PASS 0.0s
pass
146 RequestSlot elapsedTime increases over time UnitTest unit smoke standard full PASS 0.1s
pass
147 Binary exists at .build/release/afm Preflight unit smoke standard full PASS 0.0s
file exists
148 Server reachable at http://127.0.0.1:9998 Preflight unit smoke standard full PASS 0.0s
200 OK
149 /v1/models contains model ID Lifecycle unit smoke standard full PASS 0.0s
model in response
150 Basic completion returns content Lifecycle unit smoke standard full PASS 4.7s
non-empty content or reasoning
151 Stop string '5' absent from output Stop unit smoke standard full PASS 1.7s
no '5' in content
152 finish_reason is 'stop' with stop sequence Stop unit smoke standard full PASS 0.0s
stop
153 Multi-word stop 'and' truncates correctly Stop unit smoke standard full PASS 1.7s
no 'and' in output
154 Stop on newline produces single line Stop unit smoke standard full PASS 1.6s
single line
155 Multiple stop sequences [7, 12] Stop unit smoke standard full PASS 1.7s
neither found
156 Empty stop array is no-op Stop unit smoke standard full PASS 2.8s
valid output
157 Streaming: stop string '5' absent Stop unit smoke standard full PASS 1.7s
no '5' in stream
158 Stop sequence '3.' truncates list Stop standard full PASS 0.9s
no '3.' in output
159 Stop 'stopped' doesn't fire on 'stopping' Stop standard full PASS 1.9s
output produced
160 Stop 'llo' fires mid-word in 'hello' Stop standard full PASS 2.7s
no 'llo'
161 ChoiceLogprobs JSON schema valid Logprobs smoke standard full PASS 0.1s
valid schema
162 top_logprobs count <= requested (5) Logprobs smoke standard full PASS 0.1s
count valid
163 logprobs=false returns null Logprobs smoke standard full PASS 0.1s
null logprobs
164 top_logprobs=99 returns 400 Logprobs smoke standard full PASS 0.0s
400
165 Streaming logprobs present and valid Logprobs standard full PASS 0.1s
valid
166 top_logprobs=0 returns empty arrays Logprobs standard full PASS 0.1s
empty top_logprobs
167 reasoning_content present in response Think smoke standard full PASS 0.0s
present
168 No <think> tags in content field Think smoke standard full PASS 0.0s
clean content
169 Streaming: reasoning_content in deltas Think smoke standard full PASS 0.9s
present
170 Stop sequence doesn't break think extraction Think smoke standard full PASS 1.6s
response ok
171 reasoning_content has meaningful length (>5 chars) Think smoke standard full PASS 0.0s
>5 chars
172 Basic tool call: finish_reason=tool_calls, valid args Tools smoke standard full PASS 0.8s
valid
173 tool_choice=none suppresses tool calls Tools smoke standard full PASS 0.9s
no tool calls
174 Tool arguments are valid JSON dict Tools standard full PASS 0.9s
valid JSON
175 Streaming: tool calls with finish_reason Tools standard full PASS 0.4s
valid
176 Multi-tool: at least 1 tool call with 2 tools Tools standard full PASS 0.9s
>=1 calls
177 Array param: todos is JSON array (not string) Tools standard full PASS 1.2s
array
178 Nullable param: anyOf [string, null] does not crash Tools standard full PASS 0.6s
no crash
179 Multi-turn: tool result produces valid follow-up Tools standard full PASS 2.1s
text response
180 Multi-turn nullable: full round-trip (anyOf params) Tools standard full PASS 1.1s
valid follow-up
181 No tools: normal text response Tools standard full PASS 0.2s
text response
182 First request: cached_tokens=0 Cache standard full PASS 0.2s
0
183 Second identical request: cached_tokens>0 Cache standard full PASS 0.2s
>0
184 Different prompt: cached_tokens=0 Cache standard full PASS 0.2s
0
185 Streaming: cached_tokens>0 in usage chunk Cache standard full PASS 0.8s
>0
186 Two simultaneous requests: both 200 Concurrent standard full PASS 0.2s
200+200
187 Three simultaneous requests: all 200 Concurrent standard full PASS 0.2s
all 200
188 Empty messages → 400 Error smoke standard full PASS 0.0s
400
189 Malformed JSON → 400 Error smoke standard full PASS 0.0s
400
190 Missing messages field → 400 Error smoke standard full PASS 0.0s
400
191 response_format json_object returns valid JSON Error smoke standard full PASS 0.2s
valid JSON
192 max_tokens=5 is respected Error smoke standard full PASS 0.1s
<=10 tokens
193 OPTIONS /v1/chat/completions → 200 (CORS) Error smoke standard full PASS 0.0s
200
194 developer role accepted (mapped to system) Error smoke standard full PASS 4.1s
valid response
195 enable_thinking=false disables thinking Kwargs standard full PASS 0.1s
no_think
196 Streaming: enable_thinking=false disables thinking Kwargs standard full PASS 0.1s
no_think
197 Default (no kwargs) retains thinking Kwargs standard full PASS 2.4s
thinking
198 enable_thinking=false (2K tokens) returns content Kwargs standard full PASS 0.1s
content present, no reasoning
199 enable_thinking=true explicitly keeps thinking Kwargs standard full PASS 4.1s
thinking
200 Prefix cache reuse across requests Cache standard full PASS 0.3s
valid response on cache hit
201 Issue #32: sequential guided-json → nullable tool (no crash) Cache standard full PASS 2.5s
both succeed
202 Sequential: 3 nullable tool calls (cache reuse) Cache standard full PASS 2.1s
3/3 succeed
203 Multi-turn: 5-msg tool conversation with prefix cache Cache standard full PASS 1.1s
valid response
204 Long system prompt: 3 sequential requests (prefix reuse) Cache standard full PASS 5.3s
3/3 succeed
205 Sequential stress: 5 mixed requests (text/tool/json/stream/nullable) Cache standard full PASS 2.8s
5/5 succeed
206 Multi-turn: 5-turn growing conversation (prefix reuse) Cache standard full PASS 3.8s
5/5 turns
207 Streaming + non-streaming sequential (shared prefix) Cache standard full PASS 0.9s
3/3 succeed
208 Issue #32 comprehensive: nullable tool + multi-turn + prefix Cache standard full PASS 1.4s
valid response
209 json_schema produces valid schema-matching JSON Structured standard full PASS 0.2s
valid JSON
210 TTFT < 5s Perf full PASS 0.5s
<5000ms
211 tok/s > 1 (111.1 tok/s) Perf full PASS 0.5s
>1
212 Long context (~2K tokens) no crash Perf full PASS 4.4s
valid response
213 Very long context (~4K tokens) no NaN/garbage Perf full PASS 4.9s
clean output
214 Function name correctly extracted XMLTools standard full PASS 0.6s
get_weather
215 Parameter values are correct string types XMLTools standard full PASS 0.7s
strings
216 Mixed-type params (string+bool+int) parse correctly XMLTools standard full PASS 0.9s
valid types
217 Nested object param survives XML parsing XMLTools standard full PASS 0.9s
valid dict
218 tool_choice=required forces tool call XMLTools standard full PASS 0.6s
tool_calls
219 tool_choice={function: get_time} calls correct function XMLTools standard full PASS 0.5s
get_time
220 Tool call IDs are unique XMLTools standard full PASS 0.9s
unique IDs
221 Streaming: XML tool call assembles valid JSON args XMLTools standard full PASS 0.6s
valid
222 Streaming: array param is JSON array (not string) XMLTools standard full PASS 1.2s
array
223 Tool call matches OpenAI schema (id, type, function.name, function.arguments) XMLTools standard full PASS 0.6s
valid schema
224 Normal XML tool call works with afm_adaptive_xml AdaptiveXML standard full PASS 0.6s
valid tool call
225 Streaming tool call emits valid deltas AdaptiveXML standard full PASS 0.6s
name + JSON args
226 Multi-turn: model responds after tool result AdaptiveXML standard full PASS 0.3s
non-empty content
227 tool_choice=none suppresses tool calls AdaptiveXML standard full PASS 1.7s
no tool_calls
228 Multiple tools: correct function selected AdaptiveXML standard full PASS 0.6s
get_time
229 Argument types coerced (string, bool, int) AdaptiveXML standard full PASS 0.8s
correct types
230 Tool call valid (with or without grammar constraints) AdaptiveXML standard full PASS 0.5s
valid
231 Array of objects coercion (question tool pattern) AdaptiveXML standard full PASS 1.2s
array of dicts
232 Number (float) and boolean coercion AdaptiveXML standard full PASS 0.8s
correct types
233 Nested object with typed fields coercion AdaptiveXML standard full PASS 0.9s
correct types
234 Streaming array coercion (incremental path) AdaptiveXML standard full PASS 1.7s
array in stream
235 XML entity decoding in tool call values AdaptiveXML standard full PASS 2.9s
decoded
236 EBNF grammar enforces all required params present AdaptiveXML standard full PASS 0.9s
command + description
237 EBNF structured params: array gets json_array constraint AdaptiveXML standard full PASS 0.8s
tags is array