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