Context-efficient local search for files, documents, notes and logs across Pi, OMP and MCP clients
sift-light has ONE tool with an exceptionally detailed description (1,247 chars) that covers modes, parameters, prerequisites, and usage patterns. The input schema is comprehensive with 16 parameters, all typed and described. However, the description exceeds the 1,024-char baseline and reads more like API documentation than LLM-optimized guidance. The tool name 'sift-light' is a noun, not a verb (pattern violation: should be 'search_code' or 'search_files'). Output schema is not explicitly documented in the visible source. Error handling and recovery guidance are absent from the description.
Search and navigate code with bounded, verifiable evidence. Routine searches should use exact content, filenames or applicable structural modes first. Omitted mode is ordinary exact search and does not load the embedding model; concept/hybrid require vectorSearchEnabled:true in sift-light.json plus an installed model and may take tens of seconds on an uncached scope. Ordinary pattern searches use auto detail/summary; pattern is regex by default and literal=true matches source text exactly. A path selects an existing exact file or root; use mode=files with query to discover an unknown name. scope=strict prevents zero-result path expansion and wholeWord requires word boundaries. mode=capabilities returns a compact names-only project language inventory and the modes available for each detected language; capability providers are loaded only when the requested analysis runs. It never starts a parser, compiler, model or language server. mode=concept accepts a natural-language query, path and source filters; mode=hybrid uses one natural-language query for exact and local concept evidence, ranks exact evidence first, and retains a bounded semantic supplement. An explicitly enabled semantic judge may classify hybrid candidates, but it is disabled by default and never turns classification into a runtime proof. Slow concept/hybrid requests return status=waiting or running with operationId, progress, and an exact nextRequest using mode=await; copy that request unchanged to continue the same computation. Await expiry never downgrades evidence to literal-only or partial, and final results remain stable for the operation retention window. mode=cancel explicitly stops one operation. allOf and anyOf are explicit literal variants and cannot be mixed with pattern/literal; limit and context are output intent and are never silently dropped. modifiedAfter/modifiedBefore filter worktree files by inclusive/exclusive modification-time bounds in Unix milliseconds. structure requires a nonempty AST pattern and JS/TS/TSX/Go sources; lang is not a field. Outline uses a concrete source file path (not a directory) or retained cursor+matchIndex and follows declared syntax capabilities. imports/tests return bounded static module and related-test candidates without proving runtime execution. validate checks saved source evidence against its recorded origin. Partial coverage stays explicit.
Tool name 'sift-light' is a noun, not a verb. Should start with action verb (search_, query_, navigate_) to signal intent to LLMs. Current name is ambiguous about what action it performs.
Description is 1,247 characters, exceeds 1,024-char baseline and reads as API reference rather than LLM-optimized guidance. Condense to 200-400 chars with clear WHAT/WHEN/WHY structure for agent selection.
Output schema not documented in visible source. LLMs cannot plan downstream calls or extract required fields without knowing response structure (fields, types, pagination). Add explicit return type documentation.
No error handling or recovery guidance in tool description. LLMs need to know: what errors can occur? Are they retryable? What should the agent do next? E.g., 'If query returns no results, try mode=files to discover filenames.'
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 56 | <=2025-11-25 | v2 |
Parameter 'query' accepts strings up to 256 chars but lacks guidance on format (regex vs literal, case sensitivity rules). Description should state: 'Regex by default; set literal=true for exact text match. Use ignoreCase for case-insensitive search.'