{
  "schemaVersion": 1,
  "evaluation": {
    "id": "ripgrep",
    "testedOn": "2026-10-18",
    "coverage": "local-runtime",
    "summary": "Default search returned only the visible text file. Explicit flags included hidden and ignored files, and --text enabled the binary fixture. Invalid regex and no-match results had different exit codes.",
    "identity": {
      "version": "15.2.0 (rev e89fff89ac); PCRE2 10.45",
      "target": "https://github.com/BurntSushi/ripgrep/releases/download/15.2.0/ripgrep-15.2.0-x86_64-pc-windows-msvc.zip",
      "integrity": "SHA-256 71b2fef860abe467217a538ff31de02f5258807c0129f771846f87bd029aafc5 of the downloaded ZIP archive. Recorded to identify the tested artifact; no independent signature or provenance audit was performed."
    },
    "environment": [
      "Windows 11 x64; Python 3.12.10 harness. Raw timestamps use UTC.",
      "Fresh per-tool home, config, cache and temporary directories. Child environments used allowlisted OS/runtime paths without inherited account credentials. Only synthetic local files were used.",
      "Configuration isolation is a test control, not an operating-system sandbox."
    ],
    "checks": [
      {
        "id": "ripgrep-version",
        "name": "Pinned binary version",
        "method": "Command argument array: [\"rg\", \"--version\"].",
        "expected": "Print ripgrep version and engine details.",
        "observed": "Exit 0. ripgrep 15.2.0 (rev e89fff89ac)\n\nfeatures:+pcre2\nsimd(compile):+SSE2,-SSSE3,-AVX2\nsimd(runtime):+SSE2,+SSSE3,+AVX2\n\nPCRE2 10.45 is available (JIT is available)",
        "outcome": "pass"
      },
      {
        "id": "ripgrep-default-scope",
        "name": "Default search exclusions",
        "method": "Create visible.txt=\"needle visible\\n\", ignored.txt=\"needle ignored\\n\", .hidden.txt=\"needle hidden\\n\", .ignore=\"ignored.txt\\n\", and binary.bin with bytes 00 followed by UTF-8 \"needle binary\\n\". Escape sequences here describe newline and NUL bytes. Command argument array: [\"rg\", \"--no-config\", \"--files-with-matches\", \"needle\", \".\"].",
        "expected": "Return only visible.txt.",
        "observed": "Exit 0. .\\visible.txt",
        "outcome": "pass"
      },
      {
        "id": "ripgrep-expanded-scope",
        "name": "Explicit hidden and ignored files",
        "method": "Create visible.txt=\"needle visible\\n\", ignored.txt=\"needle ignored\\n\", .hidden.txt=\"needle hidden\\n\", .ignore=\"ignored.txt\\n\", and binary.bin with bytes 00 followed by UTF-8 \"needle binary\\n\". Escape sequences here describe newline and NUL bytes. Command argument array: [\"rg\", \"--no-config\", \"--hidden\", \"--no-ignore\", \"--files-with-matches\", \"needle\", \".\"].",
        "expected": "Return visible.txt, ignored.txt and .hidden.txt; keep binary content excluded.",
        "observed": "Exit 0. .\\.hidden.txt\n.\\ignored.txt\n.\\visible.txt",
        "outcome": "pass"
      },
      {
        "id": "ripgrep-binary-optin",
        "name": "Explicit binary-as-text search",
        "method": "Create visible.txt=\"needle visible\\n\", ignored.txt=\"needle ignored\\n\", .hidden.txt=\"needle hidden\\n\", .ignore=\"ignored.txt\\n\", and binary.bin with bytes 00 followed by UTF-8 \"needle binary\\n\". Escape sequences here describe newline and NUL bytes. Command argument array: [\"rg\", \"--no-config\", \"--text\", \"--files-with-matches\", \"needle\", \"binary.bin\"].",
        "expected": "Return binary.bin when --text is specified.",
        "observed": "Exit 0. binary.bin",
        "outcome": "pass"
      },
      {
        "id": "ripgrep-invalid-regex",
        "name": "Reject an incomplete regex",
        "method": "Create visible.txt=\"needle visible\\n\", ignored.txt=\"needle ignored\\n\", .hidden.txt=\"needle hidden\\n\", .ignore=\"ignored.txt\\n\", and binary.bin with bytes 00 followed by UTF-8 \"needle binary\\n\". Escape sequences here describe newline and NUL bytes. Command argument array: [\"rg\", \"--no-config\", \"[\", \"visible.txt\"].",
        "expected": "Return exit 2 and an unclosed-character-class error.",
        "observed": "Exit 2. rg: regex parse error:\n    (?:[)\n       ^\nerror: unclosed character class",
        "outcome": "pass"
      },
      {
        "id": "ripgrep-no-match",
        "name": "Distinguish no match from error",
        "method": "Create visible.txt=\"needle visible\\n\", ignored.txt=\"needle ignored\\n\", .hidden.txt=\"needle hidden\\n\", .ignore=\"ignored.txt\\n\", and binary.bin with bytes 00 followed by UTF-8 \"needle binary\\n\". Escape sequences here describe newline and NUL bytes. Command argument array: [\"rg\", \"--no-config\", \"absent\", \"visible.txt\"].",
        "expected": "Return exit 1 without matches.",
        "observed": "Exit 1. Standard output and standard error were empty.",
        "outcome": "pass"
      }
    ],
    "findings": [
      {
        "title": "Search coverage changes with flags",
        "basis": "observed",
        "severity": "low",
        "detail": "The default fixture search returned one file. --hidden --no-ignore returned three text files, and a separate --text command found the binary fixture. A default no-match result cannot establish absence across those excluded files.",
        "practicalAdvice": "Record the intended paths and exclusion rules alongside any migration or audit claim."
      },
      {
        "title": "Broader search can reveal excluded material",
        "basis": "documented",
        "severity": "medium",
        "detail": "Hidden and ignore rules commonly exclude local configuration and generated content. Overriding them expands what can appear in search output, even though ordinary search does not rewrite files.",
        "practicalAdvice": "Broaden scope deliberately and review results before copying them into shared logs or model context."
      }
    ],
    "caveats": [
      "--no-config prevented user ripgrep settings from changing these checks. The fixture used .ignore, not a real repository.",
      "These are behavior checks on tiny files, not a search-speed benchmark or a secret-detection assessment."
    ],
    "notTested": [
      "Large repositories, performance, adversarial regular expressions, PCRE2 behavior, symlinks and external preprocessors.",
      "Completeness of any real secret scan or production search; only the named synthetic file classes were exercised."
    ],
    "sources": [
      {
        "label": "ripgrep repository and defaults",
        "url": "https://github.com/BurntSushi/ripgrep"
      },
      {
        "label": "User guide and search scope",
        "url": "https://github.com/BurntSushi/ripgrep/blob/master/GUIDE.md"
      },
      {
        "label": "License choice",
        "url": "https://github.com/BurntSushi/ripgrep/blob/master/COPYING"
      },
      {
        "label": "Evaluated 15.2.0 release",
        "url": "https://github.com/BurntSushi/ripgrep/releases/tag/15.2.0"
      }
    ],
    "reportUrl": "/interface-evaluations/ripgrep.json"
  }
}
