Reason codes¶
Codes are append-only: never renamed or removed. sqy explain <CODE> prints one.
| Code | Category | Meaning | What to do |
|---|---|---|---|
AGENTS_MD_UNMANAGED |
usage | AGENTS.md has no signalquarry:begin/end blocks, so there is nothing safe to refresh. | Compare it by hand with a fresh sqy init template, then keep the markers. |
ASSET_DATASET_INVALID |
data | An asset-keyed dataset has inconsistent identity, provenance, cutoff or raw-mark data. | Correct the versioned synthetic or normalized manifest; do not infer missing aliases, events or marks. |
BACKTEST_RANGE_EMPTY |
data | No sessions in the requested backtest range. | Widen --start/--end or fetch more data. |
BENCHMARK_DATA_MISSING |
data | No recorded dataset covers the declared benchmark for the run's sessions; results are shown without a comparison. | Run sqy data fetch --strategy <id> (it fetches the benchmark too) and repeat the command. |
BROKER_CREDENTIALS_REJECTED |
environment | The broker rejected the paper credentials. | Check the keys of the paper profile; use keys of a paper account. |
BROKER_NOT_PAPER_ONLY |
risk | A broker plugin returned a broker that does not declare paper_only = True. | Only paper brokers can be used; there is no live path. Fix or remove the plugin. |
BROKER_ORDER_REJECTED |
execution | The broker rejected an order. | The session is recorded as incomplete and retried on the next unchanged target. |
BROKER_ORIGIN_NOT_PAPER |
execution | A broker request targeted a host other than the Alpaca paper origin. | Only https://paper-api.alpaca.markets is supported. |
BROKER_PLUGIN_INVALID |
environment | A broker plugin's broker lacks part of the paper broker interface (listed in the detail). | Implement account, clock, positions, open_orders, order_by_client_id, submit, cancel and calendar. |
BROKER_REQUEST_FAILED |
execution | The broker returned an unexpected HTTP status. | Inspect the status in the summary and retry. |
BROKER_RESPONSE_INVALID |
execution | The broker response could not be parsed. | Retry; report it if it persists. |
BROKER_UNAVAILABLE |
execution | The broker did not answer (network error, 429 or 5xx). | Rerun later; submissions are resolved by client order id, never resubmitted blindly. |
BUNDLE_INVALID |
evidence | The evidence bundle failed verification. | See data.errors; bundles are never edited after export. |
CACHE_DIR_NOT_WRITABLE |
environment | The market-data cache directory cannot be written. | Set SIGNALQUARRY_CACHE_DIR to a writable directory. |
COMMITMENT_CODE_MISMATCH |
evidence | The opening does not reproduce the committed code digest. | The code tree differs from what was committed. |
COMMITMENT_DIGEST_MISMATCH |
evidence | The record's digest does not match its own fields. | The record was edited after creation. |
COMMITMENT_PROOF_PENDING |
evidence | The commitment has no timestamp proof yet. | Install the OpenTimestamps client (signalquarry[ots]) and run ots stamp on the record. |
COMMITMENT_RECORD_INVALID |
evidence | The commitment record is missing or malformed. | Pass the record JSON from evidence/commitments/. |
COMMITMENT_REVEAL_INVALID |
evidence | The opening file is missing or malformed. | Use the file written by sqy commit reveal. |
COMMITMENT_REVEAL_IS_PRIVATE |
evidence | A commitment opening reveals the configuration. | Share it only under NDA, for example in a data room. |
COMMITMENT_SALT_MISSING |
evidence | The private salt for this commitment is not on this machine. | Restore $SIGNALQUARRY_CONFIG_DIR/salts from your backup. |
COMMITMENT_SPEC_MISMATCH |
evidence | The opening does not reproduce the committed specification digest. | The configuration or salt differs from what was committed. |
CONFORMANCE_FAILED |
evidence | One or more sqy check conformance checks failed. |
Fix each failed check listed in data.strategies[].checks. |
CORPORATE_ACTION_UNSUPPORTED |
data | Fetched data contains an unmodelled corporate action, or one affected an open options position. | Exclude the period or underlying; data preparation or the run stops rather than guess. |
CREDENTIALS_FILE_PERMISSIONS_TOO_OPEN |
environment | credentials.toml is readable by other users. | Run chmod 600 on the credentials file. |
DATASET_SYMBOLS_MISSING |
data | The dataset lacks a declared symbol. | Fetch data for every symbol in data.symbols. |
DATA_CREDENTIALS_MISSING |
environment | No Alpaca market-data credentials were found. | Set APCA_API_KEY_ID and APCA_API_SECRET_KEY, or use the synthetic provider. |
DATA_CREDENTIALS_REJECTED |
environment | Alpaca rejected the market-data credentials (HTTP 401/403). | Check APCA_API_KEY_ID/APCA_API_SECRET_KEY; paper keys work for market data. |
DATA_EMPTY |
data | The provider returned no bars for the request. | Check symbols and the date range. |
DATA_IDENTITY_MISMATCH |
data | Cached pages rebuild to a different dataset than the manifest records. | Re-fetch; never edit manifests by hand. |
DATA_MANIFEST_INVALID |
data | A dataset manifest is malformed or its manifest_hash does not match. | Restore the manifest from version control or re-fetch. |
DATA_PAGE_CORRUPT |
data | A cached raw page no longer matches its recorded hash. | Delete the cache entry and re-fetch. |
DATA_PAGE_MISSING |
data | A raw page referenced by a manifest is not in the local cache. | Re-run sqy data fetch for that dataset. |
DATA_PANEL_INVALID |
data | A derived research panel is missing, malformed, or has a file-hash mismatch. | Rebuild the panel from verified cached pages and its dataset manifest. |
DATA_PANEL_LOOKBACK_INVALID |
usage | A research panel lookback must be a positive number of sessions. | Set lookback to a positive integer, or omit it for all prior sessions. |
DATA_PANEL_SYMBOL_INVALID |
data | A research panel request has duplicate or unavailable symbols. | Select each symbol once from the panel's recorded symbol list. |
DATA_QUALITY_FINDINGS |
data | The dataset quality report contains informational findings. | Review the report under data/quality and verify the affected dates before a study. |
DECISION_SYMBOL_NOT_DECLARED |
signal | A target used a symbol not declared in strategy.yaml data.symbols. | Declare the symbol or remove it from the target. |
DECISION_WEIGHT_ABOVE_LIMIT |
risk | A target weight exceeds limits.max_weight_per_symbol. | Lower the weight or raise the declared limit. |
DEPENDENCY_MISSING |
environment | A required runtime dependency cannot be imported. | Reinstall with pip install signalquarry. |
EVIDENCE_FAMILY_REQUIRED |
evidence | The per-family evidence layout needs a family for this log. | Pass the strategy family; this is a framework bug if it reaches you. |
EVIDENCE_INDEX_MISMATCH |
evidence | A family evidence log does not end where the project index last recorded it. | Restore the family log from version control; logs are append-only. |
EVIDENCE_LOG_CORRUPT |
evidence | An evidence log (trials, freezes or holdouts) was edited, truncated or reordered. | Restore evidence/ from version control; never edit it by hand. |
EVIDENCE_LOG_REWRITTEN |
evidence | An evidence log or paper journal was shortened, edited or deleted since the base revision. | Restore it from the base revision; evidence logs are append-only. |
EXPORT_FILE_TYPE_NOT_ALLOWED |
evidence | A file in the export has a type bundles may not carry. | Bundles carry JSON, Markdown, SVG and timestamp proofs only. |
EXPOSURE_DATA_MISSING |
data | One or more requested exposure references have no usable passive return curve over the run's sessions. | Fetch the named symbols on the strategy's feed over its sessions, or choose references with recorded data. |
FACTOR_EVALUATION_IDENTITY_INVALID |
data | A factor evaluation lacks a valid panel or membership identity. | Use verified panel and dated membership manifests before evaluation. |
FACTOR_EVALUATION_SESSIONS_INVALID |
data | Factor decision sessions are duplicated, unordered, or outside the panel. | Use strictly increasing decision sessions recorded in the panel. |
FACTOR_EVIDENCE_BUSY |
evidence | Another factor seal or formula trial writer holds the project's evidence lock. | Wait for that writer to finish, then retry; keep the project configuration fixed while writing. |
FACTOR_FAMILY_EMPTY |
usage | No registered factor belongs to the requested family. | Run sqy factor ls; a human must register a factor declaring this family before sealing it. |
FACTOR_HOLDOUT_DECLARATION_CHANGED |
evidence | Current factor declarations or dataset selection differ from the immutable family seal. | Review the recorded seal and current declarations; resealing cannot change the fixed values. |
FACTOR_HOLDOUT_UNDECLARED |
usage | The factor family declares neither holdout months nor a training cutoff. | Declare a holdout in factor.yaml before a human seals the family. |
FACTOR_HOLDOUT_UNSEALED |
evidence | The factor family has no recorded holdout seal. | Have a human run sqy factor holdout seal --family F --dataset-id D before research trials. |
FACTOR_ID_DUPLICATE |
usage | Two registered factor modules declare the same id. | Give each project factor a unique id. |
FACTOR_IMPORT_FAILED |
signal | A registered factor module could not be imported. | Fix the module import and its dependencies in the project environment. |
FACTOR_LABEL_ACTIONS_INVALID |
data | A modeled split or cash dividend is invalid or duplicated for the requested outcomes. | Verify action terms and resolve conflicting same-symbol, same-date records before labeling outcomes. |
FACTOR_LABEL_ALIGNMENT_INVALID |
data | Factor scores and outcome labels have incompatible identities or shapes. | Derive labels from the same dated panel and align sessions and symbols exactly. |
FACTOR_LABEL_HORIZONS_INVALID |
data | A factor outcome horizon or forward-return array is invalid. | Use positive horizons and finite, shape-aligned returns no lower than -100%. |
FACTOR_MODULE_INVALID |
signal | A factor module must be inside the project and define exactly one @factor function. | Keep one decorated score function in each registered project module. |
FACTOR_NOT_FOUND |
usage | No registered factor has that id. | Run sqy factor ls or add the module to signalquarry.toml. |
FACTOR_PARAMS_INVALID |
usage | Declared factor parameters do not validate against its Params model. | Fix factor.yaml params or the factor's Params declaration. |
FACTOR_PORTFOLIO_UNAVAILABLE |
data | No eligible factor scores or prior-only factor weights are available for this decision. | Provide completed factor history and a prior-cutoff weight row, or use equal weights. |
FACTOR_REDUNDANCY_ALIGNMENT_INVALID |
data | Factor scores cannot be compared across different datasets, dates, or universes. | Compare factors scored on identical panel and membership identities. |
FACTOR_REPORT_CONFIGURATION_CHANGED |
evidence | The factor configuration changed between evaluation and report rendering. | Rerun sqy factor report with the factor configuration held fixed. |
FACTOR_REPORT_WRITE_FAILED |
environment | The descriptive factor report could not be written to a new directory. | Check project permissions and available disk space, then rerun sqy factor report. |
FACTOR_SEARCH_BUDGET_EXHAUSTED |
evidence | The requested formula search exceeds the remaining family trial budget. | Reduce the search budget or have a human extend the family budget before searching. |
FACTOR_SEARCH_CONFIG_INVALID |
usage | Formula-search settings are invalid or exceed the configured bounds. | Use a bounded seed, horizon, FDR threshold, and family trial budget. |
FACTOR_SEARCH_INPUT_INVALID |
data | Formula search needs aligned, dated panel, universe, and synthetic outcome inputs. | Provide immutable training rows, dated eligibility, and forward-label end sessions through the cutoff. |
FACTOR_SEARCH_INPUT_UNVERIFIED |
evidence | Formula-search inputs have not passed the required identity, provenance or significance checks. | Verify input manifests, bind normalized formula identity and grammar, and provide a finite p-value in [0, 1]. |
FACTOR_SPEC_INVALID |
usage | A registered factor's metadata is invalid. | Fix the reported factor.yaml field and schema version. |
FACTOR_SPEC_MISSING |
usage | factor.yaml is missing next to a registered factor module. | Add a factor.yaml with an id, family, version, hypothesis and parameters. |
FACTOR_SPEC_NOT_A_MAPPING |
usage | factor.yaml must contain a YAML mapping. | Use key-value fields matching signalquarry.factor/v1. |
FACTOR_TRAINING_WINDOW_INVALID |
evidence | The training cutoff cannot establish the required session gap before the factor holdout. | Use a dataset session at least the longest label horizon before the first sealed session. |
FACTOR_UNIVERSE_INVALID |
data | A factor universe has duplicate, empty, or unavailable symbols. | Supply distinct symbols that exist in the verified panel. |
FACTOR_UNIVERSE_TIMING_INVALID |
data | A factor universe was not observed by its decision cutoff. | Use timezone-aware observation and cutoff times from verified manifests. |
FREEZE_REQUIRED |
evidence | The configuration is not frozen, so claims stay at in_sample and the holdout stays closed. | Run sqy spec freeze --strategy <id> before evaluating. |
FREEZE_STALE |
evidence | The strategy changed after its last freeze. | Freeze again; the new configuration counts as a new trial. |
GATE_FAILED |
evidence | A qualification gate did not pass. | Report the failed gate; do not relax gates. Try a new hypothesis. |
HOLDOUT_CLIPPED |
evidence | The backtest stopped before the sealed holdout. | Expected after sqy spec freeze; the holdout is only for sqy evaluate --holdout. |
HOLDOUT_REQUIRES_GATES |
evidence | The holdout can only be opened after G1-G3 pass. | Report the failed gates; form a new hypothesis rather than tuning. |
HOLDOUT_REUSED |
evidence | The sealed holdout for this family was already opened once. | Start a new hypothesis family; claims stay capped at walk_forward. |
HUMAN_ACTION_RECORDED |
evidence | A human-only action was recorded in the evidence log. | Agents must not run human-only commands such as trials extend. |
INSUFFICIENT_HISTORY |
data | Fewer completed sessions than the strategy's declared lookback. | Fetch more history or shorten the lookback. |
INSUFFICIENT_SETTLED_CASH |
execution | A cash-account buy was reduced to the settled cash available. | Expected with cash accounts; use account.model: margin to spend unsettled proceeds. |
INTERNAL_ERROR |
environment | An unexpected error inside SignalQuarry (a bug, or a broken installation). | Run sqy doctor; report the bug with the trace id and the traceback printed on stderr. |
MARGIN_MODEL_WOULD_BORROW |
execution | A margin-account buy would require borrowing. | SignalQuarry never borrows; this indicates an engine bug. Please report it. |
OPTIONS_CHAIN_EMPTY |
data | The provider returned no option quotes for that underlying and window. | Check the symbol, widen --width or --max-dte, and record during market hours. |
OPTIONS_DELAY_STRESS_UNSUPPORTED |
usage | The options simulator has no execution-delay model. | Options stress tests vary costs only. |
OPTIONS_HISTORY_UNAVAILABLE |
data | The provider does not return daily bars for expired option contracts in that month. | Options backtests keep using modelled prices (low evidence); rely on paper forward tests. |
OPTIONS_RECORDED_CHAINS_USED |
data | Recorded provider quotes replaced modelled option prices on some sessions (count after the colon). | Informational: recorded sessions use real bid/ask snapshots; the rest stay modelled (low evidence). |
OTS_CLIENT_MISSING |
environment | The OpenTimestamps client is not installed, so new commitments stay unstamped (pending). | Install it with pip install 'signalquarry[ots]' where commitments are made (the paper host). |
PAPER_ACCOUNT_BLOCKED |
risk | The paper account is not active or trading is blocked. | Check the account in the Alpaca dashboard. |
PAPER_ACCOUNT_MISMATCH |
risk | The broker account differs from the deployment's expected or armed account. | Use the deployment's own paper account; re-arm after an intentional switch. |
PAPER_ACTIVITY_CACHE_UNSAFE |
risk | The private paper activity cache is inside the project or has unsafe permissions. | Choose a private cache outside the project with owner-only directory and file permissions. |
PAPER_ACTIVITY_CAPTURE_INCOMPLETE |
execution | The account activity capture reached its page limit before the final page. | Capture a shorter creation-time window; do not treat the partial response as evidence. |
PAPER_ARM_EXPIRED |
execution | The arm token expired. | A human re-arms with sqy paper arm. |
PAPER_ARM_NOT_CONFIRMED |
execution | The arm confirmation did not match the alias. | Type the alias exactly to confirm. |
PAPER_ARM_REQUIRES_HUMAN |
execution | Arming needs a human at an interactive terminal. | Agents must not arm paper trading; ask the owner. |
PAPER_ARM_STALE |
execution | The strategy configuration or freeze changed since arming. | Freeze the new configuration; a human re-arms. |
PAPER_BACKUP_INVALID |
usage | The backup archive is unreadable or belongs to another deployment. | Pass a tar.gz written by sqy paper backup for this alias. |
PAPER_BROKER_PLUGIN_NOT_FOUND |
environment | The paper config names a broker plugin that is not installed. | Install the package that provides it (sqy doctor lists broker plugins) or fix broker:. |
PAPER_BROKER_SIMULATED |
execution | The deployment uses the offline simulated broker, which cannot be armed or submit orders. | Use broker: alpaca-paper with a dedicated paper account for forward tests. |
PAPER_CANCEL_UNCONFIRMED |
execution | A cancel request was not confirmed yet. | Rerun; the kernel waits for a terminal status. |
PAPER_CLOCK_SKEW |
risk | The local clock differs from the broker clock beyond the guard. | Synchronize the host clock (NTP). |
PAPER_CONFIG_INVALID |
usage | The paper deployment config failed validation. | Fix the field named in the summary; run sqy schema paper. |
PAPER_CONFIG_NOT_FOUND |
usage | No paper deployment config with that alias exists. | Create paper/sqy init). |
PAPER_CONTINUITY_BROKEN |
risk | The live journal does not extend the backup: history was rolled back or rewritten. | Investigate the host; restore the journal from the backup and re-arm. |
PAPER_CORPORATE_ACTION_PENDING |
execution | A corporate action or its cash credit has not appeared at the broker yet. | Wait for the broker to apply the action or credit, then rerun. |
PAPER_CORPORATE_ACTION_UNRECONCILED |
risk | Broker positions or activities do not prove the expected corporate-action effects. | Keep paper submission halted; review the event terms, broker activity, asset mapping and journal. |
PAPER_CREDENTIALS_MISSING |
environment | No credentials were found for the deployment's paper profile. | Add [paper. |
PAPER_DATA_STALE |
execution | The previous session's bars are not available yet. | Rerun later in the window. |
PAPER_DATA_UNAVAILABLE |
execution | Market data for the session could not be loaded. | Check data credentials and connectivity; rerun. |
PAPER_DRAWDOWN_HALT |
risk | Equity fell more than the daily drawdown guard. | The deployment halted; review, then a human re-arms. |
PAPER_EXECUTION_DELAY_UNSUPPORTED |
usage | Paper deployments execute at the next open; execution_delay_sessions must be 0. | Use the delay only for backtest stress runs. |
PAPER_FRACTIONAL_UNSUPPORTED |
usage | Market-on-open paper orders need whole shares. | Set execution.sizing to whole_shares for paper deployments. |
PAPER_HALTED |
risk | The deployment is halted. | Review the halt reason; a human re-arms with sqy paper arm to resume. |
PAPER_JOURNAL_CORRUPT |
risk | The deployment journal's hash chain does not verify. | Restore the journal from backup; never edit it by hand. |
PAPER_KEY_DENIED |
risk | The paper key is on the deployment's deny-list (it belongs to another deployment). | Use this deployment's own paper account keys. |
PAPER_KIND_UNSUPPORTED |
usage | This paper runner does not trade this strategy kind. | Options deployments use the options runner. |
PAPER_NOT_ARMED |
execution | Paper trading is disabled until a human arms the deployment. | A human runs sqy paper arm --reason ... after reviewing the evidence. |
PAPER_NO_SESSION_TODAY |
execution | The market has no session today. | None; the scheduler retries on the next session. |
PAPER_OPEN_ORDERS |
execution | Own orders are still open. | Retry after they fill, expire or are canceled. |
PAPER_ORDER_NOT_FOUND |
execution | A journaled order intent never reached the broker. | None; it is recorded as not submitted. |
PAPER_OUTSIDE_WINDOW |
execution | The command ran outside the pre-open submission window. | Schedule run-once inside the configured window (default 09:00-09:25 ET). |
PAPER_PARITY_MISMATCH |
risk | Replaying a paper session through the engine produced a different decision or orders. | Investigate before trusting the forward record; G5 cannot pass with a mismatch. |
PAPER_PENDING_ORDERS |
execution | Journaled orders are not finalized yet. | Run sqy paper reconcile. |
PAPER_POSITION_DRIFT |
risk | Broker positions differ from the journal in a way fills and splits cannot explain. | The deployment halted; investigate, then a human re-arms. |
PAPER_RUN_GAVE_UP |
execution | paper run stopped retrying before run-once succeeded. | Check the reason codes; the scheduler retries on the next tick. |
PAPER_SESSION_ALREADY_COMPLETED |
execution | Today's session was already submitted. | None; run-once is idempotent. |
PAPER_STALE_ORDER_CANCELED |
execution | An own order from an earlier session was still open and was canceled. | None; the target is retried. |
PAPER_STRATEGY_FAILED |
risk | The strategy raised or broke its contract during a paper session. | The deployment halted; fix and re-freeze, then a human re-arms. |
PAPER_STRATEGY_TIMEOUT |
risk | The strategy's decide step exceeded its time limit in the isolated process. | The deployment halted; make decide faster, re-freeze, then a human re-arms. |
PAPER_SUBMISSION_DISABLED |
execution | The deployment config has submission: disabled. | A human sets submission: enabled after review. |
PAPER_UNMANAGED_ORDERS |
risk | The account has open orders this deployment did not create. | Cancel them or use a dedicated paper account per deployment. |
PAPER_UNMANAGED_POSITION |
risk | The account holds positions outside the strategy's symbols. | Close them or use a dedicated paper account per deployment. |
PERF_FEED_INVALID |
evidence | The existing feed file is not a performance snapshot, so the new one cannot chain to it. | Move the file aside (a new chain starts) or restore the published snapshot. |
PERF_PUBLISH_DENIED |
evidence | The family's publication policy does not allow a live performance feed. | Set live_feed: allow for a non-commercial family; commercial families publish lagged exports only. |
PRICE_MISSING |
data | No price for a symbol on the execution session; the order waits. | Check data coverage for the symbol. |
PROJECT_CHANGED_DURING_RUN |
evidence | A worker process rebuilt a configuration from the project's files and did not arrive at the configuration or dataset that was checked: the project changed while the command was running. | Leave the project's files alone while --jobs is in use, then run the command again; a study reuses the arms that completed. |
PROJECT_CONFIG_INVALID |
usage | signalquarry.toml could not be parsed or has invalid values. | Fix the reported field in signalquarry.toml. |
PROJECT_DIR_NOT_EMPTY |
usage | sqy init only creates projects in a new or empty directory. |
Choose a new directory name. |
PROJECT_NOT_FOUND |
usage | No signalquarry.toml in this directory or its parents. | Run sqy init <dir> or pass --project. |
PROVIDER_PAGINATION_LIMIT |
data | The request needed more pages than allowed. | Fetch fewer symbols or a shorter range at a time. |
PROVIDER_PAGINATION_LOOP |
data | The provider repeated a page token. | Retry later; the partial download was discarded. |
PROVIDER_REQUEST_FAILED |
data | The provider returned an unexpected HTTP status. | Check symbols, dates and plan entitlements (SIP needs 15-minute-old data on free plans). |
PROVIDER_RESPONSE_INVALID |
data | A provider response was malformed or contained impossible values. | Retry later; report the endpoint if it persists. |
PROVIDER_UNAVAILABLE |
data | The configured data provider is not available yet. | Use provider = "synthetic" in signalquarry.toml, or fetch data first. |
PUBLICATION_FAMILY_MISMATCH |
usage | A published strategy belongs to a different family. | List only strategies of this family. |
PUBLICATION_INVALID |
usage | The publication policy failed validation or breaks a disclosure cap. | Fix the field named in the summary; commercial families are category-tier. |
PUBLICATION_NOT_FOUND |
usage | The family has no publication policy, so nothing may be exported. | Create publication/FAMILY.publication.yaml (default-deny). |
PUBLICATION_STRATEGY_UNKNOWN |
usage | The publication policy names a strategy the project does not define. | Use strategy ids from strategy.yaml. |
PYTHON_ARCH_EMULATED |
environment | Python is running under Rosetta emulation on Apple Silicon. | Use a native arm64 Python build. |
PYTHON_VERSION_UNSUPPORTED |
environment | SignalQuarry needs Python 3.12 or newer. | Install Python 3.12+ and recreate the environment. |
QUALITY_GAP |
data | A symbol has an internal gap longer than the configured session threshold. | Investigate the reported gap dates and recover missing bars when available. |
QUALITY_OHLC_INCONSISTENT |
data | Present bars have open or close outside the low-high range or low above high. | Verify the affected source bars and correct or refetch inconsistent data. |
QUALITY_PRICE_NONPOSITIVE |
data | Present bars contain a nonpositive OHLC price. | Verify the source bars and replace invalid prices with corrected provider data. |
QUALITY_SESSION_ON_HOLIDAY |
data | The dataset records a weekday session on a known NYSE closure. | Verify the reported dates against provider timestamps and the trading calendar. |
QUALITY_SESSION_ON_WEEKEND |
data | The dataset records a session on a weekend. | Check provider timestamps and session-date normalization for the reported dates. |
QUALITY_STALE_CLOSE |
data | A symbol has consecutive identical raw closes meeting the stale-run threshold. | Investigate the reported run for illiquidity or stale provider bars. |
QUALITY_SYMBOL_EMPTY |
data | A selected symbol has no present bars in the dataset. | Verify the symbol and fetch its required history before studying it. |
QUALITY_TRADING_DAY_MISSING |
data | A known NYSE trading day is absent between the dataset's first and last sessions. | Check provider coverage and fetch missing dates when available. |
QUALITY_UNEXPLAINED_MOVE |
data | A symbol has a large close-to-close move unexplained by recorded splits. | Verify the source bars and corporate actions around the reported session. |
QUALITY_ZERO_VOLUME |
data | Present bars contain nonpositive or undefined volume. | Check whether the reported sessions traded and verify the provider's volume fields. |
REASON_CODE_UNDECLARED |
signal | A strategy returned a reason code it did not declare in strategy.yaml. | Declare the code under reason_codes in strategy.yaml. |
REASON_CODE_UNKNOWN |
usage | The code is not a framework or declared strategy reason code. | Check spelling; codes are UPPER_SNAKE_CASE. |
REPORT_CONFIGURATION_CHANGED |
evidence | The reported runs used a different configuration than the current code and spec. | Rerun the backtest and evaluation for the current configuration. |
REPORT_NO_RUNS |
usage | There is no backtest or evaluation run to report on. | Run sqy backtest --strategy <id> (and sqy evaluate) first. |
RUNS_NOT_COMPARABLE |
evidence | The runs differ in dataset, sessions, account or evidence grade, so nothing was differenced or ranked. | Compare runs produced on the same dataset and window with the same account; see data.reasons. |
RUN_ARTIFACT_INVALID |
evidence | A run's result document or equity curve is missing, unreadable or no longer matches its recorded hash. | Do not edit .signalquarry/runs/; repeat the backtest to produce the run again. |
RUN_LEASE_BUSY |
execution | Another run holds the deployment lease. | Retry after the running command finishes. |
RUN_NOT_FOUND |
usage | No run directory has that id. | Run sqy runs ls to list run ids. |
SCHEDULE_GITHUB_ACTIONS_DEMO_ONLY |
execution | GitHub Actions schedules are delayed and best-effort; use them for demos only. | Use systemd on a small VM (or launchd/cron on an always-on host) for forward tests. |
SCHEMA_UNKNOWN |
usage | No bundled schema has that name. | Run sqy schema to list schema names. |
STALE_OBSERVATIONS |
data | The latest completed bar is older than the declared staleness limit. | Refresh data with sqy data fetch. |
STRATEGY_ID_DUPLICATE |
signal | Two strategies share one id. | Give each strategy.yaml a unique id. |
STRATEGY_IMPORT_FAILED |
signal | A strategy module could not be imported. | Fix the import error shown in the detail. |
STRATEGY_KIND_MISMATCH |
usage | The strategy decorator does not match strategy.yaml's kind. | Use @options_strategy for kind options_single_leg and @strategy for equity_daily. |
STRATEGY_LOOKBACK_INVALID |
signal | lookback(params) must return a positive integer. | Fix the lookback in @strategy. |
STRATEGY_MODULE_INVALID |
signal | A strategy module must define exactly one @strategy function. | Keep one decide function per module. |
STRATEGY_NOT_FOUND |
usage | No loaded strategy has that id. | Run sqy check to list strategies, or add the module to signalquarry.toml. |
STRATEGY_PARAMS_INVALID |
signal | strategy.yaml params do not validate against the Params class. | Make params match the Params fields and bounds. |
STRATEGY_RAISED |
signal | The strategy's decide function raised an exception during a backtest; the detail names the session, the exception type and its message. | Fix the strategy code. SYMBOL_NOT_DECLARED means it read a symbol that data.symbols in strategy.yaml does not list. sqy check runs the same function under conformance checks. |
STRATEGY_RETURNED_NON_DECISION |
signal | decide() must return a Decision. | Return Decision.target, Decision.hold or Decision.unavailable. |
STRATEGY_SPEC_INVALID |
signal | strategy.yaml does not match signalquarry.strategy/v1. | Fix the fields named in the detail. |
STRATEGY_SPEC_MISSING |
signal | strategy.yaml is missing next to the strategy module. | Add strategy.yaml next to strategy.py. |
STRATEGY_STATE_NOT_SERIALIZABLE |
signal | Strategy state must be canonical JSON (string keys, finite numbers, aware datetimes). | Store plain JSON values in state. |
STRATEGY_STATE_TOO_LARGE |
signal | Strategy state exceeds 16 KB of canonical JSON. | Keep state small; recompute from bars instead. |
STUDY_ARM_INVALID |
usage | An arm of the study cannot be built: invalid parameters or execution settings, a variant that changes nothing, or a baseline the dataset does not cover. | Correct the arm named in the summary. |
STUDY_BENCHMARK_UNDECLARED |
usage | The strategy declares no benchmark, so the scaffolded benchmark baseline has no symbol yet. | Give the baseline a symbol, or declare benchmark in strategy.yaml. |
STUDY_DATASET_MISMATCH |
data | The study pins a dataset other than the one its subject strategy resolves to. | Fetch or select the pinned dataset, or update dataset in the study file (that makes a new study). |
STUDY_DETERMINISM_FAILED |
evidence | Recomputing an arm gave a different ledger than the run recorded earlier for the same configuration, dataset and window. | Do not use either result. Check that the strategy is pure (sqy check) and that the cached data verifies (sqy data verify). |
STUDY_EXISTS |
usage | A study file with that id already exists. | Choose another id or edit the existing file. |
STUDY_FILE_CHANGED |
evidence | The study file was edited after the result shown was produced, so the result belongs to a different study. | Run the study again to get a result for the current file. |
STUDY_NOT_FOUND |
usage | The project has no studies/<id>/study.yaml with that id. |
Run sqy study ls, or create one with sqy study init --strategy <id> --id <study>. |
STUDY_NO_RESULT |
usage | The study has not been run yet. | Run sqy study run --study <id>. |
STUDY_SPEC_INVALID |
usage | The study file does not satisfy the signalquarry.study/v1 contract. |
Fix the field named in the summary; the id must match the directory name. |
SWEEP_RESULTS_ARE_IN_SAMPLE |
evidence | Sweep results are in-sample and raise the trial count. | Pick a configuration by reasoning, freeze it, then evaluate. |
SWEEP_TOO_LARGE |
usage | The parameter grid has too many points. | Sweep fewer, better-reasoned values; each point on real data is a trial. |
TRIAL_BUDGET_EXHAUSTED |
evidence | The family's trial budget is used up. | Stop, or have a human run sqy trials extend --reason. |
TRIAL_BUDGET_NEARLY_USED |
evidence | The family has used at least 80% of its trial budget. | Spend the remaining trials on the best-reasoned ideas; extending the budget is a recorded human decision. |
TRIAL_NOT_FOUND |
usage | No trial ledger entry matches that sequence number or configuration-hash prefix. | Run sqy trials ls to see the entries. |
UNIVERSE_ASOF_UNAVAILABLE |
data | No verified asset snapshot was captured by the requested cutoff within the freshness window. | Capture snapshots prospectively; historical dates need an independently sourced point-in-time archive. |
UNIVERSE_CLASSIFICATION_INVALID |
data | A dated instrument classification snapshot is malformed, incomplete, or inconsistent with asset IDs. | Supply a complete, hashed classification snapshot keyed by the stable asset IDs in the asset snapshot. |
UNIVERSE_INPUT_UNAVAILABLE |
data | A required asset, classification, or market-data observation is missing, stale, or later than the cutoff. | Capture the inputs prospectively and rebuild with a decision cutoff after all required observations. |
USAGE_INVALID |
usage | The command line could not be parsed. | Run sqy commands or sqy <command> --help. |
VCS_DIRTY |
evidence | The project had uncommitted changes when frozen. | Commit before freezing so the frozen code is recoverable. |
VOLUME_CAPPED |
execution | An order was reduced to the fill model's share of that session's volume. | The rest is retried next session; lower weights or accept slower fills for illiquid symbols. |