Running phase: unpackPhase unpacking source archive /nix/store/9c9rkx10b0w6hia0nzfcgd1s5h0l710r-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.997yw6m7Vd Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.997yw6m7Vd 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.agent.loop-test command-predicate-test recognizes commands rejects signals rejects events initial-state-has-expected-shape-test handle-command-abort-when-idle-test handle-command-continue-with-steering-all-mode-test idle-transition-invalid-signal-test tool-executing-transition-tool-result-with-steering-all-mode-dequeues-all-test dequeues all steering messages in :all mode 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 handle-command-set-follow-up-mode-test tool-executing-transition-tool-update-test handle-command-set-steering-mode-test tool-executing-transition-tool-error-last-tool-test clears pending-tool-calls records error result and resumes llm step-signal-llm-done-no-tools-to-idle-test 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 route-from-streaming-test idle routes to idle tool-executing routes to tool-executing closed routes to closed streaming stays streaming handle-command-prompt-from-idle-test 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 step-signal-llm-done-with-tools-test handle-command-append-message-test agent-end-not-emitted-on-streaming-to-tool-executing-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 handle-command-continue-with-follow-up-one-at-a-time-test handle-command-set-system-prompt-test handle-command-clear-follow-up-queue-test handle-command-abort-when-streaming-test step-abort-from-streaming-to-idle-test abort signal from streaming abort command from streaming 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-reset-test handle-command-set-schema-config-test 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-continue-with-follow-up-all-mode-test handle-command-steer-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-prompt-when-not-idle-test handle-command-clear-messages-test streaming-transition-abort-test transitions to idle and clears stream-message emits message-end and turn-end handle-command-continue-with-steering-one-at-a-time-test step-prompt-from-idle-to-streaming-test handle-command-set-model-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 agent-end-not-emitted-when-staying-idle-test handle-command-continue-empty-queues-test handle-command-set-thinking-level-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 route-from-tool-executing-test with pending tool calls stays tool-executing without pending tool calls routes to streaming closed routes to closed handle-command-replace-messages-test agent-end-emitted-on-error-to-idle-test tool-executing-transition-unknown-signal-test handle-command-set-tools-test closed-transition-is-terminal-test any signal returns state unchanged with no effects handle-command-clear-steering-queue-test 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-unknown-signal-test tool-executing-transition-abort-test transitions to idle and clears pending-tool-calls emits turn-end streaming-transition-llm-error-test transitions to idle and sets error emits message-end and turn-end streaming-transition-llm-start-test streaming-transition-llm-chunk-test step-abort-from-tool-executing-to-idle-test tool-executing-transition-tool-result-last-tool-test clears pending-tool-calls appends result to messages and resumes llm handle-command-continue-steering-before-follow-up-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 handle-command-continue-when-not-idle-test agent-end-emitted-on-streaming-to-idle-test 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 handle-command-clear-all-queues-test route-from-idle-test handle-command-follow-up-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 step-prompt-when-streaming-is-rejected-test ol.llx.ai.utils.unicode-test 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 truncate-limits-string-length truncates only when input exceeds max-len coerces nil to empty string ol.llx.ai.adapters.openai-responses-test normalize-tool-call-id-trims-trailing-underscores-and-enforces-fc-prefix finalize-throws-on-unknown-stop-reason build-request-replays-versioned-text-signature-metadata normalize-tool-call-id-preserves-same-provider-item-ids build-request-preserves-valid-emoji-surrogate-pairs 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-emits-provider-payload-trove-signal decode-event-message-output-item-done-encodes-versioned-text-signature decode-event-stream-contract finalize-maps-responses-status-to-canonical-stop-reason normalize-tool-call-id-hashes-foreign-item-ids normalize-tool-call-id-gates-by-provider-allowlist normalize-tool-call-id-normalizes-pipe-ids-and-preserves-pairing build-request-sanitizes-unpaired-surrogates-in-user-text decode-event-reasoning-summary-part-done-requires-summary-part finalize-calculates-tier-adjusted-cost-when-usage-present normalize-tool-call-id-matches-upstream-issue-1022-test-id decode-event-response-failed-includes-provider-error-details build-request-converts-context-to-openai-responses-input stream-error-normalization-contract build-request-disables-reasoning-when-no-reasoning-opts ol.llx.ai.adapters.openai-codex-responses-test build-request-disables-reasoning-when-no-reasoning-opts build-request-rejects-token-missing-account-id build-request-shapes-codex-url-and-headers build-request-prefers-explicit-api-key-over-env build-request-strips-codex-unsupported-payload-fields ol.llx.ai.errors-test retry-delay-uses-linear-backoff-for-connection-errors connection-error-is-recoverable 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 extract-retry-after-from-message-parses-seconds provider-error-with-custom-recoverability server-error-is-recoverable should-retry-allows-transient-errors http-status-429-without-quota-returns-rate-limit should-retry-respects-max-retries extract-retry-after-from-message-returns-nil-when-missing retry-loop-async-exhausts-retries-and-throws retry-loop-async-succeeds-on-first-attempt retry-delay-uses-exponential-backoff-for-rate-limit-without-header quota-exceeded-is-not-recoverable timeout-error-is-recoverable retry-delay-exceeded-is-not-recoverable should-retry-rejects-client-errors rate-limit-error-has-correct-type-and-recoverable http-status-unknown-5xx-returns-recoverable-provider-error returns-nil-when-no-header retry-after-ms-takes-priority retry-loop-async-does-not-retry-client-errors invalid-request-is-not-recoverable retry-delay-adds-jitter-for-server-errors extracts-retry-after-seconds-header retry-delay-uses-server-retry-after-for-rate-limit retry-loop-async-fails-when-server-retry-delay-exceeds-cap retry-loop-async-emits-retry-scheduled-trove-signal extracts-x-ratelimit-reset-after-header extracts-retry-after-ms-header http-status-429-with-quota-and-retry-after-returns-rate-limit retry-loop-async-retries-transient-and-succeeds caps-at-max-seconds content-filter-is-not-recoverable authentication-error-is-not-recoverable 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? http-status-429-with-quota-body-returns-quota-exceeded http-status-unknown-4xx-returns-non-recoverable-provider-error model-not-found-is-not-recoverable ol.llx.ai.client-test opts-registry-overrides-env-registry complete-transforms-context-before-build-request complete-rejects-malformed-adapter-finalize-result complete-simple-wrapper-normalizes-openai-responses-reasoning-to-effort complete-allows-xhigh-for-supported-model stream-simple-wrapper-normalizes-options complete-retries-without-thread-sleep-hook complete-retries-on-transient-error complete-returns-deferred complete-surfaces-unknown-openai-completions-stop-reason-as-error-message unified-opts->request-opts-normalizes-unified-shape stream-retries-open-stream-on-transient-error complete-openai-completions-non-2xx complete-simple-wrapper-normalizes-options complete-rejects-unsupported-xhigh-with-structured-error complete-emits-error-lifecycle-trove-signals stream-rejects-unsupported-xhigh-with-structured-error unified-opts->request-opts-rejects-provider-shape-in-unified-opts stream-returns-csp-channel stream-close-delegates-to-runtime-cancel-fn complete-does-not-retry-on-client-error complete-emits-lifecycle-trove-signals 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.client.stream-test run-stream-calls-cancel-when-output-channel-preclosed run-stream-emits-start-and-done-events runtime-run-stream-input-requires-runtime-hooks requires stream runtime hooks ol.llx.ai.client.jvm-test run-stream-wraps-untyped-stream-errors-as-streaming-error run-stream-cancel-fn-closes-upstream-body 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-emits-stream-lifecycle-trove-signals 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.model-catalog.generate-test build-catalog-is-deterministically-sorted build-catalog-rejects-invalid-override-shapes build-catalog-rejects-provider-change-for-existing-id generate-models-uses-checked-in-overrides-and-emits-openai-codex-models build-catalog-normalizes-supported-providers-only render-generated-source-is-stable build-catalog-rejects-duplicate-normalized-source-keys generate-models-writes-artifact-using-injected-paths build-catalog-deep-merges-nested-override-fields build-catalog-supports-provider-qualified-override-keys ol.llx.ai.transform-messages-test same-model-replay-preserves-thinking-and-signatures missing-tool-results-get-synthetic-error-message synthetic-tool-result-uses-real-time-when-clock-missing does-not-duplicate-existing-synthetic-tool-result google-gated-normalization-rewrites-assistant-and-tool-result-ids fixture-for-aborted-reasoning-skips-aborted-turn aborted assistant turn is removed from replay tool-call-id-normalization-propagates-to-tool-result skipped-assistant-turns-with-error-or-aborted-stop-reasons cross-model-replay-converts-thinking-and-drops-signatures user-interruption-inserts-only-missing-tool-results tool-call-id-normalization-avoids-collision-for-mistral 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.oauth.cli-test login-command-writes-auth-json-in-current-working-directory persists oauth credentials to auth.json ol.llx.agent-test create-agent-rejects-missing-custom-schema-registration-test tool-and-pending-tool-call-schema-test rehydrate-agent-uses-snapshot-test create-agent-ignores-initial-state-option-test set-model-validates-model-shape-test tool-call-schema-contract-test create-agent-requires-env-contract-test set-schema-config-clears-user-additions-without-removing-canonical-schemas-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 create-agent-initializes-state-test effect-execute-tool-tool-call-schema-test prompt-validates-messages-test subscribe-unsubscribe-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 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 rehydrate-agent-custom-message-validation-test set-schema-config-updates-custom-message-validation-on-live-agent-test tool-signal-and-event-schema-tightening-test create-agent-default-convert-to-llm-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 custom-message-public-api-validation-test custom-message-schema-may-reference-provided-schemas-test 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 event-schemas accepts stream terminal events rejects malformed events accepts delta events with required payload usage-schema accepts usage where total-tokens equals component sum accepts usage where provider total-tokens does not match component sum (Google!) options-schema-allows-provider-specific-option-keys message-schemas accepts all three canonical message roles assistant message accepts unknown keys context-schema context is an ordered vector of canonical messages context-map enforces required :messages and optional envelope keys config-schema accepts known provider config accepts unknown provider keys model-schema accepts a valid model accepts supported openai-completions compat profile keys accepts unknown model keys adapter-and-env-schema accepts valid adapter and runtime env rejects adapter missing required function slots rejects env missing required function slots runtime-boundary-schemas accepts runtime adapter boundary maps rejects malformed runtime boundary maps accepts run-stream argument map contract schema-registry-rebuilds-when-component-schemas-change 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 ol.llx.ai.adapters.google-generative-ai-test reasoning-config-gemini-25-pro-budget-differs-from-flash google-normalizer-matches-upstream-issue-1022-test-id-under-gate build-request-preserves-valid-emoji-surrogate-pairs build-request-emits-provider-payload-trove-signal finalize-throws-on-unknown-stop-reason decode-event-stream-contract reasoning-config-omitted-when-model-not-reasoning build-request-converts-canonical-context-to-google-payload reasoning-config-disables-thinking-by-default-for-gemini-3-pro decode-event-tool-call-missing-args-defaults-to-empty-map adapter-registers-tool-call-id-normalizer-with-model-id-gate decode-event-stream-usage-calculates-costs open-stream-non-2xx-throws-structured-error build-request-gemini-3-preserves-unsigned-tool-calls-with-sentinel build-request-sanitizes-unpaired-surrogates-in-user-and-system reasoning-config-gemini-3-flash-uses-level 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 finalize-calculates-usage-costs reasoning-config-gemini-3-pro-uses-level thought-signature-alone-is-not-thinking reasoning-config-disables-thinking-by-default-for-gemini-25 reasoning-config-gemini-3-pro-clamps-low-effort build-request-uses-custom-thinking-budgets reasoning-config-disables-thinking-by-default-for-gemini-3 stream-error-normalization-contract map-stop-reason-fail-fast-on-unknown unknown finish reason in stream decode fails fast 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.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.adapters.common-test empty-usage-shape-is-canonical trim-trailing-slash-removes-single-trailing-slash parse-json-safe-returns-decoded-or-empty-map 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 ol.llx.ai.oauth.openai-codex-test parse-authorization-input-cases accepts full redirect URL accepts code#state format accepts query-string format falls back to raw code login-openai-codex-state-mismatch-fails login-openai-codex-bind-failure-falls-back-to-manual-input login-openai-codex-manual-fallback account-id-extraction ol.llx.ai.adapters.anthropic-messages-test build-request-preserves-valid-emoji-surrogate-pairs build-request-omits-temperature-when-thinking-is-enabled build-request-converts-canonical-context-to-anthropic-payload build-request-emits-provider-payload-trove-signal build-request-enables-adaptive-thinking-for-sonnet-4-6 normalize-tool-call-id-sanitizes-and-truncates image-only-content-does-not-inject-placeholder-text decode-event-stream-contract build-request-clamps-sonnet-4-6-xhigh-to-high finalize-maps-anthropic-stop-reasons finalize-throws-on-unknown-stop-reason build-request-uses-custom-thinking-budgets build-request-omits-thinking-when-model-not-reasoning decode-event-redacted-thinking-round-trips-to-canonical-content build-request-enables-budget-thinking-for-older-reasoning-model build-request-enables-adaptive-thinking-for-opus-4-6 build-request-replays-redacted-thinking-as-anthropic-redacted-block build-request-sanitizes-unpaired-surrogates-in-user-and-system decode-event-stream-usage-calculates-costs finalize-calculates-usage-costs build-request-disables-thinking-when-no-reasoning-opts ol.llx.agent.fx-test fx-call-llm-emits-llm-error-on-non-canonical-event-type-test fx-call-llm-runs-hooks-and-maps-events-test fx-call-llm-emits-llm-error-on-hook-failure-test fx-call-llm-uses-default-stream-fn-when-not-provided-test fx-execute-tool-uses-updated-schema-config-from-live-agent-test execute-fx-validates-effect-shape-test fx-execute-tool-uses-active-schema-registry-for-input-coercion-test 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.ai.guardrails-contract-test guardrails-enforces-boundary-shapes decode-event boundary is enforced for all adapters ol.llx.ai.oauth-test refresh-oauth-token-dispatch oauth-provider-registry-operations 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.adapters.openai-completions-test response->assistant-message-calculates-usage-costs build-request-missing-api-key-message-includes-env-var-name decode-event-maps-provider-finish-reason-errors build-request-reads-provider-specific-env-api-key normalize-tool-call-id-pipe-ids-use-call-segment-sanitize-and-truncate decode-event-tracks-thinking-signature normalize-tool-call-id-matches-upstream-issue-1022-test-id decode-event-stream-contract decode-event-extracts-reasoning-details-to-tool-call-signature normalize-tool-call-id-mistral-shape normalization is deterministic 9-char alphanumeric build-request-emits-provider-payload-trove-signal build-request-zai-disables-thinking-when-no-reasoning build-request-batches-tool-result-images-for-openai-completions decode-event-thinking-to-text-transition decode-event-stream-usage-calculates-costs build-request-preserves-valid-emoji-surrogate-pairs build-request-zai-thinking-format-sends-thinking-object response->assistant-message-maps-provider-finish-reason-errors normalize-tool-call-id-mistral-avoids-collision-for-distinct-source-ids decode-event-stream-falls-back-to-choice-usage convert-message-restores-thinking-field-from-signature response->assistant-message-falls-back-to-choice-usage build-request-sanitizes-unpaired-surrogates-in-user-text build-request-qwen-thinking-format-sends-enable-thinking build-request-forwards-tools-and-tool-choice-with-compat-token-field normalize-tool-call-id-openai-compatible-non-pipe-ids-are-unchanged build-request-tool-choice-sentinel-strings-pass-through build-request-sanitizes-unpaired-surrogates-in-tool-result-text build-request-omits-reasoning-effort-when-model-lacks-reasoning build-request-openai-compatible-omits-auth-and-respects-compat-overrides decode-event-emits-thinking-events-for-reasoning-content build-request-includes-reasoning-effort-for-reasoning-model normalize-tool-call-id-openai-non-pipe-ids-are-truncated-only convert-message-reconstructs-reasoning-details-from-tool-signatures 333 tests, 1549 assertions, 0 failures. Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.997yw6m7Vd Picked up JAVA_TOOL_OPTIONS: -Duser.home=/build/tmp.997yw6m7Vd Running phase: installPhase Running phase: fixupPhase shrinking RPATHs of ELF executables and libraries in /nix/store/7hkmldk24x64wk7ijh1vmynr6x7jhcam-llx-0.0.1 checking for references to /build/ in /nix/store/7hkmldk24x64wk7ijh1vmynr6x7jhcam-llx-0.0.1... patching script interpreter paths in /nix/store/7hkmldk24x64wk7ijh1vmynr6x7jhcam-llx-0.0.1