Ignis 0.8 required-tool qualification on one RTX PRO 6000¶
Date: 2026-10-26 local time.
Status: The original tool_choice: "auto" preflight missed its frozen
all-four tool expectation at 3/4. A separately frozen phase-two experiment kept
the exact Ignis 0.8.0 image, Qwen3.8 model revision, recipe, and hardware
profile, changed only the harness/request policy, and passed all 16 bounded
requests. The selected request-level configuration was tool_choice:
"required" with normal thinking. This qualifies that supported path for steps
where a tool call is mandatory; it does not establish auto reliability, a
global agent default, coding/SWE quality, performance, capacity, or promotion.
Result card¶
| Setup | Frozen value |
|---|---|
| Model | gpillon/Qwen3.8-Flash-Next-trellis-a25-ignis@8d94db83cd8e58d6be31e796723e5e35b960638c; served as qwen3.8-flash-next |
| Runtime | Ignis 0.8.0, immutable image sha256:0226b62047113c219124ca4a02b1e52492402b44f5a3020db91e77756914b8cc |
| Hardware | One RTX PRO 6000 Blackwell Max-Q measured; the second equal card remained at 0 MiB candidate allocation in retained snapshots |
| Recipe | TP1, 131,072 configured context, eight decode lanes, MTP3, hq-e8-2b KV, vision disabled, 52 GiB cgroup RAM limit, no cgroup swap |
| Phase-one source | dc576b25083d7cfdab1554db89379feee82346b5 |
| Phase-two harness | tool-call/v2-exact-weather; patch SHA-256 0c9b211fd6bf8d49493a2db46f5def4ebfe9a887d2470d8a74f6f37331b46206; reviewed source commit c727ff01f34d2d7564fab63d94203fec68890baf |
| Common request controls | Temperature 0.6; maximum 4,608 completion tokens; 60-second timeout; zero retries |
| Measurement boundary | Focused direct functional tool-policy qualification; no coding, SWE, route/client, capacity, performance, or promotion claim |
| Headline evidence | Result | Boundary |
|---|---|---|
| Original phase-one named checks | 4/5 | Smoke, JSON prompt, streaming tool, and tool-result passed; auto shared-prefix batch failed |
| Original phase-one observations | 8/9 | Nine requests across six sequential phases; tools were 3/4 |
| Phase-two mechanism cells | 3/3 | Seed 17: auto/default, required/default, and required/thinking-disabled each made one valid call |
| Selected required/default full preflight | 5/5 checks; 9/9 observations | Seed 17; selected by the frozen normal-thinking-first rule |
| Selected required/default repeat | 4/4 tool calls | Seed 18; one concurrent shared-prefix batch |
| Phase-two request accounting | 16/16 terminal engine requests | All 16 reconciled; literal HTTP 200 retained for the 12 captured tool requests, not all 16 observations |
| Candidate GPU allocation | 96,027 MiB / 0 MiB | Candidate and protected second GPU, respectively |
| Prepared coding campaign | 0/12 cells run | Separate route/source prerequisites blocked dispatch; it contributes no coding result |
Authoritative summary · phase-two evidence · artifact manifest · evidence index
Phase one: retain the automatic-choice miss¶
The original private plan and pre-live review described six HTTP requests. That was a planning-count error: six is the number of sequential phases. The frozen command made one smoke request, one JSON request, four concurrent tools requests, one streaming-tool request, and two requests for the tool-result exchange: nine total. Nine native observations and nine terminal engine events agree. Explicit HTTP status fields were not retained for this phase, so the report does not turn successful decoding into a literal nine-of-nine HTTP-200 claim.
Each tools request sent the same 400-line synthetic system prefix, the user
instruction What's the weather in Oakland? Use the tool., and one
get_weather(city: string) definition with tool_choice: "auto". Three calls
were valid. The fourth returned ordinary assistant prose, stopped, and
contained no tool_calls. The harness correctly rejected it against the
predeclared all-four expectation.
That result is not an Ignis protocol violation: the documented and implemented
meaning of auto leaves the decision to the model. Nor does the evidence
identify an engine, cache, template, parser, or model defect. Two other
reused-prefix requests passed, and the engine's internal request-done field was
stop for successful API tool calls as well as the failed prose response.
The phase-one result remains a bounded reliability diagnostic under its older,
unseeded oracle; it is not retroactively rescored by phase two.
Phase two: use the supported mandatory-tool policy¶
Source review pinned Ignis 0.8.0 to peeled commit
950ee0d1c2cf6178cd7fec29df3f17c3e127f987. Ignis documents auto as the
model-decided default and required as the forced-call path. The phase-two
harness added explicit tool-choice, seed, and bounded transport-capture
controls, reused the existing thinking control, and added an exact oracle: one complete get_weather call,
JSON-object arguments with non-empty city equal to Oakland, and
finish_reason: "tool_calls". No engine or model code changed.
The predeclared first stage sent three sequential seed-17 requests. All passed:
auto with default thinking, required with default thinking, and required
with thinking disabled. The selection rule preferred normal thinking when its
required cell passed, so the disabled-thinking cell remained a diagnostic and
did not become the selected configuration.
The selected required/default-thinking path then passed all five full
preflight checks and all nine observations at seed 17. A separate seed-18
shared-prefix repeat passed 4/4. Across the three stages, engine terminal IDs
1–16 formed a complete event set with no observed request loss. Twelve captured
tool requests retained HTTP status 200: the three mechanism cells, five
non-streaming tool transports in the full preflight, and four repeat requests.
The other four successful observations did not retain literal status fields.
The seeded auto 1/1 pass is useful mechanism evidence only. It does not erase
the prior unseeded 3/4 result or establish an automatic-choice success rate.
Likewise, required is the supported request-level policy for a workflow step
that must call a tool; it is not a production-wide default for coding, chat, or
autonomous agents. Ignis still leaves tool arguments to model generation, so
the exact local argument oracle remains necessary.
The retained contract note links the source lines used for this interpretation.
Identity and resources¶
Both phases used the same immutable Ignis image, exact model revision, served
name, one-card selection, rtxpro6000 profile, eight lanes, MTP3, configured
131,072-token context, and 52 GiB/no-swap containment. No profile, template,
prompt, temperature, artifact, or speculation control changed in phase two.
The post-phase-two point snapshot recorded 96,027 MiB on the candidate GPU and
0 MiB on the protected second GPU, 44,944,740,352 bytes (41.86 GiB) cgroup
peak, zero cgroup OOM events, 61,764,468,736 bytes host MemAvailable, and zero
ten-second memory pressure. The GPU and host values are bounded point samples;
the managed cgroup peak is a lifecycle high-water mark. None establishes
capacity, efficiency, or performance. Startup and CLI durations are also
excluded from performance claims.
Disk-KV remained disabled because its directory could not be opened; load
continued without that optional tier. The configured image prompt-enhancer
warning does not govern text-chat tool choice. Neither warning is assigned as
a cause of the phase-one auto miss.
Separate unrun work and decision¶
The prepared 12-cell coding campaign submitted zero cells because its explicit evaluation route and protected-source prerequisites were unavailable through a supported path. It contributes no coding, SWE, route-integration, timing, capacity, or promotion evidence.
The useful result is narrower: on this exact pin, Ignis 0.8.0 with normal
thinking passed the bounded required-tool mechanism, full five-check
preflight, and independent-seed four-call repeat. The earlier auto miss
remains visible and is interpreted according to the documented policy. No
engine patch was needed, no engine/model bug is claimed, and no general agent
configuration, performance rank, capacity claim, or promotion follows.
Restoration boundary¶
Phase-one restoration already returned the exact incumbent recipe, image, model revision, served identity, and two-GPU order; candidate absence, managed readmission, a routed smoke, idle engine state, and zero OOM delta passed. The first smoke invocation failed locally before any request because its explicit auth environment variable was absent; the retained r2 used the supported credential resolver and passed one request. Router custody objects were byte-identical, but mounted router configuration bytes were not independently inspected.
Phase two independently repeated exact operational restoration: incumbent model, revision, immutable image, recipe and registry digests, GPU order, bound endpoints, and served identity matched the captured start; the candidate was absent; router custody was unchanged; the primary route was readmitted ready; one routed smoke passed; and the engine was idle afterward with zero container OOM events. Mounted router configuration bytes were again not independently inspected, and the one smoke is not full quality or strict-JSON acceptance. The managed incumbent load took 484.84 seconds; that is an operational duration, not a performance result.
Both operational restorations passed. Independent exact-head review remains the publication gate. No candidate is promoted.