Skip to main content

Troubleshooting & Error Codes

Infrastructure Issues​

IssueError CodeSolution
Qdrant not runningINFRA_QDRANT_UNAVAILABLEQdrant is built-in and starts automatically. If using external Qdrant: docker compose up -d, verify QDRANT_URL
Qdrant operation timed outINFRA_QDRANT_TIMEOUTCheck Qdrant server load or increase timeout
Qdrant operation failedINFRA_QDRANT_OPERATIONCheck Qdrant logs for details
Qdrant optimizer failed (get_index_status / prime show optimizer: error: …)—Run the printed tea-rags qdrant recover --project <alias>: it re-applies the collection's current optimizer config (no value changes), which makes Qdrant 1.18+ recreate the optimizer and clear the error. No daemon restart, no reindex.
Qdrant optimizer still failing after recoverINFRA_QDRANT_OPTIMIZER_ERROR_PERSISTSThe cause is still live (disk space, memory, a corrupt segment). Check the Qdrant log, fix it, re-run the recover command; a full reindex builds a fresh collection.
Qdrant unauthorized—Set QDRANT_API_KEY environment variable for secured instances
Ollama not runningINFRA_EMBEDDING_OLLAMA_UNAVAILABLEVerify with curl http://localhost:11434, start Ollama or run docker compose up -d
Model missingINFRA_EMBEDDING_OLLAMA_MODEL_MISSINGollama pull nomic-embed-text
ONNX model failed to loadINFRA_EMBEDDING_ONNX_LOADCheck that the model file exists and is valid
ONNX inference failedINFRA_EMBEDDING_ONNX_INFERENCECheck model compatibility and input data
Rate limit errors (OpenAI)INFRA_EMBEDDING_OPENAI_RATE_LIMITAdjust EMBEDDING_MAX_REQUESTS_PER_MINUTE to match your provider tier
Rate limit errors (Cohere)INFRA_EMBEDDING_COHERE_RATE_LIMITWait and retry, or adjust request rate
Rate limit errors (Voyage)INFRA_EMBEDDING_VOYAGE_RATE_LIMITWait and retry, or adjust request rate
API key errorsINFRA_EMBEDDING_OPENAI_AUTHVerify correct API key in environment configuration
Git CLI not foundINFRA_GIT_NOT_FOUNDInstall git
Git command timed outINFRA_GIT_TIMEOUTReduce scope or increase timeout
Alias operation failedINFRA_ALIAS_OPERATIONCheck Qdrant server status and collection names

Indexing Issues​

IssueError CodeSolution
Codebase not indexedINGEST_NOT_INDEXEDRun index_codebase before search_code
Collection already existsINGEST_COLLECTION_EXISTSUse forceReindex=true or delete the collection first
Snapshot not foundINGEST_SNAPSHOT_MISSINGEnsure the snapshot file exists at ~/.tea-rags/snapshots/
Snapshot corruptedINGEST_SNAPSHOT_CORRUPTEDDelete old snapshot and re-index with forceReindex=true
Snapshot migration failedINGEST_MIGRATION_FAILEDDelete old snapshot and re-index
File skipped (quarantined)INGEST_FILE_*/OVERSIZEDSet aside + auto-retried - see Quarantine
Slow indexing—Use Ollama (local) for faster indexing, or increase EMBEDDING_BATCH_SIZE
Files not found—Check .gitignore and .contextignore patterns
Out of memory during index—Reduce INGEST_CHUNK_SIZE or EMBEDDING_BATCH_SIZE
Refused as already in progress, but nothing is indexingINGEST_INDEXING_IN_PROGRESSA killed index-codebase can leave its detached worker behind, still holding the collection. tea-rags doctor --sweep-workers stops workers whose CLI died before handing them off; --dry-run previews, --include-stalled also stops handed-off workers with no progress for 30 minutes. npm run build runs the same sweep for the checkout it rebuilds.
A file skipped: chunker worker stopped answeringINGEST_WORKER_TIMEOUTA chunker worker took a file and did not answer within CHUNKER_WORKER_TIMEOUT_MS (default 120 s). Typical cause: a very large or minified file whose parse legitimately runs that long, or a tree-sitter native crash or deadlock. The hung worker is recycled and only that file is skipped — it is not quarantined, and the rest of the run continues. For a genuinely large file raise CHUNKER_WORKER_TIMEOUT_MS (0 removes the bound); if an ordinary file hangs, report it together with the file.
--force-enrichments stopped before rebuilding anythingINGEST_SEED_MARKER_UNREADABLEThe recompute could not read the collection's indexing marker, so it cannot tell whether a worktree seed is still pending — and stamping over a pending seed would roll the new versions back on the next incremental. Typical cause: a transient Qdrant failure on that read — a 5xx, a timeout, or the embedded daemon still starting or recovering. Nothing was rebuilt or stamped: retry the same command once Qdrant answers. If it keeps failing, check that Qdrant is reachable and read its logs.
Force reindex found no free collection versionINGEST_VERSION_CLAIM_FAILEDA force reindex builds into the next free versioned collection (<name>_vN). It tried 16 consecutive versions and every one was held by a live indexing run. This is contention, not corruption: nothing was deleted. Wait for the runs in flight to finish and retry. If nothing is actually indexing, the markers are stale and age out within 10 minutes.
Indexing refused: the build on disk changedINGEST_PROCESS_BUILD_STALEThe tea-rags build on disk was replaced (npm run build, npm link, npm i -g) after this server or CLI process started. The process still runs the old build, but the worker threads an index run starts would load the new one, and the two halves of the run would disagree — codegraph enrichment in particular would fail for every changed file. The run was refused before any work. Reconnect the MCP server (/mcp reconnect) or rerun the CLI command, then index again. Search and read tools are not affected.
Indexing lock could not be read or writtenINGEST_INDEXING_LOCK_UNAVAILABLEThe collection's lock file under the data directory could not be created, read or updated, usually because of missing permissions or because the path is not a directory. A lock held by another run is INGEST_INDEXING_IN_PROGRESS, not this code. Check that $TEA_RAGS_DATA_DIR (default ~/.tea-rags) is a writable directory.
Indexing or reindexing failed with an unexpected errorINGEST_INDEXING_FAILED / INGEST_REINDEX_FAILEDAny failure that is not already a structured TeaRAGs error gets wrapped into one of these: INGEST_INDEXING_FAILED for a full (or forced) index, INGEST_REINDEX_FAILED for an incremental one. The message carries the original error text. Read the server log (DEBUG=1) for the cause, then retry; forceReindex=true rebuilds from scratch.
Reindex could not remove some deleted filesINGEST_PARTIAL_DELETIONDuring an incremental reindex, the points of some deleted or changed files could not be removed from Qdrant. The error reports how many of the attempted files failed. Rerun the reindex to retry the deletions, or run /tea-rags:force-reindex for a full rebuild.
Internal pipeline errorINGEST_PIPELINE_NOT_STARTED / INGEST_INVARIANT_VIOLATEDA pipeline component was used before start() or after shutdown, or an internal ingest invariant broke. Neither is caused by your code or configuration. Report it as a bug with the error message; your agent can file it through the tea-rags:report-issue skill.

Explore Issues​

IssueError CodeSolution
Collection not foundEXPLORE_COLLECTION_NOT_FOUNDIndex the codebase first with index_codebase
Collection or path not providedINPUT_COLLECTION_NOT_PROVIDEDProvide a collection name or a path to the codebase
Hybrid search not enabledEXPLORE_HYBRID_NOT_ENABLEDRe-run index_codebase — hybrid is enabled by default and auto-migrates
Invalid queryEXPLORE_INVALID_QUERYFix query parameters
Search returns no results—Try broader queries, check if codebase is indexed with get_index_status
Filter errors—Ensure Qdrant filter format, check field names match metadata

Trajectory Issues​

IssueError CodeSolution
Git blame failedTRAJECTORY_GIT_BLAME_FAILEDEnsure the file is tracked by git
Git log timed outTRAJECTORY_GIT_LOG_TIMEOUTReduce scope or increase timeout
Git not availableTRAJECTORY_GIT_NOT_AVAILABLEEnsure git is installed and in PATH
File parse failedTRAJECTORY_STATIC_PARSE_FAILEDFile may have syntax errors

Project Registry Issues​

IssueError CodeSolution
registry.json corrupt or unsupported versionINFRA_REGISTRY_FILE_CORRUPTEDThe old file is preserved at registry.json.corrupt-<ISO>.bak; tea-rags continues with an empty in-memory map. Run tea-rags doctor --recover-registry to repopulate stubs from live Qdrant state.
Atomic write of registry.json failedINFRA_REGISTRY_WRITE_FAILEDCheck disk space and write permissions on $TEA_RAGS_DATA_DIR (default ~/.tea-rags/). Retry — non-fatal for indexing, the pipeline logs and continues.
Concurrent registry writers exhausted CAS budgetINFRA_REGISTRY_CONCURRENCY5 CAS attempts with exponential backoff (10ms → 160ms) failed. Sustained contention from parallel tea-rags processes — check for runaway processes (ps aux | grep tea-rags). Retrying usually resolves transient cases.
Project name not unique (infra defensive check)INFRA_REGISTRY_NAME_CONFLICTThe user-facing surface is INPUT_PROJECT_NAME_NOT_UNIQUE (the api layer validates first); this infra-level error only fires when a caller bypasses the api. Choose a different name, or tea-rags projects unregister --name <alias> first.
Project alias has empty path (recovered stub)INPUT_PROJECT_PATH_MISSINGRegistry entry exists for the alias but its path is empty — typical for stubs produced by tea-rags doctor --recover-registry. Re-register: tea-rags projects register --path <dir> --name <alias>.
Project alias unknownINPUT_PROJECT_NOT_REGISTEREDThe --project flag or MCP project parameter referenced a name not in the registry. Run tea-rags projects list to see registered aliases, or tea-rags projects register --path <dir> --name <alias> to add one.

See Project Registry for the full guide, including the doctor command and orphan-collection workflows.

Configuration Issues​

IssueError CodeSolution
Invalid config valueCONFIG_VALUE_INVALIDCheck expected values for the field
Required config missingCONFIG_VALUE_MISSINGSet the required environment variable

Update Check Issues​

tea-rags update and the ## tea-rags package section of tea-rags prime share the same update-check pipeline. Failures are non-fatal — they surface as exit codes or as an omitted prime section.

IssueSymptomSolution
tea-rags update exits 1Couldn't check for updates (reason: network/timeout/malformed)Registry unreachable, DNS failure, or response not parseable. Retry; check curl https://registry.npmjs.org/tea-rags/latest. A 5-min negative cache is written so repeats are cheap.
tea-rags update exits 127npm not found in PATH. Install Node.js or update tea-rags manually.npm binary missing. Reinstall Node.js or add npm to PATH. The command never falls back to pnpm/yarn/bun — invoke them yourself: pnpm add -g tea-rags@latest, yarn global add tea-rags@latest, bun add -g tea-rags@latest.
postinstall doesn't run on updateAfter tea-rags update, native binaries or setup hooks weren't refreshedtea-rags forces npm_config_ignore_scripts=false in the spawn env, so even a user-level ignore-scripts=true in ~/.npmrc is overridden. If postinstall still doesn't run, check the npm exit code in your terminal output — a non-zero code is forwarded.
EACCES during npm install -gPermission denied writing to global prefixEither use sudo npm install -g tea-rags@latest once, or set a user-writable prefix: npm config set prefix ~/.npm-global then add ~/.npm-global/bin to PATH. Then re-run tea-rags update.
prime never shows the package sectionEven when you know a newer version existsCache may be stuck on an old "up-to-date" response. Delete ~/.tea-rags/update-check.json to force a fresh fetch on next prime.
prime hangs on update checkDigest takes >2s to renderThe HTTP call has a 1.5s timeout running in parallel with Qdrant queries. If it consistently times out, the negative cache (5min) skips the check entirely on subsequent runs. Confirm registry reachability outside tea-rags.
Corrupt cache JSONNo symptom — self-healsIf ~/.tea-rags/update-check.json becomes unparseable or has a wrong schema, the next read deletes it and returns null. Next prime/update re-fetches and rewrites.
Downgrade scenario (installed > latest)prime stays silent; tea-rags update reports is up to dateBy design — when installed semver is greater than registry latest (e.g. testing a pre-release locally), the status is up-to-date. No downgrade is offered.

Error Codes Reference​

Full table of all structured error codes returned by the MCP server.

CodeClassHTTPMessage TemplateHint Template
UNKNOWN_ERRORUnknownError500Unexpected error: {detail}Check server logs for details
INPUT_COLLECTION_NOT_PROVIDEDCollectionNotProvidedError400Either 'collection' or 'path' parameter is required.Provide a 'collection' name or a 'path' to the codebase.
INFRA_QDRANT_UNAVAILABLEQdrantUnavailableError503Qdrant is not reachable at {url}Start Qdrant: docker compose up -d, or verify QDRANT_URL={url}
INFRA_QDRANT_TIMEOUTQdrantTimeoutError504Qdrant operation "{operation}" timed out at {url}Check Qdrant server load or increase timeout
INFRA_QDRANT_OPERATIONQdrantOperationError500Qdrant operation "{operation}" failed: {detail}Check Qdrant logs for details
INFRA_QDRANT_OPTIMIZER_ERROR_PERSISTSQdrantOptimizerErrorPersistsError500Qdrant optimizer of collection "{collection}" still reports an error after recreation: {optimizerStatus}Check the Qdrant server log for the failing optimization, fix it, then re-run the recover command
INFRA_EMBEDDING_OLLAMA_UNAVAILABLEOllamaUnavailableError503Ollama is not reachable at {url}Start Ollama or verify OLLAMA_BASE_URL={url}
INFRA_EMBEDDING_OLLAMA_MODEL_MISSINGOllamaModelMissingError503Model "{model}" is not available on Ollama at {url}Pull the model: ollama pull {model}
INFRA_EMBEDDING_ONNX_LOADOnnxModelLoadError503Failed to load ONNX model from "{modelPath}"Check that the model file exists and is valid
INFRA_EMBEDDING_ONNX_INFERENCEOnnxInferenceError500ONNX inference failed: {detail}Check model compatibility and input data
INFRA_EMBEDDING_OPENAI_RATE_LIMITOpenAIRateLimitError429OpenAI API rate limit exceededWait and retry, or increase rate limits
INFRA_EMBEDDING_OPENAI_AUTHOpenAIAuthError401OpenAI API authentication failedCheck OPENAI_API_KEY is set correctly
INFRA_EMBEDDING_COHERE_RATE_LIMITCohereRateLimitError429Cohere API rate limit exceededWait and retry
INFRA_EMBEDDING_VOYAGE_RATE_LIMITVoyageRateLimitError429Voyage API rate limit exceededWait and retry
INFRA_GIT_NOT_FOUNDGitCliNotFoundError503Git CLI is not installedInstall git
INFRA_GIT_TIMEOUTGitCliTimeoutError504Git command "{command}" timed out after {timeoutMs}msReduce scope or increase timeout
INFRA_CODEGRAPH_DATABASE_MISSINGCodegraphDatabaseMissingError404No codegraph database at {dbPath}The collection was indexed without codegraph. Turn it on with tea-rags projects set-env --name <alias> CODEGRAPH_ENABLED=true and re-index to build it
INFRA_ALIAS_OPERATIONAliasOperationError500Alias operation "{operation}" failed: {detail}Check Qdrant server status and collection names
INGEST_NOT_INDEXEDNotIndexedError404Codebase at "{path}" is not indexedRun index_codebase first
INGEST_COLLECTION_EXISTSCollectionExistsError409Collection "{collectionName}" already existsUse forceReindex=true or delete first
INGEST_SNAPSHOT_MISSINGSnapshotMissingError404Snapshot not found at "{path}"Ensure the snapshot file exists
INGEST_SNAPSHOT_CORRUPTEDSnapshotCorruptedError400Snapshot corrupted: {detail}Delete and re-index with forceReindex=true
INGEST_MIGRATION_FAILEDMigrationFailedError400Snapshot migration failed: {reason}Delete old snapshot and re-index
INGEST_VERSION_CLAIM_FAILEDVersionedCollectionClaimError409Versions v{first}..v{last} of "{baseCollectionName}" are all held by live indexing runsWait for the runs in flight to finish, then retry; stale markers age out within 10 minutes
INGEST_INDEXING_IN_PROGRESSIndexingAlreadyInProgressError409Indexing of "{path}" is already running — in the background or in another sessionWait until get_index_status no longer reports indexing or enrichment in progress, then retry
INGEST_INDEXING_LOCK_UNAVAILABLEIndexingLockUnavailableError500Indexing lock "{lockPath}" could not be used: {cause}Check that $TEA_RAGS_DATA_DIR (default ~/.tea-rags) is a writable directory
INGEST_PROCESS_BUILD_STALEIndexingProcessBuildStaleError503The tea-rags build on disk changed since this process started (loaded {loaded}, on disk {onDisk})Reconnect the MCP server (/mcp reconnect) or rerun the CLI, then index again
INGEST_INDEXING_FAILEDIndexingFailedError500Full indexing failed: {detail}Check server logs for details, or retry with forceReindex=true
INGEST_REINDEX_FAILEDReindexFailedError500Incremental re-indexing failed: {detail}Check server logs for details, or re-index with forceReindex=true
INGEST_PARTIAL_DELETIONPartialDeletionError500Failed to delete {failed} of {attempted} filesRerun reindex to retry, or /tea-rags:force-reindex for a full rebuild
INGEST_PIPELINE_NOT_STARTEDPipelineNotStartedError500{component} not startedCall start() before using the pipeline (internal — report as a bug)
INGEST_INVARIANT_VIOLATEDIngestInvariantError500Invariant violated: {detail}Programming error — report it as a bug
INGEST_PAYLOAD_TOO_LARGEQdrantPayloadTooLargeError400Qdrant payload too large for "{path}": {detail}Quarantined + auto-retried. Reserved: the current upsert path does not raise it yet
INGEST_FILE_READ_FAILEDFileReadError400Failed to read "{path}": {detail}Quarantined + auto-retried - see Quarantine
INGEST_FILE_PARSE_FAILEDFileParseError400Failed to parse "{path}": {detail}Quarantined + auto-retried - see Quarantine
INGEST_CHUNK_OVERSIZEDChunkOversizedError400Chunk in "{path}" oversized: {detail}Lower INGEST_CHUNK_SIZE - see Quarantine
INGEST_EMBEDDING_REJECTEDEmbeddingRejectedError400Embedding rejected for "{path}": {detail}Quarantined + auto-retried - see Quarantine
INGEST_WORKER_TIMEOUTWorkerTimeoutError504{pool} worker did not respond for "{request}" within {timeoutMs}msThe hung worker was recycled. Raise CHUNKER_WORKER_TIMEOUT_MS for a genuinely large file; otherwise report the crash/deadlock
INGEST_SEED_MARKER_UNREADABLEWorktreeSeedMarkerUnreadableError503Could not read the indexing marker of "{collectionName}" to check for a pending worktree seedNothing was stamped or rebuilt. Retry once Qdrant answers
INGEST_SEED_MARKER_UNCONFIRMEDWorktreeSeedMarkerUnconfirmedError503Qdrant did not confirm the pending worktree seed rewrite on the indexing marker of "{collectionName}" within the write-barrier budgetThe seed is treated as still owed. Retry once Qdrant has drained its update queue, or raise QDRANT_TUNE_WRITE_BARRIER_BUDGET_MS
EXPLORE_COLLECTION_NOT_FOUNDCollectionNotFoundError404Collection "{collectionName}" does not existIndex the codebase first
EXPLORE_HYBRID_NOT_ENABLEDHybridNotEnabledError400Collection "{collectionName}" does not support hybrid searchRe-run index_codebase — hybrid is enabled by default and auto-migrates
EXPLORE_INVALID_QUERYInvalidQueryError400Invalid query: {reason}Fix query parameters
TRAJECTORY_GIT_BLAME_FAILEDGitBlameFailedError500Git blame failed for "{file}"Ensure file is tracked by git
TRAJECTORY_GIT_LOG_TIMEOUTGitLogTimeoutError504Git log timed out after {timeoutMs}msReduce scope or increase timeout
TRAJECTORY_GIT_NOT_AVAILABLEGitNotAvailableError503Git is not availableEnsure git is installed and in PATH
TRAJECTORY_STATIC_PARSE_FAILEDStaticParseFailedError500Failed to parse "{file}"File may have syntax errors
CONFIG_VALUE_INVALIDConfigValueInvalidError400Invalid value "{value}" for field "{field}"Expected one of: {expected}
CONFIG_VALUE_MISSINGConfigValueMissingError400Required field "{field}" is not setSet the {envVar} environment variable
INFRA_REGISTRY_FILE_CORRUPTEDRegistryFileCorruptedError500Registry file at "{path}" is corrupted: {reason}Delete the file and re-run indexing, or run tea-rags doctor to regenerate from Qdrant
INFRA_REGISTRY_WRITE_FAILEDRegistryWriteError500Failed to write registry file at "{path}"Check disk space and write permissions on the data directory
INFRA_REGISTRY_CONCURRENCYRegistryConcurrencyError503Registry file at "{path}" was modified concurrently across {attempts} attemptsRetry the operation; if it persists, check for runaway tea-rags processes
INFRA_REGISTRY_NAME_CONFLICTRegistryNameConflictError409Project name "{name}" is not unique — already used by "{existingCollectionName}"Pre-validate via findByName before setName, or surface as 409 to the user
INPUT_PROJECT_NOT_REGISTEREDProjectNotRegisteredError400Project "{name}" is not registered. Available: {list}Register the project via index_codebase, or pick a name from the available list
INPUT_PROJECT_NAME_NOT_UNIQUEProjectNameNotUniqueError400Project name "{name}" is not unique — already used by "{existingCollectionName}"Choose a different name or remove the existing project
INPUT_PROJECT_NAME_INVALIDProjectNameInvalidError400Project name "{name}" is invalid: {reasonPhrase}Names must be non-empty, within length limits, and match the allowed character set
INPUT_PATH_NOT_EXISTSPathDoesNotExistError400Path "{path}" does not existProvide an absolute path to an existing directory
INPUT_PROJECT_PATH_MISSINGProjectPathMissingError400Project "{name}" has no path stored — re-register it before using as an aliasRun tea-rags projects register --path <dir> --name <alias>
INPUT_PROJECT_ENV_KEY_UNKNOWNProjectEnvKeyUnknownError400Unknown project env key "{key}"Only keys an indexing run reads per project are accepted; secrets and server settings are never stored per project

MCP Response Format​

When an error occurs, the MCP server returns a structured JSON error response:

{
"isError": true,
"content": [
{
"type": "text",
"text": "Error [INFRA_QDRANT_UNAVAILABLE]: Qdrant is not reachable at http://localhost:6333\n\nHint: Start Qdrant: docker compose up -d, or verify QDRANT_URL=http://localhost:6333"
}
]
}

The text field always follows the pattern:

Error [<CODE>]: <message>

Hint: <hint>

For unknown/unexpected errors, the response includes the full stack trace in debug mode:

{
"isError": true,
"content": [
{
"type": "text",
"text": "Error [UNKNOWN_ERROR]: Unexpected error: Cannot read properties of undefined\n\nHint: Check server logs for details"
}
]
}

Enable debug logging with DEBUG=1 to get full stack traces in the server logs.


FAQ​

Does reindexing cause downtime?​

No. forceReindex uses zero-downtime collection aliases. A new versioned collection is built in the background while search continues on the current one. When indexing completes, the alias is switched atomically. Search is available 100% of the time during reindexing.

How do I know when indexing is complete?​

The MCP server returns a success response with statistics (files indexed, chunks created, time elapsed). You can also check status anytime with get_index_status.

I accidentally cancelled the request. Is my indexing lost?​

No worries! Indexing continues in the background until completion. Check progress with get_index_status. Already processed chunks are saved via checkpointing.

How do I stop indexing?​

Find and kill the process:

ps aux | grep tea-rags
kill -9 <PID>

How do I resume interrupted indexing?​

Just run index_codebase again. Completed steps are cached -- only remaining work will be processed.

Where are cache snapshots and logs stored?​

All data is stored in ~/.tea-rags/:

  • snapshots/ -- file hash snapshots for incremental indexing
  • git-cache/ -- git blame cache (L2 disk cache)
  • logs/ -- debug logs (when DEBUG=1)

How do I enable MCP logging?​

Run your agent with the DEBUG variable:

DEBUG=1 claude

Or add DEBUG=true to your MCP server configuration in env section.