Tool · OpenHands · OpenHands
grep
What matters here2 of 3 invariants hold · 1 unverified
- Regex dialectvaries by backend: Rust regex, POSIX, or Python resrconly one of 11
- Announces truncationinvariantholdssrcall 18 hold
- Agrees with readinvariant—6 of 7 hold
- Gitignorevaries by backend: yes under ripgrep, no otherwisesrconly one of 18
The facts the registry marks decision-changing, with how the other implementations answered. An invariant may be shown as pass/fail; a design choice never is, however unusual it looks.
How this differs from most implementations
- Case sensitivityalways insensitive, not configurablevs sensitive, model can ask in 3 of 5
- Searches hidden filesnovs yes in 7 of 13
Derived by comparing every recorded value against the other implementations of the same capability. Differing is not a defect unless the row is marked an invariant.
Description, as the model sees it
Not recorded yet — the verbatim description has not been captured for this tool.
Registered schema
Not recorded yet — the schema as registered has not been captured for this tool.
Observed · Code search
compare all →| Fact | This tool | Across all implementations |
|---|---|---|
| Shape | 3 of 3 recorded | |
| What it searches | by-contentsrc | like 9 of 20by-name ×9 · both ×1 +1 |
| Tools per harness | two toolssrc Separate glob and grep tools. | like 18 of 20no search tool ×1 · one tool ×1 |
| Search engine | ripgrep, else system grep, else Python resrc Backend is picked once at start-up by whichever binary is present (_select_search_backend). | only one of 19bundled ripgrep ×6 · ripgrep ×2 +101 unverified |
| Query language | 2 of 2 recorded | |
| Regex dialect | varies by backend: Rust regex, POSIX, or Python resrc The same pattern is handed to a different engine depending on what is installed on the machine. Nothing in the tool result says which one ran. | only one of 11Rust regex ×8 · varies by backend: Rust regex, git grep, POSIX, or JS RegExp ×1 +1 |
| Case sensitivity | always insensitive, not configurablesrc -i is hardcoded on both binary paths and re.IGNORECASE on the Python path; the model cannot ask for a case-sensitive search. | like 2 of 6sensitive, model can ask ×3 · whatever is on the machine ×113 unverified |
| Result shape | 4 of 4 recorded | |
| Line numbers in results | none — file paths onlysrc rg -l / grep -l. The model is told which files match, not where. | only one of 11Line N: ×3 · path:N: ×2 +5 |
| Result cap | 100 filessrc | like 4 of 20100 matches ×3 · 100 matches or 30KB ×2 +10 |
| Announces truncationinvariant | holdssrc "[Results truncated to first 100 files. Consider using a more specific pattern.]" | all 18 hold1 unverified |
| How "no matches" reads | sentencesrc "No files found containing pattern the pattern and directory named". | like 16 of 17empty stdout ×13 unverified |
| Agreement with read | 0 of 2 recorded | |
| Search line N is read line Ninvariant | — No line numbers are reported, so there is nothing to disagree. | 6 of 7 holdtrue ×6 · false ×12 unverified |
| Search counts as having read | ? | 2 others recordedno read tracking at all ×1 · yes — matched files are recorded as partial reads ×19 unverified |
| Scope | 3 of 3 recorded | |
| Respects .gitignore | varies by backend: yes under ripgrep, no otherwisesrc rg honours .gitignore by default; grep -R and the os.walk fallback do not. Whether the agent can see an ignored file depends on the machine. | only one of 18yes ×8 · no, deliberately ×2 +52 unverified |
| Binary content never enters contextinvariant | holdssrc Only paths are returned, so no matched bytes reach the context window. | 2 of 3 holdfalse ×18 unverified |
| Ordering | 1 of 1 recorded | |
| Result ordering | modification time, newest firstsrc --sortr=modified, re-sorted by st_mtime on every backend. | like 5 of 16ripgrep traversal order ×5 · bounded discovery order; newest-first on request ×1 +54 unverified |