Troubleshooting
Start with run state, then recent events, then logs. Those three usually establish whether the problem is in the contract, model, plugin, or storage layer.
Shortest diagnostic path
CLI:
scientific-agent status RUN_ID
scientific-agent status RUN_ID --events
Control API:
curl -sS http://127.0.0.1:8000/api/v1/health | jq
curl -sS http://127.0.0.1:8000/api/v1/diagnostics | jq
curl -sS http://127.0.0.1:8000/api/v1/runs/RUN_ID/state | jq
In Desktop, open Control Room. Check State's current_terminal_failure and Recent failures, then Timeline with the Failures filter, Jobs, and Model calls. Settings → About can open the log location.
Understand run states
| State | Meaning | Next step |
|---|---|---|
CREATED |
Contract exists but has not started | Start or resume |
RUNNING |
Planning or execution is active | Wait; inspect Timeline/SSE |
PAUSED |
Safely paused | Fix external conditions, then Resume |
BLOCKED |
Current decision cannot advance | Inspect failures, notes, and missing inputs; intervene if needed |
CAPABILITY_MISSING |
A contract capability is unavailable | Enable/fix the plugin, then Resume |
BUDGET_EXHAUSTED |
A budget limit was reached | Review results; apply a finite budget update, then Resume |
INTERRUPTED |
Process exited outside a safe terminal state | Recover or resume |
RECOVERING |
Unfinished work is being reconciled | Wait and inspect Jobs |
CANCELLING |
Job cancellation has been requested | Wait for Executor confirmation |
CANCELLED |
Cancelled terminal state | Create a new run to continue |
SUCCESS |
All metric and artifact conditions passed | Review and export |
FAILED |
Unrecoverable failure or failure limit reached | Diagnose, fix, and create a new run |
Do not infer a hang only from a stationary progress bar. A long solver may have no intermediate metric. Check Job state and whether Timeline or SSE still receives updates.
Budget diagnostics
| Code | Meaning | Response |
|---|---|---|
SOLVER_CALL_BUDGET_EXCEEDED |
The action requests more solver calls than remain. Positive remaining capacity causes rejection and replanning; zero remaining capacity exhausts the run. | Compare requested_solver_calls with remaining_solver_calls. Prefer a smaller batch; otherwise review the UI's suggested finite total. |
TRAINING_SAMPLE_BUDGET_EXCEEDED |
The action requests more training samples than remain, with the same replan-versus-exhaust distinction. | Compare requested_samples with remaining_samples; shrink the data batch or finitely raise max_training_samples. |
HARD_SAFETY_LIMIT_REACHED |
A process safety fuse was reached, not an operator limit that ordinary intervention may raise. | Preserve results, diagnose runaway work, and create a corrected task. |
Research contract cannot be created
acceptance metric has no producer
The selected capabilities do not declare the criterion under metric_outputs.
- Open capability details and copy the actual metric name.
- Check case, dots, and underscores. Names are normalized, but approximate names are not matched.
- Plugin authors must update both
plugin.yamland the Python manifest. - If a metric requires independent evaluation, add the corresponding trusted evaluator capability.
Duplicate or conflicting criteria
Each metric may appear once in acceptance_criteria, and its first item must exactly equal acceptance. Merge duplicate conditions or retain the stricter one.
Invalid capability constraint
Each rule may contain only mapping-valued when and require. First run the capability example, then add frozen parameters. Nested fields must match actual plugin inputs.
Input upload fails
Desktop permits at most 20 attachments per study. A folder selected with Choose folder retains
the directory_bundle type and uses one attachment slot; deterministic ZIP is only its transport
encoding. Its limits are 512 regular files, 50 MiB total before compression, a 10 MiB payload, 32 path components, and 1,024 UTF-8 path
bytes. Unsafe or duplicate paths, multiple roots, unreadable or changing files, and limit overruns
are rejected; native Desktop selection also rejects symlinks and special filesystem entries. A
browser with directory-entry support accepts mixed dropped files and folders, packaging each
top-level folder as one attachment. If the browser cannot read dropped directory entries, use
Choose folder.
The Web File API cannot preserve Unix mode bits and writes browser-selected files as ordinary non-executable ZIP entries. That alone does not invalidate a solver folder: the Runtime wrapper ensures the selected solver binary is executable in the isolated workspace. Check that ordinary files remain readable, Base64 is complete, and artifact types are appropriate. Large datasets are better generated or imported by a controlled plugin from an explicit location than embedded in an API request.
Solver folder is not recognized as directory_bundle or solver_bundle
The folder picker must send source_kind=directory; a safe single-root source folder then remains
directory_bundle and can carry source_code or a statically supported reference_solver role.
A manually uploaded ZIP intentionally remains zip_archive. Backend profiling specializes a safe
directory/ZIP to solver_bundle only when it finds both a non-empty
README/usage document and an ELF, PE, or Mach-O executable header. It reads at most 64 KiB of README
text as untrusted documentation, inspects only bounded binary headers, and neither runs the binary
nor extracts the archive as a whole. Unsafe or duplicate paths, symlinks, encrypted members,
expansion risk, too many members, or a project-plugin manifest prevent promotion. Clean the folder
and upload it again; renaming an arbitrary ZIP does not change its static type.
Provider or model failure
AUTONOMOUS_PLANNER_UNAVAILABLE or AUTONOMOUS_PLAN_NEEDS_CLARIFICATION
The normal Desktop one-request flow requires a connected Scientific Reasoner to produce a strict
intent draft before any plugin is installed/enabled or any Run is created. Check Settings →
Providers, test the scientific-reasoning route, and then retry. AUTONOMOUS_PLANNER_UNAVAILABLE
means the route was missing, failed, or could not return a valid structured draft.
AUTONOMOUS_PLAN_NEEDS_CLARIFICATION means the draft was low-confidence or identified a question
that would materially change the contract. Desktop presents the question as an AWAITING INPUT
item in the Planning Control Room timeline. Add the missing objective, inputs, target variable,
threshold, or deliverable there, or explicitly continue with reasonable defaults.
Both outcomes remain preflight states: selected plugins remain unchanged, no Research Run or input artifacts are created, and staged attachments remain available. The Planning Control Room itself is a pre-run UI session, not a partially configured Research Run. Desktop deliberately does not replace the LLM plan with keyword rules.
Credential not found
auth_env names an environment variable; it is not the key value:
export OPENAI_API_KEY="..."
python -c 'import os; print(bool(os.environ.get("OPENAI_API_KEY")))'
A different shell, systemd unit, or IDE may not inherit the variable. In Desktop, save the credential again under Settings → Providers and use Test connection.
Codex CLI is not logged in
codex login
Complete browser login and detect it again in Settings. Make sure Desktop and the terminal run as the same operating-system user with the same Codex configuration directory.
Connection works but structured output fails
- Match API format to the endpoint: Responses, Chat Completions, and Anthropic Messages are not interchangeable.
- For a compatible endpoint, select a mode it truly supports:
json_schema,json_object, ortool_call. - Anthropic Messages does not support the
json_objectmode here. - Schema repair handles bounded format drift; it cannot repair an incompatible API.
Timeout or repeated retries
Inspect Model calls for latency, failure code, retry count, and fallback. If max_output_tokens was set explicitly, adjust it or the task size before cautiously increasing timeout_seconds. Persistent 401/403, model-not-found, and quota errors do not improve with retries.
Plugin problems
Installed but capability is unavailable
The plugin has not been Enabled, or enabling found missing dependencies. Inspect status, missing_dependencies, and load_error in plugin details.
entrypoint cannot be imported
An entry point uses package.module:ClassName, not a file path. Confirm that:
- the ZIP/directory contains that Python package;
- the package directory has
__init__.py; - the class inherits
ScientificPlugin; - dependencies are installed in the Python environment actually used by Scientific Agent;
- import does not depend on external files or network side effects.
ZIP is rejected
Common causes are several plugin.yaml files, a packaged virtual environment or symlink, path traversal, encrypted entries, or exceeding 10 MiB/50 MiB/512-file limits. Package only the manifest, source, and small required resources.
Capability input is rejected
Copy the capability's example, then replace one field at a time. Ordinary inputs cannot contain undeclared keys. Required artifacts belong under artifact_inputs; do not pass an artifact ID as a normal path field.
Solver adapter is not published
Static solver_bundle recognition is not publication permission. Check Allow reusable plugin
publishing on the Create page. The contract then requires a file-solver-adapter-v1 source and a
passing Local Executor validation record. The fixed publisher accepts exactly three immutable
sources—solver_bundle, adapter_source, and validation—and verifies the declared pass state,
interface, exact source hashes, and Artifact provenance before Control revalidates the package for
managed install and enablement.
| Failure | Check |
|---|---|
ADAPTER_VALIDATION_NOT_PASSED / INVALID_ADAPTER_VALIDATION |
Re-run the bounded documented smoke test; do not edit hashes or synthesize a pass record. |
SECURITY_REVIEW_FAILED / SECURITY_REVIEW_DENIED |
Inspect the configured ExternalBinarySecurityReviewer decision; do not bypass it. |
SOLVER_ADAPTER_CANDIDATE_MISSING |
Confirm that the run produced the bundle, adapter source, and validation with matching lineage. |
SOLVER_ADAPTER_PUBLICATION_FAILED |
Read the publication message for a package, provenance, hash, identity-collision, install, or enable failure. |
SOLVER_ADAPTER_DELIVERY_FAILED |
The scientific run may still be successful; inspect the separate publication/export stage before claiming the plugin is available. |
The default reviewer status, permissive_deferred, permits publication but records that no
independent malware, signature, provenance-authentication, or binary-safety review occurred. It is
not a security approval. Validation records and digest attestations establish declared state,
identity, and lineage; they are not independent proof that a smoke test ran or that the binary is
safe.
Local Executor problems
- Command not found: the required tool is absent from the app process's PATH. Check with the same user and environment in a terminal.
- Output missing: generated code did not write the relative file name declared in JobSpec.
- Nonzero exit: inspect stored stdout, stderr, and structured failure type under Jobs.
MEMORY_ERROR, OOM, orSIGKILL: ordinary Runtime-generated local jobs currently request 8,192 MiB, enforced as a POSIX address-space limit. Reduce sample mini-batches, chunk coordinates or inference, and remove accidental full-field copies rather than changing the scientific model merely to hide an implementation problem.- Slow cancellation: an external process is not handling termination promptly; wait for state reconciliation and clean up only inside an isolated environment if necessary.
- Path rejected: inputs and outputs must stay in the workspace; absolute paths and
..are invalid.
Do not fix a task by weakening path checks. Correct its JobSpec or file convention.
Delivery validation problems
MINIMAL_EXAMPLE must ...: emit a UTF-8, syntactically valid.pyfile with real executable invocation code, and declare it asMINIMAL_EXAMPLE. Imports or prose alone do not qualify.USAGE_GUIDE must ...: emit UTF-8 text declared asUSAGE_GUIDEand explicitly cover input, output, domain, and fallback. The current validator looks for those four English terms.
An invalid delivery file is not committed as an artifact and cannot satisfy a completion gate.
Artifact or lineage problems
hash mismatch / corrupt artifact
The underlying file no longer matches its recorded SHA-256. Do not rewrite the record or recalculate the hash to hide it.
- Stop the run.
- Preserve logs and a copy of the damaged file.
- Restore the whole related run from a verified backup, or recompute in a new run.
- Investigate sync software, manual edits, and disk errors.
Expected lineage edge is missing
A plugin must establish relationships through artifact inputs, existing artifact IDs, or parent_names among artifacts returned together. Mentioning a file name only in free-text metadata does not create an edge.
File cannot be previewed
Control Room previews text and CSV. Large or binary artifacts may be download-only. Open them in a domain tool and compare type, size, and hash shown in the UI.
Storage and recovery problems
Old run cannot be found
The most common cause is a different --data-dir:
scientific-agent --data-dir EXPECTED_DIR status RUN_ID
Check the current directory under Desktop Settings → Storage. Do not confuse the cache root with the data root.
Data directory is read-only or full
Check permissions, mount state, and free space. Pause runs and create a backup before migrating through Settings or /storage/location. Never manually move half the directory while the app is running.
resume is rejected
Only continuable states can resume. SUCCESS, FAILED, and CANCELLED are terminal. Use Recover for INTERRUPTED. For BUDGET_EXHAUSTED, review the run and apply a controlled finite budget increase first.
Control API problems
| HTTP status | Common meaning |
|---|---|
| 401 | You reached Desktop's internal API without its correct ephemeral token |
| 404 | Run/artifact/plugin ID does not exist, or a Desktop-only shutdown route was called in development mode |
| 409 | Lifecycle conflict, duplicate command, or operation not allowed in current state |
| 422 | Invalid JSON field, enum, pagination, or scientific-command contract |
Call /api/v1/health first to confirm port and mode. The development service exposes its interactive schema at /api/v1/docs. Reconnect SSE with the last cursor; do not open many streams that all replay from after=0.
Benchmark problems
--prepare-onlyfails: verify Xsuite/ML dependencies and the spec's relativebase_configpath.- Spec hash mismatch: a frozen spec, base config, or protocol-relevant file changed; do not force reuse of the old result root.
- No valid success: inspect each trial's Runtime state and trusted criterion, not only aggregate output.
- Integrity failure: the report is invalid; investigate private-data leakage, event freezing, predictor hashes, and cross-run isolation.
- A rerun did not start over: the difficulty runner resumes by slot by design; use a new
--data-dirfor an independent experiment.
Update check is unavailable
About displays current Desktop and Runtime versions. If the distribution has no update source configured, Check for updates explicitly reports that it is unavailable; this is not a network failure. Install through the project's official release channel and create a backup before upgrading.
What to include in a bug report
Provide minimal, redacted evidence:
- Desktop, Runtime, operating-system, and Python versions;
- run ID and final status;
diagnosticsoutput;- relevant Timeline event types and error codes;
- plugin ID/version, capability ID, and
load_error; - a minimal reproducing config with credentials, private data, and personal absolute paths removed.
Never send API keys, operating-system credentials, evaluator-private content, or an entire sensitive data directory.
System VPN, proxy, and certificate settings
The Desktop application follows the operating system routing table, DNS configuration, and VPN
routes. Desktop Runtime also imports standard proxy variables, native Windows/macOS proxy settings,
GNOME proxy settings, Linux desktop Portal/PAC resolution, proxy bypass rules, and the operating
system certificate store. HTTP, HTTPS, and SOCKS proxies are supported. Explicit HTTP_PROXY,
HTTPS_PROXY, ALL_PROXY, NO_PROXY, SSL_CERT_FILE, and SSL_CERT_DIR values take precedence.
Network routes change immediately with the operating system. Proxy settings are refreshed before provider requests, so changing the system connection does not require reconfiguring a provider.