helixordevelopers

Troubleshooting

Find the symptom, confirm the cause, apply the fix. Every error the runtime raises names what failed; start with the exception type.

Installation#

SymptomCauseFix
pip install helixor-runtime finds no packageThe package is not on the public index yet.Install the wheel from your evaluation access. See Installation.
Import crashes on Python 3.143.14 is not yet supported.Use Python 3.9 to 3.13; 3.11 is the tested version.
Process aborts on import on macOS with an OpenMP "duplicate library" messageTwo numeric libraries in the environment each load their own OpenMP runtime.Use a clean virtual environment. As a stopgap, set KMP_DUPLICATE_LIB_OK=TRUE.
ModuleNotFoundError: fastapi or websocketsService dependencies missing from a trimmed environment.Reinstall the runtime with its dependencies.

Licenses#

ErrorCauseFix
LicenseSignatureInvalidErrorThe file was edited, truncated, re-encoded, or is not a Helixor license.Use the file exactly as issued. Check line endings if it passed through a secret store.
LicenseExpiredErrorPast valid_until plus the grace period, or the host clock is wrong.Renew, then recompile or re-download packs. Check the host's time sync.
LicenseNotYetValidErrorBefore valid_from, usually a clock running behind.Fix time sync.
LicenseEntitlementErrorThe license does not cover the pack ID or a solver the pack uses.helixor-pack inspect-license and compare its pack patterns with the pack ID.
CLI: "No license file provided and default ... not found"No license in the search path.Pass --license or set HELIXOR_LICENSE_FILE.

Packs#

ErrorCauseFix
PackUnsealError: content key mismatchThe pack was compiled for a different license, or before a renewal.Recompile or re-download with the license you are running.
PackUnsealError: bad magic, version or integrityTruncated or corrupted file, or not a pack.Re-fetch the artifact and compare its SHA-256 with the one you recorded at build time.
CompilerError: mapping values are not allowed hereAn unquoted value containing : in the playbook.Quote the value. See Playbooks.
FileNotFoundError from HelixorEngine.load_packThe pack or the license file does not exist at the path given.Fix the path. load_pack never falls back to the built-in pack.
UnsupportedPackDeclarationError at compile or loadThe playbook declares something a compiled pack does not execute: your own codons or hard_rules, a rule type other than regex or luhn_checksum, an action other than block or redact, a rule without id, or an invalid pattern.Read the listed problems; express the logic as supported rules. See Playbooks.
EnclaveCapabilityError from compile_custom_ruleThe engine runs a sealed pack, whose rules are fixed. In the next release the method is removed and the call raises RemovedCapabilityError.Add the rule to the playbook and compile again.
UnsupportedPackDeclarationError at compile, or PackDeclarationUnsealError at load: "actions does not declare …" (next release)The playbook lists actions but leaves out an action the pack can return, often the built-in ones.List every action named in the error, or omit actions, and compile again. See Playbook schema.
DecisionBudgetExceededError (next release)A decision took longer than the pack's budget.max_latency_ms. The result is withheld.Treat it as no decision. Raise the budget if it is tighter than your host can meet.
Two different inputs have the same receiptKnown issue in 0.2.1: compiled-pack receipts hash clean_text, which is the same for every input a block rule replaces whole. Fixed in the next release.Log your own request ID next to the receipt.

Evaluation#

SymptomCauseFix
Several triggers, but the action names only one ruleEvery match is reported; the first fatal match decides the action. By design.Explain with action and reason; report everything found from triggers.
CodonRuntimeError from evaluate() on a dictThe dict has no text, message or payload key, or its value is not a string.Pass a string, or put the text under one of those keys. See Evaluating decisions.
AmbiguousPayloadError from evaluate() on a dict (next release)The dict has more than one key, so evaluating one field would leave the others unchecked.Pass the text as a string, or a dict with exactly one of text, message, payload.
LicenseExpiredError from evaluate() on a running compiled packThe license passed its grace period while the process was running.Deploy a renewed license and packs recompiled for it.
A 16-digit number is not treated as a cardIt fails the Luhn check.Expected. Use a real test number such as 4111-1111-1111-1111.
CommunityEditionRestrictionErrorcompile_custom_rule on the Community tier.Put the rule in a playbook and compile it with a Developer license. See Add custom rules.
DeveloperQuotaExceededErrorPer-minute or lifetime limit reached on a strict Developer license. In 0.2.1 only the built-in example pack enforces the limits; in the next release compiled packs enforce them too.Slow down, or move to a tier without limits.
Wall-clock time is much higher than latency_uslatency_us covers evaluation only. The first call in a process is also slower.Measure end to end; warm the engine at startup with one clean evaluation.

Streaming and services#

SymptomCauseFix
The last words of a stream never arriveflush() was not called.Call session.flush() when the source ends.
StreamBlockedError: Stream blocked by statutory invariantA fatal rule fired inside stream_filter or astream_filter.Expected; catch it and end the response.
ServerConfigurationError: Refusing to bind '0.0.0.0' without authenticationA non-loopback host without a service token.Pass --token or set HELIXOR_SERVICE_TOKEN, or bind 127.0.0.1.
401 Missing or invalid bearer tokenThe service has a token and the request did not send it.Send Authorization: Bearer <token>. GET /v1/health needs no token.
400 "per-request license_key is not accepted"The service serves a compiled pack; a request cannot bring its own license.Drop license_key from the request.
Browser calls fail with a CORS errorCross-origin access is off by default.List the origin in HELIXOR_CORS_ORIGINS. A wildcard is rejected.
WebSocket keeps streaming after a blocked tokenKnown issue in 0.2.1: the next stream_chunk starts a new session. Fixed in the next release: later chunks get an error with code STREAM_BLOCKED.Close the connection on blocked: true.

Known issues and fixes#

Every defect documented for 0.2.1, and its status. "Fixed on main" means the fix is merged in the source and ships in the next runtime release; no release has been cut, so a 0.2.1 install still behaves as described on the page linked, and the workaround there still applies.

Runtime#

IssueAffects 0.2.1Status
WebSocket stream continues after a blocked token (Services)YesFixed on main
A blocked value can stay in a compiled pack's clean_text (Playbook schema)YesFixed on main
A regex rule with capturing groups reports and redacts only the first groupYesFixed on main
Compiled-pack receipts hash clean_text, so different inputs share a receipt (Receipts)YesFixed on main: one receipt recipe for both engines
compile_custom_rule() has no public engine it runs on, and does not redact its matchYesFixed on main: removed, raises RemovedCapabilityError
evaluate(dict) evaluates one text field and ignores the rest (Evaluating decisions)YesFixed on main: a dict with more than one key raises AmbiguousPayloadError
Compiled packs accept actions, default_action and budget without enforcing themYesFixed on main
Compiled packs do not enforce the license's per-minute and lifetime decision limitsYesFixed on main
Manifest merkle_root is a placeholder; the contact rule's factor names one field (Pack manifest)YesFixed on main
Package metadata does not match the code: distribution name and versionYesFixed on main: helixor-runtime, version taken from __version__. Publishing to the public index is still Planned
Importing the runtime loads the GPU solver's libraries, about 0.9 s (Benchmarks)YesFixed on main: import measured at 107 to 109 ms
Cold start above the 100 ms targetYesOpen: still above 100 ms on main
HelixorBeliefLedger has no snapshot or restore (Outcome memory)YesFixed on main: snapshot() and restore()
Generated Python and Java clients: caller-supplied action, one cause in the counterfactual, Java isApproved() false for clean payloads, placeholder proof (Java)YesFixed in the SDK generator. The client bundled with the runtime has not been regenerated, so it is still open there

Hosted reasoning service Preview#

IssueAffectsStatus
/v1/decide: p_correct not calibrated, abstentions reported as answers, composed built on abstained questions, require.* and unknown questions ignored (Reasoning service)Service builds before 2026-09-28Fixed on main
Learning loop: a version whose disposition_bands keys are not alphabetical becomes unreadable after a restart (Learning loop)Service builds before 2026-09-28Fixed on main
Learning loop: built-in default golden cases and exception clauseService builds before 2026-09-28Fixed on main: both come from the pack or the request
Playbook turn response does not name the pack version that decidedService builds before 2026-09-28Fixed on main: pack_version, pack_digest, pack_source
Playbook turn takes tenant_id from the request body; outcomes and evolve not scoped to the tenantService builds before 2026-09-28Fixed on main: tenant from your credentials, conflicting tenant refused with 403 tenant_mismatch

Still stuck?#

Email hello@helixor.ai with the runtime version (helixor_runtime.__version__), Python version, the exception type and message, and the output of helixor-pack inspect-license (it shows no key material; remove the contact email line). Never include license files, packs or real payloads.