tinyhumansai/openhuman · error · anyhow::Error
tick failed: {e}
Error message
tick failed: {e} What it means
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.
Source
Thrown at src/core/subconscious_cli.rs:152
// Check provider availability
if let Some(reason) =
crate::openhuman::subconscious::provider::subconscious_provider_unavailable_reason(
&config,
)
{
eprintln!("[subconscious] provider unavailable: {reason}");
return Err(anyhow!("provider unavailable: {reason}"));
}
// Create engine and run tick. The engine pulls its own memory_diff /
// context state from the workspace — no memory client to pass in.
let engine = crate::openhuman::subconscious::memory_instance(&config);
eprintln!("[subconscious] running tick...");
let result = engine
.tick()
.await
.map_err(|e| anyhow!("tick failed: {e}"))?;
eprintln!(
"[subconscious] tick complete: duration={}ms response_chars={}",
result.duration_ms, result.response_chars,
);
if flags.verbose {
// Print the world baseline the next tick will diff against.
let baseline = crate::openhuman::subconscious::store::with_connection(
&config.workspace_dir,
|conn| {
crate::openhuman::subconscious::store::get_baseline_checkpoint_id(
conn, "memory",
)
},
)
.unwrap_or(None);
match baseline {View on GitHub (pinned to a221052e0d)
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`.
Example fix
# before: subconscious pinned to a tool-incapable model -> 'tick failed: ... no tool-use endpoint' # after: pick a tool-capable model [workload_models] subconscious = "gpt-4o" # any tool-calling model
Defensive patterns
Strategy: retry
Try / catch
let mut attempt = 0;
loop {
match engine.tick().await {
Ok(result) => break result,
Err(e) if attempt < 3 && is_transient(&e) => {
attempt += 1;
tokio::time::sleep(Duration::from_secs(2u64.pow(attempt))).await;
}
Err(e) => return Err(anyhow!("tick failed: {e}")),
}
}
fn is_transient(e: &anyhow::Error) -> bool {
let s = e.to_string();
s.contains("timeout") || s.contains("connection") || s.contains("network")
// never retry permanent tool-capability / rate-cap halts
&& !s.contains("tool-use") && !s.contains("token limit")
} Prevention
- 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.
When it happens
Trigger: `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.
Common situations: 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.
Related errors
- learning_save_profile: summarisation failed: {e:#}
- unknown mode '{other}', expected simple|aggressive
- provider unavailable: {reason}
- learning_enrich_profile: {e:#}
- Invalid ${paramName}: must be an array of IDs.
AI-assisted analysis of tinyhumansai/openhuman@a221052e0d (2026-08-16).
Data as JSON: /api/errors/6b62c3ffb83b702c.
Report an issue: GitHub.