Troubleshooting
"Setup required" or provider errors
- Run
/connectand verify your API key. - Run
/modelsand ensure selected model exists for that provider. - If using local endpoint, verify it responds to
/v1/models.
"No providers connected"
- Use
/connectand choose a provider. - For LM Studio/Ollama/llama.cpp/vLLM, choose
Local endpoints (LM Studio/Ollama/llama.cpp/…)and enter the endpoint (for examplelocalhost:1234). You can add several endpoints; when prompted for an API key, press enter to skip it unless the server requires one. - Then use
/modelsand select a model.
Token budget exceeded or context blocked
- Increase budget with
/budget <n>or disable limit with/budget 0. - Run
/compact(or/compact <focus...>) to reduce active context size. - Check
/compact policyfor thresholds and failure counters. - Toggle auto-compaction with
/compact auto on|off.
Hooks not running as expected
- Run
/hooksto inspect merged global+project rules and warnings. - Verify event names are exactly:
PreToolUse,PostToolUse,PermissionRequest,SessionStart. - Confirm matcher patterns target the tool IDs you expect (
bash,file-edit, etc.). A matcher written forshell-execstill fires onbash; one for a narrower retired name (multi-edit,ls,task-*, ...) fires only when the model calls that name. Thetool_idyour script receives is always the canonical name. - Hook commands must exit with code
0to be treated as successful.
/approve does nothing useful
- Ensure a plan was generated first.
- Ensure there is a pending plan.
- Check current permission with
/permissionor/permissions.
Unknown agent / delegation failures
- Verify agent IDs exist in
spettro.agents.toml. - Check
handoffsandallowed_toolsreferences. - Fix manifest validation issues and restart.
Manifest validation error
- Fix unknown TOML fields, duplicate IDs, invalid permission values, or missing references.
- See
AGENTS.mdfor schema/validation. - Remove or rename broken
spettro.agents.tomlto use built-ins.
Search/suggestions feel slow in large repos
- Mention suggestions and repository scans may slow down in very large trees.
- Narrow prompts and use focused file mentions (
@path/to/file).
Approval prompts lack detail
- Enable diagnostics with
/permissions debug on. - Use
/permissionsto inspect active rules and recent decisions.
Text is unreadable on a light terminal
- Run
/theme light. It repaints immediately and persists the choice. - Run bare
/themeto open the picker and preview each palette, and to see what Spettro detected and which source decided it. autodegrades to the dark palette whenever the terminal's background cannot be determined — a terminal that ignores the OSC 11 query and sets noCOLORFGBG, output redirected to a file, orTERM=dumb.- To force a palette without saving it, set
SPETTRO_THEME=light(ordark). - See Themes for the full precedence and detection rules.
Some emoji look different in the transcript
Terminals disagree on how many cells some emoji take: a sequence joined
with U+200D (ZERO WIDTH JOINER), such as "woman technologist", is two cells
in a terminal that clusters graphemes and four in one that does not
(xterm.js, Terminal.app), and a symbol followed by the emoji variation
selector U+FE0F is one cell or two. Spettro rewrites those in model text,
tool output and prompts to a form every terminal measures alike, so table
borders and the side panel stay in line: a joined sequence shows as its
parts side by side, the variation selector and skin-tone modifiers are
dropped, a flag shows as its two letters (Italy's flag becomes IT) and a
keycap as its digit. The stored session and the text sent to the model are
unchanged.
Only emoji sequences are rewritten. Text in scripts that combine letters with marks (Devanagari, Bengali, Tamil, Thai, Tibetan and others) is shown exactly as written, even though a terminal that does not cluster graphemes may give such a row a few more cells than the layout expects, which can push a table's right border out of line on that row.
The agent stops early or ends without doing anything
The run loop does not accept every reply without tool calls as the final answer. Each case below gets a bounded nudge (a short user message asking the model to go on), reported in the transcript as a note:
- An empty reply is nudged up to twice; a third ends the turn with an error.
- A short reply that only announces work ("I'll start by exploring the
repository...") before the turn has made any tool call is nudged once.
A reply that asks the user something (it contains
?or the word "you") or introduces an answer with a colon ("Let me explain: ...") is never treated as an announcement, so a clarifying question still ends the turn and waits for the user. - A reply whose finish reason says it stopped for tool calls, but which carries none, is nudged once to send the call again.
A second announce-only reply in the same turn ends it, and so does a second
dropped-call reply that carries text. A second dropped-call reply with no
text is an empty reply, so it gets the empty-reply nudges above. None of
these can loop. To see what the provider actually returned, set
SPETTRO_DEBUG_LOG to a file path before starting spettro (TUI, --acp or
--goal):
SPETTRO_DEBUG_LOG=/tmp/spettro-debug.log spettro --goal "fix the failing test"
Every reply is then logged at debug level with its normalized and raw finish reason, the number of tool calls parsed and seen in the stream (unnamed calls and orphan argument fragments included), text and reasoning sizes, output tokens and the first characters of the text. Without the variable nothing is logged.
A local server or OpenAI-compatible provider misbehaves
Streamed requests to OpenAI-compatible endpoints (catalog providers with an OpenAI-style API, the Spettro Subscription, local servers) go through Spettro's own chat-completions client. To rule it out, send them through the fantasy SDK it replaced, for one run or for good:
SPETTRO_PROVIDER_WIRE=fantasy spettro # one run
or set "provider_wire": "fantasy" in ~/.spettro/config.json (see
Configuration). If the problem goes away,
please report it with the debug log described above.
Reset local state
If needed, remove local Spettro state:
rm -rf .spettro
rm -rf ~/.spettro/config.json ~/.spettro/keys.enc ~/.spettro/trusted.json ~/.spettro/sessions
Only do this if you are comfortable losing local session history, trusted paths, and encrypted keys.
