Troubleshooting
No Project Selected
Symptom:
No project selected. Use /project to choose a folder before running a task.
Fix:
proto-cli project set ~/projects/my-app
or in the TUI:
/project
Model Not Selected
Symptom:
No model selected for provider 'ollama'
Fix:
proto-cli model
Then run:
proto-cli check
ProtoLink Missing Or Not Ready
Symptom:
Protolink missing
or runtime readiness fields are unavailable.
Fix:
source .venv/bin/activate
pip install --upgrade -e core
proto-cli check
check should report streaming, metrics, compaction, context, state, reports,
cancellation, logging, auth, transport, and web tools as ready. Web-tool
readiness is separate from baseline agent_ready because Scout is optional.
Tool Request Appears As The Answer
A reply such as {"tool_call":{"name":"explorer",...}} is an unfinished
action, not a project explanation. ProtoLink now sends recognizable malformed
wrappers through its native parse correction loop in JSON/native modes. The
agent can correct the request in the same run; repeated malformed proposals
stop at the engine limit. Check /trace for actual tool receipts; printed JSON
proves no read. There is no application final-answer rejection hook.
Ollama models advertising tools now use ProtoLink's native tool channel
automatically. If your server's metadata is unavailable but you know the model
supports native tools, use PROTOAGENT_OLLAMA_TOOL_CALLING=native. If its native
template is unreliable, use json to retain the strict JSON action protocol.
The small profile provides a concrete Explorer README delegation example.
An advertised capability does not guarantee the model follows the protocol.
Failed/interrupted runs are not automatically replayed.
When asking for action-protocol examples, include explanatory prose or return
them inside explicit final.content. A standalone action object, even inside
one JSON fence, is an action proposal. Other JSON application answers remain valid.
Planning Fails Because There Are No Check IDs
The selected project may have no tests or check configuration, even when its
README lists a test folder. plan_task rejects invalid selections through native
no-change feedback and includes valid IDs in details.available_check_ids.
Omitting check_ids keeps defaults.
The compact task record shows available_check_ids without requiring another
status call or a large command catalog.
Python projects with no existing checks receive a predefined python-tests
unittest runner. Architect/Tester should ask Coder for focused root test_*.py
regressions. A zero-test baseline means missing coverage, and a final empty suite
cannot pass verification. There is no automatic dependency installation.
Explicit .protoagent/project.json checks take precedence, including an empty
list. Unsupported projects need a project-owned command configured outside the
run. Approved edits without a usable check remain unverified/incomplete.
See Task Workflow.
Request Correction Limit Reached
ProtoLink allows two corrective turns per inference by default. Local unknown
tools, invalid schemas, no-change tool rejections and worker capability mistakes
share that allowance; a successful action does not reset it. tool.correction.exhausted
and structured blockers explain the final rejection. /trace and /timeline
retain prior execution receipts alongside distinct rejection records.
Inspect the rejected request and advertised IDs/tools first. Configure
providers.PROVIDER.max_tool_corrections only when a larger allowance is useful;
existing model-call and runtime budgets still apply. Rejection made no changes
in that request, but earlier approved work may already be applied. Denials,
partial effects and disconnections do not qualify for automatic correction.
Scout Is Off Or Search Fails
Inspect the current agent settings:
proto-cli agents scout
proto-cli check
Enable Scout for the next run:
proto-cli agents scout on
If web_tools_ready is unavailable, install ProtoLink 0.8.1 or newer. Brave is
the default search engine and needs:
export BRAVE_SEARCH_API_KEY=...
DuckDuckGo is a keyless best-effort engine; English Wikipedia is keyless
factual search. Architect can pass either to web_search. Wikipedia only supports
freshness="any". URL fetching intentionally rejects private/loopback hosts,
nonstandard ports, unsafe redirects, binary content, and oversized responses.
These rejections are safety behavior, not general network failures.
ProtoLink 0.8.1 applies native budget checks to direct tool tasks. If a call
stops at a budget boundary, inspect /trace and the configured run budget.
Verifier also has a separate per-command timeout.
Localhost Runtime Fails In A Sandbox
Symptom can look like:
PermissionError: [Errno 1] Operation not permitted
This can be an environment restriction on binding or connecting to localhost, not necessarily a ProtoAgent regression.
Try:
PROTOAGENT_AGENT_TRANSPORT=http PROTOAGENT_STREAM=0 proto-cli run "diagnose runtime"
If the environment blocks even local ports, use scaffold mode to verify the Rust/Python boundary:
PROTOAGENT_SCAFFOLD=1 proto-cli run "diagnose runtime"
Context Loom Misses The Right File
Steps:
/index refresh
/context the exact feature or path name
Then inspect:
- Whether the file is ignored, binary, too large, or outside the active project.
- Whether query terms match path, symbols, headings, imports, or content.
- Whether a git-changed file should get a relevance boost.
- Whether
Unchangedis high: that is expected during an incremental refresh and means those files were not reread because size and modification time still matched.
Source files:
core/protoagent_core/context/indexer.pycore/protoagent_core/context/packer.py
TUI Trace Is Hard To Share
Use one-shot capture:
PROTOAGENT_TRACE=1 proto-cli run "your failing task" 2>&1 | tee /tmp/protoagent-debug.txt
tail -n 80 "${PROTOAGENT_CONFIG_DIR:-$HOME/.protoagent}/traces.jsonl"
The TUI /trace view is for live inspection. The one-shot runner is the better
copy-paste artifact.
API Key Looks Stale
Model inventory caches recent validation results briefly. To force a real refresh, wait for the retry window or restart the process, then run:
proto-cli models
If a live run succeeds, remember_valid_provider() marks that provider/model
combination as recently valid.
Approval Did Not Execute
Check:
- Did the diff modal show a
filesystem.writeapproval? - Was the request denied?
- Did cancellation arrive while waiting for approval?
- Did native preparation reject a symlink, missing parent or stale revision?
Relevant files:
core/protoagent_core/agents/coder.pycore/protoagent_core/runtime_bridge.pycli/src/progress.rscli/src/terminal_ui/approval.rs
Memory Feels Wrong
First check whether persistent memory is on:
/context memory
Then inspect model-facing memory:
/context history
Remember:
sessions.jsonis a Rust UI ledger.conversations.sqliteis model-facing ProtoLink state./context offmakes each task use task-local state./context resetclears saved ProtoLink histories for the active project session.
Verification Or Undo Is Blocked
For a command, inspect the process.execute JSON preview with V. The environment
is explicit: use absolute executables or supply PATH. Check native exit status,
timeout and truncation; unavailable or interrupted execution cannot pass. Results
are passed, failed, stale or unverified.
For undo, use the same project and inspect /checkpoints. A conflict can reflect
changed resource identity as well as content, including after another restoration.
Legacy records lack native revisions; prepared/restoring/uncertain records require
inspection. Nothing is force-overwritten or automatically replayed.
Recoverable file tools require POSIX, paths without symlinks and existing parent directories. If another run owns the recovery namespace, finish or cancel that run before starting a new one. See Verify & Recover.