{"record":{"id":"6b62c3ffb83b702c","repo":"tinyhumansai/openhuman","slug":"tick-failed-e","errorCode":null,"errorMessage":"tick failed: {e}","messagePattern":"tick failed: (.+?)","errorType":"console","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"src/core/subconscious_cli.rs","lineNumber":152,"sourceCode":"        // Check provider availability\n        if let Some(reason) =\n            crate::openhuman::subconscious::provider::subconscious_provider_unavailable_reason(\n                &config,\n            )\n        {\n            eprintln!(\"[subconscious] provider unavailable: {reason}\");\n            return Err(anyhow!(\"provider unavailable: {reason}\"));\n        }\n\n        // Create engine and run tick. The engine pulls its own memory_diff /\n        // context state from the workspace — no memory client to pass in.\n        let engine = crate::openhuman::subconscious::memory_instance(&config);\n\n        eprintln!(\"[subconscious] running tick...\");\n        let result = engine\n            .tick()\n            .await\n            .map_err(|e| anyhow!(\"tick failed: {e}\"))?;\n\n        eprintln!(\n            \"[subconscious] tick complete: duration={}ms response_chars={}\",\n            result.duration_ms, result.response_chars,\n        );\n\n        if flags.verbose {\n            // Print the world baseline the next tick will diff against.\n            let baseline = crate::openhuman::subconscious::store::with_connection(\n                &config.workspace_dir,\n                |conn| {\n                    crate::openhuman::subconscious::store::get_baseline_checkpoint_id(\n                        conn, \"memory\",\n                    )\n                },\n            )\n            .unwrap_or(None);\n            match baseline {","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/tinyhumansai/openhuman/blob/a221052e0df5b1f7598fceba7329fd1af95d6699/src/core/subconscious_cli.rs#L134-L170","documentation":"Generic wrapper around `engine.tick().await` failing on the subconscious memory engine built from `subconscious::memory_instance(&config)`. The tick runs a tool-bearing LLM decision turn plus store I/O, so the inner `{e}` is typically: a model with no tool-use endpoint (TOOL_UNSUPPORTED_REASON from provider.rs:19), a rate-cap circuit-breaker halt (per-minute token cap, provider.rs:25), an HTTP/network failure against the provider, or a workspace store error reading the baseline checkpoint.","triggerScenarios":"`openhuman subconscious tick` with a chat model that lacks tool-use; a model whose provider rejects requests with 413/TPM caps; provider endpoint unreachable (Ollama not running, cloud outage); workspace_dir artifacts/DB unreadable so tick setup fails.","commonSituations":"User picked a small/local model for subconscious that cannot call tools; switching providers mid-circuit leaving the breaker halted for the old signature; Ollama daemon stopped; corrupt subconscious store in the workspace after a crash.","solutions":["Read the inner `{e}` in the printed error — it names the actual failing stage (tool-capability vs rate cap vs network).","If it is the tool-use reason, switch the subconscious model to a tool-capable one in Connections → API keys → LLM.","If it is the rate-cap halt, pick a higher-tier model/provider (the breaker auto-clears when the provider signature changes).","If network, confirm the provider endpoint is reachable (e.g. `ollama serve` is up) and retry the tick.","If store-related, verify workspace_dir is writable and rerun; check `openhuman subconscious status`."],"exampleFix":"# before: subconscious pinned to a tool-incapable model -> 'tick failed: ... no tool-use endpoint'\n# after: pick a tool-capable model\n[workload_models]\nsubconscious = \"gpt-4o\"   # any tool-calling model","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"let mut attempt = 0;\nloop {\n    match engine.tick().await {\n        Ok(result) => break result,\n        Err(e) if attempt < 3 && is_transient(&e) => {\n            attempt += 1;\n            tokio::time::sleep(Duration::from_secs(2u64.pow(attempt))).await;\n        }\n        Err(e) => return Err(anyhow!(\"tick failed: {e}\")),\n    }\n}\n\nfn is_transient(e: &anyhow::Error) -> bool {\n    let s = e.to_string();\n    s.contains(\"timeout\") || s.contains(\"connection\") || s.contains(\"network\")\n        // never retry permanent tool-capability / rate-cap halts\n        && !s.contains(\"tool-use\") && !s.contains(\"token limit\")\n}","preventionTips":["Pin the subconscious workload to a tool-capable model (TOOL_UNSUPPORTED_REASON is permanent).","Retry only transient (network/timeout) failures; rate-cap halts need a model/tier change and auto-clear when the provider signature changes.","Log duration/response_chars on success to baseline normal tick behaviour."],"tags":["rust","subconscious","inference","circuit-breaker","network"],"backgroundTag":null,"analyzedSha":"a221052e0df5b1f7598fceba7329fd1af95d6699","analyzedAt":"2026-08-16T12:47:06.542Z","schemaVersion":2},"datasetVersion":"2026-08-16T13:17:31.715Z"}