this derivation will be built: /nix/store/1wlh0cjnq2xd7qjhhvlx4ncpf733scp1-llx-0.0.1.drv building '/nix/store/1wlh0cjnq2xd7qjhhvlx4ncpf733scp1-llx-0.0.1.drv' on 'ssh-ng://nix-remote-build@quine.prim.private.invalid' building '/nix/store/1wlh0cjnq2xd7qjhhvlx4ncpf733scp1-llx-0.0.1.drv' llx-0.0.1> Running phase: unpackPhase llx-0.0.1> unpacking source archive /nix/store/0f5asq7xxr7rrj7z3sk9jm1xb70iqk5n-source llx-0.0.1> source root is source llx-0.0.1> Running phase: patchPhase llx-0.0.1> Running phase: updateAutotoolsGnuConfigScriptsPhase llx-0.0.1> Running phase: configurePhase llx-0.0.1> no configure script, doing nothing llx-0.0.1> Running phase: buildPhase llx-0.0.1> Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.tjnKtvEGg4 llx-0.0.1> Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.tjnKtvEGg4 llx-0.0.1> GUARDRAILS IS ENABLED. RUNTIME PERFORMANCE WILL BE AFFECTED. llx-0.0.1> Mode: :runtime config: {:throw? true, :guardrails/use-stderr? true} llx-0.0.1> Guardrails was enabled because the guardrails.enabled property is set to a (any) value. llx-0.0.1> --- unit (clojure.test) --------------------------- llx-0.0.1> ol.llx.ai.errors-test llx-0.0.1> retry-loop-async-exhausts-retries-and-throws llx-0.0.1> retry-loop-async-fails-when-server-retry-delay-exceeds-cap llx-0.0.1> returns-nil-when-no-header llx-0.0.1> quota-exceeded-is-not-recoverable llx-0.0.1> invalid-request-is-not-recoverable llx-0.0.1> retry-delay-adds-jitter-for-server-errors llx-0.0.1> retry-delay-uses-server-retry-after-for-rate-limit llx-0.0.1> caps-at-max-seconds llx-0.0.1> extracts-x-ratelimit-reset-after-header llx-0.0.1> http-status-429-with-quota-body-returns-quota-exceeded llx-0.0.1> should-retry-respects-max-retries llx-0.0.1> http-status-unknown-5xx-returns-recoverable-provider-error llx-0.0.1> extract-retry-after-from-message-returns-nil-when-missing llx-0.0.1> server-error-is-recoverable llx-0.0.1> retry-after-ms-takes-priority llx-0.0.1> retry-loop-async-succeeds-on-first-attempt llx-0.0.1> provider-error-with-custom-recoverability llx-0.0.1> content-filter-is-not-recoverable llx-0.0.1> retry-loop-async-emits-retry-scheduled-trove-signal llx-0.0.1> extracts-retry-after-ms-header llx-0.0.1> http-status-429-without-quota-returns-rate-limit llx-0.0.1> rate-limit-error-has-correct-type-and-recoverable llx-0.0.1> retry-delay-uses-exponential-backoff-for-rate-limit-without-header llx-0.0.1> predicates-match-error-categories llx-0.0.1> llx-error? matches structured errors llx-0.0.1> recoverable? matches recoverable errors llx-0.0.1> rate-limit-error? llx-0.0.1> quota-exceeded-error? llx-0.0.1> rate-limited-error? llx-0.0.1> timeout-error? llx-0.0.1> client-error? llx-0.0.1> transient-error? llx-0.0.1> timeout-error-is-recoverable llx-0.0.1> model-not-found-is-not-recoverable llx-0.0.1> http-status->error-maps-common-codes llx-0.0.1> 400 -> invalid-request llx-0.0.1> 401 -> authentication-error llx-0.0.1> 403 -> authorization-error llx-0.0.1> 404 -> model-not-found llx-0.0.1> 408 -> timeout llx-0.0.1> 500 -> server-error llx-0.0.1> 502 -> server-error llx-0.0.1> 503 -> server-error llx-0.0.1> http-status-429-with-quota-and-retry-after-returns-rate-limit llx-0.0.1> authentication-error-is-not-recoverable llx-0.0.1> retry-delay-exceeded-is-not-recoverable llx-0.0.1> should-retry-allows-transient-errors llx-0.0.1> should-retry-rejects-client-errors llx-0.0.1> retry-delay-uses-linear-backoff-for-connection-errors llx-0.0.1> http-status-unknown-4xx-returns-non-recoverable-provider-error llx-0.0.1> connection-error-is-recoverable llx-0.0.1> retry-loop-async-retries-transient-and-succeeds llx-0.0.1> extracts-retry-after-seconds-header llx-0.0.1> extract-retry-after-from-message-parses-seconds llx-0.0.1> retry-loop-async-does-not-retry-client-errors llx-0.0.1> llx-0.0.1> ol.llx.ai.utils.overflow-test llx-0.0.1> context-overflow-detection llx-0.0.1> detects explicit provider messages llx-0.0.1> detects 400/413 status codes llx-0.0.1> detects silent overflow with context window llx-0.0.1> false for non-overflow errors llx-0.0.1> llx-0.0.1> ol.llx.ai.transform-messages-test llx-0.0.1> tool-call-id-normalization-avoids-collision-for-mistral llx-0.0.1> same-model-replay-preserves-thinking-and-signatures llx-0.0.1> cross-model-replay-converts-thinking-and-drops-signatures llx-0.0.1> tool-call-id-normalization-propagates-to-tool-result llx-0.0.1> fixture-for-aborted-reasoning-skips-aborted-turn llx-0.0.1> aborted assistant turn is removed from replay llx-0.0.1> skipped-assistant-turns-with-error-or-aborted-stop-reasons llx-0.0.1> user-interruption-inserts-only-missing-tool-results llx-0.0.1> missing-tool-results-get-synthetic-error-message llx-0.0.1> google-gated-normalization-rewrites-assistant-and-tool-result-ids llx-0.0.1> synthetic-tool-result-uses-real-time-when-clock-missing llx-0.0.1> does-not-duplicate-existing-synthetic-tool-result llx-0.0.1> llx-0.0.1> ol.llx.agent.loop-test llx-0.0.1> streaming-transition-llm-done-no-tools-test llx-0.0.1> transitions to idle and clears stream-message llx-0.0.1> appends the final message llx-0.0.1> emits message-end and turn-end llx-0.0.1> streaming-transition-llm-done-with-follow-up-queue-starts-next-turn-test llx-0.0.1> starts a new turn from follow-up messages when no steering exists llx-0.0.1> continues the run with another llm call llx-0.0.1> tool-executing-transition-tool-error-with-steering-interrupts-remaining-tools-test llx-0.0.1> does not execute the next real tool and resumes llm after synthetic skipped results llx-0.0.1> keeps one steering message queued in one-at-a-time mode llx-0.0.1> appends error result, skipped tool results, and dequeued steering message llx-0.0.1> handle-command-continue-with-follow-up-one-at-a-time-test llx-0.0.1> handle-command-clear-all-queues-test llx-0.0.1> closed-transition-is-terminal-test llx-0.0.1> any signal returns state unchanged with no effects llx-0.0.1> streaming-transition-llm-chunk-test llx-0.0.1> step-prompt-from-idle-to-streaming-test llx-0.0.1> handle-command-continue-when-not-idle-test llx-0.0.1> command-predicate-test llx-0.0.1> recognizes commands llx-0.0.1> rejects signals llx-0.0.1> rejects events llx-0.0.1> tool-executing-transition-unknown-signal-test llx-0.0.1> step-abort-from-tool-executing-to-idle-test llx-0.0.1> handle-command-continue-steering-before-follow-up-test llx-0.0.1> tool-executing-transition-tool-update-test llx-0.0.1> handle-command-set-schema-config-test llx-0.0.1> route-from-idle-test llx-0.0.1> step-full-happy-path-test llx-0.0.1> state progression llx-0.0.1> final state has both messages llx-0.0.1> agent-end is emitted on final step llx-0.0.1> agent-end is not emitted on intermediate steps llx-0.0.1> streaming-transition-llm-error-test llx-0.0.1> transitions to idle and sets error llx-0.0.1> emits message-end and turn-end llx-0.0.1> idle-transition-invalid-signal-test llx-0.0.1> handle-command-continue-with-steering-all-mode-test llx-0.0.1> handle-command-steer-test llx-0.0.1> route-from-tool-executing-test llx-0.0.1> with pending tool calls stays tool-executing llx-0.0.1> without pending tool calls routes to streaming llx-0.0.1> closed routes to closed llx-0.0.1> streaming-transition-llm-start-test llx-0.0.1> handle-command-prompt-from-idle-test llx-0.0.1> agent-end-emitted-on-error-to-idle-test llx-0.0.1> agent-end-not-emitted-on-streaming-to-tool-executing-test llx-0.0.1> handle-command-reset-test llx-0.0.1> handle-command-replace-messages-test llx-0.0.1> handle-command-abort-when-streaming-test llx-0.0.1> step-signal-llm-done-with-tools-test llx-0.0.1> handle-command-clear-steering-queue-test llx-0.0.1> streaming-transition-unknown-signal-test llx-0.0.1> handle-command-abort-when-idle-test llx-0.0.1> agent-end-emitted-on-streaming-to-idle-test llx-0.0.1> idle-transition-prompt-start-test llx-0.0.1> appends messages and transitions to streaming llx-0.0.1> emits agent-start, turn-start, message events, and call-llm llx-0.0.1> call-llm receives the full message history including new messages llx-0.0.1> streaming-transition-llm-done-prefers-steering-over-follow-up-test llx-0.0.1> uses steering messages first and leaves follow-up queued llx-0.0.1> continues immediately with call-llm llx-0.0.1> handle-command-append-message-test llx-0.0.1> tool-executing-transition-tool-result-with-remaining-test llx-0.0.1> processes result and keeps remaining tools llx-0.0.1> appends result to messages llx-0.0.1> emits tool-execution-end, message events, and starts next tool llx-0.0.1> initial-state-has-expected-shape-test llx-0.0.1> handle-command-set-steering-mode-test llx-0.0.1> handle-command-set-system-prompt-test llx-0.0.1> handle-command-set-model-test llx-0.0.1> tool-executing-transition-tool-error-last-tool-test llx-0.0.1> clears pending-tool-calls llx-0.0.1> records error result and resumes llm llx-0.0.1> tool-executing-transition-tool-result-with-steering-interrupts-remaining-tools-test llx-0.0.1> clears pending tool calls and keeps remaining steering queued in one-at-a-time mode llx-0.0.1> appends current tool result, synthetic skipped results, and dequeued steering message llx-0.0.1> emits current result events, skipped tool lifecycle events, steering message events, and resumes llm llx-0.0.1> route-from-streaming-test llx-0.0.1> idle routes to idle llx-0.0.1> tool-executing routes to tool-executing llx-0.0.1> closed routes to closed llx-0.0.1> streaming stays streaming llx-0.0.1> step-abort-from-streaming-to-idle-test llx-0.0.1> abort signal from streaming llx-0.0.1> abort command from streaming llx-0.0.1> handle-command-continue-with-follow-up-all-mode-test llx-0.0.1> step-tool-loop-test llx-0.0.1> state progression through tool loop llx-0.0.1> tool completion resumes llm llx-0.0.1> final state has all messages llx-0.0.1> agent-end emitted on final transition to idle llx-0.0.1> tool-executing-transition-abort-test llx-0.0.1> transitions to idle and clears pending-tool-calls llx-0.0.1> emits turn-end llx-0.0.1> streaming-transition-abort-test llx-0.0.1> transitions to idle and clears stream-message llx-0.0.1> emits message-end and turn-end llx-0.0.1> handle-command-follow-up-test llx-0.0.1> idle-transition-continue-start-test llx-0.0.1> appends messages and transitions to streaming llx-0.0.1> emits turn-start (no agent-start), message events, and call-llm llx-0.0.1> call-llm receives the full message history including new messages llx-0.0.1> tool-executing-transition-tool-result-with-steering-all-mode-dequeues-all-test llx-0.0.1> dequeues all steering messages in :all mode llx-0.0.1> handle-command-set-follow-up-mode-test llx-0.0.1> handle-command-continue-empty-queues-test llx-0.0.1> handle-command-set-thinking-level-test llx-0.0.1> handle-command-prompt-when-not-idle-test llx-0.0.1> tool-executing-transition-tool-error-with-remaining-test llx-0.0.1> records error result and keeps remaining tools llx-0.0.1> emits tool-execution-end, message events, and starts next tool llx-0.0.1> handle-command-continue-with-steering-one-at-a-time-test llx-0.0.1> streaming-transition-llm-done-with-tools-test llx-0.0.1> transitions to tool-executing llx-0.0.1> sets pending-tool-calls and clears stream-message llx-0.0.1> appends the message llx-0.0.1> emits message-end, tool-execution-start, and execute-tool llx-0.0.1> streaming-transition-llm-done-with-steering-queue-starts-next-turn-test llx-0.0.1> moves directly into the next streaming turn llx-0.0.1> appends the finished assistant message and queued steering message llx-0.0.1> continues the run by ending the turn and scheduling more llm work llx-0.0.1> handle-command-clear-follow-up-queue-test llx-0.0.1> agent-end-not-emitted-when-staying-idle-test llx-0.0.1> step-prompt-when-streaming-is-rejected-test llx-0.0.1> handle-command-set-tools-test llx-0.0.1> handle-command-clear-messages-test llx-0.0.1> step-signal-llm-done-no-tools-to-idle-test llx-0.0.1> tool-executing-transition-tool-result-last-tool-test llx-0.0.1> clears pending-tool-calls llx-0.0.1> appends result to messages and resumes llm llx-0.0.1> llx-0.0.1> ol.llx.ai.oauth.cli-test llx-0.0.1> login-command-writes-auth-json-in-current-working-directory llx-0.0.1> persists oauth credentials to auth.json llx-0.0.1> llx-0.0.1> ol.llx.ai.models-test llx-0.0.1> model-registry-and-lookup llx-0.0.1> model-utility-functions llx-0.0.1> calculate-cost llx-0.0.1> supports-xhigh? llx-0.0.1> direct anthropic 4.6 models use the larger context window llx-0.0.1> models-equal? llx-0.0.1> llx-0.0.1> ol.llx.ai.utils.rate-limit-test llx-0.0.1> rate-limited-detection llx-0.0.1> detects structured error types llx-0.0.1> detects provider message patterns llx-0.0.1> false for non-rate-limit errors llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.common-test llx-0.0.1> parse-json-lenient-falls-back-to-decode llx-0.0.1> uses decode-safe when it succeeds llx-0.0.1> falls back to decode when decode-safe returns nil llx-0.0.1> uses decode directly when decode-safe is absent llx-0.0.1> parse-json-safe-returns-decoded-or-empty-map llx-0.0.1> trim-trailing-slash-removes-single-trailing-slash llx-0.0.1> empty-usage-shape-is-canonical llx-0.0.1> llx-0.0.1> ol.llx.ai.utils.tool-validation-test llx-0.0.1> validate-tool-call llx-0.0.1> success case llx-0.0.1> tool not found llx-0.0.1> validation errors are structured llx-0.0.1> missing required field llx-0.0.1> human-readable error message includes tool name and arguments llx-0.0.1> tool-not-found error message includes tool name llx-0.0.1> coerces string values using the input schema llx-0.0.1> applies schema defaults from the input schema llx-0.0.1> resolves custom schema references from the active registry llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.google-generative-ai-test llx-0.0.1> open-stream-non-2xx-throws-structured-error llx-0.0.1> decode-event-stream-contract llx-0.0.1> reasoning-config-gemini-3-pro-uses-level llx-0.0.1> decode-event-stream-usage-calculates-costs llx-0.0.1> adapter-registers-tool-call-id-normalizer-with-model-id-gate llx-0.0.1> thought-signature-alone-is-not-thinking llx-0.0.1> reasoning-config-disables-thinking-by-default-for-gemini-3 llx-0.0.1> finalize-throws-on-unknown-stop-reason llx-0.0.1> reasoning-config-omitted-when-model-not-reasoning llx-0.0.1> build-request-gemini-3-preserves-unsigned-tool-calls-with-sentinel llx-0.0.1> reasoning-config-disables-thinking-by-default-for-gemini-3-pro llx-0.0.1> build-request-converts-canonical-context-to-google-payload llx-0.0.1> map-stop-reason-fail-fast-on-unknown llx-0.0.1> unknown finish reason in stream decode fails fast llx-0.0.1> reasoning-config-gemini-3-pro-clamps-low-effort llx-0.0.1> build-request-emits-provider-payload-trove-signal llx-0.0.1> build-request-uses-custom-thinking-budgets llx-0.0.1> reasoning-config-gemini-3-flash-uses-level llx-0.0.1> build-request-preserves-valid-emoji-surrogate-pairs llx-0.0.1> reasoning-config-disables-thinking-by-default-for-gemini-25 llx-0.0.1> stream-error-normalization-contract llx-0.0.1> build-request-tool-result-image-forwarding-by-model-capability llx-0.0.1> gemini-3 multimodal model forwards image in functionResponse parts llx-0.0.1> text-only model drops images from functionResponse llx-0.0.1> google-normalizer-matches-upstream-issue-1022-test-id-under-gate llx-0.0.1> finalize-calculates-usage-costs llx-0.0.1> decode-event-tool-call-missing-args-defaults-to-empty-map llx-0.0.1> build-request-sanitizes-unpaired-surrogates-in-user-and-system llx-0.0.1> reasoning-config-gemini-25-pro-budget-differs-from-flash llx-0.0.1> llx-0.0.1> ol.llx.ai.client.jvm-test llx-0.0.1> run-stream-cancel-fn-closes-upstream-body llx-0.0.1> run-stream-emits-stream-lifecycle-trove-signals llx-0.0.1> run-stream-emits-stream-event-error-trove-signal llx-0.0.1> run-stream-wraps-untyped-stream-errors-as-streaming-error llx-0.0.1> run-stream-validation llx-0.0.1> rejects malformed decoded events llx-0.0.1> rejects malformed finalize output llx-0.0.1> malformed normalize-error still emits terminal error llx-0.0.1> llx-0.0.1> ol.llx.ai.model-catalog.generate-test llx-0.0.1> render-generated-source-is-stable llx-0.0.1> build-catalog-rejects-invalid-override-shapes llx-0.0.1> build-catalog-supports-provider-qualified-override-keys llx-0.0.1> build-catalog-deep-merges-nested-override-fields llx-0.0.1> generate-models-uses-checked-in-overrides-and-emits-openai-codex-models llx-0.0.1> generate-models-writes-artifact-using-injected-paths llx-0.0.1> build-catalog-is-deterministically-sorted llx-0.0.1> build-catalog-rejects-duplicate-normalized-source-keys llx-0.0.1> build-catalog-rejects-provider-change-for-existing-id llx-0.0.1> build-catalog-normalizes-supported-providers-only llx-0.0.1> llx-0.0.1> ol.llx.ai.utils.unicode-test llx-0.0.1> truncate-limits-string-length llx-0.0.1> truncates only when input exceeds max-len llx-0.0.1> coerces nil to empty string llx-0.0.1> sanitize-surrogates-handles-surrogate-edge-cases llx-0.0.1> preserves valid emoji surrogate pairs llx-0.0.1> removes unpaired high surrogate llx-0.0.1> removes unpaired low surrogate llx-0.0.1> removes high surrogate at end of string llx-0.0.1> removes multiple unpaired surrogates in one string llx-0.0.1> preserves mixed content: emoji, CJK, math symbols, special quotes llx-0.0.1> handles nil and empty input llx-0.0.1> passes through plain ASCII unchanged llx-0.0.1> sanitize-payload-deep-walks-data-structures llx-0.0.1> sanitizes strings nested in maps, vectors, and mixed structures llx-0.0.1> real-world LinkedIn data with emoji preserved llx-0.0.1> unpaired surrogates stripped from tool result content llx-0.0.1> handles bare string input llx-0.0.1> handles bare vector input llx-0.0.1> passes through non-string leaves unchanged llx-0.0.1> llx-0.0.1> ol.llx.ai.guardrails-contract-test llx-0.0.1> guardrails-enforces-boundary-shapes llx-0.0.1> decode-event boundary is enforced for all adapters llx-0.0.1> llx-0.0.1> ol.llx.agent-test llx-0.0.1> rehydrate-agent-custom-message-validation-test llx-0.0.1> tool-signal-and-event-schema-tightening-test llx-0.0.1> effect-execute-tool-tool-call-schema-test llx-0.0.1> set-model-validates-model-shape-test llx-0.0.1> set-schema-config-ignores-nil-fields-test llx-0.0.1> nil schema-registry preserves the current user registry llx-0.0.1> nil custom-message-schemas preserves the current dispatch map llx-0.0.1> prompt-validates-messages-test llx-0.0.1> set-schema-config-clears-user-additions-without-removing-canonical-schemas-test llx-0.0.1> custom-message-schema-may-reference-provided-schemas-test llx-0.0.1> tool-schema-tightening-on-commands-and-state-test llx-0.0.1> :ol.llx.agent/command-set-tools expects :ol.llx.agent/tool entries llx-0.0.1> :ol.llx.agent/create-agent-opts expects :ol.llx.agent/tool entries in :tools llx-0.0.1> :ol.llx.agent.loop/state expects :ol.llx.agent/tool entries in :tools llx-0.0.1> custom-message-public-api-validation-test llx-0.0.1> tool-call-schema-contract-test llx-0.0.1> set-schema-config-updates-custom-message-validation-on-live-agent-test llx-0.0.1> create-agent-default-convert-to-llm-test llx-0.0.1> rehydrate-agent-uses-snapshot-test llx-0.0.1> command-wrappers-dispatch-through-driver-run-test llx-0.0.1> prompt dispatches vector messages llx-0.0.1> continue dispatches the continue command llx-0.0.1> abort dispatches the abort command llx-0.0.1> state mutators dispatch commands llx-0.0.1> create-agent-requires-env-contract-test llx-0.0.1> create-agent-initializes-state-test llx-0.0.1> subscribe-unsubscribe-test llx-0.0.1> custom-message-schemas-validate-message-and-messages-test llx-0.0.1> :ol.llx.agent/custom-message-schemas requires namespace-qualified dispatch keys llx-0.0.1> :ol.llx.agent/message rejects custom roles when not registered llx-0.0.1> :ol.llx.agent/message accepts registered custom role llx-0.0.1> :ol.llx.agent/messages accepts canonical + registered custom messages llx-0.0.1> :ol.llx.agent/messages rejects invalid registered custom message payloads llx-0.0.1> canonical messages remain valid with custom registrations enabled llx-0.0.1> tool-and-pending-tool-call-schema-test llx-0.0.1> create-agent-ignores-initial-state-option-test llx-0.0.1> create-agent-rejects-missing-custom-schema-registration-test llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.openai-codex-responses-test llx-0.0.1> build-request-rejects-token-missing-account-id llx-0.0.1> build-request-prefers-explicit-api-key-over-env llx-0.0.1> build-request-strips-codex-unsupported-payload-fields llx-0.0.1> build-request-shapes-codex-url-and-headers llx-0.0.1> build-request-disables-reasoning-when-no-reasoning-opts llx-0.0.1> llx-0.0.1> ol.llx.ai.schema-test llx-0.0.1> adapter-and-env-schema llx-0.0.1> accepts valid adapter and runtime env llx-0.0.1> rejects adapter missing required function slots llx-0.0.1> rejects env missing required function slots llx-0.0.1> message-schemas llx-0.0.1> accepts all three canonical message roles llx-0.0.1> assistant message accepts unknown keys llx-0.0.1> event-schemas llx-0.0.1> accepts stream terminal events llx-0.0.1> rejects malformed events llx-0.0.1> accepts delta events with required payload llx-0.0.1> config-schema llx-0.0.1> accepts known provider config llx-0.0.1> accepts unknown provider keys llx-0.0.1> model-schema llx-0.0.1> accepts a valid model llx-0.0.1> accepts supported openai-completions compat profile keys llx-0.0.1> accepts unknown model keys llx-0.0.1> options-schema llx-0.0.1> accepts valid unified request options llx-0.0.1> accepts unknown unified request option keys llx-0.0.1> accepts valid provider request options including provider-specific keys llx-0.0.1> tool input schema field descriptions survive json schema conversion llx-0.0.1> schema-registry-rebuilds-when-component-schemas-change llx-0.0.1> options-schema-allows-provider-specific-option-keys llx-0.0.1> runtime-boundary-schemas llx-0.0.1> accepts runtime adapter boundary maps llx-0.0.1> rejects malformed runtime boundary maps llx-0.0.1> accepts run-stream argument map contract llx-0.0.1> usage-schema llx-0.0.1> accepts usage where total-tokens equals component sum llx-0.0.1> accepts usage where provider total-tokens does not match component sum (Google!) llx-0.0.1> oauth-schema-contracts llx-0.0.1> accepts OpenAI Codex provider and API enum values llx-0.0.1> accepts oauth credential and provider contracts llx-0.0.1> rejects oauth credential map missing required keys llx-0.0.1> rejects oauth provider missing required function slots llx-0.0.1> context-schema llx-0.0.1> context is an ordered vector of canonical messages llx-0.0.1> context-map enforces required :messages and optional envelope keys llx-0.0.1> llx-0.0.1> ol.llx.ai.oauth-test llx-0.0.1> refresh-oauth-token-dispatch llx-0.0.1> oauth-provider-registry-operations llx-0.0.1> get-oauth-api-key-behavior llx-0.0.1> returns nil for missing provider credentials llx-0.0.1> returns existing api key when credential is not expired llx-0.0.1> refreshes expired credential before returning api key llx-0.0.1> llx-0.0.1> ol.llx.agent.fx-test llx-0.0.1> fx-call-llm-runs-hooks-and-maps-events-test llx-0.0.1> fx-call-llm-emits-llm-error-on-non-canonical-event-type-test llx-0.0.1> fx-call-llm-uses-default-stream-fn-when-not-provided-test llx-0.0.1> fx-execute-tool-uses-active-schema-registry-for-input-coercion-test llx-0.0.1> execute-fx-validates-effect-shape-test llx-0.0.1> fx-call-llm-emits-llm-error-on-hook-failure-test llx-0.0.1> fx-execute-tool-uses-updated-schema-config-from-live-agent-test llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.anthropic-messages-test llx-0.0.1> decode-event-stream-usage-calculates-costs llx-0.0.1> build-request-sanitizes-unpaired-surrogates-in-user-and-system llx-0.0.1> build-request-converts-canonical-context-to-anthropic-payload llx-0.0.1> build-request-disables-thinking-when-no-reasoning-opts llx-0.0.1> decode-event-stream-contract llx-0.0.1> build-request-enables-adaptive-thinking-for-sonnet-4-6 llx-0.0.1> decode-event-redacted-thinking-round-trips-to-canonical-content llx-0.0.1> finalize-calculates-usage-costs llx-0.0.1> build-request-replays-redacted-thinking-as-anthropic-redacted-block llx-0.0.1> build-request-omits-temperature-when-thinking-is-enabled llx-0.0.1> build-request-uses-custom-thinking-budgets llx-0.0.1> build-request-clamps-sonnet-4-6-xhigh-to-high llx-0.0.1> build-request-preserves-valid-emoji-surrogate-pairs llx-0.0.1> normalize-tool-call-id-sanitizes-and-truncates llx-0.0.1> build-request-emits-provider-payload-trove-signal llx-0.0.1> image-only-content-does-not-inject-placeholder-text llx-0.0.1> build-request-enables-budget-thinking-for-older-reasoning-model llx-0.0.1> finalize-maps-anthropic-stop-reasons llx-0.0.1> build-request-enables-adaptive-thinking-for-opus-4-6 llx-0.0.1> build-request-omits-thinking-when-model-not-reasoning llx-0.0.1> finalize-throws-on-unknown-stop-reason llx-0.0.1> llx-0.0.1> ol.llx.ai.client.stream-test llx-0.0.1> run-stream-calls-cancel-when-output-channel-preclosed llx-0.0.1> run-stream-emits-start-and-done-events llx-0.0.1> runtime-run-stream-input-requires-runtime-hooks llx-0.0.1> requires stream runtime hooks llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.openai-responses-test llx-0.0.1> cache-retention-mapping llx-0.0.1> cache-control none omits both prompt cache fields llx-0.0.1> cache-control long sets 24h retention for direct api.openai.com llx-0.0.1> cache-control long does not set retention for non-openai base url llx-0.0.1> finalize-throws-on-unknown-stop-reason llx-0.0.1> finalize-maps-responses-status-to-canonical-stop-reason llx-0.0.1> stream-error-normalization-contract llx-0.0.1> decode-event-response-failed-includes-provider-error-details llx-0.0.1> normalize-tool-call-id-trims-trailing-underscores-and-enforces-fc-prefix llx-0.0.1> normalize-tool-call-id-normalizes-pipe-ids-and-preserves-pairing llx-0.0.1> decode-event-reasoning-summary-part-done-requires-summary-part llx-0.0.1> normalize-tool-call-id-hashes-foreign-item-ids llx-0.0.1> normalize-tool-call-id-gates-by-provider-allowlist llx-0.0.1> build-request-replays-versioned-text-signature-metadata llx-0.0.1> decode-event-stream-contract llx-0.0.1> decode-event-message-output-item-done-encodes-versioned-text-signature llx-0.0.1> normalize-tool-call-id-preserves-same-provider-item-ids llx-0.0.1> build-request-emits-provider-payload-trove-signal llx-0.0.1> build-request-preserves-valid-emoji-surrogate-pairs llx-0.0.1> build-request-disables-reasoning-when-no-reasoning-opts llx-0.0.1> normalize-tool-call-id-matches-upstream-issue-1022-test-id llx-0.0.1> build-request-sanitizes-unpaired-surrogates-in-user-text llx-0.0.1> build-request-converts-context-to-openai-responses-input llx-0.0.1> finalize-calculates-tier-adjusted-cost-when-usage-present llx-0.0.1> llx-0.0.1> ol.llx.ai.oauth.openai-codex-test llx-0.0.1> account-id-extraction llx-0.0.1> login-openai-codex-bind-failure-falls-back-to-manual-input llx-0.0.1> login-openai-codex-state-mismatch-fails llx-0.0.1> login-openai-codex-manual-fallback llx-0.0.1> parse-authorization-input-cases llx-0.0.1> accepts full redirect URL llx-0.0.1> accepts code#state format llx-0.0.1> accepts query-string format llx-0.0.1> falls back to raw code llx-0.0.1> llx-0.0.1> ol.llx.ai.adapters.openai-completions-test llx-0.0.1> build-request-qwen-thinking-format-sends-enable-thinking llx-0.0.1> normalize-tool-call-id-mistral-shape llx-0.0.1> normalization is deterministic 9-char alphanumeric llx-0.0.1> decode-event-maps-provider-finish-reason-errors llx-0.0.1> normalize-tool-call-id-mistral-avoids-collision-for-distinct-source-ids llx-0.0.1> build-request-missing-api-key-message-includes-env-var-name llx-0.0.1> build-request-emits-provider-payload-trove-signal llx-0.0.1> build-request-sanitizes-unpaired-surrogates-in-tool-result-text llx-0.0.1> normalize-tool-call-id-pipe-ids-use-call-segment-sanitize-and-truncate llx-0.0.1> build-request-reads-provider-specific-env-api-key llx-0.0.1> build-request-openai-compatible-omits-auth-and-respects-compat-overrides llx-0.0.1> decode-event-stream-usage-calculates-costs llx-0.0.1> build-request-forwards-tools-and-tool-choice-with-compat-token-field llx-0.0.1> normalize-tool-call-id-matches-upstream-issue-1022-test-id llx-0.0.1> convert-message-restores-thinking-field-from-signature llx-0.0.1> normalize-tool-call-id-openai-non-pipe-ids-are-truncated-only llx-0.0.1> build-request-includes-reasoning-effort-for-reasoning-model llx-0.0.1> normalize-tool-call-id-openai-compatible-non-pipe-ids-are-unchanged llx-0.0.1> build-request-omits-reasoning-effort-when-model-lacks-reasoning llx-0.0.1> response->assistant-message-calculates-usage-costs llx-0.0.1> decode-event-thinking-to-text-transition llx-0.0.1> build-request-sanitizes-unpaired-surrogates-in-user-text llx-0.0.1> build-request-zai-thinking-format-sends-thinking-object llx-0.0.1> response->assistant-message-falls-back-to-choice-usage llx-0.0.1> convert-message-reconstructs-reasoning-details-from-tool-signatures llx-0.0.1> build-request-tool-choice-sentinel-strings-pass-through llx-0.0.1> build-request-batches-tool-result-images-for-openai-completions llx-0.0.1> decode-event-emits-thinking-events-for-reasoning-content llx-0.0.1> decode-event-stream-contract llx-0.0.1> decode-event-stream-falls-back-to-choice-usage llx-0.0.1> build-request-zai-disables-thinking-when-no-reasoning llx-0.0.1> response->assistant-message-maps-provider-finish-reason-errors llx-0.0.1> decode-event-extracts-reasoning-details-to-tool-call-signature llx-0.0.1> build-request-preserves-valid-emoji-surrogate-pairs llx-0.0.1> decode-event-tracks-thinking-signature llx-0.0.1> llx-0.0.1> ol.llx.agent.driver-test llx-0.0.1> prompt-continues-through-queued-steering-without-stalling-test llx-0.0.1> abort-cancels-tool-execution-and-returns-to-idle-test llx-0.0.1> abort-drops-stale-llm-events-and-allows-reuse-test llx-0.0.1> llx-0.0.1> ol.llx.ai.registry-test llx-0.0.1> registry-patterns llx-0.0.1> immutable registry returns new value llx-0.0.1> mutable registry llx-0.0.1> dynamic registry llx-0.0.1> registry-operations llx-0.0.1> unregister and clear adapters llx-0.0.1> rejects invalid api value llx-0.0.1> llx-0.0.1> ol.llx.ai.client-test llx-0.0.1> stream-close-delegates-to-runtime-cancel-fn llx-0.0.1> complete-emits-error-lifecycle-trove-signals llx-0.0.1> complete-emits-lifecycle-trove-signals llx-0.0.1> stream-retries-open-stream-on-transient-error llx-0.0.1> stream-rejects-unsupported-xhigh-with-structured-error llx-0.0.1> complete-does-not-retry-on-client-error llx-0.0.1> complete-retries-without-thread-sleep-hook llx-0.0.1> complete-openai-completions-non-2xx llx-0.0.1> complete-rejects-unsupported-xhigh-with-structured-error llx-0.0.1> complete-surfaces-unknown-openai-completions-stop-reason-as-error-message llx-0.0.1> opts-registry-overrides-env-registry llx-0.0.1> complete-simple-wrapper-normalizes-options llx-0.0.1> complete-transforms-context-before-build-request llx-0.0.1> unified-opts->request-opts-rejects-provider-shape-in-unified-opts llx-0.0.1> complete-allows-xhigh-for-supported-model llx-0.0.1> stream-returns-csp-channel llx-0.0.1> complete-rejects-malformed-adapter-finalize-result llx-0.0.1> unified-opts->request-opts-normalizes-unified-shape llx-0.0.1> complete-retries-on-transient-error llx-0.0.1> complete-returns-deferred llx-0.0.1> stream-simple-wrapper-normalizes-options llx-0.0.1> complete-simple-wrapper-normalizes-openai-responses-reasoning-to-effort llx-0.0.1> llx-0.0.1> 333 tests, 1549 assertions, 0 failures. llx-0.0.1> Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.tjnKtvEGg4 llx-0.0.1> Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.tjnKtvEGg4 llx-0.0.1> Running phase: installPhase llx-0.0.1> Running phase: fixupPhase llx-0.0.1> shrinking RPATHs of ELF executables and libraries in /nix/store/hrx837rdcmvxa61bsag2pig7486kbnvz-llx-0.0.1 llx-0.0.1> checking for references to /build/ in /nix/store/hrx837rdcmvxa61bsag2pig7486kbnvz-llx-0.0.1... llx-0.0.1> patching script interpreter paths in /nix/store/hrx837rdcmvxa61bsag2pig7486kbnvz-llx-0.0.1 post-build step Upload to Mali Attic: ok ⚙️ Pushing 1 paths to "private" on "mali" (0 already cached, 0 in upstream)... ✅ hrx837rdcmvxa61bsag2pig7486kbnvz-llx-0.0.1 (2.02 MiB/s)