diff --git a/.claude/agents/technical-writer.md b/.claude/agents/technical-writer.md index 9f41e3e95..06ba0dc57 100644 --- a/.claude/agents/technical-writer.md +++ b/.claude/agents/technical-writer.md @@ -115,7 +115,7 @@ rtk --version # Should show rtk X.Y.Z **Option 2: From Source** ```bash -git clone https://github.com/rtk-ai/rtk.git +git clone https://github.com/algolia/rtk.git cd rtk cargo install --path . rtk --version # Verify installation @@ -130,7 +130,7 @@ rtk gain # Should show token savings analytics **From Source** (Cargo required): ```bash -git clone https://github.com/rtk-ai/rtk.git +git clone https://github.com/algolia/rtk.git cd rtk cargo install --path . @@ -141,7 +141,7 @@ rtk --version **Binary Download** (faster): ```bash -curl -sSL https://github.com/rtk-ai/rtk/releases/download/v0.16.0/rtk-linux-x86_64 -o rtk +curl -sSL https://github.com/algolia/rtk/releases/download/v0.16.0/rtk-linux-x86_64 -o rtk chmod +x rtk sudo mv rtk /usr/local/bin/ rtk --version @@ -172,7 +172,7 @@ rtk --version - **Fix**: Uninstall and reinstall correct RTK ```bash cargo uninstall rtk - cargo install --path . # From rtk-ai/rtk repo + cargo install --path . # From algolia/rtk repo (fork of rtk-ai/rtk) rtk gain --help # Should work ``` ``` diff --git a/.claude/hooks/bash/pre-commit-format.sh b/.claude/hooks/bash/pre-commit-format.sh index 08fe7267b..dd488dd7e 100755 --- a/.claude/hooks/bash/pre-commit-format.sh +++ b/.claude/hooks/bash/pre-commit-format.sh @@ -1,16 +1,33 @@ #!/bin/bash -# Auto-format Rust code before commits -# Hook: PreToolUse for git commit +# Auto-format and lint Rust code before commits +# Hook: PreToolUse for git commit (Claude Code) +# Also installed as .git/hooks/pre-commit for native git + +set -e echo "🦀 Running Rust pre-commit checks..." -# Format code +# Find cargo (support both rustup and system installs) +if [ -f "$HOME/.cargo/env" ]; then + # shellcheck source=/dev/null + source "$HOME/.cargo/env" +fi + +if ! command -v cargo &>/dev/null; then + echo "⚠️ cargo not found — skipping pre-commit checks" + exit 0 +fi + +# Auto-fix formatting cargo fmt --all -# Check for compilation errors only (warnings allowed) -if cargo clippy --all-targets 2>&1 | grep -q "error:"; then - echo "❌ Clippy found errors. Fix them before committing." +# Stage any fmt changes so they're included in the commit +git add -u + +# Strict clippy — matches CI exactly +if ! cargo clippy --all-targets -- -D warnings 2>&1; then + echo "❌ Clippy -D warnings failed. Fix errors before committing." exit 1 fi -echo "✅ Pre-commit checks passed (warnings allowed)" +echo "✅ Pre-commit checks passed" diff --git a/.claude/hooks/rtk-rewrite.sh b/.claude/hooks/rtk-rewrite.sh index 5c8bad028..613a2b17f 100755 --- a/.claude/hooks/rtk-rewrite.sh +++ b/.claude/hooks/rtk-rewrite.sh @@ -39,9 +39,13 @@ case "$FIRST_CMD" in rtk\ *|*/rtk\ *) _rtk_audit_log "skip:already_rtk" "$CMD"; exit 0 ;; esac -# Skip commands with heredocs, variable assignments as the whole command, etc. +# Skip commands with heredocs, subshell assignments, or process substitution. +# Subshell assignments like VAR=$(grep ...) confuse the ENV_PREFIX regex +# which misparsed "APP_ID=$(grep " as an env prefix, mangling the rewrite. case "$FIRST_CMD" in *'<<'*) _rtk_audit_log "skip:heredoc" "$CMD"; exit 0 ;; + *'=$('*) _rtk_audit_log "skip:subshell_assignment" "$CMD"; exit 0 ;; + *'=`'*) _rtk_audit_log "skip:backtick_assignment" "$CMD"; exit 0 ;; esac # Strip leading env var assignments for pattern matching diff --git a/.claude/skills/ship.md b/.claude/skills/ship.md index 380a8ba2b..646d6a7b3 100644 --- a/.claude/skills/ship.md +++ b/.claude/skills/ship.md @@ -187,7 +187,7 @@ gh release view v0.17.0 ### 3. Installation Verification ```bash # Test installation from release -curl -sSL https://github.com/rtk-ai/rtk/releases/download/v0.17.0/rtk-macos-latest -o rtk +curl -sSL https://github.com/algolia/rtk/releases/download/v0.17.0/rtk-macos-latest -o rtk chmod +x rtk ./rtk --version # Should show v0.17.0 diff --git a/.github/workflows/benchmark.yml b/.github/workflows/benchmark.yml index 92ce9cc76..29c669327 100644 --- a/.github/workflows/benchmark.yml +++ b/.github/workflows/benchmark.yml @@ -2,7 +2,7 @@ name: Benchmark Token Savings on: push: - branches: [master, main] + branches: [main] pull_request: jobs: diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..21746766c --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,115 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: read + +env: + CARGO_TERM_COLOR: always + +jobs: + # ── Cheap pre-checks (no compilation, run in parallel) ────────────────────── + fmt: + name: Format Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - run: cargo fmt --all --check + + telemetry-guard: + name: Telemetry Guard + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Block telemetry code + run: | + echo "## Telemetry Guard" >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + FAILED=0 + + # Check for telemetry module + if [ -f src/telemetry.rs ]; then + echo "::error::src/telemetry.rs exists — this fork does not permit telemetry" + echo "- src/telemetry.rs detected" >> $GITHUB_STEP_SUMMARY + FAILED=1 + fi + + # Check for telemetry dependencies + for dep in ureq reqwest hyper sha2 hostname; do + if grep -q "^${dep} " Cargo.toml 2>/dev/null || grep -q "\"${dep}\"" Cargo.toml 2>/dev/null; then + echo "::error::Forbidden dependency '${dep}' found in Cargo.toml" + echo "- Forbidden dep: ${dep}" >> $GITHUB_STEP_SUMMARY + FAILED=1 + fi + done + + # Check for phone-home patterns in Rust source + if grep -rE "telemetry|phone.?home|TELEMETRY_URL|TELEMETRY_TOKEN|send_ping|maybe_ping" src/ --include="*.rs" | grep -v "// *no.telemetry\|tracking.rs\|SECURITY.md"; then + echo "::error::Telemetry-related code patterns found in src/" + echo "- Telemetry patterns in source" >> $GITHUB_STEP_SUMMARY + FAILED=1 + fi + + # Check for HTTP client usage (ureq/reqwest) in source + if grep -rE "ureq::|reqwest::" src/ --include="*.rs"; then + echo "::error::HTTP client usage found in source — RTK should not make network calls" + echo "- HTTP client usage in source" >> $GITHUB_STEP_SUMMARY + FAILED=1 + fi + + if [ "$FAILED" -eq 1 ]; then + echo "" >> $GITHUB_STEP_SUMMARY + echo "This fork maintains a strict no-telemetry policy." >> $GITHUB_STEP_SUMMARY + echo "See CLAUDE.md 'Telemetry Exclusion Policy' for details." >> $GITHUB_STEP_SUMMARY + exit 1 + fi + + echo "No telemetry code detected." >> $GITHUB_STEP_SUMMARY + + # ── Heavy matrix job (shares one compile via target/ within each runner) ──── + build-and-test: + name: Build & Test (${{ matrix.os }}) + needs: [fmt, telemetry-guard] + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + steps: + - uses: actions/checkout@v4 + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + with: + components: clippy + + - name: Cargo cache + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry/index/ + ~/.cargo/registry/cache/ + ~/.cargo/git/db/ + target/ + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + restore-keys: ${{ runner.os }}-cargo- + + # Single compile shared by clippy + test (target/ persists across steps) + - name: Clippy + run: cargo clippy --all-targets -- -D warnings + + - name: Test + run: cargo test --all + + # Release build only on main — PRs don't need it + - name: Build release + if: github.ref == 'refs/heads/main' + run: cargo build --release diff --git a/.github/workflows/release-please.yml b/.github/workflows/release-please.yml index bd1e0893b..fe3870d10 100644 --- a/.github/workflows/release-please.yml +++ b/.github/workflows/release-please.yml @@ -3,7 +3,7 @@ name: Release Please on: push: branches: - - master + - main permissions: contents: write diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 67fbcc062..a829c59ee 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -184,111 +184,3 @@ jobs: files: release/* env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - homebrew: - name: Update Homebrew formula - needs: [release] - runs-on: ubuntu-latest - steps: - - name: Get version - id: version - run: | - TAG="${{ inputs.tag }}" - if [ -z "$TAG" ]; then - TAG="${{ github.event.release.tag_name }}" - fi - VERSION="${TAG#v}" - echo "tag=$TAG" >> $GITHUB_OUTPUT - echo "version=$VERSION" >> $GITHUB_OUTPUT - - - name: Download checksums - run: | - gh release download "${{ steps.version.outputs.tag }}" \ - --repo rtk-ai/rtk \ - --pattern checksums.txt - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Parse checksums - id: sha - run: | - echo "mac_arm=$(grep aarch64-apple-darwin.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT - echo "mac_intel=$(grep x86_64-apple-darwin.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT - echo "linux_arm=$(grep aarch64-unknown-linux-gnu.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT - echo "linux_intel=$(grep x86_64-unknown-linux-gnu.tar.gz checksums.txt | head -1 | awk '{print $1}')" >> $GITHUB_OUTPUT - - - name: Generate formula - run: | - cat > rtk.rb << 'FORMULA' - class Rtk < Formula - desc "Rust Token Killer - High-performance CLI proxy to minimize LLM token consumption" - homepage "https://www.rtk-ai.app" - version "VERSION_PLACEHOLDER" - license "MIT" - - if OS.mac? && Hardware::CPU.arm? - url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-aarch64-apple-darwin.tar.gz" - sha256 "SHA_MAC_ARM_PLACEHOLDER" - elsif OS.mac? && Hardware::CPU.intel? - url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-x86_64-apple-darwin.tar.gz" - sha256 "SHA_MAC_INTEL_PLACEHOLDER" - elsif OS.linux? && Hardware::CPU.arm? - url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-aarch64-unknown-linux-gnu.tar.gz" - sha256 "SHA_LINUX_ARM_PLACEHOLDER" - elsif OS.linux? && Hardware::CPU.intel? - url "https://github.com/rtk-ai/rtk/releases/download/TAG_PLACEHOLDER/rtk-x86_64-unknown-linux-gnu.tar.gz" - sha256 "SHA_LINUX_INTEL_PLACEHOLDER" - end - - def install - bin.install "rtk" - end - - def caveats - <<~EOS - rtk is installed! Get started: - - # Initialize for Claude Code - rtk init -g # Global hook-first setup (recommended) - rtk init # Add to ./CLAUDE.md (this project only) - - # See all commands - rtk --help - - # Measure your token savings - rtk gain - - Full documentation: https://www.rtk-ai.app - EOS - end - - test do - system "#{bin}/rtk", "--version" - end - end - FORMULA - sed -i "s/VERSION_PLACEHOLDER/${{ steps.version.outputs.version }}/g" rtk.rb - sed -i "s/TAG_PLACEHOLDER/${{ steps.version.outputs.tag }}/g" rtk.rb - sed -i "s/SHA_MAC_ARM_PLACEHOLDER/${{ steps.sha.outputs.mac_arm }}/g" rtk.rb - sed -i "s/SHA_MAC_INTEL_PLACEHOLDER/${{ steps.sha.outputs.mac_intel }}/g" rtk.rb - sed -i "s/SHA_LINUX_ARM_PLACEHOLDER/${{ steps.sha.outputs.linux_arm }}/g" rtk.rb - sed -i "s/SHA_LINUX_INTEL_PLACEHOLDER/${{ steps.sha.outputs.linux_intel }}/g" rtk.rb - # Remove leading spaces from heredoc - sed -i 's/^ //' rtk.rb - - - name: Push to homebrew-tap - run: | - CONTENT=$(base64 -w 0 rtk.rb) - SHA=$(gh api repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb --jq '.sha' 2>/dev/null || echo "") - if [ -n "$SHA" ]; then - gh api -X PUT repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb \ - -f message="rtk ${{ steps.version.outputs.version }}" \ - -f content="$CONTENT" \ - -f sha="$SHA" - else - gh api -X PUT repos/rtk-ai/homebrew-tap/contents/Formula/rtk.rb \ - -f message="rtk ${{ steps.version.outputs.version }}" \ - -f content="$CONTENT" - fi - env: - GH_TOKEN: ${{ secrets.HOMEBREW_TAP_TOKEN }} diff --git a/.github/workflows/security-check.yml b/.github/workflows/security-check.yml index 75859305a..69ad4d97d 100644 --- a/.github/workflows/security-check.yml +++ b/.github/workflows/security-check.yml @@ -2,7 +2,7 @@ name: Security Check on: pull_request: - branches: [ master ] + branches: [ main ] permissions: contents: read @@ -46,7 +46,7 @@ jobs: - name: Critical files check run: | echo "### 🎯 Critical Files Modified" >> $GITHUB_STEP_SUMMARY - CRITICAL=$(git diff --name-only origin/master...HEAD | grep -E "(runner|summary|tracking|init|pnpm_cmd|container)\.rs|Cargo\.toml|workflows/.*\.yml" || true) + CRITICAL=$(git diff --name-only origin/main...HEAD | grep -E "(runner|summary|tracking|init|pnpm_cmd|container)\.rs|Cargo\.toml|workflows/.*\.yml" || true) if [ -n "$CRITICAL" ]; then echo "⚠️ **HIGH RISK**: The following critical files were modified:" >> $GITHUB_STEP_SUMMARY echo '```' >> $GITHUB_STEP_SUMMARY @@ -66,7 +66,7 @@ jobs: - name: Dangerous patterns scan run: | echo "### 🚨 Dangerous Code Patterns" >> $GITHUB_STEP_SUMMARY - PATTERNS=$(git diff origin/master...HEAD | grep -E "Command::new\(\"sh\"|Command::new\(\"bash\"|\.env\(\"LD_PRELOAD|\.env\(\"PATH|reqwest::|std::net::|TcpStream|UdpSocket|unsafe \{|\.unwrap\(\) |panic!\(|todo!\(|unimplemented!\(" || true) + PATTERNS=$(git diff origin/main...HEAD | grep -E "Command::new\(\"sh\"|Command::new\(\"bash\"|\.env\(\"LD_PRELOAD|\.env\(\"PATH|reqwest::|std::net::|TcpStream|UdpSocket|unsafe \{|\.unwrap\(\) |panic!\(|todo!\(|unimplemented!\(" || true) if [ -n "$PATTERNS" ]; then echo "⚠️ **Potentially dangerous patterns detected:**" >> $GITHUB_STEP_SUMMARY echo '```diff' >> $GITHUB_STEP_SUMMARY @@ -88,7 +88,7 @@ jobs: - name: New dependencies check run: | echo "### 📚 Dependencies Changes" >> $GITHUB_STEP_SUMMARY - if git diff origin/master...HEAD Cargo.toml | grep -E "^\+.*=" | grep -v "^\+\+\+" > new_deps.txt; then + if git diff origin/main...HEAD Cargo.toml | grep -E "^\+.*=" | grep -v "^\+\+\+" > new_deps.txt; then echo "⚠️ **New dependencies added:**" >> $GITHUB_STEP_SUMMARY echo '```toml' >> $GITHUB_STEP_SUMMARY cat new_deps.txt >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/validate-docs.yml b/.github/workflows/validate-docs.yml index 27879bc0f..ee40ab525 100644 --- a/.github/workflows/validate-docs.yml +++ b/.github/workflows/validate-docs.yml @@ -9,7 +9,7 @@ on: - '.claude/hooks/*.sh' push: branches: - - master + - main - feat/** jobs: diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 7d63d3c81..13308f5a2 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -1483,4 +1483,4 @@ When implementing a new command, consider: **Last Updated**: 2026-02-22 **Architecture Version**: 2.2 -**rtk Version**: 0.22.2 +**rtk Version**: 0.22.4 diff --git a/CHANGELOG.md b/CHANGELOG.md index caee3bc9e..1112d32b5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,38 @@ All notable changes to rtk (Rust Token Killer) will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.22.4](https://github.com/algolia/rtk/compare/v0.22.3...v0.22.4) (2026-03-18) + +### Features + +* **git**: support `-C ` global option for cross-repo commands (PR #5) + +## [0.22.3](https://github.com/algolia/rtk/compare/v0.22.2...v0.22.3) (2026-03-18) + +This is the first release from the `algolia/rtk` fork. All upstream features are welcome; +telemetry is permanently excluded. + +### Security + +* **no-telemetry policy**: Codified and CI-enforced — `src/telemetry.rs`, `ureq`, `sha2`, + `hostname` deps, and phone-home patterns are blocked by the `telemetry-guard` CI job. + RTK is a CLI filter; it has no business making network calls. +* **CI**: Added `ci.yml` with build/test/clippy/fmt on ubuntu + macOS, plus dedicated + telemetry guard job that fails on any phone-home code or forbidden dependencies. + +### Fork Maintenance + +* **install.sh**: Now points to `algolia/rtk` with pinned version `v0.22.2` + (overridable via `RTK_VERSION` env var). Previously fetched latest from upstream, + which could pull telemetry-enabled releases. +* **Cargo.toml**: Repository field updated to `algolia/rtk`. +* **All docs/scripts**: Install URLs, clone URLs, release download URLs, CI workflows, + and issue tracker links updated to `algolia/rtk`. Historical CHANGELOG links to + upstream preserved for attribution. +* **CLAUDE.md**: Added fork maintenance strategy documenting sync policy (selective + cherry-pick), telemetry exclusion rules, and version pinning approach. +* **security-check.yml**: Updated to target `main` branch (not `master`). + ## [0.22.2](https://github.com/rtk-ai/rtk/compare/v0.22.1...v0.22.2) (2026-02-20) diff --git a/CLAUDE.md b/CLAUDE.md index b8cf94f0f..6d2cd3e8a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -6,22 +6,75 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co **rtk (Rust Token Killer)** is a high-performance CLI proxy that minimizes LLM token consumption by filtering and compressing command outputs. It achieves 60-90% token savings on common development operations through smart filtering, grouping, truncation, and deduplication. -This is a fork with critical fixes for git argument parsing and modern JavaScript stack support (pnpm, vitest, Next.js, TypeScript, Playwright, Prisma). +**This is `algolia/rtk`** — Algolia's maintained fork of [rtk-ai/rtk](https://github.com/rtk-ai/rtk) (upstream). The fork was created before upstream added telemetry and is maintained independently with selective cherry-picks. ### ⚠️ Name Collision Warning **Two different "rtk" projects exist:** -- ✅ **This project**: Rust Token Killer (rtk-ai/rtk) +- ✅ **This project**: Rust Token Killer (`algolia/rtk`, forked from `rtk-ai/rtk`) - ❌ **reachingforthejack/rtk**: Rust Type Kit (DIFFERENT - generates Rust types) **Verify correct installation:** ```bash -rtk --version # Should show "rtk 0.22.2" (or newer) +rtk --version # Should show "rtk 0.22.4" (or newer) rtk gain # Should show token savings stats (NOT "command not found") ``` If `rtk gain` fails, you have the wrong package installed. +## Fork Maintenance Strategy + +### Identity + +- **Our repo**: `algolia/rtk` (origin) +- **Upstream**: `rtk-ai/rtk` (upstream remote — **fetch only, push disabled**) +- All install scripts, docs, and Cargo.toml point to `algolia/rtk` +- Upstream attribution preserved in CHANGELOG and commit history +- `gh` default repo is `algolia/rtk` — never create PRs against upstream + +**Upstream push guard** (already set, but re-run if you re-clone): +```bash +git remote set-url --push upstream no-push-to-upstream +gh repo set-default algolia/rtk +``` + +### Sync Policy: Selective Cherry-Pick + +We do **not** merge upstream wholesale. Instead: + +1. **Watch**: Upstream commits surface as GitHub issues (via watch bot) +2. **Triage**: Each issue is reviewed — accept, skip, or defer +3. **Cherry-pick**: Accepted commits are cherry-picked onto our main branch +4. **Close**: Issue closed with rationale (cherry-picked, skipped, or N/A) + +**What we want from upstream:** +- Bug fixes (exit codes, regressions, platform compat) +- New command filters (dotnet, AWS, psql, etc.) +- Security hardening (trust boundaries, input validation) +- Performance improvements +- Hook system and rewrite engine improvements + +**What we always reject:** +- `src/telemetry.rs` and any phone-home code +- Dependencies serving only telemetry: `ureq`, `sha2`, `hostname` +- Opt-out telemetry config fields (`TelemetryConfig`, `telemetry_enabled()`) +- Any code that sends data to external servers + +### Telemetry Exclusion Policy + +**Hard rule: zero network telemetry.** RTK is a CLI proxy — it reads command output and prints filtered text. It has no business phoning home. + +- `src/telemetry.rs` must never exist in this fork +- No HTTP client deps (`ureq`, `reqwest`, `hyper`) unless for a user-facing feature +- `tracking.rs` is local-only SQLite — that's fine and encouraged +- If upstream adds telemetry hooks in existing modules, strip them during cherry-pick + +### Version Pinning + +- `install.sh` pins to a specific release tag (e.g., `v0.22.4`) +- Pin is updated manually after testing a new upstream sync +- `Cargo.toml` version reflects our fork's release, not upstream's + ## Development Commands > **Note**: If rtk is installed, prefer `rtk ` over raw commands for token-optimized output. diff --git a/Cargo.lock b/Cargo.lock index 29a678cc1..dea699e7d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -581,7 +581,7 @@ checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "rtk" -version = "0.22.2" +version = "0.22.4" dependencies = [ "anyhow", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 244aa793d..ed9400f5a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,12 +1,12 @@ [package] name = "rtk" -version = "0.22.2" +version = "0.22.4" edition = "2021" authors = ["Patrick Szymkowiak"] description = "Rust Token Killer - High-performance CLI proxy to minimize LLM token consumption" license = "MIT" homepage = "https://www.rtk-ai.app" -repository = "https://github.com/rtk-ai/rtk" +repository = "https://github.com/algolia/rtk" readme = "README.md" keywords = ["cli", "llm", "token", "filter", "productivity"] categories = ["command-line-utilities", "development-tools"] diff --git a/INSTALL.md b/INSTALL.md index 002e71471..4def2ddd5 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -5,7 +5,7 @@ **There are TWO completely different projects named "rtk":** 1. ✅ **Rust Token Killer** (this project) - LLM token optimizer - - Repos: `rtk-ai/rtk` + - Repos: `algolia/rtk` (fork of `rtk-ai/rtk`) - Has `rtk gain` command for token savings stats 2. ❌ **Rust Type Kit** (reachingforthejack/rtk) - DIFFERENT PROJECT @@ -44,7 +44,7 @@ cargo uninstall rtk ### Quick Install (Linux/macOS) ```bash -curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/master/install.sh | sh +curl -fsSL https://raw.githubusercontent.com/algolia/rtk/main/install.sh | sh ``` After installation, **verify you have the correct rtk**: @@ -56,7 +56,7 @@ rtk gain # Must show token savings stats (not "command not found") ```bash # From rtk-ai repository (NOT reachingforthejack!) -cargo install --git https://github.com/rtk-ai/rtk +cargo install --git https://github.com/algolia/rtk # OR (if published and correct on crates.io) cargo install rtk @@ -164,7 +164,7 @@ rtk init -g # Automatically migrates to hook-first mode ### First-Time User (Recommended) ```bash # 1. Install RTK -cargo install --git https://github.com/rtk-ai/rtk +cargo install --git https://github.com/algolia/rtk rtk gain # Verify (must show token stats) # 2. Setup with prompts @@ -357,8 +357,8 @@ cargo install --path . --force - **Website**: https://www.rtk-ai.app - **Contact**: contact@rtk-ai.app - **Troubleshooting**: See [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md) for common issues -- **GitHub issues**: https://github.com/rtk-ai/rtk/issues -- **Pull Requests**: https://github.com/rtk-ai/rtk/pulls +- **GitHub issues**: https://github.com/algolia/rtk/issues +- **Pull Requests**: https://github.com/algolia/rtk/pulls ⚠️ **If you installed the wrong rtk (Type Kit)**, see [TROUBLESHOOTING.md](docs/TROUBLESHOOTING.md#problem-rtk-gain-command-not-found) diff --git a/README.md b/README.md index b6537eab7..1d834dece 100644 --- a/README.md +++ b/README.md @@ -4,16 +4,32 @@ **High-performance CLI proxy to minimize LLM token consumption.** -[Website](https://www.rtk-ai.app) | [GitHub](https://github.com/rtk-ai/rtk) | [Install](INSTALL.md) +[Website](https://www.rtk-ai.app) | [GitHub](https://github.com/algolia/rtk) | [Install](INSTALL.md) | Forked from [rtk-ai/rtk](https://github.com/rtk-ai/rtk) rtk filters and compresses command outputs before they reach your LLM context, saving 60-90% of tokens on common operations. +## 🔒 No Telemetry — Enforced by CI + +This is `algolia/rtk`, a maintained fork of [rtk-ai/rtk](https://github.com/rtk-ai/rtk). + +**Why this fork exists:** Upstream added phone-home telemetry in v0.29.0 (`src/telemetry.rs` — daily ping with device hash, OS, command counts). This fork was created before that addition and permanently excludes it. + +**What we guarantee:** +- No network calls — RTK reads stdin, writes stdout, writes to a local SQLite file. That's it. +- No `ureq`, `reqwest`, or any HTTP client dependency +- CI blocks any future addition via a dedicated [`telemetry-guard` job](.github/workflows/ci.yml) + +Install from this fork — **not** from upstream: +```bash +curl -fsSL https://raw.githubusercontent.com/algolia/rtk/main/install.sh | sh +``` + ## ⚠️ Important: Name Collision Warning **There are TWO different projects named "rtk":** 1. ✅ **This project (Rust Token Killer)** - LLM token optimizer - - Repos: `rtk-ai/rtk` + - Repos: `algolia/rtk` (fork of `rtk-ai/rtk`) - Purpose: Reduce Claude Code token consumption 2. ❌ **reachingforthejack/rtk** - Rust Type Kit (DIFFERENT PROJECT) @@ -22,7 +38,7 @@ rtk filters and compresses command outputs before they reach your LLM context, s **How to verify you have the correct rtk:** ```bash -rtk --version # Should show "rtk 0.22.2" +rtk --version # Should show "rtk 0.22.4" rtk gain # Should show token savings stats ``` @@ -74,7 +90,7 @@ brew install rtk ### Quick Install (Linux/macOS) ```bash -curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh +curl -fsSL https://raw.githubusercontent.com/algolia/rtk/main/install.sh | sh ``` > **Note**: rtk installs to `~/.local/bin` by default. If this directory is not in your PATH, add it: @@ -91,7 +107,7 @@ rtk gain # Must show token savings stats (not "command not found") ```bash # From rtk-ai upstream (maintained by pszymkowiak) -cargo install --git https://github.com/rtk-ai/rtk +cargo install --git https://github.com/algolia/rtk # OR if published to crates.io cargo install rtk @@ -101,7 +117,7 @@ cargo install rtk ### Alternative: Pre-built Binaries -Download from [rtk-ai/releases](https://github.com/rtk-ai/rtk/releases): +Download from [algolia/rtk releases](https://github.com/algolia/rtk/releases): - macOS: `rtk-x86_64-apple-darwin.tar.gz` / `rtk-aarch64-apple-darwin.tar.gz` - Linux: `rtk-x86_64-unknown-linux-gnu.tar.gz` / `rtk-aarch64-unknown-linux-gnu.tar.gz` - Windows: `rtk-x86_64-pc-windows-msvc.zip` @@ -240,7 +256,7 @@ Command Count Example git checkout 84 git checkout feature/my-branch cargo run 32 cargo run -- gain --help ---------------------------------------------------- --> github.com/rtk-ai/rtk/issues +-> github.com/algolia/rtk/issues ``` ### Containers @@ -855,4 +871,4 @@ Contributions welcome! Please open an issue or PR on GitHub. - Website: https://www.rtk-ai.app - Email: contact@rtk-ai.app -- Issues: https://github.com/rtk-ai/rtk/issues +- Issues: https://github.com/algolia/rtk/issues diff --git a/SECURITY.md b/SECURITY.md index 1e239085c..0967d042d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -112,7 +112,7 @@ bash scripts/detect-dangerous-patterns.sh /tmp/pr.diff | `SystemTime::now() > ...` | Logic bombs | Delayed malicious behavior | | Base64/hex strings | Obfuscation | Hides malicious URLs/commands | -See [Dangerous Patterns Reference](https://github.com/rtk-ai/rtk/wiki/Dangerous-Patterns) for exploitation examples. +See [Dangerous Patterns Reference](https://github.com/algolia/rtk/wiki/Dangerous-Patterns) for exploitation examples. --- @@ -207,7 +207,7 @@ Critical vulnerabilities (remote code execution, data exfiltration) may be fast- ## Contact - **Security issues**: security@rtk-ai.dev -- **General questions**: https://github.com/rtk-ai/rtk/discussions +- **General questions**: https://github.com/algolia/rtk/discussions - **Maintainers**: @FlorianBruniaux (active fork maintainer) --- diff --git a/bug-reports/2026-03-19-fuzz-findings.md b/bug-reports/2026-03-19-fuzz-findings.md new file mode 100644 index 000000000..824131613 --- /dev/null +++ b/bug-reports/2026-03-19-fuzz-findings.md @@ -0,0 +1,123 @@ +# RTK Agentic Fuzzing Results — 2026-03-19 + +**Method**: LLM-generated commands (Qwen 3.5 via Algolia inference proxy) targeting format-changing flags, comparing raw vs RTK output with 6 heuristic checks. + +**Stats**: 64 tests | 34 pass | 30 fail | 0 warn | 47% failure rate + +--- + +## BUG 1: grep flags crash with exit code 2 (CRITICAL) + +**Affected flags**: `-l`, `--vimgrep`, `-A/-B/-C`, `--json`, `--no-filename`, `--count-matches` + +**Symptom**: RTK exits with code 2 (rg error) while raw rg exits 0. These flags are passed through to rg via `extra_args` but conflict with RTK's hardcoded `-n --no-heading` flags, or RTK's Clap parser rejects them before they reach rg. + +**Root cause**: RTK's grep command has structured params (`pattern`, `path`, `max_len`, etc.) that consume positional args before the `extra_args` trailing var arg. Flags like `-l` or `--vimgrep` may be consumed by Clap as unknown flags, or conflict with `-n`. + +**Impact**: 7/16 grep tests fail with EXIT_CODE_MISMATCH. + +**Commands that fail**: +- `rtk grep 'fn ' --count` (despite -c fix — `--count` long form works differently?) +- `rtk grep 'pub ' -l` +- `rtk grep 'fn ' --vimgrep` +- `rtk grep 'pub ' -A 2 -B 2` +- `rtk grep 'use ' --json` +- `rtk grep 'pub ' --no-filename --count-matches` + +**Fix priority**: HIGH — these are common rg flags that users expect to work. + +--- + +## BUG 2: grep -c passthrough incomplete (MEDIUM) + +**Symptom**: `rtk grep 'fn ' -c` now works (from earlier fix) but output has LINE_EXPANSION (64 → 73 lines) and MARKER_INJECTION (📄, 🔍). Similarity to raw: 4%. + +**Root cause**: The `-c` fix detects short flag but the long `--count` form triggers a different code path. Also, when running in the test repo (not /tmp file), the count output includes more files and RTK's formatting adds headers/markers. + +**Fix priority**: MEDIUM — revisit count mode passthrough logic. + +--- + +## BUG 3: git log --format is filtered when it shouldn't be (HIGH) + +**Affected flags**: `--format='...'`, `--pretty=raw`, `--pretty=format:'...'` + +**Symptom**: When user provides custom `--format`, RTK still applies its compact log filter, truncating lines and reformatting output. Similarity drops to 20-45%. + +**Commands that fail**: +- `git log --format='%H %s %b' -10` (45% similarity) +- `git log --format='%H %s' -10` (36%) +- `git log --format='%H %ci' --abbrev-commit --decorate=no -10` (20%) +- `git log --format='%H' --name-only -10` (43%) +- `git log --pretty=raw -10` (38%) +- `git log --pretty=raw --numstat -10` (38%) + +**Root cause**: `git.rs:run_log()` detects `--format`/`--pretty` to avoid injecting its own `--pretty`, but still applies the compact filter function to the output. Should passthrough when user specifies format. + +**Fix priority**: HIGH — custom format strings are scripting staples. + +--- + +## BUG 4: git log --graph output mangled (MEDIUM) + +**Command**: `git log --oneline --graph --abbrev-commit -10` + +**Symptom**: 33% similarity. RTK's compact log strips the graph characters (|, *, \, /) that make `--graph` useful. + +**Fix priority**: MEDIUM — `--graph` is visual; stripping graph chars defeats its purpose. + +--- + +## BUG 5: git log DATA_LOSS on stat/numstat/patch (MEDIUM) + +**Affected flags**: `--stat`, `--numstat`, `--shortstat`, `--patch` + +**Symptom**: RTK's compact log drops `commit`, `Author:`, `Date:` lines and reorganizes stat info. This is intentional compression for default `git log`, but when combined with `--stat`/`--numstat`/`--patch`, the user wants detailed file-level info. + +**Commands that fail**: +- `git log --stat -10` +- `git log --numstat -10` +- `git log --shortstat -10` +- `git log --patch -10` +- `git log --stat --no-merges -10` + +**Fix priority**: MEDIUM — RTK's compression is valid for basic `git log` but should detect these flags and adjust. + +--- + +## BUG 6: git status --porcelain --long conflict (LOW) + +**Command**: `git status --porcelain --long` (contradictory flags) + +**Symptom**: 61% similarity. Git resolves the conflict (--long wins), but RTK applies its status filter which strips lines. + +**Fix priority**: LOW — contradictory flags are an edge case, but RTK should still passthrough. + +--- + +## BUG 7: git diff exit code swallowed (LOW) + +**Command**: `git diff --porcelain=v2` (invalid flag) + +**Symptom**: Raw git exits 129 (error), RTK exits 0. RTK swallows the error exit code. + +**Fix priority**: LOW — invalid flag, but exit code preservation matters for scripts. + +--- + +## Summary by Module + +| Module | Tests | Pass | Fail | Key Issues | +|--------|-------|------|------|------------| +| git-log | 16 | 3 | 13 | --format passthrough, --graph mangling, stat data loss | +| git-status | 16 | 14 | 2 | --porcelain --long edge case | +| git-diff | 16 | 15 | 1 | Exit code swallowed | +| grep | 16 | 2 | 14 | Most rg flags crash (exit 2), count mode incomplete | + +## Recommended Fix Priority + +1. **grep flag passthrough** — most flags crash entirely (exit 2) +2. **git log --format passthrough** — custom formats are scripting fundamentals +3. **git log --graph preservation** — visual output destroyed +4. **git log stat flags** — adjust compression when stat flags present +5. **grep count mode** — complete the -c/--count fix diff --git a/bug-reports/2026-03-19-fuzz-run2-findings.md b/bug-reports/2026-03-19-fuzz-run2-findings.md new file mode 100644 index 000000000..3952926ab --- /dev/null +++ b/bug-reports/2026-03-19-fuzz-run2-findings.md @@ -0,0 +1,101 @@ +# RTK Agentic Fuzzing — Run 2 Results (2026-03-19) + +**Method**: Static regression tests + LLM-generated commands (Qwen 3.5), 2 rounds × 10 families × 8 commands. +**Binary**: rtk 0.22.4 (with all Run 1 fixes applied) +**Stats**: 210 tests | 112 pass | 4 warn | 83 fail | 11 skip | **40% failure rate** + +--- + +## Summary by Module + +| Module | Tests | Pass | Fail | Warn | Key Issues | +|--------|-------|------|------|------|------------| +| git-log | 25 | 25 | 0 | 0 | **All fixed** | +| git-status | 4 | 4 | 0 | 0 | **All fixed** (porcelain markers now PASS) | +| git-diff | 21 | 19 | 2 | 0 | --name-only/--name-status format slightly altered | +| git-show | 12 | 9 | 3 | 0 | --name-only crashes (exit 128), --raw DATA_LOSS | +| git-branch | 21 | 4 | 17 | 0 | **CRITICAL**: --format, --sort cause massive expansion | +| grep | 25 | 7 | 18 | 0 | File ordering, -h Clap intercept, many format flags | +| ls | 21 | 10 | 11 | 0 | -la strips all metadata (permissions, sizes) | +| find | 15 | 3 | 12 | 0 | RTK find != system find (exit 2 on all) | +| diff | 22 | 3 | 19 | 0 | **CRITICAL**: exit code 1 swallowed, all modes broken | +| wc | 20 | 19 | 1 | 0 | -c byte count altered | +| tree | 20 | 16 | 0 | 4 | Minor line expansion warnings | +| gh-pr | 2 | 2 | 0 | 0 | **All fixed** | +| curl | 1 | 1 | 0 | 0 | OK | +| env | 1 | 1 | 0 | 0 | OK | + +--- + +## NEW BUGS (not in Run 1) + +### BUG 8: diff exit code 1 always swallowed (CRITICAL) + +**Affected**: All diff commands when files differ (exit code 1) + +`diff` returns exit 1 when files differ (not an error). RTK swallows this, returning 0. Also, `diff -q` with arguments RTK doesn't understand exits 2. + +**Impact**: 19/22 diff tests fail. Scripts relying on `diff` exit codes break silently. + +### BUG 9: find commands all fail with exit 2 (CRITICAL) + +**Affected**: All `find` commands + +RTK's `find` is a custom glob-based implementation, not a passthrough to system `find`. It doesn't accept standard find flags (`-maxdepth`, `-name`, `-type`, `-printf`). Every command fails with exit 2. + +**Impact**: 12/15 find tests fail. RTK find is fundamentally incompatible with system find. + +### BUG 10: git branch --format/--sort cause 10-15x line expansion (HIGH) + +**Affected**: `git branch --format=...`, `git branch --sort=...`, `git branch -v` + +RTK's branch filter outputs verbose info (86-94 lines) for what should be 6 lines. The filter doesn't detect format-changing flags and applies its own expansion. + +**Impact**: 17/21 git-branch tests fail. + +### BUG 11: ls -la strips all file metadata (HIGH) + +**Affected**: `ls -la`, `ls -l`, `ls -lhS`, `ls -la --color=never` + +RTK's ls filter strips permissions, ownership, sizes, dates — the exact info users request with `-l`. The filter assumes all ls output should be compacted to filenames-only, but `-l` users explicitly want metadata. + +**Impact**: 11/21 ls tests fail. 100% anchor token loss on `-l` variants. + +### BUG 12: git show --name-only exits 128 (MEDIUM) + +**Affected**: `git show --name-only HEAD`, `git show --name-only -1` + +RTK's git show handler doesn't recognize `--name-only` and fails with exit 128. The flag should trigger passthrough like git-log does. + +**Impact**: 3/12 git-show tests fail. + +### BUG 13: wc -c byte count altered (LOW) + +**Affected**: `wc -c` (byte count mode) + +RTK's wc filter reformats the byte count output, achieving only 45% similarity. + +**Impact**: 1/20 wc tests fail. Minor formatting difference. + +--- + +## Previously Fixed (verified passing) + +| Bug | Module | Status | +|-----|--------|--------| +| gh --json passthrough | gh-pr | FIXED | +| grep -c Clap collision | grep | FIXED | +| grep -l/-m Clap collision | grep | FIXED | +| git log --format passthrough | git-log | FIXED | +| git log --stat/--graph/--patch | git-log | FIXED | + +--- + +## Recommended Fix Priority + +1. **diff exit code preservation** — exit 1 is not an error, must be preserved +2. **git branch --format passthrough** — same pattern as git-log fix +3. **ls -l metadata preservation** — -l is the most common ls flag +4. **find compatibility** — either passthrough to system find or document limitation +5. **git show --name-only passthrough** — same pattern as git-log fix +6. **grep ordering** — false positive from rg thread parallelism (heuristic issue, not RTK bug) diff --git a/bug-reports/2026-03-19-fuzz-run2-report.json b/bug-reports/2026-03-19-fuzz-run2-report.json new file mode 100644 index 000000000..e486a1b6e --- /dev/null +++ b/bug-reports/2026-03-19-fuzz-run2-report.json @@ -0,0 +1,7432 @@ +{ + "timestamp": "2026-03-19T18:20:11.713051+00:00", + "rtk_version": "rtk 0.22.4", + "test_repo": "/home/pln/Work/Tools/rtk", + "rounds": 2, + "per_round": 8, + "families_tested": [ + "git-log", + "git-diff", + "git-show", + "git-branch", + "grep", + "ls", + "find", + "diff", + "wc", + "tree" + ], + "results": [ + { + "command": "git log --format='%H' -5", + "family": "git-log", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfa315c6045538a97f793e89301ac7fe412305790\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nf72e3f941646b3b7846cd8574814a77584163e8b\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfa315c6045538a97f793e89301ac7fe412305790\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nf72e3f941646b3b7846cd8574814a77584163e8b\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --pretty=raw -3", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\ntree d373ab35df262bd2f64d3a234f7dc5c322f7e944\nparent 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nauthor Paul-Louis NECH 1773943741 +0100\ncommitter Paul-Louis NECH 1773943741 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\ntree c0b15bfaec544c23b8623f14148397960ac8877a\nparent f72e3f9", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\ntree d373ab35df262bd2f64d3a234f7dc5c322f7e944\nparent 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nauthor Paul-Louis NECH 1773943741 +0100\ncommitter Paul-Louis NECH 1773943741 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\ntree c0b15bfaec544c23b8623f14148397960ac8877a\nparent f72e3f9", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --stat -5", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n scripts/fuzz-rtk.py | 5 ++++-\n src/tracking.rs | 6 ++++++\n 2 files changed, 10 insertions(+), 1 deletion(-)\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remot", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n scripts/fuzz-rtk.py | 5 ++++-\n src/tracking.rs | 6 ++++++\n 2 files changed, 10 insertions(+), 1 deletion(-)\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remot", + "stderr": "", + "exit_code": 0, + "duration_ms": 23, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --graph --oneline -10", + "family": "git-log", + "raw": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 14, + "error": null + }, + "rtk": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --numstat -5", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n4\t1\tscripts/fuzz-rtk.py\n6\t0\tsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n4\t1\tscripts/fuzz-rtk.py\n6\t0\tsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families", + "stderr": "", + "exit_code": 0, + "duration_ms": 20, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --name-only -5", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --patch -1", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --shortstat -5", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n 2 files changed, 1514 insertions(+)\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n 2 files changed, 10 insertions(+), 1 deletion(-)\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static re", + "stderr": "", + "exit_code": 0, + "duration_ms": 20, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n 2 files changed, 1514 insertions(+)\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\n 2 files changed, 10 insertions(+), 1 deletion(-)\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static re", + "stderr": "", + "exit_code": 0, + "duration_ms": 24, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --pretty=format:'%h %an %s' -5", + "family": "git-log", + "raw": { + "stdout": "69eb684 Paul-Louis NECH feat: expand static tests to 65 across 17 families, add demo page\nfa315c6 Paul-Louis NECH feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bca Paul-Louis NECH feat: expand fuzzer with 20 command families and static regression tests\nf72e3f9 Paul-Louis NECH fix: passthrough git log when format/detail flags are present\n1ad8cfb Paul-Louis NECH fix: resolve grep Clap flag collisions with rg native flags", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb684 Paul-Louis NECH feat: expand static tests to 65 across 17 families, add demo page\nfa315c6 Paul-Louis NECH feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bca Paul-Louis NECH feat: expand fuzzer with 20 command families and static regression tests\nf72e3f9 Paul-Louis NECH fix: passthrough git log when format/detail flags are present\n1ad8cfb Paul-Louis NECH fix: resolve grep Clap flag collisions with rg native flags", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --stat HEAD~1", + "family": "git-diff", + "raw": { + "stdout": " scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --name-only HEAD~1", + "family": "git-diff", + "raw": { + "stdout": "scripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "scripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\n--- Changes ---\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 84%)" + } + ], + "skipped_reason": null + }, + { + "command": "git diff --name-status HEAD~1", + "family": "git-diff", + "raw": { + "stdout": "M\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "M\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n\n--- Changes ---\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 85%)" + } + ], + "skipped_reason": null + }, + { + "command": "git diff --numstat HEAD~1", + "family": "git-diff", + "raw": { + "stdout": "59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --shortstat HEAD~1", + "family": "git-diff", + "raw": { + "stdout": " 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --stat HEAD", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 14, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%H %s' --no-patch HEAD", + "family": "git-show", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --name-only HEAD", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n\n", + "exit_code": 128, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=128" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['commit', 'Author', 'Date', 'feat', 'New']" + } + ], + "skipped_reason": null + }, + { + "command": "git show --raw HEAD", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "69eb684 feat: expand static tests to 65 across 17 families, add demo page (31 seconds ago) \n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 26, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "6/8 anchor tokens missing: ['commit', 'Author', 'Date', 'New', 'cargo-clippy']" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -a", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/origin/HEAD -> origin/main\n remotes/origin/feature/agentic-fuzzing\n remotes/origin/fix/git-global-opts\n remotes/origin/fork/algolia-identity\n remotes/origin/main\n remotes/origin/release/v0.22.3\n remotes/origin/release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/up", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/upstream/feat/hook-rewrite-toml\n remotes/upstream/feat/new-tools-toml\n remotes/upstream/feat/pr-template-ci\n remotes/upstream/feat/rtk-rewrite\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/feat/scaffold-command\n remotes/upstre", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git branch -v", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing 69eb684 feat: expand static tests to 65 across 17 families, add demo page\n fix/git-global-opts 16c324e feat: support git -C (directory) global option for cross-repo commands\n fork/algolia-identity 1a4b175 ci: use actions/cache@v4 for Rust build cache (zero third-party trust)\n main f72e3f9 [ahead 3] fix: passthrough git log when format/detail flags are present\n release/v0.22.3 d2d8a34 release: bump to v0.22.3, drop homebrew job, update version refs\n release/v0.22.4 f89894e release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/upstream/feat/hook-rewrite-toml\n remotes/upstream/feat/new-tools-toml\n remotes/upstream/feat/pr-template-ci\n remotes/upstream/feat/rtk-rewrite\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/feat/scaffold-command\n remotes/upstre", + "stderr": "git branch\n", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) %(objectname:short)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing 69eb684\nfix/git-global-opts 16c324e\nfork/algolia-identity 1a4b175\nmain f72e3f9\nrelease/v0.22.3 d2d8a34\nrelease/v0.22.4 f89894e\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing 69eb684\n fix/git-global-opts 16c324e\n fork/algolia-identity 1a4b175\n main f72e3f9\n release/v0.22.3 d2d8a34\n release/v0.22.4 f89894e\n origin d5f3cfa\n origin/feature/agentic-fuzzing 8e61bca\n origin/fix/git-global-opts 16c324e\n origin/fork/algolia-identity 1a4b175\n origin/main d5f3cfa\n origin/release/v0.22.3 d2d8a34\n origin/release/v0.22.4 f89894e\n upstream/bug/critical-fixes 1ebd6a0\n upstream/chore/claude-config 34db3e4\n upstream/develop c2cc8f3\n upstream/docs/add-ascii-diagrams a9889bc\n upstream/docs/agent-agnostic-readme d2e5bd7\n upstream/docs/functional-documentation 339d5a2\n upstream/docs/prompt-caching-faq bee819b\n upstream/docs/readme-revamp ff0c9f5\n upstream/docs/session-summary-companion ebb73e9\n upstream/docs/v0.15.1-python-go-complete fb37bc9\n upstream/feat/add-support-native-claude-cmd f00837b\n upstream/feat/claude-skills-pr-issue-triage da50445\n upstream/feat/claude-tooling-agents-rules-skills bab7363\n upstream/feat/hook-", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 13%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 11%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -c", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:3\n./src/gain.rs:14\n./src/summary.rs:10\n./src/runner.rs:5\n./src/lint_cmd.rs:14\n./scripts/benchmark.sh:4\n./src/vitest_cmd.rs:13\n./src/next_cmd.rs:5\n./src/container.rs:30\n./src/prettier_cmd.rs:5\n./scripts/test-all.sh:2\n./src/diff_cmd.rs:23\n./src/filter.rs:19\n./src/git.rs:49\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./src/main.rs:7\n./scripts/fuzz-rtk.py:10\n./src/ls.rs:11\n./src/cargo_cmd.rs:52\n./src/prisma_cmd.rs:16\n./docs/tracking.md:18\n./src/tracking.rs:25\n./src/config.rs:8\n./src/pytest_cmd.rs:10\n./src/deps.rs:6\n./src/tree.rs:8\n./src/read.rs:6\n./src/ccusage.rs:12\n./src/learn/mod.rs:1\n./src/wc_cmd.rs:22\n./src/cc_economics.rs:36\n./src/learn/report.rs:6\n./src/grep_cmd.rs:16\n./src/init.rs:50\n./ARCHITECTURE.md:13\n./src/go_cmd.rs:15\n./src/local_llm.rs:13\n./src/parser/mod.rs:22\n./src/curl_cmd.rs:6\n./src/golangci_cmd.rs:6\n./src/utils.rs:34\n./src/learn/detector.rs:25\n./src/gh_cmd.rs:47\n./src/parser/README.md:6\n./src/wget_cmd.rs:8\n./src/npm_cmd.rs:4\n./src/find_cmd.rs:14\n./scripts/fuzz", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "./CLAUDE.md:3\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./ARCHITECTURE.md:13\n./src/init.rs:50\n./src/go_cmd.rs:15\n./src/next_cmd.rs:5\n./docs/tracking.md:18\n./src/prettier_cmd.rs:5\n./src/git.rs:49\n./src/runner.rs:5\n./scripts/benchmark.sh:4\n./src/diff_cmd.rs:23\n./src/playwright_cmd.rs:10\n./src/deps.rs:6\n./src/container.rs:30\n./src/main.rs:7\n./src/tree.rs:8\n./scripts/test-all.sh:2\n./src/display_helpers.rs:55\n./src/filter.rs:19\n./src/parser/error.rs:1\n./src/parser/mod.rs:22\n./src/discover/mod.rs:3\n./src/ls.rs:11\n./src/parser/formatter.rs:17\n./src/cc_economics.rs:36\n./scripts/fuzz-rtk.py:10\n./src/parser/README.md:6\n./src/gh_cmd.rs:47\n./src/discover/registry.rs:28\n./src/cargo_cmd.rs:52\n./src/wget_cmd.rs:8\n./src/prisma_cmd.rs:16\n./src/pip_cmd.rs:11\n./src/curl_cmd.rs:6\n./src/discover/report.rs:7\n./src/summary.rs:10\n./src/pytest_cmd.rs:10\n./src/wc_cmd.rs:22\n./src/golangci_cmd.rs:6\n./src/ruff_cmd.rs:9\n./src/format_cmd.rs:12\n./src/npm_cmd.rs:4\n./src/discover/provider.rs:18\n./src/local_llm.rs:13\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 17%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -l", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md\n./src/runner.rs\n./src/gain.rs\n./src/container.rs\n./src/summary.rs\n./bug-reports/2026-03-19-fuzz-findings.md\n./scripts/benchmark.sh\n./src/filter.rs\n./src/lint_cmd.rs\n./src/pnpm_cmd.rs\n./src/vitest_cmd.rs\n./src/cargo_cmd.rs\n./src/hook_audit_cmd.rs\n./scripts/test-all.sh\n./src/ruff_cmd.rs\n./src/next_cmd.rs\n./src/pytest_cmd.rs\n./src/config.rs\n./scripts/fuzz-rtk.py\n./src/tsc_cmd.rs\n./src/tee.rs\n./src/prettier_cmd.rs\n./src/ccusage.rs\n./src/log_cmd.rs\n./src/pip_cmd.rs\n./src/diff_cmd.rs\n./src/grep_cmd.rs\n./scripts/fuzzer-demo.html\n./src/utils.rs\n./src/main.rs\n./src/playwright_cmd.rs\n./docs/tracking.md\n./src/ls.rs\n./src/wget_cmd.rs\n./src/format_cmd.rs\n./src/learn/mod.rs\n./src/display_helpers.rs\n./src/local_llm.rs\n./src/golangci_cmd.rs\n./src/deps.rs\n./src/go_cmd.rs\n./src/wc_cmd.rs\n./src/prisma_cmd.rs\n./src/learn/report.rs\n./src/tree.rs\n./src/json_cmd.rs\n./src/npm_cmd.rs\n./src/cc_economics.rs\n./src/git.rs\n./src/find_cmd.rs\n./src/curl_cmd.rs\n./src/read.rs\n./src/learn/detector.rs\n./src/e", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "./CLAUDE.md\n./bug-reports/2026-03-19-fuzz-findings.md\n./ARCHITECTURE.md\n./scripts/benchmark.sh\n./scripts/fuzzer-demo.html\n./scripts/fuzz-rtk.py\n./scripts/test-all.sh\n./docs/tracking.md\n./src/pip_cmd.rs\n./src/npm_cmd.rs\n./src/find_cmd.rs\n./src/local_llm.rs\n./src/cc_economics.rs\n./src/runner.rs\n./src/hook_audit_cmd.rs\n./src/format_cmd.rs\n./src/wget_cmd.rs\n./src/gain.rs\n./src/utils.rs\n./src/golangci_cmd.rs\n./src/json_cmd.rs\n./src/container.rs\n./src/pnpm_cmd.rs\n./src/go_cmd.rs\n./src/summary.rs\n./src/config.rs\n./src/wc_cmd.rs\n./src/curl_cmd.rs\n./src/ruff_cmd.rs\n./src/filter.rs\n./src/ccusage.rs\n./src/log_cmd.rs\n./src/tee.rs\n./src/discover/mod.rs\n./src/grep_cmd.rs\n./src/tsc_cmd.rs\n./src/git.rs\n./src/pytest_cmd.rs\n./src/init.rs\n./src/tracking.rs\n./src/cargo_cmd.rs\n./src/discover/provider.rs\n./src/playwright_cmd.rs\n./src/env_cmd.rs\n./src/learn/mod.rs\n./src/display_helpers.rs\n./src/deps.rs\n./src/discover/registry.rs\n./src/discover/report.rs\n./src/ls.rs\n./src/learn/report.rs\n./src/lint_cmd.rs\n./s", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . --vimgrep", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./scripts/benchmark.sh:175:28:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh:175:59:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh:177:31:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:177:62:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:178:34:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:178:76:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:179:29:bench \"grep -c\" \"grep -ron 'fn ' src/ || true\" \"$RTK grep '", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "rtk": { + "stdout": "./ARCHITECTURE.md:419:1:fn calculate_total(items: &[Item]) -> i32 {\n./ARCHITECTURE.md:425:1:fn calculate_total(items: &[Item]) -> i32 {\n./ARCHITECTURE.md:430:1:fn calculate_total(items: &[Item]) -> i32 { ... }\n./ARCHITECTURE.md:584:5:pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:633:1:fn test_pytest_state_machine() {\n./ARCHITECTURE.md:646:1:fn test_go_test_ndjson_interleaved() {\n./ARCHITECTURE.md:1111:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:1133:1:fn execute_command(args: &[String]) -> Result {\n./ARCHITECTURE.md:1150:1:fn filter_output(raw: &str, verbose: u8) -> String {\n./ARCHITECTURE.md:1169:5: fn test_filter_output() {\n./ARCHITECTURE.md:1313:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:1334:1:fn filter(raw: &str, verbose: u8) -> String {\n./ARCHITECTURE.md:1344:5: fn test_filter() {\n./CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md:359", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 27%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -A 2", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md- let lines: Vec<_> = input\n./CLAUDE.md- .lines()\n--\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md- match get_filter(cmd) {\n./CLAUDE.md- Some(filter) => match filter.apply(cmd, args) {\n--\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md- let filter = get_filter(cmd).expect(\"Filter must exist\");\n./CLAUDE.md- filter.apply(cmd, args)?;\n--\n./scripts/benchmark.sh:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh-bench \"grep struct\" \"grep -rn 'struct ' src/ || true\" \"$RTK grep 'struct ' src/\"\n./scripts/benchmark.sh:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:bench \"grep -c\" \"grep -ron 'f", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "rtk": { + "stdout": "./CLAUDE.md:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md- let lines: Vec<_> = input\n./CLAUDE.md- .lines()\n--\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md- match get_filter(cmd) {\n./CLAUDE.md- Some(filter) => match filter.apply(cmd, args) {\n--\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md- let filter = get_filter(cmd).expect(\"Filter must exist\");\n./CLAUDE.md- filter.apply(cmd, args)?;\n--\n./scripts/benchmark.sh:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh-bench \"grep struct\" \"grep -rn 'struct ' src/ || true\" \"$RTK grep 'struct ' src/\"\n./scripts/benchmark.sh:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:bench \"grep -c\" \"grep -ron 'f", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . --json", + "family": "grep", + "raw": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 {\\n\"},\"line_number\":419,\"absolute_offset\":18736,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 {\\n\"},\"line_number\":425,\"absolute_offset\":18909,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 { ... }\\n\"},\"line_number\":430,\"absolute_offset\":19077,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\\n\"},\"line_number\":584,\"absolute_offset\":25218,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":4,\"end\":7}]}}\n{\"type\"", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "rtk": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 {\\n\"},\"line_number\":419,\"absolute_offset\":18736,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 {\\n\"},\"line_number\":425,\"absolute_offset\":18909,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"fn calculate_total(items: &[Item]) -> i32 { ... }\\n\"},\"line_number\":430,\"absolute_offset\":19077,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":0,\"end\":3}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"./ARCHITECTURE.md\"},\"lines\":{\"text\":\"pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\\n\"},\"line_number\":584,\"absolute_offset\":25218,\"submatches\":[{\"match\":{\"text\":\"fn \"},\"start\":4,\"end\":7}]}}\n{\"type\"", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -h", + "family": "grep", + "raw": { + "stdout": "ripgrep 14.1.0\nAndrew Gallant \n\nripgrep (rg) recursively searches the current directory for lines matching\na regex pattern. By default, ripgrep will respect gitignore rules and\nautomatically skip hidden files/directories and binary files.\n\nUse -h for short descriptions and --help for more details.\n\nProject home page: https://github.com/BurntSushi/ripgrep\n\nUSAGE:\n rg [OPTIONS] PATTERN [PATH ...]\n\nPOSITIONAL ARGUMENTS:\n A regular expression used for searching.\n ... A file or directory to search.\n\nINPUT OPTIONS:\n -e, --regexp=PATTERN A pattern to search for.\n -f, --file=PATTERNFILE Search for patterns from the given file.\n --pre=COMMAND Search output of COMMAND for each PATH.\n --pre-glob=GLOB Include or exclude files from a preprocessor.\n -z, --search-zip Search in compressed files.\n\nSEARCH OPTIONS:\n -s, --case-sensitive Search case sensitively (default).\n --crl", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "Compact grep - strips whitespace, truncates, groups by file\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nArguments:\n Pattern to search\n [PATH] Path to search in [default: .]\n [EXTRA_ARGS]... Extra ripgrep arguments (e.g., -i, -A 3, -w, -l, -c, --glob)\n\nOptions:\n --max-len Max line length (no short flag \u2014 -l is rg's --files-with-matches) [default: 80]\n --max Max results to show (no short flag \u2014 -m is rg's --max-count) [default: 50]\n --context-only Show only match context (not full line; no short \u2014 -c is rg's --count)\n -t, --file-type Filter by file type (e.g., ts, py, rust) \u2014 matches rg -t\n -n, --line-numbers Show line numbers (always on, accepted for grep/rg compatibility)\n -v, --verbose... Verbosity level (-v, -vv, -vvv)\n -u, --ultra-compact Ultra-compact mode: ASCII icons, inline format (Level 2 optimizations)\n --skip-env ", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "5/7 anchor tokens missing: ['Andrew', 'automatically', 'Use', 'Project', 'USAGE']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -i --count", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:3\n./scripts/fuzzer-demo.html:7\n./scripts/benchmark.sh:4\n./scripts/test-all.sh:2\n./scripts/fuzz-rtk.py:10\n./docs/tracking.md:18\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./src/env_cmd.rs:7\n./src/read.rs:6\n./src/init.rs:50\n./src/tracking.rs:25\n./src/deps.rs:6\n./src/cc_economics.rs:36\n./src/tree.rs:8\n./src/next_cmd.rs:5\n./src/go_cmd.rs:15\n./src/git.rs:49\n./src/wget_cmd.rs:8\n./src/summary.rs:10\n./src/prettier_cmd.rs:5\n./src/vitest_cmd.rs:13\n./src/diff_cmd.rs:23\n./src/lint_cmd.rs:14\n./ARCHITECTURE.md:13\n./src/golangci_cmd.rs:6\n./src/npm_cmd.rs:4\n./src/runner.rs:5\n./src/main.rs:7\n./src/ls.rs:11\n./src/gain.rs:14\n./src/prisma_cmd.rs:16\n./src/display_helpers.rs:55\n./src/utils.rs:34\n./src/discover/mod.rs:3\n./src/tee.rs:23\n./src/curl_cmd.rs:6\n./src/container.rs:30\n./src/pnpm_cmd.rs:16\n./src/discover/registry.rs:28\n./src/wc_cmd.rs:22\n./src/pytest_cmd.rs:10\n./src/discover/report.rs:7\n./src/grep_cmd.rs:16\n./src/parser/mod.rs:22\n./src/ruff_cmd.rs:9\n./src/filter.rs:19\n./src/pip_cmd.rs:11", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "./ARCHITECTURE.md:13\n./CLAUDE.md:3\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./scripts/benchmark.sh:4\n./src/env_cmd.rs:7\n./scripts/test-all.sh:2\n./src/tracking.rs:25\n./src/playwright_cmd.rs:10\n./scripts/fuzz-rtk.py:10\n./src/runner.rs:5\n./src/parser/mod.rs:22\n./src/display_helpers.rs:55\n./src/read.rs:6\n./src/parser/error.rs:1\n./src/parser/README.md:6\n./src/container.rs:30\n./src/parser/formatter.rs:17\n./src/init.rs:50\n./src/gain.rs:14\n./src/filter.rs:19\n./src/wc_cmd.rs:22\n./src/prettier_cmd.rs:5\n./src/summary.rs:10\n./src/local_llm.rs:13\n./src/discover/mod.rs:3\n./docs/tracking.md:18\n./src/gh_cmd.rs:47\n./src/diff_cmd.rs:23\n./src/discover/report.rs:7\n./src/wget_cmd.rs:8\n./src/lint_cmd.rs:14\n./src/tee.rs:23\n./src/cargo_cmd.rs:52\n./src/tree.rs:8\n./src/discover/registry.rs:28\n./src/vitest_cmd.rs:13\n./src/npm_cmd.rs:4\n./src/golangci_cmd.rs:6\n./src/go_cmd.rs:15\n./src/pytest_cmd.rs:10\n./scripts/fuzzer-demo.html:7\n./src/json_cmd.rs:6\n./src/config.rs:8\n./src/prisma_cmd.rs:16\n./src/cc_economics.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 17%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -B 1", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md-\n./CLAUDE.md:pub fn filter_git_log(input: &str) -> Result {\n--\n./CLAUDE.md-// \u2705 RIGHT: Fallback to raw command if filter fails\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n--\n./CLAUDE.md-// \u274c WRONG: Panic if no filter\n./CLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n--\n./bug-reports/2026-03-19-fuzz-findings.md-**Commands that fail**:\n./bug-reports/2026-03-19-fuzz-findings.md:- `rtk grep 'fn ' --count` (despite -c fix \u2014 `--count` long form works differently?)\n./bug-reports/2026-03-19-fuzz-findings.md-- `rtk grep 'pub ' -l`\n./bug-reports/2026-03-19-fuzz-findings.md:- `rtk grep 'fn ' --vimgrep`\n--\n./bug-reports/2026-03-19-fuzz-findings.md-\n./bug-reports/2026-03-19-fuzz-findings.md:**Symptom**: `rtk grep 'fn ' -c` now works (from earlier fix) but output has LINE_EXPANSION (64 \u2192 73 lines) and MARKER_INJECTION (\ud83d\udcc4, \ud83d\udd0d). Similarity to raw: 4%.\n--\n./scripts/benchmark.sh-section \"grep\"\n./scripts/benchmark.sh:b", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "./ARCHITECTURE.md-// FilterLevel::None - Keep everything\n./ARCHITECTURE.md:fn calculate_total(items: &[Item]) -> i32 {\n--\n./ARCHITECTURE.md-// FilterLevel::Minimal - Strip comments only (20-40% reduction)\n./ARCHITECTURE.md:fn calculate_total(items: &[Item]) -> i32 {\n--\n./ARCHITECTURE.md-// FilterLevel::Aggressive - Strip comments + function bodies (60-90% reduction)\n./ARCHITECTURE.md:fn calculate_total(items: &[Item]) -> i32 { ... }\n--\n./ARCHITECTURE.md-// Router\n./ARCHITECTURE.md:pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\n--\n./ARCHITECTURE.md-#[test]\n./ARCHITECTURE.md:fn test_pytest_state_machine() {\n--\n./ARCHITECTURE.md-#[test]\n./ARCHITECTURE.md:fn test_go_test_ndjson_interleaved() {\n--\n./ARCHITECTURE.md-/// Public entry point called by main.rs router\n./ARCHITECTURE.md:pub fn run(args: &[String], verbose: u8) -> Result<()> {\n--\n./ARCHITECTURE.md-/// Execute the underlying tool\n./ARCHITECTURE.md:fn execute_command(args: &[String]) -> Result {\n--\n./ARCHITECTUR", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . --files-without-match", + "family": "grep", + "raw": { + "stdout": "./Cargo.toml\n./CHANGELOG.md\n./INSTALL.md\n./README.md\n./release-please-config.json\n./install.sh\n./SECURITY.md\n./bug-reports/2026-03-19-gh-json-output-rewritten.md\n./TEST_EXEC_TIME.md\n./hooks/test-rtk-rewrite.sh\n./scripts/test-aristote.sh\n./scripts/install-local.sh\n./hooks/rtk-rewrite.sh\n./scripts/update-readme-metrics.sh\n./hooks/rtk-awareness.md\n./docs/TROUBLESHOOTING.md\n./ROADMAP.md\n./scripts/FUZZ-RTK.md\n./LICENSE\n./Formula/rtk.rb\n./scripts/test-tracking.sh\n./scripts/validate-docs.sh\n./scripts/check-installation.sh\n./docs/AUDIT_GUIDE.md\n./scripts/rtk-economics.sh\n./Cargo.lock\n./src/parser/types.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "rtk": { + "stdout": "./install.sh\n./LICENSE\n./CHANGELOG.md\n./TEST_EXEC_TIME.md\n./INSTALL.md\n./release-please-config.json\n./Formula/rtk.rb\n./hooks/test-rtk-rewrite.sh\n./hooks/rtk-rewrite.sh\n./ROADMAP.md\n./hooks/rtk-awareness.md\n./bug-reports/2026-03-19-gh-json-output-rewritten.md\n./Cargo.toml\n./README.md\n./docs/TROUBLESHOOTING.md\n./SECURITY.md\n./src/parser/types.rs\n./scripts/test-aristote.sh\n./docs/AUDIT_GUIDE.md\n./scripts/install-local.sh\n./scripts/test-tracking.sh\n./scripts/update-readme-metrics.sh\n./scripts/FUZZ-RTK.md\n./scripts/validate-docs.sh\n./scripts/rtk-economics.sh\n./scripts/check-installation.sh\n./Cargo.lock\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -la", + "family": "ls", + "raw": { + "stdout": "total 280\ndrwxrwxr-x 12 pln pln 4096 Mar 19 15:25 .\ndrwxrwxr-x 32 pln pln 4096 Mar 19 10:46 ..\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\ndrwxrwxr-x 7 pln pln 4096 Mar 19 19:05 .claude\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 8 pln pln 4096 Mar 19 19:19 .git\ndrwxrwxr-x 3 pln pln 4096 Mar 17 17:41 .github\n-rw-rw-r-- 1 pln pln 339 Mar 17 17:41 .gitignore\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 r", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 .toml, 1 .gitignore, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', 'drwxrwxr-x', 'drwxrwxr-x', '-rw-rw-r--', 'drwxrwxr-x']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -1", + "family": "ls", + "raw": { + "stdout": "ARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nFormula\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .toml, 1 .gitignore, 1 .lock, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "20 \u2192 25 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls -lhS src/", + "family": "ls", + "raw": { + "stdout": "total 836K\n-rw-rw-r-- 1 pln pln 54K Mar 19 17:53 git.rs\n-rw-rw-r-- 1 pln pln 53K Mar 17 17:41 cargo_cmd.rs\n-rw-rw-r-- 1 pln pln 51K Mar 18 04:21 init.rs\n-rw-rw-r-- 1 pln pln 50K Mar 19 17:37 main.rs\n-rw-rw-r-- 1 pln pln 47K Mar 19 15:42 gh_cmd.rs\n-rw-rw-r-- 1 pln pln 38K Mar 18 04:21 cc_economics.rs\n-rw-rw-r-- 1 pln pln 34K Mar 19 18:57 tracking.rs\n-rw-rw-r-- 1 pln pln 28K Mar 18 04:21 container.rs\n-rw-rw-r-- 1 pln pln 24K Mar 18 04:21 lint_cmd.rs\n-rw-rw-r-- 1 pln pln 17K Mar 18 04:21 gain.rs\n-rw-rw-r-- 1 pln pln 17K Mar 17 17:41 pnpm_cmd.rs\n-rw-rw-r-- 1 pln pln 16K Mar 17 17:41 go_cmd.rs\n-rw-rw-r-- 1 pln pln 14K Mar 17 17:41 playwright_cmd.rs\n-rw-rw-r-- 1 pln pln 14K Mar 17 17:41 prisma_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 18 04:21 format_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 19 17:49 grep_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 18 04:21 ruff_cmd.rs\n-rw-rw-r-- 1 pln pln 12K Mar 17 17:41 filter.rs\n-rw-rw-r-- 1 pln pln 12K Mar 17 17:41 pytest_cmd.rs\n-rw-rw-r-- 1 pln pln 12K", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "discover/\nlearn/\nparser/\ngit.rs 53.4K\ncargo_cmd.rs 52.6K\ninit.rs 50.3K\nmain.rs 49.6K\ngh_cmd.rs 46.1K\ncc_economics.rs 37.6K\ntracking.rs 33.1K\ncontainer.rs 27.3K\nlint_cmd.rs 23.4K\ngain.rs 16.6K\npnpm_cmd.rs 16.1K\ngo_cmd.rs 15.9K\nplaywright_cmd.rs 13.5K\nprisma_cmd.rs 13.4K\nformat_cmd.rs 12.9K\ngrep_cmd.rs 12.9K\nruff_cmd.rs 12.5K\nfilter.rs 11.9K\npytest_cmd.rs 11.8K\nvitest_cmd.rs 11.7K\ntee.rs 11.5K\nwc_cmd.rs 11.4K\nutils.rs 11.1K\ndiff_cmd.rs 10.4K\ndisplay_helpers.rs 9.5K\nls.rs 9.5K\nlocal_llm.rs 9.5K\nccusage.rs 9.3K\nsummary.rs 9.0K\nhook_audit_cmd.rs 8.9K\ndeps.rs 8.8K\ntsc_cmd.rs 8.4K\nrunner.rs 8.3K\npip_cmd.rs 8.3K\nwget_cmd.rs 7.9K\nfind_cmd.rs 7.9K\nlog_cmd.rs 7.6K\ngolangci_cmd.rs 7.3K\nnext_cmd.rs 7.2K\ntree.rs 6.0K\nenv_cmd.rs 5.6K\nprettier_cmd.rs 5.5K\njson_cmd.rs 5.3K\nread.rs 4.5K\ncurl_cmd.rs 3.3K\nconfig.rs 3.0K\nnpm_cmd.rs 2.7K\n\n\ud83d\udcca 47 files, 3 dirs (47 .rs)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -R src/", + "family": "ls", + "raw": { + "stdout": "src/:\ncargo_cmd.rs\ncc_economics.rs\nccusage.rs\nconfig.rs\ncontainer.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndiscover\ndisplay_helpers.rs\nenv_cmd.rs\nfilter.rs\nfind_cmd.rs\nformat_cmd.rs\ngain.rs\ngh_cmd.rs\ngit.rs\ngo_cmd.rs\ngolangci_cmd.rs\ngrep_cmd.rs\nhook_audit_cmd.rs\ninit.rs\njson_cmd.rs\nlearn\nlint_cmd.rs\nlocal_llm.rs\nlog_cmd.rs\nls.rs\nmain.rs\nnext_cmd.rs\nnpm_cmd.rs\nparser\npip_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs\npytest_cmd.rs\nread.rs\nruff_cmd.rs\nrunner.rs\nsummary.rs\ntee.rs\ntracking.rs\ntree.rs\ntsc_cmd.rs\nutils.rs\nvitest_cmd.rs\nwc_cmd.rs\nwget_cmd.rs\n\nsrc/discover:\nmod.rs\nprovider.rs\nregistry.rs\nreport.rs\n\nsrc/learn:\ndetector.rs\nmod.rs\nreport.rs\n\nsrc/parser:\nerror.rs\nformatter.rs\nmod.rs\nREADME.md\ntypes.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "discover/\nlearn/\nparser/\ncargo_cmd.rs 52.6K\ncc_economics.rs 37.6K\nccusage.rs 9.3K\nconfig.rs 3.0K\ncontainer.rs 27.3K\ncurl_cmd.rs 3.3K\ndeps.rs 8.8K\ndiff_cmd.rs 10.4K\ndisplay_helpers.rs 9.5K\nenv_cmd.rs 5.6K\nfilter.rs 11.9K\nfind_cmd.rs 7.9K\nformat_cmd.rs 12.9K\ngain.rs 16.6K\ngh_cmd.rs 46.1K\ngit.rs 53.4K\ngo_cmd.rs 15.9K\ngolangci_cmd.rs 7.3K\ngrep_cmd.rs 12.9K\nhook_audit_cmd.rs 8.9K\ninit.rs 50.3K\njson_cmd.rs 5.3K\nlint_cmd.rs 23.4K\nlocal_llm.rs 9.5K\nlog_cmd.rs 7.6K\nls.rs 9.5K\nmain.rs 49.6K\nnext_cmd.rs 7.2K\nnpm_cmd.rs 2.7K\npip_cmd.rs 8.3K\nplaywright_cmd.rs 13.5K\npnpm_cmd.rs 16.1K\nprettier_cmd.rs 5.5K\nprisma_cmd.rs 13.4K\npytest_cmd.rs 11.8K\nread.rs 4.5K\nruff_cmd.rs 12.5K\nrunner.rs 8.3K\nsummary.rs 9.0K\ntee.rs 11.5K\ntracking.rs 33.1K\ntree.rs 6.0K\ntsc_cmd.rs 8.4K\nutils.rs 11.1K\nvitest_cmd.rs 11.7K\nwc_cmd.rs 11.4K\nwget_cmd.rs 7.9K\nmod.rs 8.1K\nprovider.rs 14.7K\nregistry.rs 19.7K\nreport.rs 5.4K\ndetector.rs 20.7K\nmod.rs 3.6K\nreport.rs 5.6K\nerror.rs ", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -la --color=never", + "family": "ls", + "raw": { + "stdout": "total 280\ndrwxrwxr-x 12 pln pln 4096 Mar 19 15:25 .\ndrwxrwxr-x 32 pln pln 4096 Mar 19 10:46 ..\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\ndrwxrwxr-x 7 pln pln 4096 Mar 19 19:05 .claude\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 8 pln pln 4096 Mar 19 19:19 .git\ndrwxrwxr-x 3 pln pln 4096 Mar 17 17:41 .github\n-rw-rw-r-- 1 pln pln 339 Mar 17 17:41 .gitignore\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 r", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 no ext, 1 .sh, 1 .gitignore, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', 'drwxrwxr-x', 'drwxrwxr-x', '-rw-rw-r--', 'drwxrwxr-x']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 18%)" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -name '*.rs'", + "family": "find", + "raw": { + "stdout": "./src/init.rs\n./src/read.rs\n./src/tracking.rs\n./src/env_cmd.rs\n./src/display_helpers.rs\n./src/playwright_cmd.rs\n./src/gh_cmd.rs\n./src/git.rs\n./src/go_cmd.rs\n./src/cc_economics.rs\n./src/tree.rs\n./src/deps.rs\n./src/prisma_cmd.rs\n./src/ls.rs\n./src/main.rs\n./src/diff_cmd.rs\n./src/prettier_cmd.rs\n./src/next_cmd.rs\n./src/vitest_cmd.rs\n./src/lint_cmd.rs\n./src/summary.rs\n./src/gain.rs\n./src/npm_cmd.rs\n./src/golangci_cmd.rs\n./src/wget_cmd.rs\n./src/local_llm.rs\n./src/wc_cmd.rs\n./src/format_cmd.rs\n./src/find_cmd.rs\n./src/curl_cmd.rs\n./src/json_cmd.rs\n./src/config.rs\n./src/hook_audit_cmd.rs\n./src/pip_cmd.rs\n./src/tee.rs\n./src/log_cmd.rs\n./src/tsc_cmd.rs\n./src/ruff_cmd.rs\n./src/pnpm_cmd.rs\n./src/utils.rs\n./src/grep_cmd.rs\n./src/ccusage.rs\n./src/pytest_cmd.rs\n./src/cargo_cmd.rs\n./src/filter.rs\n./src/container.rs\n./src/runner.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['./src/init.rs', './src/read.rs', './src/tracking.rs', './src/env_cmd.rs', './src/display_helpers.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -type d", + "family": "find", + "raw": { + "stdout": ".\n./src\n./src/discover\n./src/parser\n./src/learn\n./.claude\n./.claude/skills\n./.claude/commands\n./.claude/hooks\n./.claude/rules\n./.claude/agents\n./.github\n./.github/workflows\n./Formula\n./scripts\n./docs\n./docs/images\n./target\n./target/debug\n./target/release\n./bug-reports\n./hooks\n./.git\n./.git/info\n./.git/objects\n./.git/refs\n./.git/logs\n./.git/branches\n./.git/hooks\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['./src', './src/discover', './src/parser', './src/learn', './.claude']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -name '*.toml'", + "family": "find", + "raw": { + "stdout": "./Cargo.toml\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "1,1610c1,56\n< mod cargo_cmd;\n< mod cc_economics;\n< mod ccusage;\n< mod config;\n< mod container;\n< mod curl_cmd;\n< mod deps;\n< mod diff_cmd;\n< mod discover;\n< mod display_helpers;\n< mod env_cmd;\n< mod filter;\n< mod find_cmd;\n< mod format_cmd;\n< mod gain;\n< mod gh_cmd;\n< mod git;\n< mod go_cmd;\n< mod golangci_cmd;\n< mod grep_cmd;\n< mod hook_audit_cmd;\n< mod init;\n< mod json_cmd;\n< mod learn;\n< mod lint_cmd;\n< mod local_llm;\n< mod log_cmd;\n< mod ls;\n< mod next_cmd;\n< mod npm_cmd;\n< mod parser;\n< mod pip_cmd;\n< mod playwright_cmd;\n< mod pnpm_cmd;\n< mod prettier_cmd;\n< mod prisma_cmd;\n< mod pytest_cmd;\n< mod read;\n< mod ruff_cmd;\n< mod runner;\n< mod summary;\n< mod tee;\n< mod tracking;\n< mod tree;\n< mod tsc_cmd;\n< mod utils;\n< mod vitest_cmd;\n< mod wc_cmd;\n< mod wget_cmd;\n< \n< use anyhow::{Context, Result};\n< use clap::{Parser, Subcommand};\n< use std::ffi::OsString;\n< use std::path::{Path, PathBuf};\n< \n< #[derive(Parser)]\n< #[command(\n< name = \"rtk\",\n< version,\n< about = \"Rust Toke", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['1,1610c1,56']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "wc -l src/main.rs", + "family": "wc", + "raw": { + "stdout": "1610 src/main.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "1610\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -w src/main.rs", + "family": "wc", + "raw": { + "stdout": "4666 src/main.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "4666\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -c src/main.rs", + "family": "wc", + "raw": { + "stdout": "50760 src/main.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "50760\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 45%)" + } + ], + "skipped_reason": null + }, + { + "command": "wc -l src/git.rs src/grep_cmd.rs", + "family": "wc", + "raw": { + "stdout": " 1734 src/git.rs\n 420 src/grep_cmd.rs\n 2154 total\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "1734 git.rs\n420 grep_cmd.rs\n\u03a3 2154\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 ARCHITECTURE.md\n\u251c\u2500\u2500 bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 CHANGELOG.md\n\u251c\u2500\u2500 CLAUDE.md\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 TROUBLESHOOTING.md\n\u251c\u2500\u2500 Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 rtk.rb\n\u251c\u2500\u2500 hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-rtk-rewrite.sh\n\u251c\u2500\u2500 INSTALL.md\n\u251c\u2500\u2500 install.sh\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 release-please-config.json\n\u251c\u2500\u2500 ROADMAP.md\n\u251c\u2500\u2500 scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 update-readme-metrics.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 validate-docs.sh\n\u251c\u2500\u2500 SECURITY.md\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cargo_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cc_economics.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ccusage.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 container.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 curl_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deps.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 diff_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 ARCHITECTURE.md\n\u251c\u2500\u2500 bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 Cargo.lock\n\u251c\u2500\u2500 Cargo.toml\n\u251c\u2500\u2500 CHANGELOG.md\n\u251c\u2500\u2500 CLAUDE.md\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 TROUBLESHOOTING.md\n\u251c\u2500\u2500 Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 rtk.rb\n\u251c\u2500\u2500 hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-rtk-rewrite.sh\n\u251c\u2500\u2500 INSTALL.md\n\u251c\u2500\u2500 install.sh\n\u251c\u2500\u2500 LICENSE\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 release-please-config.json\n\u251c\u2500\u2500 ROADMAP.md\n\u251c\u2500\u2500 scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 update-readme-metrics.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 validate-docs.sh\n\u251c\u2500\u2500 SECURITY.md\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cargo_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cc_economics.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ccusage.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 container.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 curl_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deps.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 diff_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -d -L 3", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 images\n\u251c\u2500\u2500 Formula\n\u251c\u2500\u2500 hooks\n\u251c\u2500\u2500 scripts\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 learn\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 parser\n\u2514\u2500\u2500 target\n \u251c\u2500\u2500 debug\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 build\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 deps\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 examples\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 incremental\n \u2514\u2500\u2500 release\n \u251c\u2500\u2500 build\n \u251c\u2500\u2500 deps\n \u251c\u2500\u2500 examples\n \u2514\u2500\u2500 incremental\n\n22 directories\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 images\n\u251c\u2500\u2500 Formula\n\u251c\u2500\u2500 hooks\n\u251c\u2500\u2500 scripts\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 discover\n \u251c\u2500\u2500 learn\n \u2514\u2500\u2500 parser\n\n11 directories\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 1 --charset=ascii", + "family": "tree", + "raw": { + "stdout": ".\n|-- ARCHITECTURE.md\n|-- bug-reports\n|-- Cargo.lock\n|-- Cargo.toml\n|-- CHANGELOG.md\n|-- CLAUDE.md\n|-- docs\n|-- Formula\n|-- hooks\n|-- INSTALL.md\n|-- install.sh\n|-- LICENSE\n|-- README.md\n|-- release-please-config.json\n|-- ROADMAP.md\n|-- scripts\n|-- SECURITY.md\n|-- src\n|-- target\n`-- TEST_EXEC_TIME.md\n\n8 directories, 13 files\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": ".\n|-- ARCHITECTURE.md\n|-- bug-reports\n|-- Cargo.lock\n|-- Cargo.toml\n|-- CHANGELOG.md\n|-- CLAUDE.md\n|-- docs\n|-- Formula\n|-- hooks\n|-- INSTALL.md\n|-- install.sh\n|-- LICENSE\n|-- README.md\n|-- release-please-config.json\n|-- ROADMAP.md\n|-- scripts\n|-- SECURITY.md\n|-- src\n`-- TEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 -f", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 ./ARCHITECTURE.md\n\u251c\u2500\u2500 ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 ./Cargo.lock\n\u251c\u2500\u2500 ./Cargo.toml\n\u251c\u2500\u2500 ./CHANGELOG.md\n\u251c\u2500\u2500 ./CLAUDE.md\n\u251c\u2500\u2500 ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./Formula/rtk.rb\n\u251c\u2500\u2500 ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 ./INSTALL.md\n\u251c\u2500\u2500 ./install.sh\n\u251c\u2500\u2500 ./LICENSE\n\u251c\u2500\u2500 ./README.md\n\u251c\u2500\u2500 ./release-please-config.json\n\u251c\u2500\u2500 ./ROADMAP.md\n\u251c\u2500\u2500 ./scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/update-readme-metrics", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 ./ARCHITECTURE.md\n\u251c\u2500\u2500 ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 ./Cargo.lock\n\u251c\u2500\u2500 ./Cargo.toml\n\u251c\u2500\u2500 ./CHANGELOG.md\n\u251c\u2500\u2500 ./CLAUDE.md\n\u251c\u2500\u2500 ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./Formula/rtk.rb\n\u251c\u2500\u2500 ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 ./INSTALL.md\n\u251c\u2500\u2500 ./install.sh\n\u251c\u2500\u2500 ./LICENSE\n\u251c\u2500\u2500 ./README.md\n\u251c\u2500\u2500 ./release-please-config.json\n\u251c\u2500\u2500 ./ROADMAP.md\n\u251c\u2500\u2500 ./scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/update-readme-metrics", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --format='%H' -10", + "family": "git-log", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfa315c6045538a97f793e89301ac7fe412305790\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nf72e3f941646b3b7846cd8574814a77584163e8b\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6\n87fa5b978b15271d4461934428b2a3b8fa99833d\nd5f3cfa0ac86b693bce326db8484dfc8996fde72\n3c4126de2f93ac906c7d63874459ab8506a430bd\n92872477ea0edd88847c18a19c120bb4b159b537\nf89894eaeea622f376b079dccb73041019580f55\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfa315c6045538a97f793e89301ac7fe412305790\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nf72e3f941646b3b7846cd8574814a77584163e8b\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6\n87fa5b978b15271d4461934428b2a3b8fa99833d\nd5f3cfa0ac86b693bce326db8484dfc8996fde72\n3c4126de2f93ac906c7d63874459ab8506a430bd\n92872477ea0edd88847c18a19c120bb4b159b537\nf89894eaeea622f376b079dccb73041019580f55\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --oneline --graph -10", + "family": "git-log", + "raw": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --pretty=tformat:'%H %s' --abbrev-commit -5", + "family": "git-log", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests\nf72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detail flags are present\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests\nf72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detail flags are present\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --patch --no-merges -10", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 26, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 32, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --stat --name-only -10", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --porcelain -5", + "family": "git-log", + "raw": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n", + "exit_code": 128, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n\n", + "exit_code": 128, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --format='{\"hash\":\"%H\",\"subject\":\"%s\"}' --json -10", + "family": "git-log", + "raw": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --json\n", + "exit_code": 128, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --json\n", + "exit_code": 128, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --quiet --name-status -10", + "family": "git-log", + "raw": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n", + "exit_code": 128, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n", + "exit_code": 128, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --stat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --numstat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --shortstat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --name-only", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --name-status", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --cached", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --raw", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --word-diff=plain", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%H %s' -1", + "family": "git-show", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ \"git status --short --branch\",\n+ ],\n+ \"git-diff\": [\n+ \"git diff --stat HEAD~1\",\n+ \"git diff --name-only HEAD~1\",\n+ \"git diff --name-status HEAD~1\",\n+ \"git diff --numstat HEAD~1\",\n+ \"git diff --shortstat HEAD~1\",\n+ ],\n+ \"git-show\": [\n+ \"git show --stat HEAD\",\n+ \"git show --format='%H %s' --n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ \"git status --short --branch\",\n+ ],\n+ \"git-diff\": [\n+ \"git diff --stat HEAD~1\",\n+ \"git diff --name-only HEAD~1\",\n+ \"git diff --name-status HEAD~1\",\n+ \"git diff --numstat HEAD~1\",\n+ \"git diff --shortstat HEAD~1\",\n+ ],\n+ \"git-show\": [\n+ \"git show --stat HEAD\",\n+ \"git show --format='%H %s' --n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --pretty=raw -1", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git sta", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git sta", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --name-only -1", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n\n", + "exit_code": 128, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=128" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['commit', 'Author', 'Date', 'feat', 'New']" + } + ], + "skipped_reason": null + }, + { + "command": "git show --stat --no-patch -1", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%h - %s' --name-status -1", + "family": "git-show", + "raw": { + "stdout": "69eb684 - feat: expand static tests to 65 across 17 families, add demo page\n\nM\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "69eb684 - feat: expand static tests to 65 across 17 families, add demo page\n\nM\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --pretty=short --no-patch -1", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \n\n feat: expand static tests to 65 across 17 families, add demo page\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \n\n feat: expand static tests to 65 across 17 families, add demo page\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format=%B --no-patch -1", + "family": "git-show", + "raw": { + "stdout": "feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --porcelain -1", + "family": "git-show", + "raw": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n", + "exit_code": 128, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n\n", + "exit_code": 128, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git branch --format='%H %s'", + "family": "git-branch", + "raw": { + "stdout": "%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 0%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -a --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n remotes/origin/feature/agentic-fuzzing\n main\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n release/v0.22.4\n remotes/origin/release/v0.22.4\n fix/git-global-opts\n remotes/origin/fix/git-global-opts\n release/v0.22.3\n remotes/origin/release/v0.22.3\n fork/algolia-identity\n remotes/origin/fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 18, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "4/7 anchor tokens missing: ['remotes/origin/feature/agentic-fuzzing', 'remotes/origin/HEAD', 'remotes/origin/main', 'remotes/origin/release/v0.22.4']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 88%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --porcelain -v", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `porcelain'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --json --list", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `json'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git branc", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --quiet --name-only", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `name-only'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --all --oneline --graph -5", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `oneline'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git br", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) | %(committerdate:unix)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing | 1773944381\nfix/git-global-opts | 1773853165\nfork/algolia-identity | 1773783266\nmain | 1773939208\nrelease/v0.22.3 | 1773804219\nrelease/v0.22.4 | 1773858435\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing | 1773944381\n fix/git-global-opts | 1773853165\n fork/algolia-identity | 1773783266\n main | 1773939208\n release/v0.22.3 | 1773804219\n release/v0.22.4 | 1773858435\n origin | 1773931503\n origin/feature/agentic-fuzzing | 1773941055\n origin/fix/git-global-opts | 1773853165\n origin/fork/algolia-identity | 1773783266\n origin/main | 1773931503\n origin/release/v0.22.3 | 1773804219\n origin/release/v0.22.4 | 1773858435\n upstream/bug/critical-fixes | 1773147156\n upstream/chore/claude-config | 1771237628\n upstream/develop | 1773765602\n upstream/docs/add-ascii-diagrams | 1771768040\n upstream/docs/agent-agnostic-readme | 1773044951\n upstream/docs/functional-documentation | 1772820011\n upstream/docs/prompt-caching-faq | 1773395320\n upstream/docs/readme-revamp | 1772794320\n upstream/docs/session-summary-companion | 1771230835\n upstream/docs/v0.15.1-python-go-complete | 1771089657\n upstream/feat/add-support-native-claude-cmd | 1773047861\n upstream/fea", + "stderr": "", + "exit_code": 0, + "duration_ms": 21, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 15%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -r --sort=committerdate --format='%(refname:short) %h'", + "family": "git-branch", + "raw": { + "stdout": "upstream/docs/v0.15.1-python-go-complete %h\nupstream/feat/tee-output %h\nupstream/docs/session-summary-companion %h\nupstream/chore/claude-config %h\nupstream/feat/hook-audit-mode %h\nupstream/fix/install-local-bin %h\nupstream/feat/scaffold-command %h\nupstream/docs/add-ascii-diagrams %h\nupstream/fix/remove-personal-refs-claude-md %h\nupstream/feat/rtk-rewrite %h\nupstream/feat/telemetry %h\nupstream/fix/hook-rewrite-guard-and-exclude %h\nupstream/feat/claude-skills-pr-issue-triage %h\nupstream/fix/hook-outdated-warning %h\nupstream/fix/345-346-347-rewrite-json %h\nupstream/fix/prettier-false-positive %h\nupstream/fix/git-commit-flags %h\nupstream/fix/docker-compose-rewrite %h\nupstream/fix/lint-npx-prefix %h\nupstream/fix/linux-binary-release %h\nupstream/docs/readme-revamp %h\nupstream/fix/354-gh-diff-truncation %h\nupstream/fix/discord-release-notification %h\nupstream/docs/functional-documentation %h\nupstream/fix/cicd-add-secu-check-dev %h\nupstream/docs/agent-agnostic-readme %h\nupstream/feat/add-suppo", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "rtk": { + "stdout": "* \n upstream/docs/v0.15.1-python-go-complete %h\n upstream/feat/tee-output %h\n upstream/docs/session-summary-companion %h\n upstream/chore/claude-config %h\n upstream/feat/hook-audit-mode %h\n upstream/fix/install-local-bin %h\n upstream/feat/scaffold-command %h\n upstream/docs/add-ascii-diagrams %h\n upstream/fix/remove-personal-refs-claude-md %h\n upstream/feat/rtk-rewrite %h\n upstream/feat/telemetry %h\n upstream/fix/hook-rewrite-guard-and-exclude %h\n upstream/feat/claude-skills-pr-issue-triage %h\n upstream/fix/hook-outdated-warning %h\n upstream/fix/345-346-347-rewrite-json %h\n upstream/fix/prettier-false-positive %h\n upstream/fix/git-commit-flags %h\n upstream/fix/docker-compose-rewrite %h\n upstream/fix/lint-npx-prefix %h\n upstream/fix/linux-binary-release %h\n upstream/docs/readme-revamp %h\n upstream/fix/354-gh-diff-truncation %h\n upstream/fix/discord-release-notification %h\n upstream/docs/functional-documentation %h\n upstream/fix/cicd-add-secu-check-dev %h\n upstrea", + "stderr": "", + "exit_code": 0, + "duration_ms": 20, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 71%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --files-with-matches", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md\nsrc/env_cmd.rs\nCLAUDE.md\nsrc/tracking.rs\nsrc/read.rs\nsrc/init.rs\nsrc/prisma_cmd.rs\nsrc/deps.rs\nsrc/runner.rs\nsrc/tree.rs\nscripts/benchmark.sh\nsrc/curl_cmd.rs\nsrc/parser/mod.rs\nsrc/container.rs\nsrc/cc_economics.rs\nsrc/find_cmd.rs\nsrc/parser/README.md\nsrc/tsc_cmd.rs\nscripts/test-all.sh\nsrc/go_cmd.rs\nsrc/filter.rs\nsrc/parser/error.rs\nsrc/format_cmd.rs\nsrc/parser/formatter.rs\nsrc/log_cmd.rs\nscripts/fuzz-rtk.py\nbug-reports/2026-03-19-fuzz-findings.md\nsrc/wc_cmd.rs\nsrc/cargo_cmd.rs\nsrc/gh_cmd.rs\nsrc/git.rs\nsrc/tee.rs\nsrc/playwright_cmd.rs\nsrc/local_llm.rs\nsrc/pytest_cmd.rs\nsrc/display_helpers.rs\nsrc/vitest_cmd.rs\nsrc/pip_cmd.rs\nsrc/wget_cmd.rs\nsrc/ccusage.rs\nsrc/next_cmd.rs\nsrc/hook_audit_cmd.rs\nsrc/golangci_cmd.rs\nsrc/discover/mod.rs\nsrc/grep_cmd.rs\nsrc/prettier_cmd.rs\nsrc/pnpm_cmd.rs\nsrc/config.rs\nsrc/discover/registry.rs\nsrc/utils.rs\nsrc/npm_cmd.rs\nsrc/diff_cmd.rs\nsrc/ruff_cmd.rs\nsrc/discover/report.rs\nsrc/ls.rs\nsrc/discover/provider.rs\nscripts/fuzzer-demo.html\nsrc/lint_cm", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--files-with-matches' found\n\n tip: a similar argument exists: '--file-type'\n tip: to pass '--files-with-matches' as a value, use '-- --files-with-matches'\n\nUsage: rtk grep --file-type [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'src/env_cmd.rs', 'CLAUDE.md', 'src/tracking.rs', 'src/read.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --count", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:3\nscripts/benchmark.sh:4\nscripts/fuzzer-demo.html:7\nscripts/test-all.sh:2\nbug-reports/2026-03-19-fuzz-findings.md:3\nscripts/fuzz-rtk.py:10\nARCHITECTURE.md:13\ndocs/tracking.md:18\nsrc/vitest_cmd.rs:13\nsrc/tree.rs:8\nsrc/tracking.rs:25\nsrc/read.rs:6\nsrc/runner.rs:5\nsrc/init.rs:50\nsrc/discover/mod.rs:3\nsrc/next_cmd.rs:5\nsrc/cc_economics.rs:36\nsrc/container.rs:30\nsrc/gh_cmd.rs:47\nsrc/git.rs:49\nsrc/prettier_cmd.rs:5\nsrc/display_helpers.rs:55\nsrc/filter.rs:19\nsrc/playwright_cmd.rs:10\nsrc/deps.rs:6\nsrc/diff_cmd.rs:23\nsrc/discover/registry.rs:28\nsrc/ls.rs:11\nsrc/cargo_cmd.rs:52\nsrc/go_cmd.rs:15\nsrc/discover/provider.rs:18\nsrc/prisma_cmd.rs:16\nsrc/wget_cmd.rs:8\nsrc/pytest_cmd.rs:10\nsrc/tsc_cmd.rs:7\nsrc/discover/report.rs:7\nsrc/golangci_cmd.rs:6\nsrc/ccusage.rs:12\nsrc/parser/mod.rs:22\nsrc/format_cmd.rs:12\nsrc/main.rs:7\nsrc/summary.rs:10\nsrc/npm_cmd.rs:4\nsrc/log_cmd.rs:7\nsrc/local_llm.rs:13\nsrc/grep_cmd.rs:16\nsrc/env_cmd.rs:7\nsrc/learn/mod.rs:1\nsrc/parser/README.md:6\nsrc/gain.rs:14\nsrc/uti", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--count' found\n\n tip: a similar argument exists: '--context-only'\n tip: to pass '--count' as a value, use '-- --count'\n\nUsage: rtk grep --context-only [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:3', 'scripts/benchmark.sh:4', 'scripts/fuzzer-demo.html:7', 'scripts/test-all.sh:2', 'bug-reports/2026-03-19-fuzz-findings.md:3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' --no-filename", + "family": "grep", + "raw": { + "stdout": "* **hook:** use POSIX character classes for cross-platform grep compatibility ([#98](https://github.com/rtk-ai/rtk/issues/98)) ([4aafc83](https://github.com/rtk-ai/rtk/commit/4aafc832d4bdd438609358e2737a96bee4bb2467))\n- Refactored `insert_hook_entry()` to use idiomatic Rust `entry()` API\n* **migrate commands to OutputParser**: vitest, playwright, pnpm now use robust parsing\n# 4. Test: git status (should use rtk)\n**Golden Rule**: AI coding assistants should ALWAYS use `rtk` as a proxy for shell commands that generate verbose output (git, pnpm, npm, cargo test, vitest, docker, kubectl).\n- **Lazy regex compilation**: Compile once with `lazy_static!`, reuse forever\n- **ALWAYS** use `.context(\"description\")` with `?` operator\n- **NO unwrap()** in production code (tests only - use `expect(\"explanation\")` if needed)\nuse anyhow::{Context, Result};\n- Deep diving into external command documentation (use fixtures, don't research git/cargo internals)\n- Verifying API signatures across multiple crat", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--no-filename' found\n\n tip: a similar argument exists: '--line-numbers'\n tip: to pass '--no-filename' as a value, use '-- --no-filename'\n\nUsage: rtk grep --line-numbers [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['**Golden']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --json", + "family": "grep", + "raw": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn filter_git_log(input: &str) -> Result {\\n\"},\"line_number\":335,\"absolute_offset\":12739,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":359,\"absolute_offset\":13354,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":374,\"absolute_offset\":13813,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":48501,\"human\":\"0.000049s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_l", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--json' found\n\n tip: to pass '--json' as a value, use '-- --json'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":48501,\"human\":\"0.000049s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_lines\":3,\"matches\":3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --vimgrep", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nscripts/benchmark.sh:175:28:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\nscripts/benchmark.sh:175:59:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\nscripts/benchmark.sh:177:31:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\nscripts/benchmark.sh:177:62:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\nscripts/benchmark.sh:178:34:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\nscripts/benchmark.sh:178:76:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\nscripts/benchmark.sh:179:29:bench \"grep -c\" \"grep -ron 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -c\"\nscript", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--vimgrep' found\n\n tip: to pass '--vimgrep' as a value, use '-- --vimgrep'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:335:5:pub', 'CLAUDE.md:359:5:pub', 'CLAUDE.md:374:5:pub', 'scripts/benchmark.sh:175:28:bench', 'scripts/benchmark.sh:175:59:bench']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' -A 0 -B 0", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nsrc/display_helpers.rs:pub fn format_duration(ms: u64) -> String {\nsrc/display_helpers.rs: fn icon() -> &'static str;\nsrc/display_helpers.rs: fn label() -> &'static str;\nsrc/display_helpers.rs: fn period(&self) -> String;\nsrc/display_helpers.rs: fn commands(&self) -> usize;\nsrc/display_helpers.rs: fn input_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn output_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn saved_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn savings_pct(&self) -> f64;\nsrc/display_helpers.rs: fn total_time_ms(&self) -> u64;\nsrc/display_helpers.rs: fn avg_time_ms(&self) -> u64;\nsrc/display_helpers.rs: fn period_width() -> usize;\nsrc/display_helpers.rs: fn separator_width() -> usize;\nsrc/display_helpers.rs:", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-A' found\n\n tip: to pass '-A' as a value, use '-- -A'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:pub', 'CLAUDE.md:pub', 'CLAUDE.md:pub', 'src/display_helpers.rs:pub', 'src/display_helpers.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --format='{path}:{line}:{column}:{match}'", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "rg: unrecognized flag --format\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--format' found\n\n tip: to pass '--format' as a value, use '-- --format'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --quiet --files-with-matches", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--quiet' found\n\n tip: to pass '--quiet' as a value, use '-- --quiet'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "ls -l --human-readable", + "family": "ls", + "raw": { + "stdout": "total 252K\n-rw-rw-r-- 1 pln pln 56K Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30K Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1.5K Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4.0K Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 11K Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2.7K Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1.1K Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33K Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7.2K Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4.0K Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4.0K Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2.2K Mar 17 17:41 TEST_EXE", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 0B\nCargo.lock 0B\nCargo.toml 0B\nCHANGELOG.md 0B\nCLAUDE.md 0B\n.gitignore 339B\nINSTALL.md 0B\ninstall.sh 0B\nLICENSE 0B\nREADME.md 0B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 0B\nTEST_EXEC_TIME.md 0B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .toml, 1 no ext, 1 .gitignore, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -1 -a --color=never", + "family": "ls", + "raw": { + "stdout": ".\n..\nARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\n.claude\nCLAUDE.md\ndocs\nFormula\n.git\n.github\n.gitignore\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\n.release-please-manifest.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 .lock, 1 .sh, 1 .toml, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 51%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --format=long --sort=size", + "family": "ls", + "raw": { + "stdout": "total 252\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 7272 Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\ndrwxrwxr-x 2 pln pln 4096 Mar 19 19:19 scripts\ndrwxrwxr-x 5 pln pln 4096 Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4096 Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 2171 Mar 17 17:41 TEST_EXEC_TIME.md\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:4", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nREADME.md 32.6K\nCargo.lock 29.8K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\nINSTALL.md 10.5K\nSECURITY.md 7.1K\ninstall.sh 2.6K\nTEST_EXEC_TIME.md 2.1K\nCargo.toml 1.4K\nLICENSE 1.0K\nROADMAP.md 459B\n.gitignore 339B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 .sh, 1 no ext, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 19%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --porcelain --quoting-style=shell-escape", + "family": "ls", + "raw": { + "stdout": "", + "stderr": "ls: unrecognized option '--porcelain'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "ls: unrecognized option '--porcelain'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -R -t -h", + "family": "ls", + "raw": { + "stdout": ".:\nscripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n\n./scripts:\nfuzz-rtk.py\nfuzzer-demo.html\nFUZZ-RTK.md\ncheck-installation.sh\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nbenchmark.sh\n\n./src:\ntracking.rs\ngit.rs\ngrep_cmd.rs\nmain.rs\ngh_cmd.rs\nwc_cmd.rs\ntree.rs\nruff_cmd.rs\nsummary.rs\ntee.rs\nlog_cmd.rs\nparser\npip_cmd.rs\nlint_cmd.rs\ninit.rs\nlearn\ngolangci_cmd.rs\ngain.rs\nfind_cmd.rs\nformat_cmd.rs\ncontainer.rs\ndiscover\ncc_economics.rs\nccusage.rs\nwget_cmd.rs\nrunner.rs\ntsc_cmd.rs\nutils.rs\nvitest_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs\npytest_cmd.rs\nread.rs\nnpm_cmd.rs\nlocal_llm.rs\nls.rs\nnext_cmd.rs\nhook_audit_cmd.rs\njson_cmd.rs\ngo_cmd.rs\nenv_cmd.rs\nfilter.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndisplay_helpers.rs\ncargo_cmd.rs\nconf", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "rtk": { + "stdout": "scripts/\n.claude/\nsrc/\nbug-reports/\ndocs/\nhooks/\nFormula/\n.github/\nobjects/\nhooks/\nlogs/\nrefs/\nbranches/\ninfo/\n69/\n6e/\n97/\nd6/\nd7/\nfa/\nd3/\nff/\n6d/\nb6/\n05/\n8e/\n17/\nc0/\n2a/\n45/\nf7/\na0/\n07/\nca/\n1a/\n85/\n03/\n49/\n19/\n67/\naf/\n78/\n0d/\n87/\n56/\na5/\nc9/\n08/\n82/\nd5/\nb9/\nf4/\n42/\nbe/\n89/\nc8/\n3c/\n9d/\nbb/\n92/\nf8/\nde/\ncf/\n1d/\n13/\n4c/\ned/\nf1/\n11/\ndd/\n16/\n83/\n1e/\ndc/\n21/\n57/\ne4/\nd2/\n91/\n4b/\n12/\n2f/\n5f/\n27/\n64/\na8/\n3e/\n7e/\nc6/\n48/\n5a/\nb5/\nb4/\nb3/\n09/\n39/\n18/\ndf/\nbf/\ne6/\n22/\n4e/\nb7/\nf2/\n75/\n94/\n36/\n34/\n2c/\n35/\n93/\n25/\na2/\n8f/\na6/\n54/\nab/\ne9/\n0c/\n23/\n77/\nf9/\ne3/\n4f/\n43/\n0a/\n66/\n9b/\nfb/\n2e/\nd0/\n32/\n61/\n68/\na3/\nce/\nc7/\nf3/\n99/\nac/\n76/\na7/\n01/\n79/\n9e/\n4d/\n60/\n3d/\nee/\n06/\n29/\nfe/\npack/\ninfo/\nrefs/\nheads/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nchore/\nbug/\nheads/\ntags/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nbug/\nchore/\nskills/\nagents/\nrules/\nhooks/\ncommands/\nrtk-tdd/\nrefe", + "stderr": "", + "exit_code": 0, + "duration_ms": 72, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "2559 \u2192 4488 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls --full-time --no-preserve-root", + "family": "ls", + "raw": { + "stdout": "", + "stderr": "ls: unrecognized option '--no-preserve-root'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "ls: unrecognized option '--no-preserve-root'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -C --quoting-style=c", + "family": "ls", + "raw": { + "stdout": "\"ARCHITECTURE.md\" \"Formula\"\t\t\t \"ROADMAP.md\"\n\"bug-reports\"\t \"hooks\"\t\t\t \"scripts\"\n\"Cargo.lock\"\t \"INSTALL.md\"\t\t\t \"SECURITY.md\"\n\"Cargo.toml\"\t \"install.sh\"\t\t\t \"src\"\n\"CHANGELOG.md\"\t \"LICENSE\"\t\t\t \"target\"\n\"CLAUDE.md\"\t \"README.md\"\t\t\t \"TEST_EXEC_TIME.md\"\n\"docs\"\t\t \"release-please-config.json\"\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "(empty)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['ARCHITECTURE.md', 'bug-reports', 'Cargo.lock', 'Cargo.toml', 'CHANGELOG.md']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 2%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --time-style=long-iso --block-size=1M", + "family": "ls", + "raw": { + "stdout": "ARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nFormula\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "(empty)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'bug-reports', 'Cargo.lock', 'Cargo.toml', 'CHANGELOG.md']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -name '*.rs' -printf '%f %s\\n'", + "family": "find", + "raw": { + "stdout": "init.rs 51472\nread.rs 4610\ntracking.rs 33880\nenv_cmd.rs 5731\nprovider.rs 15078\nreport.rs 5531\nregistry.rs 20218\nmod.rs 8298\ndisplay_helpers.rs 9732\nplaywright_cmd.rs 13792\ngh_cmd.rs 47210\nformatter.rs 10757\nerror.rs 1168\ntypes.rs 3051\nmod.rs 10408\ngit.rs 54654\ngo_cmd.rs 16233\ncc_economics.rs 38506\ntree.rs 6191\ndeps.rs 9040\nprisma_cmd.rs 13715\nls.rs 9702\nmain.rs 50760\ndiff_cmd.rs 10655\nprettier_cmd.rs 5633\nnext_cmd.rs 7422\nvitest_cmd.rs 11942\nlint_cmd.rs 23986\nsummary.rs 9265\ngain.rs 17021\nnpm_cmd.rs 2720\ngolangci_cmd.rs 7467\nwget_cmd.rs 8100\nlocal_llm.rs 9700\nwc_cmd.rs 11630\nformat_cmd.rs 13258\nfind_cmd.rs 8063\ncurl_cmd.rs 3406\njson_cmd.rs 5475\ndetector.rs 21191\nreport.rs 5777\nmod.rs 3685\nconfig.rs 3069\nhook_audit_cmd.rs 9125\npip_cmd.rs 8458\ntee.rs 11730\nlog_cmd.rs 7766\ntsc_cmd.rs 8648\nruff_cmd.rs 12771\npnpm_cmd.rs 16537\nutils.rs 11346\ngrep_cmd.rs 13202\nccusage.rs 9523\npytest_cmd.rs 12080\ncargo_cmd.rs 53866\nfilter.rs 12156\ncontainer.rs 27918\nrunner.rs 8483\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-n' found\n\n tip: to pass '-n' as a value, use '-- -n'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['init.rs', 'read.rs', 'tracking.rs', 'env_cmd.rs', 'provider.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -printf '%y %n\\t%p\\n'", + "family": "find", + "raw": { + "stdout": "f 1\t./ARCHITECTURE.md\nf 1\t./SECURITY.md\nf 1\t./.gitignore\nf 1\t./src/init.rs\nf 1\t./src/read.rs\nf 1\t./src/tracking.rs\nf 1\t./src/env_cmd.rs\nf 1\t./src/discover/provider.rs\nf 1\t./src/discover/report.rs\nf 1\t./src/discover/registry.rs\nf 1\t./src/discover/mod.rs\nf 1\t./src/display_helpers.rs\nf 1\t./src/playwright_cmd.rs\nf 1\t./src/gh_cmd.rs\nf 1\t./src/parser/formatter.rs\nf 1\t./src/parser/error.rs\nf 1\t./src/parser/types.rs\nf 1\t./src/parser/README.md\nf 1\t./src/parser/mod.rs\nf 1\t./src/git.rs\nf 1\t./src/go_cmd.rs\nf 1\t./src/cc_economics.rs\nf 1\t./src/tree.rs\nf 1\t./src/deps.rs\nf 1\t./src/prisma_cmd.rs\nf 1\t./src/ls.rs\nf 1\t./src/main.rs\nf 1\t./src/diff_cmd.rs\nf 1\t./src/prettier_cmd.rs\nf 1\t./src/next_cmd.rs\nf 1\t./src/vitest_cmd.rs\nf 1\t./src/lint_cmd.rs\nf 1\t./src/summary.rs\nf 1\t./src/gain.rs\nf 1\t./src/npm_cmd.rs\nf 1\t./src/golangci_cmd.rs\nf 1\t./src/wget_cmd.rs\nf 1\t./src/local_llm.rs\nf 1\t./src/wc_cmd.rs\nf 1\t./src/format_cmd.rs\nf 1\t./src/find_cmd.rs\nf 1\t./src/curl_cmd.rs\nf 1\t./src/json_cmd.rs\nf 1\t./src/learn/detecto", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -name '*.md' -print0 | xargs -0 wc -l", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: |" + }, + { + "command": "find . -maxdepth 3 -path '*/node_modules/*' -prune -o -type f -print", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "blocked word: -prune" + }, + { + "command": "find . -maxdepth 3 -type d -printf '%d\\n'", + "family": "find", + "raw": { + "stdout": "0\n1\n2\n2\n2\n1\n2\n3\n2\n2\n3\n2\n2\n1\n2\n1\n1\n1\n2\n1\n2\n3\n3\n3\n3\n3\n2\n3\n3\n3\n3\n3\n1\n1\n1\n2\n2\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n2\n3\n3\n3\n2\n3\n2\n2\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -iname '*.json' -printf '%i %M %m\\n'", + "family": "find", + "raw": { + "stdout": "64316454 -rw-rw-r-- 664\n64233117 -rw-rw-r-- 664\n64234938 -rw-r--r-- 644\n64233150 -rw-rw-r-- 664\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-i' found\n\n tip: to pass '-i' as a value, use '-- -i'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['64316454', '64233117', '64234938', '64233150']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -printf '---\\nPath: %p\\nSize: %s\\n---\\n'", + "family": "find", + "raw": { + "stdout": "---\nPath: ./ARCHITECTURE.md\nSize: 57226\n---\n---\nPath: ./SECURITY.md\nSize: 7272\n---\n---\nPath: ./.gitignore\nSize: 339\n---\n---\nPath: ./src/init.rs\nSize: 51472\n---\n---\nPath: ./src/read.rs\nSize: 4610\n---\n---\nPath: ./src/tracking.rs\nSize: 33880\n---\n---\nPath: ./src/env_cmd.rs\nSize: 5731\n---\n---\nPath: ./src/discover/provider.rs\nSize: 15078\n---\n---\nPath: ./src/discover/report.rs\nSize: 5531\n---\n---\nPath: ./src/discover/registry.rs\nSize: 20218\n---\n---\nPath: ./src/discover/mod.rs\nSize: 8298\n---\n---\nPath: ./src/display_helpers.rs\nSize: 9732\n---\n---\nPath: ./src/playwright_cmd.rs\nSize: 13792\n---\n---\nPath: ./src/gh_cmd.rs\nSize: 47210\n---\n---\nPath: ./src/parser/formatter.rs\nSize: 10757\n---\n---\nPath: ./src/parser/error.rs\nSize: 1168\n---\n---\nPath: ./src/parser/types.rs\nSize: 3051\n---\n---\nPath: ./src/parser/README.md\nSize: 8939\n---\n---\nPath: ./src/parser/mod.rs\nSize: 10408\n---\n---\nPath: ./src/git.rs\nSize: 54654\n---\n---\nPath: ./src/go_cmd.rs\nSize: 16233\n---\n---\nPath: ./src/cc_economics.rs\nSize: 38506\n---\n-", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['---', 'Path', 'Size', '---', '---']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -ls | head -5", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: |" + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -y src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-y' found\n\n tip: to pass '-y' as a value, use '-- -y'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --color=never src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "1,1610c1,56\n< mod cargo_cmd;\n< mod cc_economics;\n< mod ccusage;\n< mod config;\n< mod container;\n< mod curl_cmd;\n< mod deps;\n< mod diff_cmd;\n< mod discover;\n< mod display_helpers;\n< mod env_cmd;\n< mod filter;\n< mod find_cmd;\n< mod format_cmd;\n< mod gain;\n< mod gh_cmd;\n< mod git;\n< mod go_cmd;\n< mod golangci_cmd;\n< mod grep_cmd;\n< mod hook_audit_cmd;\n< mod init;\n< mod json_cmd;\n< mod learn;\n< mod lint_cmd;\n< mod local_llm;\n< mod log_cmd;\n< mod ls;\n< mod next_cmd;\n< mod npm_cmd;\n< mod parser;\n< mod pip_cmd;\n< mod playwright_cmd;\n< mod pnpm_cmd;\n< mod prettier_cmd;\n< mod prisma_cmd;\n< mod pytest_cmd;\n< mod read;\n< mod ruff_cmd;\n< mod runner;\n< mod summary;\n< mod tee;\n< mod tracking;\n< mod tree;\n< mod tsc_cmd;\n< mod utils;\n< mod vitest_cmd;\n< mod wc_cmd;\n< mod wget_cmd;\n< \n< use anyhow::{Context, Result};\n< use clap::{Parser, Subcommand};\n< use std::ffi::OsString;\n< use std::path::{Path, PathBuf};\n< \n< #[derive(Parser)]\n< #[command(\n< name = \"rtk\",\n< version,\n< about = \"Rust Toke", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--color' found\n\n tip: to pass '--color' as a value, use '-- --color'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['1,1610c1,56']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --unified=3 src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--unified' found\n\n tip: to pass '--unified' as a value, use '-- --unified'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --brief src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--brief' found\n\n tip: to pass '--brief' as a value, use '-- --brief'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --side-by-side --color=never src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--side-by-side' found\n\n tip: to pass '--side-by-side' as a value, use '-- --side-by-side'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -c src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "*** src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n--- Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n***************\n*** 1,1610 ****\n! mod cargo_cmd;\n! mod cc_economics;\n! mod ccusage;\n! mod config;\n! mod container;\n! mod curl_cmd;\n! mod deps;\n! mod diff_cmd;\n! mod discover;\n! mod display_helpers;\n! mod env_cmd;\n! mod filter;\n! mod find_cmd;\n! mod format_cmd;\n! mod gain;\n! mod gh_cmd;\n! mod git;\n! mod go_cmd;\n! mod golangci_cmd;\n! mod grep_cmd;\n! mod hook_audit_cmd;\n! mod init;\n! mod json_cmd;\n! mod learn;\n! mod lint_cmd;\n! mod local_llm;\n! mod log_cmd;\n! mod ls;\n! mod next_cmd;\n! mod npm_cmd;\n! mod parser;\n! mod pip_cmd;\n! mod playwright_cmd;\n! mod pnpm_cmd;\n! mod prettier_cmd;\n! mod prisma_cmd;\n! mod pytest_cmd;\n! mod read;\n! mod ruff_cmd;\n! mod runner;\n! mod summary;\n! mod tee;\n! mod tracking;\n! mod tree;\n! mod tsc_cmd;\n! mod utils;\n! mod vitest_cmd;\n! mod wc_cmd;\n! mod wget_cmd;\n! \n! use anyhow::{Context, Result};\n! use clap::{Parser, Subcommand};\n! use std::ffi::OsString;\n! use ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-c' found\n\n tip: to pass '-c' as a value, use '-- -c'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['***', '---', '***************', '***']" + } + ], + "skipped_reason": null + }, + { + "command": "wc -l src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -w src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -c src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -m src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -L src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -lwc src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -l --files0-from=/dev/null src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: extra operand 'src/*.rs'\nfile operands cannot be combined with --files0-from\nTry 'wc --help' for more information.\n", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: extra operand 'src/*.rs'\nfile operands cannot be combined with --files0-from\nTry 'wc --help' for more information.\n", + "exit_code": 1, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc --files0-from=src/*.rs -l", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: cannot open 'src/*.rs' for reading: No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: cannot open 'src/*.rs' for reading: No such file or directory\n", + "exit_code": 1, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 -d", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 images\n\u251c\u2500\u2500 Formula\n\u251c\u2500\u2500 hooks\n\u251c\u2500\u2500 scripts\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 learn\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 parser\n\u2514\u2500\u2500 target\n \u251c\u2500\u2500 debug\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 build\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 deps\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 examples\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 incremental\n \u2514\u2500\u2500 release\n \u251c\u2500\u2500 build\n \u251c\u2500\u2500 deps\n \u251c\u2500\u2500 examples\n \u2514\u2500\u2500 incremental\n\n22 directories\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 images\n\u251c\u2500\u2500 Formula\n\u251c\u2500\u2500 hooks\n\u251c\u2500\u2500 scripts\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 discover\n \u251c\u2500\u2500 learn\n \u2514\u2500\u2500 parser\n\n11 directories\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 -f", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 ./ARCHITECTURE.md\n\u251c\u2500\u2500 ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 ./Cargo.lock\n\u251c\u2500\u2500 ./Cargo.toml\n\u251c\u2500\u2500 ./CHANGELOG.md\n\u251c\u2500\u2500 ./CLAUDE.md\n\u251c\u2500\u2500 ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/images/gain-dashboard.jpg\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./Formula/rtk.rb\n\u251c\u2500\u2500 ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 ./INSTALL.md\n\u251c\u2500\u2500 ./install.sh\n\u251c\u2500\u2500 ./LICENSE\n\u251c\u2500\u2500 ./README.md\n\u251c\u2500\u2500 ./release-please-config.json\n\u251c\u2500\u2500 ./ROADMAP.md\n\u251c\u2500\u2500 ./scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-tracki", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 ./ARCHITECTURE.md\n\u251c\u2500\u2500 ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 ./Cargo.lock\n\u251c\u2500\u2500 ./Cargo.toml\n\u251c\u2500\u2500 ./CHANGELOG.md\n\u251c\u2500\u2500 ./CLAUDE.md\n\u251c\u2500\u2500 ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/images/gain-dashboard.jpg\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./Formula/rtk.rb\n\u251c\u2500\u2500 ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 ./INSTALL.md\n\u251c\u2500\u2500 ./install.sh\n\u251c\u2500\u2500 ./LICENSE\n\u251c\u2500\u2500 ./README.md\n\u251c\u2500\u2500 ./release-please-config.json\n\u251c\u2500\u2500 ./ROADMAP.md\n\u251c\u2500\u2500 ./scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ./scripts/test-tracki", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 -s", + "family": "tree", + "raw": { + "stdout": "[ 4096] .\n\u251c\u2500\u2500 [ 57226] ARCHITECTURE.md\n\u251c\u2500\u2500 [ 4096] bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 5187] 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 1247] 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 [ 30515] Cargo.lock\n\u251c\u2500\u2500 [ 1476] Cargo.toml\n\u251c\u2500\u2500 [ 26314] CHANGELOG.md\n\u251c\u2500\u2500 [ 25702] CLAUDE.md\n\u251c\u2500\u2500 [ 4096] docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 12550] AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 4096] images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 244812] gain-dashboard.jpg\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 15345] tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 5539] TROUBLESHOOTING.md\n\u251c\u2500\u2500 [ 4096] Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 1171] rtk.rb\n\u251c\u2500\u2500 [ 4096] hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 964] rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 10256] rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 9996] test-rtk-rewrite.sh\n\u251c\u2500\u2500 [ 10738] INSTALL.md\n\u251c\u2500\u2500 [ 2675] install.sh\n\u251c\u2500\u2500 [ 1075] LICENSE\n\u251c\u2500\u2500 [ 33408] README.md\n\u251c\u2500\u2500 [ 181] release-please-config.json\n\u251c\u2500\u2500 [ 459] ROADMAP.md\n\u251c\u2500\u2500 [ 4096] scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 14641] benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "[ 4096] .\n\u251c\u2500\u2500 [ 57226] ARCHITECTURE.md\n\u251c\u2500\u2500 [ 4096] bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 5187] 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 1247] 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 [ 30515] Cargo.lock\n\u251c\u2500\u2500 [ 1476] Cargo.toml\n\u251c\u2500\u2500 [ 26314] CHANGELOG.md\n\u251c\u2500\u2500 [ 25702] CLAUDE.md\n\u251c\u2500\u2500 [ 4096] docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 12550] AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 4096] images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 244812] gain-dashboard.jpg\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 15345] tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 5539] TROUBLESHOOTING.md\n\u251c\u2500\u2500 [ 4096] Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 1171] rtk.rb\n\u251c\u2500\u2500 [ 4096] hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 964] rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 10256] rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [ 9996] test-rtk-rewrite.sh\n\u251c\u2500\u2500 [ 10738] INSTALL.md\n\u251c\u2500\u2500 [ 2675] install.sh\n\u251c\u2500\u2500 [ 1075] LICENSE\n\u251c\u2500\u2500 [ 33408] README.md\n\u251c\u2500\u2500 [ 181] release-please-config.json\n\u251c\u2500\u2500 [ 459] ROADMAP.md\n\u251c\u2500\u2500 [ 4096] scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ 14641] benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [ ", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 --charset=ascii -a", + "family": "tree", + "raw": { + "stdout": ".\n|-- ARCHITECTURE.md\n|-- bug-reports\n| |-- 2026-03-19-fuzz-findings.md\n| `-- 2026-03-19-gh-json-output-rewritten.md\n|-- Cargo.lock\n|-- Cargo.toml\n|-- CHANGELOG.md\n|-- .claude\n| |-- agents\n| | |-- code-reviewer.md\n| | |-- debugger.md\n| | |-- rtk-testing-specialist.md\n| | |-- rust-rtk.md\n| | `-- technical-writer.md\n| |-- commands\n| | |-- diagnose.md\n| | `-- test-routing.md\n| |-- hooks\n| | |-- bash\n| | |-- rtk-rewrite.sh\n| | `-- rtk-suggest.sh\n| |-- rules\n| | `-- cli-testing.md\n| |-- settings.local.json\n| `-- skills\n| |-- performance.md\n| |-- repo-recap.md\n| |-- rtk-tdd\n| |-- security-guardian.md\n| `-- ship.md\n|-- CLAUDE.md\n|-- docs\n| |-- AUDIT_GUIDE.md\n| |-- images\n| | `-- gain-dashboard.jpg\n| |-- tracking.md\n| `-- TROUBLESHOOTING.md\n|-- Formula\n| `-- rtk.rb\n|-- .git\n| |-- branches\n| |-- COMMIT_EDITMSG\n| |-- config\n| |-- description\n| |-- FETCH_HEAD\n| |-- HEAD\n| |-- hook", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": ".\n|-- ARCHITECTURE.md\n|-- bug-reports\n| |-- 2026-03-19-fuzz-findings.md\n| `-- 2026-03-19-gh-json-output-rewritten.md\n|-- Cargo.lock\n|-- Cargo.toml\n|-- CHANGELOG.md\n|-- .claude\n| |-- agents\n| | |-- code-reviewer.md\n| | |-- debugger.md\n| | |-- rtk-testing-specialist.md\n| | |-- rust-rtk.md\n| | `-- technical-writer.md\n| |-- commands\n| | |-- diagnose.md\n| | `-- test-routing.md\n| |-- hooks\n| | |-- bash\n| | |-- rtk-rewrite.sh\n| | `-- rtk-suggest.sh\n| |-- rules\n| | `-- cli-testing.md\n| |-- settings.local.json\n| `-- skills\n| |-- performance.md\n| |-- repo-recap.md\n| |-- rtk-tdd\n| |-- security-guardian.md\n| `-- ship.md\n|-- CLAUDE.md\n|-- docs\n| |-- AUDIT_GUIDE.md\n| |-- images\n| | `-- gain-dashboard.jpg\n| |-- tracking.md\n| `-- TROUBLESHOOTING.md\n|-- Formula\n| `-- rtk.rb\n|-- .git\n| |-- branches\n| |-- COMMIT_EDITMSG\n| |-- config\n| |-- description\n| |-- FETCH_HEAD\n| |-- HEAD\n| |-- hook", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 -p -i", + "family": "tree", + "raw": { + "stdout": "[drwxrwxr-x] .\n[-rw-rw-r--] ARCHITECTURE.md\n[drwxrwxr-x] bug-reports\n[-rw-rw-r--] 2026-03-19-fuzz-findings.md\n[-rw-rw-r--] 2026-03-19-gh-json-output-rewritten.md\n[-rw-rw-r--] Cargo.lock\n[-rw-rw-r--] Cargo.toml\n[-rw-rw-r--] CHANGELOG.md\n[-rw-rw-r--] CLAUDE.md\n[drwxrwxr-x] docs\n[-rw-rw-r--] AUDIT_GUIDE.md\n[drwxrwxr-x] images\n[-rw-rw-r--] gain-dashboard.jpg\n[-rw-rw-r--] tracking.md\n[-rw-rw-r--] TROUBLESHOOTING.md\n[drwxrwxr-x] Formula\n[-rw-rw-r--] rtk.rb\n[drwxrwxr-x] hooks\n[-rw-rw-r--] rtk-awareness.md\n[-rw-rw-r--] rtk-rewrite.sh\n[-rwxrwxr-x] test-rtk-rewrite.sh\n[-rw-rw-r--] INSTALL.md\n[-rw-rw-r--] install.sh\n[-rw-rw-r--] LICENSE\n[-rw-rw-r--] README.md\n[-rw-rw-r--] release-please-config.json\n[-rw-rw-r--] ROADMAP.md\n[drwxrwxr-x] scripts\n[-rwxrwxr-x] benchmark.sh\n[-rwxrwxr-x] check-installation.sh\n[-rw-rw-r--] fuzzer-demo.html\n[-rw-rw-r--] FUZZ-RTK.md\n[-rw-rw-r--] fuzz-rtk.py\n[-rwxrwxr-x] install-local.sh\n[-rwxrwxr-x] rtk-economics.sh\n[-rwxrwxr-x] test-all", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "[drwxrwxr-x] .\n[-rw-rw-r--] ARCHITECTURE.md\n[drwxrwxr-x] bug-reports\n[-rw-rw-r--] 2026-03-19-fuzz-findings.md\n[-rw-rw-r--] 2026-03-19-gh-json-output-rewritten.md\n[-rw-rw-r--] Cargo.lock\n[-rw-rw-r--] Cargo.toml\n[-rw-rw-r--] CHANGELOG.md\n[-rw-rw-r--] CLAUDE.md\n[drwxrwxr-x] docs\n[-rw-rw-r--] AUDIT_GUIDE.md\n[drwxrwxr-x] images\n[-rw-rw-r--] gain-dashboard.jpg\n[-rw-rw-r--] tracking.md\n[-rw-rw-r--] TROUBLESHOOTING.md\n[drwxrwxr-x] Formula\n[-rw-rw-r--] rtk.rb\n[drwxrwxr-x] hooks\n[-rw-rw-r--] rtk-awareness.md\n[-rw-rw-r--] rtk-rewrite.sh\n[-rwxrwxr-x] test-rtk-rewrite.sh\n[-rw-rw-r--] INSTALL.md\n[-rw-rw-r--] install.sh\n[-rw-rw-r--] LICENSE\n[-rw-rw-r--] README.md\n[-rw-rw-r--] release-please-config.json\n[-rw-rw-r--] ROADMAP.md\n[drwxrwxr-x] scripts\n[-rwxrwxr-x] benchmark.sh\n[-rwxrwxr-x] check-installation.sh\n[-rw-rw-r--] fuzzer-demo.html\n[-rw-rw-r--] FUZZ-RTK.md\n[-rw-rw-r--] fuzz-rtk.py\n[-rwxrwxr-x] install-local.sh\n[-rwxrwxr-x] rtk-economics.sh\n[-rwxrwxr-x] test-all", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 --dirsfirst --prune 'node_modules'", + "family": "tree", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "blocked word: --prune" + }, + { + "command": "tree -L 3 --format='%n%p%t'", + "family": "tree", + "raw": { + "stdout": "", + "stderr": "tree: Invalid argument `--format=%n%p%t'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--inf", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "tree: Invalid argument `--format=%n%p%t'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--inf", + "exit_code": 1, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 3 -I '.*' --oneline", + "family": "tree", + "raw": { + "stdout": "", + "stderr": "tree: Invalid argument `--oneline'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofile[", + "exit_code": 1, + "duration_ms": 1, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "tree: Invalid argument `--oneline'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofile[", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --oneline -10", + "family": "git-log", + "raw": { + "stdout": "69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\nfa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\nf72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\nd5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\nf89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static test...\nfa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain s...\n8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer wit...\nf72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags a...\n1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\nd5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough...\n3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\nf89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) rel...\n450c4bb release: bump to v0.22.4 with git -C support\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 14, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --format='%H %s %ad' --date=short -10", + "family": "git-log", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page 2026-03-19\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats 2026-03-19\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests 2026-03-19\nf72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detail flags are present 2026-03-19\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags 2026-03-19\n87fa5b978b15271d4461934428b2a3b8fa99833d feat: add agentic fuzzing system for RTK filter bug discovery 2026-03-19\nd5f3cfa0ac86b693bce326db8484dfc8996fde72 fix: passthrough --json in gh commands and -c in grep 2026-03-19\n3c4126de2f93ac906c7d63874459ab8506a430bd fix: correct git_cmd() doc comment per PR #5 review feedback 2026-03-19\n92872477ea0edd88847c18a19c120bb4b159b537 Merge pull request #7 from algo", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page 2026-03-19\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats 2026-03-19\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests 2026-03-19\nf72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detail flags are present 2026-03-19\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags 2026-03-19\n87fa5b978b15271d4461934428b2a3b8fa99833d feat: add agentic fuzzing system for RTK filter bug discovery 2026-03-19\nd5f3cfa0ac86b693bce326db8484dfc8996fde72 fix: passthrough --json in gh commands and -c in grep 2026-03-19\n3c4126de2f93ac906c7d63874459ab8506a430bd fix: correct git_cmd() doc comment per PR #5 review feedback 2026-03-19\n92872477ea0edd88847c18a19c120bb4b159b537 Merge pull request #7 from algo", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --stat --name-only -10", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:09:01 2026 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nscripts/fuzz-rtk.py\nsrc/tracking.rs\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 18:24:15 2026 +0100\n\n feat: expand fuzzer with 20 command families and static regressi", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --oneline --graph --all -10", + "family": "git-log", + "raw": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 27, + "error": null + }, + "rtk": { + "stdout": "* 69eb684 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n* fa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n* 8e61bca (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n* f72e3f9 (refs/heads/main) fix: passthrough git log when format/detail flags are present\n* 1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n* 87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\n* d5f3cfa (refs/remotes/origin/main, refs/remotes/origin/HEAD) fix: passthrough --json in gh commands and -c in grep\n* 3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\n* 9287247 (tag: refs/tags/v0.22.4) Merge pull request #7 from algolia/release/v0.22.4\n|\\ \n| * f89894e (refs/remotes/origin/release/v0.22.4, refs/heads/release/v0.22.4) release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 18, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --format=raw -10", + "family": "git-log", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\ntree d373ab35df262bd2f64d3a234f7dc5c322f7e944\nparent 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nauthor Paul-Louis NECH 1773943741 +0100\ncommitter Paul-Louis NECH 1773943741 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\ntree c0b15bfaec544c23b8623f14148397960ac8877a\nparent f72e3f9", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ncommit fa315c6045538a97f793e89301ac7fe412305790\ntree d373ab35df262bd2f64d3a234f7dc5c322f7e944\nparent 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\nauthor Paul-Louis NECH 1773943741 +0100\ncommitter Paul-Louis NECH 1773943741 +0100\n\n feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\ncommit 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\ntree c0b15bfaec544c23b8623f14148397960ac8877a\nparent f72e3f9", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --pretty=format:'COMMIT:%H %B' -10", + "family": "git-log", + "raw": { + "stdout": "COMMIT:69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nCOMMIT:fa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nCOMMIT:8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests\n\n- Add 11 new command families: find, cat, tree, cargo-test, cargo-clippy,\n git-branch, git-stash, curl, wc, env, diff\n- Add STATIC_TESTS dict for deterministic regression without LLM\n- Extract _run_single_test() reusable helper\n- Switch to qwen3.5-35b-fp8 for faster throughput\n- Add FUZZ-RTK.md project README documenting architecture and usage\n\nCOMMIT:f72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detai", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "COMMIT:69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nCOMMIT:fa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n\nCOMMIT:8e61bcac36bb821d87216a0c73b3ca4fdc03b199 feat: expand fuzzer with 20 command families and static regression tests\n\n- Add 11 new command families: find, cat, tree, cargo-test, cargo-clippy,\n git-branch, git-stash, curl, wc, env, diff\n- Add STATIC_TESTS dict for deterministic regression without LLM\n- Extract _run_single_test() reusable helper\n- Switch to qwen3.5-35b-fp8 for faster throughput\n- Add FUZZ-RTK.md project README documenting architecture and usage\n\nCOMMIT:f72e3f941646b3b7846cd8574814a77584163e8b fix: passthrough git log when format/detai", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --numstat --pretty='oneline' -10", + "family": "git-log", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n4\t1\tscripts/fuzz-rtk.py\n6\t0\tsrc/tracking.rs\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n87\t0\tscripts/FUZZ-RTK.md\n218\t58\tscripts/fuzz-rtk.py\nf72e3f941646b3b7846cd8574814a77584163e8b (refs/heads/main) fix: passthrough git log when format/detail flags are present\n58\t9\tsrc/git.rs\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags\n106\t44\tsrc/grep_cmd.rs\n8\t8\tsrc/main.rs\n87fa5b978b15271d4461934428b2a3b8fa99833d feat: add agentic fuzzing system for RTK filter bug discovery\n123\t0\tbug-reports/2026-03-19-fuzz-findin", + "stderr": "", + "exit_code": 0, + "duration_ms": 22, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing) feat: expand static tests to 65 across 17 families, add demo page\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\nfa315c6045538a97f793e89301ac7fe412305790 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n4\t1\tscripts/fuzz-rtk.py\n6\t0\tsrc/tracking.rs\n8e61bcac36bb821d87216a0c73b3ca4fdc03b199 (refs/remotes/origin/feature/agentic-fuzzing) feat: expand fuzzer with 20 command families and static regression tests\n87\t0\tscripts/FUZZ-RTK.md\n218\t58\tscripts/fuzz-rtk.py\nf72e3f941646b3b7846cd8574814a77584163e8b (refs/heads/main) fix: passthrough git log when format/detail flags are present\n58\t9\tsrc/git.rs\n1ad8cfb3a80d656126ced83643ec0c5c29beb3a6 fix: resolve grep Clap flag collisions with rg native flags\n106\t44\tsrc/grep_cmd.rs\n8\t8\tsrc/main.rs\n87fa5b978b15271d4461934428b2a3b8fa99833d feat: add agentic fuzzing system for RTK filter bug discovery\n123\t0\tbug-reports/2026-03-19-fuzz-findin", + "stderr": "", + "exit_code": 0, + "duration_ms": 29, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git log --decorate=no --no-merges --oneline -10", + "family": "git-log", + "raw": { + "stdout": "69eb684 feat: expand static tests to 65 across 17 families, add demo page\nfa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain stats\n8e61bca feat: expand fuzzer with 20 command families and static regression tests\nf72e3f9 fix: passthrough git log when format/detail flags are present\n1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\nd5f3cfa fix: passthrough --json in gh commands and -c in grep\n3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\nf89894e release: update version refs to 0.22.4 across docs\n450c4bb release: bump to v0.22.4 with git -C support\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb684 feat: expand static tests to 65 across 17 families, add demo page\nfa315c6 feat: add RTK_SKIP_TRACKING env var to exclude fuzzer from rtk gain s...\n8e61bca feat: expand fuzzer with 20 command families and static regression tests\nf72e3f9 fix: passthrough git log when format/detail flags are present\n1ad8cfb fix: resolve grep Clap flag collisions with rg native flags\n87fa5b9 feat: add agentic fuzzing system for RTK filter bug discovery\nd5f3cfa fix: passthrough --json in gh commands and -c in grep\n3c4126d fix: correct git_cmd() doc comment per PR #5 review feedback\nf89894e release: update version refs to 0.22.4 across docs\n450c4bb release: bump to v0.22.4 with git -C support\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --stat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --numstat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --shortstat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --name-only", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --name-status", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --cached --stat", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --raw --name-status", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git diff --word-diff=porcelain", + "family": "git-diff", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%H %s %ad' --date=short", + "family": "git-show", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page 2026-03-19\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ \"git status --short --branch\",\n+ ],\n+ \"git-diff\": [\n+ \"git diff --stat HEAD~1\",\n+ \"git diff --name-only HEAD~1\",\n+ \"git diff --name-status HEAD~1\",\n+ \"git diff --numstat HEAD~1\",\n+ \"git diff --shortstat HEAD~1\",\n+ ],\n+ \"git-show\": [\n+ \"git show --stat HEAD\",\n+ \"git show --format=", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page 2026-03-19\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git status --porcelain\",\n \"git status --porcelain=v2\",\n \"git status -s\",\n+ \"git status --short --branch\",\n+ ],\n+ \"git-diff\": [\n+ \"git diff --stat HEAD~1\",\n+ \"git diff --name-only HEAD~1\",\n+ \"git diff --name-status HEAD~1\",\n+ \"git diff --numstat HEAD~1\",\n+ \"git diff --shortstat HEAD~1\",\n+ ],\n+ \"git-show\": [\n+ \"git show --stat HEAD\",\n+ \"git show --format=", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --stat --numstat", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n59\t0\tscripts/fuzz-rtk.py\n1455\t0\tscripts/fuzzer-demo.html\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 14, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --name-only --name-status", + "family": "git-show", + "raw": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n", + "exit_code": 128, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n\n", + "exit_code": 128, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --pretty=format:'%H %s' --no-patch", + "family": "git-show", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%H %s %b' --no-patch", + "family": "git-show", + "raw": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page New families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "69eb6846f47dca60b36b98bcee4cb059ba257aa8 feat: expand static tests to 65 across 17 families, add demo page New families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --pretty=raw", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git sta", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8\ntree 6e0863e9814677b0d85c9aee7e190ea4eddc05d6\nparent fa315c6045538a97f793e89301ac7fe412305790\nauthor Paul-Louis NECH 1773944381 +0100\ncommitter Paul-Louis NECH 1773944381 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\ndiff --git a/scripts/fuzz-rtk.py b/scripts/fuzz-rtk.py\nindex 05fb467..d77fb95 100644\n--- a/scripts/fuzz-rtk.py\n+++ b/scripts/fuzz-rtk.py\n@@ -250,11 +250,34 @@ STATIC_TESTS = {\n \"git log --graph --oneline -10\",\n \"git log --numstat -5\",\n \"git log --name-only -5\",\n+ \"git log --patch -1\",\n+ \"git log --shortstat -5\",\n+ \"git log --pretty=format:'%h %an %s' -5\",\n ],\n \"git-status\": [\n \"git sta", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --porcelain --summary", + "family": "git-show", + "raw": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n", + "exit_code": 128, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: unrecognized argument: --porcelain\n\n", + "exit_code": 128, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git show --format='%B' --no-patch", + "family": "git-show", + "raw": { + "stdout": "feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "feat: expand static tests to 65 across 17 families, add demo page\n\nNew families: git-diff, git-show, git-branch, find, cargo-build,\ncargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\nFound 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git branch --format='%H %s'", + "family": "git-branch", + "raw": { + "stdout": "%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* \n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 0%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --all --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n remotes/origin/feature/agentic-fuzzing\n main\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n release/v0.22.4\n remotes/origin/release/v0.22.4\n fix/git-global-opts\n remotes/origin/fix/git-global-opts\n release/v0.22.3\n remotes/origin/release/v0.22.3\n fork/algolia-identity\n remotes/origin/fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "4/7 anchor tokens missing: ['remotes/origin/feature/agentic-fuzzing', 'remotes/origin/HEAD', 'remotes/origin/main', 'remotes/origin/release/v0.22.4']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 88%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --list --remotes -v", + "family": "git-branch", + "raw": { + "stdout": " origin/HEAD -> origin/main\n origin/feature/agentic-fuzzing 8e61bca feat: expand fuzzer with 20 command families and static regression tests\n origin/fix/git-global-opts 16c324e feat: support git -C (directory) global option for cross-repo commands\n origin/fork/algolia-identity 1a4b175 ci: use actions/cache@v4 for Rust build cache (zero third-party trust)\n origin/main d5f3cfa fix: passthrough --json in gh commands and -c in grep\n origin/release/v0.22.3 d2d8a34 release: bump to v0.22.3, drop homebrew job, update version refs\n origin/release/v0.22.4 f89894e release: update version refs to 0.22.4 across docs\n upstream/bug/critical-fixes 1ebd6a0 docs: bump README version to 0.28.0\n upstream/chore/cla", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "* \n origin/HEAD -> origin/main\n origin/feature/agentic-fuzzing 8e61bca feat: expand fuzzer with 20 command families and static regression tests\n origin/fix/git-global-opts 16c324e feat: support git -C (directory) global option for cross-repo commands\n origin/fork/algolia-identity 1a4b175 ci: use actions/cache@v4 for Rust build cache (zero third-party trust)\n origin/main d5f3cfa fix: passthrough --json in gh commands and -c in grep\n origin/release/v0.22.3 d2d8a34 release: bump to v0.22.3, drop homebrew job, update version refs\n origin/release/v0.22.4 f89894e release: update version refs to 0.22.4 across docs\n upstream/bug/critical-fixes 1ebd6a0 docs: bump README version to 0.28.0\n upstream/chore/", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "git branch --porcelain", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `porcelain'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --quiet", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/upstream/feat/hook-rewrite-toml\n remotes/upstream/feat/new-tools-toml\n remotes/upstream/feat/pr-template-ci\n remotes/upstream/feat/rtk-rewrite\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/feat/scaffold-command\n remotes/upstre", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 11%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) %(objectname)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing 69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\nfork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\nmain f72e3f941646b3b7846cd8574814a77584163e8b\nrelease/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\nrelease/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing 69eb6846f47dca60b36b98bcee4cb059ba257aa8\n fix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\n fork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\n main f72e3f941646b3b7846cd8574814a77584163e8b\n release/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\n release/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n origin d5f3cfa0ac86b693bce326db8484dfc8996fde72\n origin/feature/agentic-fuzzing 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\n origin/fix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\n origin/fork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\n origin/main d5f3cfa0ac86b693bce326db8484dfc8996fde72\n origin/release/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\n origin/release/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n upstream/bug/critical-fixes 1ebd6a064188c12717cca464ad28b786605ae79a\n upstream/chore/claude-config 34db3e47382a5857cbe5c8fc0421bb4ed3a0be9e\n upstream/develop c2cc8f3c7271634370e20", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 26%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --sort=creatordate --name-only", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `name-only'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -a --format='%(refname:lstrip=2) [%(committerdate:short)]'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing [2026-03-19]\nfix/git-global-opts [2026-03-18]\nfork/algolia-identity [2026-03-17]\nmain [2026-03-19]\nrelease/v0.22.3 [2026-03-18]\nrelease/v0.22.4 [2026-03-18]\norigin/HEAD [2026-03-19]\norigin/feature/agentic-fuzzing [2026-03-19]\norigin/fix/git-global-opts [2026-03-18]\norigin/fork/algolia-identity [2026-03-17]\norigin/main [2026-03-19]\norigin/release/v0.22.3 [2026-03-18]\norigin/release/v0.22.4 [2026-03-18]\nupstream/bug/critical-fixes [2026-03-10]\nupstream/chore/claude-config [2026-02-16]\nupstream/develop [2026-03-17]\nupstream/docs/add-ascii-diagrams [2026-02-22]\nupstream/docs/agent-agnostic-readme [2026-03-09]\nupstream/docs/functional-documentation [2026-03-06]\nupstream/docs/prompt-caching-faq [2026-03-13]\nupstream/docs/readme-revamp [2026-03-06]\nupstream/docs/session-summary-companion [2026-02-16]\nupstream/docs/v0.15.1-python-go-complete [2026-02-14]\nupstream/feat/add-support-native-claude-cmd [2026-03-09]\nupstream/feat/claude-skills-pr-issue-triage [2026-03-05]\nups", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing [2026-03-19]\n fix/git-global-opts [2026-03-18]\n fork/algolia-identity [2026-03-17]\n main [2026-03-19]\n release/v0.22.3 [2026-03-18]\n release/v0.22.4 [2026-03-18]\n origin/HEAD [2026-03-19]\n origin/feature/agentic-fuzzing [2026-03-19]\n origin/fix/git-global-opts [2026-03-18]\n origin/fork/algolia-identity [2026-03-17]\n origin/main [2026-03-19]\n origin/release/v0.22.3 [2026-03-18]\n origin/release/v0.22.4 [2026-03-18]\n upstream/bug/critical-fixes [2026-03-10]\n upstream/chore/claude-config [2026-02-16]\n upstream/develop [2026-03-17]\n upstream/docs/add-ascii-diagrams [2026-02-22]\n upstream/docs/agent-agnostic-readme [2026-03-09]\n upstream/docs/functional-documentation [2026-03-06]\n upstream/docs/prompt-caching-faq [2026-03-13]\n upstream/docs/readme-revamp [2026-03-06]\n upstream/docs/session-summary-companion [2026-02-16]\n upstream/docs/v0.15.1-python-go-complete [2026-02-14]\n upstream/feat/add-support-native-claude-cmd [2026-03-09]\n upstrea", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 80%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --count", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md:13\nCLAUDE.md:3\nbug-reports/2026-03-19-fuzz-findings.md:3\nscripts/benchmark.sh:4\nsrc/go_cmd.rs:15\nsrc/diff_cmd.rs:23\nsrc/gain.rs:14\nscripts/test-all.sh:2\nsrc/summary.rs:10\nsrc/main.rs:7\nsrc/runner.rs:5\nsrc/git.rs:49\nsrc/lint_cmd.rs:14\nscripts/fuzz-rtk.py:10\nsrc/ls.rs:11\nsrc/deps.rs:6\nsrc/container.rs:30\nsrc/vitest_cmd.rs:13\nsrc/prisma_cmd.rs:16\nsrc/filter.rs:19\ndocs/tracking.md:18\nsrc/next_cmd.rs:5\nsrc/prettier_cmd.rs:5\nsrc/tree.rs:8\nsrc/format_cmd.rs:12\nsrc/env_cmd.rs:7\nsrc/hook_audit_cmd.rs:14\nsrc/wget_cmd.rs:8\nsrc/cargo_cmd.rs:52\nsrc/wc_cmd.rs:22\nsrc/config.rs:8\nsrc/parser/mod.rs:22\nsrc/cc_economics.rs:36\nsrc/golangci_cmd.rs:6\nsrc/tracking.rs:25\nsrc/pytest_cmd.rs:10\nsrc/npm_cmd.rs:4\nsrc/local_llm.rs:13\nsrc/parser/README.md:6\nsrc/curl_cmd.rs:6\nsrc/read.rs:6\nsrc/json_cmd.rs:6\nsrc/ccusage.rs:12\nsrc/log_cmd.rs:7\nsrc/tee.rs:23\nsrc/ruff_cmd.rs:9\nscripts/fuzzer-demo.html:7\nsrc/tsc_cmd.rs:7\nsrc/parser/error.rs:1\nsrc/pip_cmd.rs:11\nsrc/pnpm_cmd.rs:16\nsrc/init.rs:50\nsrc/utils.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--count' found\n\n tip: a similar argument exists: '--context-only'\n tip: to pass '--count' as a value, use '-- --count'\n\nUsage: rtk grep --context-only [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md:13', 'CLAUDE.md:3', 'bug-reports/2026-03-19-fuzz-findings.md:3', 'scripts/benchmark.sh:4', 'src/go_cmd.rs:15']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' -l", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md\nCHANGELOG.md\nINSTALL.md\ninstall.sh\nCLAUDE.md\nscripts/test-aristote.sh\nREADME.md\nbug-reports/2026-03-19-fuzz-findings.md\nscripts/fuzz-rtk.py\nsrc/tracking.rs\nhooks/rtk-awareness.md\nsrc/read.rs\nsrc/go_cmd.rs\nsrc/init.rs\nsrc/playwright_cmd.rs\nSECURITY.md\nsrc/git.rs\nsrc/env_cmd.rs\nsrc/display_helpers.rs\nsrc/find_cmd.rs\nsrc/runner.rs\ndocs/TROUBLESHOOTING.md\nsrc/vitest_cmd.rs\nsrc/gh_cmd.rs\nsrc/format_cmd.rs\nscripts/rtk-economics.sh\nsrc/npm_cmd.rs\nsrc/discover/mod.rs\nsrc/next_cmd.rs\nsrc/gain.rs\nsrc/discover/registry.rs\nsrc/container.rs\nsrc/summary.rs\nsrc/wc_cmd.rs\nsrc/discover/report.rs\nsrc/lint_cmd.rs\nsrc/prettier_cmd.rs\nsrc/discover/provider.rs\nsrc/filter.rs\nsrc/golangci_cmd.rs\nsrc/parser/mod.rs\nsrc/local_llm.rs\nsrc/deps.rs\nsrc/wget_cmd.rs\nsrc/diff_cmd.rs\nsrc/log_cmd.rs\nsrc/cargo_cmd.rs\nsrc/tree.rs\nsrc/json_cmd.rs\nsrc/config.rs\nsrc/pytest_cmd.rs\ndocs/tracking.md\nsrc/curl_cmd.rs\nsrc/tee.rs\nsrc/parser/README.md\nsrc/main.rs\nsrc/hook_audit_cmd.rs\nsrc/cc_economics.rs\nsrc/ccusage.r", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-l' found\n\n tip: to pass '-l' as a value, use '-- -l'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'CHANGELOG.md', 'INSTALL.md', 'install.sh', 'CLAUDE.md']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --no-filename", + "family": "grep", + "raw": { + "stdout": "pub fn filter_git_log(input: &str) -> Result {\npub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\npub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n- `rtk grep 'pub ' -l`\n- `rtk grep 'pub ' -A 2 -B 2`\n- `rtk grep 'pub ' --no-filename --count-matches`\nassert_ok \"rtk grep pattern\" rtk grep \"pub fn\" src/\nassert_contains \"rtk grep finds results\" \"pub fn\" rtk grep \"pub fn\" src/\nassert_ok \"rtk grep with file type\" rtk grep \"pub fn\" src/ -t rust\n \"note\": \"RTK grep wraps ripgrep. Use patterns that will match (e.g. 'fn ', 'use ', 'pub ').\",\npub struct Tracker {\n pub fn new() -> Result;\n pub fn record(\n pub fn get_summary(&self) -> Result;\n pub fn get_all_days(&self) -> Result>;\n pub fn get_by_week(&self) -> Result>;\n pub fn get_by_month(&self) -> Result>;\n pub fn get_recent(&self, limit: usize) -> Result>;\npub", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--no-filename' found\n\n tip: a similar argument exists: '--line-numbers'\n tip: to pass '--no-filename' as a value, use '-- --no-filename'\n\nUsage: rtk grep --line-numbers [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "5/5 anchor tokens missing: ['pub', 'pub', 'pub', 'assert_ok', 'assert_contains']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --vimgrep", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nARCHITECTURE.md:419:1:fn calculate_total(items: &[Item]) -> i32 {\nARCHITECTURE.md:425:1:fn calculate_total(items: &[Item]) -> i32 {\nARCHITECTURE.md:430:1:fn calculate_total(items: &[Item]) -> i32 { ... }\nARCHITECTURE.md:584:5:pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\nARCHITECTURE.md:633:1:fn test_pytest_state_machine() {\nARCHITECTURE.md:646:1:fn test_go_test_ndjson_interleaved() {\nARCHITECTURE.md:1111:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\nARCHITECTURE.md:1133:1:fn execute_command(args: &[String]) -> Result {\nARCHITECTURE.md:1150:1:fn filter_output(raw: &str, verbose: u8) -> String {\nARCHITECTURE.md:1169:5: fn test_filter_output() {\nARCHITECTURE.md:1313:5:pub fn run(args: &[String], verbose: u8) -> R", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--vimgrep' found\n\n tip: to pass '--vimgrep' as a value, use '-- --vimgrep'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:335:5:pub', 'CLAUDE.md:359:5:pub', 'CLAUDE.md:374:5:pub', 'ARCHITECTURE.md:419:1:fn', 'ARCHITECTURE.md:425:1:fn']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' -A 2 -B 2", + "family": "grep", + "raw": { + "stdout": "CHANGELOG.md-### Bug Fixes\nCHANGELOG.md-\nCHANGELOG.md:* **hook:** use POSIX character classes for cross-platform grep compatibility ([#98](https://github.com/rtk-ai/rtk/issues/98)) ([4aafc83](https://github.com/rtk-ai/rtk/commit/4aafc832d4bdd438609358e2737a96bee4bb2467))\nCHANGELOG.md-\nCHANGELOG.md-## [0.15.1](https://github.com/rtk-ai/rtk/compare/v0.15.0...v0.15.1) (2026-02-12)\n--\nCHANGELOG.md-\nCHANGELOG.md-### Changed\nCHANGELOG.md:- Refactored `insert_hook_entry()` to use idiomatic Rust `entry()` API\nCHANGELOG.md-- Simplified `hook_already_present()` logic with iterator chains\nCHANGELOG.md-- Improved atomic write error messages for better debugging\n--\nCHANGELOG.md- - Tier 3: Passthrough with truncated raw output and error markers\nCHANGELOG.md- - Guarantees RTK never returns false data silently\nCHANGELOG.md:* **migrate commands to OutputParser**: vitest, playwright, pnpm now use robust parsing\nCHANGELOG.md- - JSON parsing with safe fallbacks for all modern JS tooling\nCHANGELOG.md- ", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-A' found\n\n tip: to pass '-A' as a value, use '-- -A'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['CHANGELOG.md-###', 'CHANGELOG.md-', 'CHANGELOG.md:*', 'CHANGELOG.md-', 'CHANGELOG.md-##']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --json", + "family": "grep", + "raw": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn filter_git_log(input: &str) -> Result {\\n\"},\"line_number\":335,\"absolute_offset\":12739,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":359,\"absolute_offset\":13354,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":374,\"absolute_offset\":13813,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":46262,\"human\":\"0.000046s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_l", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--json' found\n\n tip: to pass '--json' as a value, use '-- --json'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":46262,\"human\":\"0.000046s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_lines\":3,\"matches\":3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --format='{path}:{line}:{column}: {match}'", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "rg: unrecognized flag --format\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--format' found\n\n tip: to pass '--format' as a value, use '-- --format'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "rg 'use ' --files-with-matches --quiet", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--files-with-matches' found\n\n tip: a similar argument exists: '--file-type'\n tip: to pass '--files-with-matches' as a value, use '-- --files-with-matches'\n\nUsage: rtk grep --file-type [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "ls -l --color=never", + "family": "ls", + "raw": { + "stdout": "total 252\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7272 Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4096 Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4096 Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2171 Ma", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 no ext, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 20%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls -1 -a -h", + "family": "ls", + "raw": { + "stdout": ".\n..\nARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\n.claude\nCLAUDE.md\ndocs\nFormula\n.git\n.github\n.gitignore\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\n.release-please-manifest.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 .sh, 1 .toml, 1 .gitignore, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -R -S -t", + "family": "ls", + "raw": { + "stdout": ".:\nscripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n\n./scripts:\nfuzz-rtk.py\nfuzzer-demo.html\nFUZZ-RTK.md\ncheck-installation.sh\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nbenchmark.sh\n\n./src:\ntracking.rs\ngit.rs\ngrep_cmd.rs\nmain.rs\ngh_cmd.rs\nwc_cmd.rs\ntree.rs\nruff_cmd.rs\nsummary.rs\ntee.rs\nlog_cmd.rs\nparser\npip_cmd.rs\nlint_cmd.rs\ninit.rs\nlearn\ngolangci_cmd.rs\ngain.rs\nfind_cmd.rs\nformat_cmd.rs\ncontainer.rs\ndiscover\ncc_economics.rs\nccusage.rs\nwget_cmd.rs\nrunner.rs\ntsc_cmd.rs\nutils.rs\nvitest_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs\npytest_cmd.rs\nread.rs\nnpm_cmd.rs\nlocal_llm.rs\nls.rs\nnext_cmd.rs\nhook_audit_cmd.rs\njson_cmd.rs\ngo_cmd.rs\nenv_cmd.rs\nfilter.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndisplay_helpers.rs\ncargo_cmd.rs\nconf", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "rtk": { + "stdout": "scripts/\n.claude/\nsrc/\nbug-reports/\ndocs/\nhooks/\nFormula/\n.github/\nobjects/\nhooks/\nlogs/\nrefs/\nbranches/\ninfo/\n69/\n6e/\n97/\nd6/\nd7/\nfa/\nd3/\nff/\n6d/\nb6/\n05/\n8e/\n17/\nc0/\n2a/\n45/\nf7/\na0/\n07/\nca/\n1a/\n85/\n03/\n49/\n19/\n67/\naf/\n78/\n0d/\n87/\n56/\na5/\nc9/\n08/\n82/\nd5/\nb9/\nf4/\n42/\nbe/\n89/\nc8/\n3c/\n9d/\nbb/\n92/\nf8/\nde/\ncf/\n1d/\n13/\n4c/\ned/\nf1/\n11/\ndd/\n16/\n83/\n1e/\ndc/\n21/\n57/\ne4/\nd2/\n91/\n4b/\n12/\n2f/\n5f/\n27/\n64/\na8/\n3e/\n7e/\nc6/\n48/\n5a/\nb5/\nb4/\nb3/\n09/\n39/\n18/\ndf/\nbf/\ne6/\n22/\n4e/\nb7/\nf2/\n75/\n94/\n36/\n34/\n2c/\n35/\n93/\n25/\na2/\n8f/\na6/\n54/\nab/\ne9/\n0c/\n23/\n77/\nf9/\ne3/\n4f/\n43/\n0a/\n66/\n9b/\nfb/\n2e/\nd0/\n32/\n61/\n68/\na3/\nce/\nc7/\nf3/\n99/\nac/\n76/\na7/\n01/\n79/\n9e/\n4d/\n60/\n3d/\nee/\n06/\n29/\nfe/\npack/\ninfo/\nrefs/\nheads/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nchore/\nbug/\nheads/\ntags/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nbug/\nchore/\nskills/\nagents/\nrules/\nhooks/\ncommands/\nrtk-tdd/\nrefe", + "stderr": "", + "exit_code": 0, + "duration_ms": 100, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "2559 \u2192 4488 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls --format=long --human-readable", + "family": "ls", + "raw": { + "stdout": "total 252K\n-rw-rw-r-- 1 pln pln 56K Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30K Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1.5K Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4.0K Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 11K Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2.7K Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1.1K Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33K Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7.2K Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4.0K Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4.0K Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2.2K Mar 17 17:41 TEST_EXE", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 0B\nCargo.lock 0B\nCargo.toml 0B\nCHANGELOG.md 0B\nCLAUDE.md 0B\n.gitignore 339B\nINSTALL.md 0B\ninstall.sh 0B\nLICENSE 0B\nREADME.md 0B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 0B\nTEST_EXEC_TIME.md 0B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 no ext, 1 .toml, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 21%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls -c --color=never -1", + "family": "ls", + "raw": { + "stdout": "scripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 no ext, 1 .gitignore, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "20 \u2192 25 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 22%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --porcelain -R", + "family": "ls", + "raw": { + "stdout": "", + "stderr": "ls: unrecognized option '--porcelain'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "ls: unrecognized option '--porcelain'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls --json --color=never", + "family": "ls", + "raw": { + "stdout": "", + "stderr": "ls: unrecognized option '--json'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "ls: unrecognized option '--json'\nTry 'ls --help' for more information.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "ls -l --format='%A %n %Y' -5", + "family": "ls", + "raw": { + "stdout": "", + "stderr": "ls: invalid argument \u2018%A %n %Y\u2019 for \u2018--format\u2019\nValid arguments are:\n - \u2018verbose\u2019, \u2018long\u2019\n - \u2018commas\u2019\n - \u2018horizontal\u2019, \u2018across\u2019\n - \u2018vertical\u2019\n - \u2018single-column\u2019\nTry 'ls --help' for more information.\n", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "ls: invalid argument \u2018%A %n %Y\u2019 for \u2018--format\u2019\nValid arguments are:\n - \u2018verbose\u2019, \u2018long\u2019\n - \u2018commas\u2019\n - \u2018horizontal\u2019, \u2018across\u2019\n - \u2018vertical\u2019\n - \u2018single-column\u2019\nTry 'ls --help' for more information.\n", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -printf '%p %M %u\\n'", + "family": "find", + "raw": { + "stdout": ". drwxrwxr-x pln\n./ARCHITECTURE.md -rw-rw-r-- pln\n./SECURITY.md -rw-rw-r-- pln\n./.gitignore -rw-rw-r-- pln\n./src drwxrwxr-x pln\n./src/init.rs -rw-rw-r-- pln\n./src/read.rs -rw-rw-r-- pln\n./src/tracking.rs -rw-rw-r-- pln\n./src/env_cmd.rs -rw-rw-r-- pln\n./src/discover drwxrwxr-x pln\n./src/discover/provider.rs -rw-rw-r-- pln\n./src/discover/report.rs -rw-rw-r-- pln\n./src/discover/registry.rs -rw-rw-r-- pln\n./src/discover/mod.rs -rw-rw-r-- pln\n./src/display_helpers.rs -rw-rw-r-- pln\n./src/playwright_cmd.rs -rw-rw-r-- pln\n./src/gh_cmd.rs -rw-rw-r-- pln\n./src/parser drwxrwxr-x pln\n./src/parser/formatter.rs -rw-rw-r-- pln\n./src/parser/error.rs -rw-rw-r-- pln\n./src/parser/types.rs -rw-rw-r-- pln\n./src/parser/README.md -rw-rw-r-- pln\n./src/parser/mod.rs -rw-rw-r-- pln\n./src/git.rs -rw-rw-r-- pln\n./src/go_cmd.rs -rw-rw-r-- pln\n./src/cc_economics.rs -rw-rw-r-- pln\n./src/tree.rs -rw-rw-r-- pln\n./src/deps.rs -rw-rw-r-- pln\n./src/prisma_cmd.rs -rw-rw-r-- pln\n./src/ls.rs -rw-rw-r-- pln\n./src/main.rs -r", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['./ARCHITECTURE.md', './SECURITY.md', './.gitignore', './src', './src/init.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -print0 | wc -c", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: |" + }, + { + "command": "find . -maxdepth 3 -type f -name '*.rs' -ls", + "family": "find", + "raw": { + "stdout": " 64233644 52 -rw-rw-r-- 1 pln pln 51472 Mar 18 04:21 ./src/init.rs\n 64233235 8 -rw-rw-r-- 1 pln pln 4610 Mar 17 17:41 ./src/read.rs\n 64233242 36 -rw-rw-r-- 1 pln pln 33880 Mar 19 18:57 ./src/tracking.rs\n 64233185 8 -rw-rw-r-- 1 pln pln 5731 Mar 17 17:41 ./src/env_cmd.rs\n 64233169 16 -rw-rw-r-- 1 pln pln 15078 Mar 18 04:21 ./src/discover/provider.rs\n 64233130 8 -rw-rw-r-- 1 pln pln 5531 Mar 18 04:21 ./src/discover/report.rs\n 64233181 20 -rw-rw-r-- 1 pln pln 20218 Mar 17 17:41 ./src/discover/registry.rs\n 64233178 12 -rw-rw-r-- 1 pln pln 8298 Mar 17 17:41 ./src/discover/mod.rs\n 64233184 12 -rw-rw-r-- 1 pln pln 9732 Mar 17 17:41 ./src/display_helpers.rs\n 64233227 16 -rw-rw-r-- 1 pln pln 13792 Mar 17 17:41 ./src/playwright_cmd.rs\n 64233192 48 -rw-rw-r-- 1 pln pln 47210 Mar 19 1", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-n' found\n\n tip: to pass '-n' as a value, use '-- -n'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['64233644', '64233235', '64233242', '64233185', '64233169']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -path '*/.git/*' -prune -o -type f -print", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "blocked word: -prune" + }, + { + "command": "find . -maxdepth 3 -printf '%f %s\\n' | sort -n", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: |" + }, + { + "command": "find . -maxdepth 3 -iname '*.json' -print0", + "family": "find", + "raw": { + "stdout": "./.claude/settings.local.json\u0000./.release-please-manifest.json\u0000./target/.rustc_info.json\u0000./release-please-config.json\u0000", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-i' found\n\n tip: to pass '-i' as a value, use '-- -i'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type d -printf '%d\\n' | head -5", + "family": "find", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: |" + }, + { + "command": "find . -maxdepth 3 -printf '%y %p\\n'", + "family": "find", + "raw": { + "stdout": "d .\nf ./ARCHITECTURE.md\nf ./SECURITY.md\nf ./.gitignore\nd ./src\nf ./src/init.rs\nf ./src/read.rs\nf ./src/tracking.rs\nf ./src/env_cmd.rs\nd ./src/discover\nf ./src/discover/provider.rs\nf ./src/discover/report.rs\nf ./src/discover/registry.rs\nf ./src/discover/mod.rs\nf ./src/display_helpers.rs\nf ./src/playwright_cmd.rs\nf ./src/gh_cmd.rs\nd ./src/parser\nf ./src/parser/formatter.rs\nf ./src/parser/error.rs\nf ./src/parser/types.rs\nf ./src/parser/README.md\nf ./src/parser/mod.rs\nf ./src/git.rs\nf ./src/go_cmd.rs\nf ./src/cc_economics.rs\nf ./src/tree.rs\nf ./src/deps.rs\nf ./src/prisma_cmd.rs\nf ./src/ls.rs\nf ./src/main.rs\nf ./src/diff_cmd.rs\nf ./src/prettier_cmd.rs\nf ./src/next_cmd.rs\nf ./src/vitest_cmd.rs\nf ./src/lint_cmd.rs\nf ./src/summary.rs\nf ./src/gain.rs\nf ./src/npm_cmd.rs\nf ./src/golangci_cmd.rs\nf ./src/wget_cmd.rs\nf ./src/local_llm.rs\nf ./src/wc_cmd.rs\nf ./src/format_cmd.rs\nf ./src/find_cmd.rs\nf ./src/curl_cmd.rs\nf ./src/json_cmd.rs\nd ./src/learn\nf ./src/learn/detector.rs\nf ./src/learn/report.rs\nf", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -y src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-y' found\n\n tip: to pass '-y' as a value, use '-- -y'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --color=never -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--color' found\n\n tip: to pass '--color' as a value, use '-- --color'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -c src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "*** src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n--- Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n***************\n*** 1,1610 ****\n! mod cargo_cmd;\n! mod cc_economics;\n! mod ccusage;\n! mod config;\n! mod container;\n! mod curl_cmd;\n! mod deps;\n! mod diff_cmd;\n! mod discover;\n! mod display_helpers;\n! mod env_cmd;\n! mod filter;\n! mod find_cmd;\n! mod format_cmd;\n! mod gain;\n! mod gh_cmd;\n! mod git;\n! mod go_cmd;\n! mod golangci_cmd;\n! mod grep_cmd;\n! mod hook_audit_cmd;\n! mod init;\n! mod json_cmd;\n! mod learn;\n! mod lint_cmd;\n! mod local_llm;\n! mod log_cmd;\n! mod ls;\n! mod next_cmd;\n! mod npm_cmd;\n! mod parser;\n! mod pip_cmd;\n! mod playwright_cmd;\n! mod pnpm_cmd;\n! mod prettier_cmd;\n! mod prisma_cmd;\n! mod pytest_cmd;\n! mod read;\n! mod ruff_cmd;\n! mod runner;\n! mod summary;\n! mod tee;\n! mod tracking;\n! mod tree;\n! mod tsc_cmd;\n! mod utils;\n! mod vitest_cmd;\n! mod wc_cmd;\n! mod wget_cmd;\n! \n! use anyhow::{Context, Result};\n! use clap::{Parser, Subcommand};\n! use std::ffi::OsString;\n! use ", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-c' found\n\n tip: to pass '-c' as a value, use '-- -c'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['***', '---', '***************', '***']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --brief src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--brief' found\n\n tip: to pass '--brief' as a value, use '-- --brief'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u --label=file1 --label=file2 src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- file1\n+++ file2\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- name = \"rtk\",\n- version,\n- about = \"Rust Token Killer - Minimize LLM token co", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--label' found\n\n tip: to pass '--label' as a value, use '-- --label'\n\nUsage: rtk diff --ultra-compact [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q --label=left --label=right src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files left and right differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "wc -l src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -w src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -c src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -m src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -L src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -l -w src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 1, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 6, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -c -m src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 1, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: 'src/*.rs': No such file or directory\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "wc -l --total src/*.rs", + "family": "wc", + "raw": { + "stdout": "", + "stderr": "wc: invalid argument \u2018src/*.rs\u2019 for \u2018--total\u2019\nValid arguments are:\n - \u2018auto\u2019\n - \u2018always\u2019\n - \u2018only\u2019\n - \u2018never\u2019\nTry 'wc --help' for more information.\n", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "FAILED: wc wc: invalid argument \u2018src/*.rs\u2019 for \u2018--total\u2019\nValid arguments are:\n - \u2018auto\u2019\n - \u2018always\u2019\n - \u2018only\u2019\n - \u2018never\u2019\nTry 'wc --help' for more information.\n", + "exit_code": 1, + "duration_ms": 5, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 --dirsfirst", + "family": "tree", + "raw": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 TROUBLESHOOTING.md\n\u251c\u2500\u2500 Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 rtk.rb\n\u251c\u2500\u2500 hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-rtk-rewrite.sh\n\u251c\u2500\u2500 scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 update-readme-metrics.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 validate-docs.sh\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 learn\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 parser\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cargo_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cc_economics.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ccusage.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 container.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 curl_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deps.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 diff_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 display_helpers.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 env_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 filter.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 find_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 format_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 gain.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 gh_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 git.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 go_cmd.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": ".\n\u251c\u2500\u2500 bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 TROUBLESHOOTING.md\n\u251c\u2500\u2500 Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 rtk.rb\n\u251c\u2500\u2500 hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 test-rtk-rewrite.sh\n\u251c\u2500\u2500 scripts\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 benchmark.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 check-installation.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzzer-demo.html\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 FUZZ-RTK.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 fuzz-rtk.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 install-local.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 rtk-economics.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-all.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-aristote.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test-tracking.sh\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 update-readme-metrics.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 validate-docs.sh\n\u251c\u2500\u2500 src\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 discover\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 learn\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 parser\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cargo_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 cc_economics.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ccusage.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 container.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 curl_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deps.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 diff_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 display_helpers.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 env_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 filter.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 find_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 format_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 gain.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 gh_cmd.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 git.rs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 go_cmd.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 -d --prune", + "family": "tree", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "blocked word: --prune" + }, + { + "command": "tree -L 2 -p -f", + "family": "tree", + "raw": { + "stdout": "[drwxrwxr-x] .\n\u251c\u2500\u2500 [-rw-rw-r--] ./ARCHITECTURE.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./Cargo.lock\n\u251c\u2500\u2500 [-rw-rw-r--] ./Cargo.toml\n\u251c\u2500\u2500 [-rw-rw-r--] ./CHANGELOG.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./CLAUDE.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [drwxrwxr-x] ./docs/images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./Formula/rtk.rb\n\u251c\u2500\u2500 [drwxrwxr-x] ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rwxrwxr-x] ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 [-rw-rw-r--] ./INSTALL.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./install.sh\n\u251c\u2500\u2500 [-rw-rw-r--] ./LICENSE\n\u251c\u2500\u2500 [-rw-rw-r--] ./README.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./release-please-config.json\n\u251c\u2500\u2500 [-rw-rw-r--] ./ROADMAP.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./scrip", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "[drwxrwxr-x] .\n\u251c\u2500\u2500 [-rw-rw-r--] ./ARCHITECTURE.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./bug-reports\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./bug-reports/2026-03-19-fuzz-findings.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./bug-reports/2026-03-19-gh-json-output-rewritten.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./Cargo.lock\n\u251c\u2500\u2500 [-rw-rw-r--] ./Cargo.toml\n\u251c\u2500\u2500 [-rw-rw-r--] ./CHANGELOG.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./CLAUDE.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./docs\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./docs/AUDIT_GUIDE.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [drwxrwxr-x] ./docs/images\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./docs/tracking.md\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./docs/TROUBLESHOOTING.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./Formula\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rw-rw-r--] ./Formula/rtk.rb\n\u251c\u2500\u2500 [drwxrwxr-x] ./hooks\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./hooks/rtk-awareness.md\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 [-rw-rw-r--] ./hooks/rtk-rewrite.sh\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 [-rwxrwxr-x] ./hooks/test-rtk-rewrite.sh\n\u251c\u2500\u2500 [-rw-rw-r--] ./INSTALL.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./install.sh\n\u251c\u2500\u2500 [-rw-rw-r--] ./LICENSE\n\u251c\u2500\u2500 [-rw-rw-r--] ./README.md\n\u251c\u2500\u2500 [-rw-rw-r--] ./release-please-config.json\n\u251c\u2500\u2500 [-rw-rw-r--] ./ROADMAP.md\n\u251c\u2500\u2500 [drwxrwxr-x] ./scrip", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 --charset=ascii -i", + "family": "tree", + "raw": { + "stdout": ".\nARCHITECTURE.md\nbug-reports\n2026-03-19-fuzz-findings.md\n2026-03-19-gh-json-output-rewritten.md\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nAUDIT_GUIDE.md\nimages\ntracking.md\nTROUBLESHOOTING.md\nFormula\nrtk.rb\nhooks\nrtk-awareness.md\nrtk-rewrite.sh\ntest-rtk-rewrite.sh\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nbenchmark.sh\ncheck-installation.sh\nfuzzer-demo.html\nFUZZ-RTK.md\nfuzz-rtk.py\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nSECURITY.md\nsrc\ncargo_cmd.rs\ncc_economics.rs\nccusage.rs\nconfig.rs\ncontainer.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndiscover\ndisplay_helpers.rs\nenv_cmd.rs\nfilter.rs\nfind_cmd.rs\nformat_cmd.rs\ngain.rs\ngh_cmd.rs\ngit.rs\ngo_cmd.rs\ngolangci_cmd.rs\ngrep_cmd.rs\nhook_audit_cmd.rs\ninit.rs\njson_cmd.rs\nlearn\nlint_cmd.rs\nlocal_llm.rs\nlog_cmd.rs\nls.rs\nmain.rs\nnext_cmd.rs\nnpm_cmd.rs\nparser\npip_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": ".\nARCHITECTURE.md\nbug-reports\n2026-03-19-fuzz-findings.md\n2026-03-19-gh-json-output-rewritten.md\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nAUDIT_GUIDE.md\nimages\ntracking.md\nTROUBLESHOOTING.md\nFormula\nrtk.rb\nhooks\nrtk-awareness.md\nrtk-rewrite.sh\ntest-rtk-rewrite.sh\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nbenchmark.sh\ncheck-installation.sh\nfuzzer-demo.html\nFUZZ-RTK.md\nfuzz-rtk.py\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nSECURITY.md\nsrc\ncargo_cmd.rs\ncc_economics.rs\nccusage.rs\nconfig.rs\ncontainer.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndiscover\ndisplay_helpers.rs\nenv_cmd.rs\nfilter.rs\nfind_cmd.rs\nformat_cmd.rs\ngain.rs\ngh_cmd.rs\ngit.rs\ngo_cmd.rs\ngolangci_cmd.rs\ngrep_cmd.rs\nhook_audit_cmd.rs\ninit.rs\njson_cmd.rs\nlearn\nlint_cmd.rs\nlocal_llm.rs\nlog_cmd.rs\nls.rs\nmain.rs\nnext_cmd.rs\nnpm_cmd.rs\nparser\npip_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 -s --name-only", + "family": "tree", + "raw": { + "stdout": "", + "stderr": "tree: Invalid argument `--name-only'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofil", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "tree: Invalid argument `--name-only'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofil", + "exit_code": 1, + "duration_ms": 9, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + }, + { + "command": "tree -L 2 --prune -a", + "family": "tree", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "blocked word: --prune" + }, + { + "command": "tree -L 3 --format='[%h] %s' 2>/dev/null", + "family": "tree", + "raw": null, + "rtk": null, + "verdict": "SKIP", + "issues": [], + "skipped_reason": "shell operator: >" + }, + { + "command": "tree -L 2 -I 'node_modules' --porcelain", + "family": "tree", + "raw": { + "stdout": "", + "stderr": "tree: Invalid argument `--porcelain'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofil", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "tree: Invalid argument `--porcelain'.\nusage: tree [-acdfghilnpqrstuvxACDFJQNSUX] [-L level [-R]] [-H baseHREF]\n\t[-T title] [-o filename] [-P pattern] [-I pattern] [--gitignore]\n\t[--gitfile[=]file] [--matchdirs] [--metafirst] [--ignore-case]\n\t[--nolinks] [--hintro[=]file] [--houtro[=]file] [--inodes] [--device]\n\t[--sort[=]] [--dirsfirst] [--filesfirst] [--filelimit #] [--si]\n\t[--du] [--prune] [--charset[=]X] [--timefmt[=]format] [--fromfile]\n\t[--fromtabfile] [--fflinks] [--info] [--infofil", + "exit_code": 1, + "duration_ms": 7, + "error": null + }, + "verdict": "PASS", + "issues": [], + "skipped_reason": null + } + ], + "summary": { + "total": 210, + "pass": 112, + "warn": 4, + "fail": 83, + "error": 0, + "skip": 11 + }, + "failures": [ + { + "command": "git diff --name-only HEAD~1", + "family": "git-diff", + "raw": { + "stdout": "scripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "scripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n\n--- Changes ---\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 84%)" + } + ], + "skipped_reason": null + }, + { + "command": "git diff --name-status HEAD~1", + "family": "git-diff", + "raw": { + "stdout": "M\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "M\tscripts/fuzz-rtk.py\nA\tscripts/fuzzer-demo.html\n\n--- Changes ---\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 85%)" + } + ], + "skipped_reason": null + }, + { + "command": "git show --name-only HEAD", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n\n", + "exit_code": 128, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=128" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['commit', 'Author', 'Date', 'feat', 'New']" + } + ], + "skipped_reason": null + }, + { + "command": "git show --raw HEAD", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "69eb684 feat: expand static tests to 65 across 17 families, add demo page (31 seconds ago) \n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n:100644 100644 05fb467 d77fb95 M\tscripts/fuzz-rtk.py\n:000000 100644 0000000 d6499fa A\tscripts/fuzzer-demo.html\n scripts/fuzz-rtk.py | 59 ++\n scripts/fuzzer-demo.html | 1455 ++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 1514 insertions(+)\n\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 26, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "6/8 anchor tokens missing: ['commit', 'Author', 'Date', 'New', 'cargo-clippy']" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) %(objectname:short)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing 69eb684\nfix/git-global-opts 16c324e\nfork/algolia-identity 1a4b175\nmain f72e3f9\nrelease/v0.22.3 d2d8a34\nrelease/v0.22.4 f89894e\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing 69eb684\n fix/git-global-opts 16c324e\n fork/algolia-identity 1a4b175\n main f72e3f9\n release/v0.22.3 d2d8a34\n release/v0.22.4 f89894e\n origin d5f3cfa\n origin/feature/agentic-fuzzing 8e61bca\n origin/fix/git-global-opts 16c324e\n origin/fork/algolia-identity 1a4b175\n origin/main d5f3cfa\n origin/release/v0.22.3 d2d8a34\n origin/release/v0.22.4 f89894e\n upstream/bug/critical-fixes 1ebd6a0\n upstream/chore/claude-config 34db3e4\n upstream/develop c2cc8f3\n upstream/docs/add-ascii-diagrams a9889bc\n upstream/docs/agent-agnostic-readme d2e5bd7\n upstream/docs/functional-documentation 339d5a2\n upstream/docs/prompt-caching-faq bee819b\n upstream/docs/readme-revamp ff0c9f5\n upstream/docs/session-summary-companion ebb73e9\n upstream/docs/v0.15.1-python-go-complete fb37bc9\n upstream/feat/add-support-native-claude-cmd f00837b\n upstream/feat/claude-skills-pr-issue-triage da50445\n upstream/feat/claude-tooling-agents-rules-skills bab7363\n upstream/feat/hook-", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 13%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 11%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -c", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:3\n./src/gain.rs:14\n./src/summary.rs:10\n./src/runner.rs:5\n./src/lint_cmd.rs:14\n./scripts/benchmark.sh:4\n./src/vitest_cmd.rs:13\n./src/next_cmd.rs:5\n./src/container.rs:30\n./src/prettier_cmd.rs:5\n./scripts/test-all.sh:2\n./src/diff_cmd.rs:23\n./src/filter.rs:19\n./src/git.rs:49\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./src/main.rs:7\n./scripts/fuzz-rtk.py:10\n./src/ls.rs:11\n./src/cargo_cmd.rs:52\n./src/prisma_cmd.rs:16\n./docs/tracking.md:18\n./src/tracking.rs:25\n./src/config.rs:8\n./src/pytest_cmd.rs:10\n./src/deps.rs:6\n./src/tree.rs:8\n./src/read.rs:6\n./src/ccusage.rs:12\n./src/learn/mod.rs:1\n./src/wc_cmd.rs:22\n./src/cc_economics.rs:36\n./src/learn/report.rs:6\n./src/grep_cmd.rs:16\n./src/init.rs:50\n./ARCHITECTURE.md:13\n./src/go_cmd.rs:15\n./src/local_llm.rs:13\n./src/parser/mod.rs:22\n./src/curl_cmd.rs:6\n./src/golangci_cmd.rs:6\n./src/utils.rs:34\n./src/learn/detector.rs:25\n./src/gh_cmd.rs:47\n./src/parser/README.md:6\n./src/wget_cmd.rs:8\n./src/npm_cmd.rs:4\n./src/find_cmd.rs:14\n./scripts/fuzz", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "./CLAUDE.md:3\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./ARCHITECTURE.md:13\n./src/init.rs:50\n./src/go_cmd.rs:15\n./src/next_cmd.rs:5\n./docs/tracking.md:18\n./src/prettier_cmd.rs:5\n./src/git.rs:49\n./src/runner.rs:5\n./scripts/benchmark.sh:4\n./src/diff_cmd.rs:23\n./src/playwright_cmd.rs:10\n./src/deps.rs:6\n./src/container.rs:30\n./src/main.rs:7\n./src/tree.rs:8\n./scripts/test-all.sh:2\n./src/display_helpers.rs:55\n./src/filter.rs:19\n./src/parser/error.rs:1\n./src/parser/mod.rs:22\n./src/discover/mod.rs:3\n./src/ls.rs:11\n./src/parser/formatter.rs:17\n./src/cc_economics.rs:36\n./scripts/fuzz-rtk.py:10\n./src/parser/README.md:6\n./src/gh_cmd.rs:47\n./src/discover/registry.rs:28\n./src/cargo_cmd.rs:52\n./src/wget_cmd.rs:8\n./src/prisma_cmd.rs:16\n./src/pip_cmd.rs:11\n./src/curl_cmd.rs:6\n./src/discover/report.rs:7\n./src/summary.rs:10\n./src/pytest_cmd.rs:10\n./src/wc_cmd.rs:22\n./src/golangci_cmd.rs:6\n./src/ruff_cmd.rs:9\n./src/format_cmd.rs:12\n./src/npm_cmd.rs:4\n./src/discover/provider.rs:18\n./src/local_llm.rs:13\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 17%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . --vimgrep", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./CLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n./scripts/benchmark.sh:175:28:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh:175:59:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\n./scripts/benchmark.sh:177:31:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:177:62:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\n./scripts/benchmark.sh:178:34:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:178:76:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\n./scripts/benchmark.sh:179:29:bench \"grep -c\" \"grep -ron 'fn ' src/ || true\" \"$RTK grep '", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "rtk": { + "stdout": "./ARCHITECTURE.md:419:1:fn calculate_total(items: &[Item]) -> i32 {\n./ARCHITECTURE.md:425:1:fn calculate_total(items: &[Item]) -> i32 {\n./ARCHITECTURE.md:430:1:fn calculate_total(items: &[Item]) -> i32 { ... }\n./ARCHITECTURE.md:584:5:pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:633:1:fn test_pytest_state_machine() {\n./ARCHITECTURE.md:646:1:fn test_go_test_ndjson_interleaved() {\n./ARCHITECTURE.md:1111:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:1133:1:fn execute_command(args: &[String]) -> Result {\n./ARCHITECTURE.md:1150:1:fn filter_output(raw: &str, verbose: u8) -> String {\n./ARCHITECTURE.md:1169:5: fn test_filter_output() {\n./ARCHITECTURE.md:1313:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\n./ARCHITECTURE.md:1334:1:fn filter(raw: &str, verbose: u8) -> String {\n./ARCHITECTURE.md:1344:5: fn test_filter() {\n./CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\n./CLAUDE.md:359", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 27%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -h", + "family": "grep", + "raw": { + "stdout": "ripgrep 14.1.0\nAndrew Gallant \n\nripgrep (rg) recursively searches the current directory for lines matching\na regex pattern. By default, ripgrep will respect gitignore rules and\nautomatically skip hidden files/directories and binary files.\n\nUse -h for short descriptions and --help for more details.\n\nProject home page: https://github.com/BurntSushi/ripgrep\n\nUSAGE:\n rg [OPTIONS] PATTERN [PATH ...]\n\nPOSITIONAL ARGUMENTS:\n A regular expression used for searching.\n ... A file or directory to search.\n\nINPUT OPTIONS:\n -e, --regexp=PATTERN A pattern to search for.\n -f, --file=PATTERNFILE Search for patterns from the given file.\n --pre=COMMAND Search output of COMMAND for each PATH.\n --pre-glob=GLOB Include or exclude files from a preprocessor.\n -z, --search-zip Search in compressed files.\n\nSEARCH OPTIONS:\n -s, --case-sensitive Search case sensitively (default).\n --crl", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "Compact grep - strips whitespace, truncates, groups by file\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nArguments:\n Pattern to search\n [PATH] Path to search in [default: .]\n [EXTRA_ARGS]... Extra ripgrep arguments (e.g., -i, -A 3, -w, -l, -c, --glob)\n\nOptions:\n --max-len Max line length (no short flag \u2014 -l is rg's --files-with-matches) [default: 80]\n --max Max results to show (no short flag \u2014 -m is rg's --max-count) [default: 50]\n --context-only Show only match context (not full line; no short \u2014 -c is rg's --count)\n -t, --file-type Filter by file type (e.g., ts, py, rust) \u2014 matches rg -t\n -n, --line-numbers Show line numbers (always on, accepted for grep/rg compatibility)\n -v, --verbose... Verbosity level (-v, -vv, -vvv)\n -u, --ultra-compact Ultra-compact mode: ASCII icons, inline format (Level 2 optimizations)\n --skip-env ", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "5/7 anchor tokens missing: ['Andrew', 'automatically', 'Use', 'Project', 'USAGE']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' . -i --count", + "family": "grep", + "raw": { + "stdout": "./CLAUDE.md:3\n./scripts/fuzzer-demo.html:7\n./scripts/benchmark.sh:4\n./scripts/test-all.sh:2\n./scripts/fuzz-rtk.py:10\n./docs/tracking.md:18\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./src/env_cmd.rs:7\n./src/read.rs:6\n./src/init.rs:50\n./src/tracking.rs:25\n./src/deps.rs:6\n./src/cc_economics.rs:36\n./src/tree.rs:8\n./src/next_cmd.rs:5\n./src/go_cmd.rs:15\n./src/git.rs:49\n./src/wget_cmd.rs:8\n./src/summary.rs:10\n./src/prettier_cmd.rs:5\n./src/vitest_cmd.rs:13\n./src/diff_cmd.rs:23\n./src/lint_cmd.rs:14\n./ARCHITECTURE.md:13\n./src/golangci_cmd.rs:6\n./src/npm_cmd.rs:4\n./src/runner.rs:5\n./src/main.rs:7\n./src/ls.rs:11\n./src/gain.rs:14\n./src/prisma_cmd.rs:16\n./src/display_helpers.rs:55\n./src/utils.rs:34\n./src/discover/mod.rs:3\n./src/tee.rs:23\n./src/curl_cmd.rs:6\n./src/container.rs:30\n./src/pnpm_cmd.rs:16\n./src/discover/registry.rs:28\n./src/wc_cmd.rs:22\n./src/pytest_cmd.rs:10\n./src/discover/report.rs:7\n./src/grep_cmd.rs:16\n./src/parser/mod.rs:22\n./src/ruff_cmd.rs:9\n./src/filter.rs:19\n./src/pip_cmd.rs:11", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "./ARCHITECTURE.md:13\n./CLAUDE.md:3\n./bug-reports/2026-03-19-fuzz-findings.md:3\n./scripts/benchmark.sh:4\n./src/env_cmd.rs:7\n./scripts/test-all.sh:2\n./src/tracking.rs:25\n./src/playwright_cmd.rs:10\n./scripts/fuzz-rtk.py:10\n./src/runner.rs:5\n./src/parser/mod.rs:22\n./src/display_helpers.rs:55\n./src/read.rs:6\n./src/parser/error.rs:1\n./src/parser/README.md:6\n./src/container.rs:30\n./src/parser/formatter.rs:17\n./src/init.rs:50\n./src/gain.rs:14\n./src/filter.rs:19\n./src/wc_cmd.rs:22\n./src/prettier_cmd.rs:5\n./src/summary.rs:10\n./src/local_llm.rs:13\n./src/discover/mod.rs:3\n./docs/tracking.md:18\n./src/gh_cmd.rs:47\n./src/diff_cmd.rs:23\n./src/discover/report.rs:7\n./src/wget_cmd.rs:8\n./src/lint_cmd.rs:14\n./src/tee.rs:23\n./src/cargo_cmd.rs:52\n./src/tree.rs:8\n./src/discover/registry.rs:28\n./src/vitest_cmd.rs:13\n./src/npm_cmd.rs:4\n./src/golangci_cmd.rs:6\n./src/go_cmd.rs:15\n./src/pytest_cmd.rs:10\n./scripts/fuzzer-demo.html:7\n./src/json_cmd.rs:6\n./src/config.rs:8\n./src/prisma_cmd.rs:16\n./src/cc_economics.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 17%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls -la", + "family": "ls", + "raw": { + "stdout": "total 280\ndrwxrwxr-x 12 pln pln 4096 Mar 19 15:25 .\ndrwxrwxr-x 32 pln pln 4096 Mar 19 10:46 ..\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\ndrwxrwxr-x 7 pln pln 4096 Mar 19 19:05 .claude\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 8 pln pln 4096 Mar 19 19:19 .git\ndrwxrwxr-x 3 pln pln 4096 Mar 17 17:41 .github\n-rw-rw-r-- 1 pln pln 339 Mar 17 17:41 .gitignore\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 r", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 .toml, 1 .gitignore, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', 'drwxrwxr-x', 'drwxrwxr-x', '-rw-rw-r--', 'drwxrwxr-x']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -lhS src/", + "family": "ls", + "raw": { + "stdout": "total 836K\n-rw-rw-r-- 1 pln pln 54K Mar 19 17:53 git.rs\n-rw-rw-r-- 1 pln pln 53K Mar 17 17:41 cargo_cmd.rs\n-rw-rw-r-- 1 pln pln 51K Mar 18 04:21 init.rs\n-rw-rw-r-- 1 pln pln 50K Mar 19 17:37 main.rs\n-rw-rw-r-- 1 pln pln 47K Mar 19 15:42 gh_cmd.rs\n-rw-rw-r-- 1 pln pln 38K Mar 18 04:21 cc_economics.rs\n-rw-rw-r-- 1 pln pln 34K Mar 19 18:57 tracking.rs\n-rw-rw-r-- 1 pln pln 28K Mar 18 04:21 container.rs\n-rw-rw-r-- 1 pln pln 24K Mar 18 04:21 lint_cmd.rs\n-rw-rw-r-- 1 pln pln 17K Mar 18 04:21 gain.rs\n-rw-rw-r-- 1 pln pln 17K Mar 17 17:41 pnpm_cmd.rs\n-rw-rw-r-- 1 pln pln 16K Mar 17 17:41 go_cmd.rs\n-rw-rw-r-- 1 pln pln 14K Mar 17 17:41 playwright_cmd.rs\n-rw-rw-r-- 1 pln pln 14K Mar 17 17:41 prisma_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 18 04:21 format_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 19 17:49 grep_cmd.rs\n-rw-rw-r-- 1 pln pln 13K Mar 18 04:21 ruff_cmd.rs\n-rw-rw-r-- 1 pln pln 12K Mar 17 17:41 filter.rs\n-rw-rw-r-- 1 pln pln 12K Mar 17 17:41 pytest_cmd.rs\n-rw-rw-r-- 1 pln pln 12K", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "discover/\nlearn/\nparser/\ngit.rs 53.4K\ncargo_cmd.rs 52.6K\ninit.rs 50.3K\nmain.rs 49.6K\ngh_cmd.rs 46.1K\ncc_economics.rs 37.6K\ntracking.rs 33.1K\ncontainer.rs 27.3K\nlint_cmd.rs 23.4K\ngain.rs 16.6K\npnpm_cmd.rs 16.1K\ngo_cmd.rs 15.9K\nplaywright_cmd.rs 13.5K\nprisma_cmd.rs 13.4K\nformat_cmd.rs 12.9K\ngrep_cmd.rs 12.9K\nruff_cmd.rs 12.5K\nfilter.rs 11.9K\npytest_cmd.rs 11.8K\nvitest_cmd.rs 11.7K\ntee.rs 11.5K\nwc_cmd.rs 11.4K\nutils.rs 11.1K\ndiff_cmd.rs 10.4K\ndisplay_helpers.rs 9.5K\nls.rs 9.5K\nlocal_llm.rs 9.5K\nccusage.rs 9.3K\nsummary.rs 9.0K\nhook_audit_cmd.rs 8.9K\ndeps.rs 8.8K\ntsc_cmd.rs 8.4K\nrunner.rs 8.3K\npip_cmd.rs 8.3K\nwget_cmd.rs 7.9K\nfind_cmd.rs 7.9K\nlog_cmd.rs 7.6K\ngolangci_cmd.rs 7.3K\nnext_cmd.rs 7.2K\ntree.rs 6.0K\nenv_cmd.rs 5.6K\nprettier_cmd.rs 5.5K\njson_cmd.rs 5.3K\nread.rs 4.5K\ncurl_cmd.rs 3.3K\nconfig.rs 3.0K\nnpm_cmd.rs 2.7K\n\n\ud83d\udcca 47 files, 3 dirs (47 .rs)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -la --color=never", + "family": "ls", + "raw": { + "stdout": "total 280\ndrwxrwxr-x 12 pln pln 4096 Mar 19 15:25 .\ndrwxrwxr-x 32 pln pln 4096 Mar 19 10:46 ..\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\ndrwxrwxr-x 7 pln pln 4096 Mar 19 19:05 .claude\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 8 pln pln 4096 Mar 19 19:19 .git\ndrwxrwxr-x 3 pln pln 4096 Mar 17 17:41 .github\n-rw-rw-r-- 1 pln pln 339 Mar 17 17:41 .gitignore\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 r", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 no ext, 1 .sh, 1 .gitignore, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', 'drwxrwxr-x', 'drwxrwxr-x', '-rw-rw-r--', 'drwxrwxr-x']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 18%)" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -name '*.rs'", + "family": "find", + "raw": { + "stdout": "./src/init.rs\n./src/read.rs\n./src/tracking.rs\n./src/env_cmd.rs\n./src/display_helpers.rs\n./src/playwright_cmd.rs\n./src/gh_cmd.rs\n./src/git.rs\n./src/go_cmd.rs\n./src/cc_economics.rs\n./src/tree.rs\n./src/deps.rs\n./src/prisma_cmd.rs\n./src/ls.rs\n./src/main.rs\n./src/diff_cmd.rs\n./src/prettier_cmd.rs\n./src/next_cmd.rs\n./src/vitest_cmd.rs\n./src/lint_cmd.rs\n./src/summary.rs\n./src/gain.rs\n./src/npm_cmd.rs\n./src/golangci_cmd.rs\n./src/wget_cmd.rs\n./src/local_llm.rs\n./src/wc_cmd.rs\n./src/format_cmd.rs\n./src/find_cmd.rs\n./src/curl_cmd.rs\n./src/json_cmd.rs\n./src/config.rs\n./src/hook_audit_cmd.rs\n./src/pip_cmd.rs\n./src/tee.rs\n./src/log_cmd.rs\n./src/tsc_cmd.rs\n./src/ruff_cmd.rs\n./src/pnpm_cmd.rs\n./src/utils.rs\n./src/grep_cmd.rs\n./src/ccusage.rs\n./src/pytest_cmd.rs\n./src/cargo_cmd.rs\n./src/filter.rs\n./src/container.rs\n./src/runner.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['./src/init.rs', './src/read.rs', './src/tracking.rs', './src/env_cmd.rs', './src/display_helpers.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -type d", + "family": "find", + "raw": { + "stdout": ".\n./src\n./src/discover\n./src/parser\n./src/learn\n./.claude\n./.claude/skills\n./.claude/commands\n./.claude/hooks\n./.claude/rules\n./.claude/agents\n./.github\n./.github/workflows\n./Formula\n./scripts\n./docs\n./docs/images\n./target\n./target/debug\n./target/release\n./bug-reports\n./hooks\n./.git\n./.git/info\n./.git/objects\n./.git/refs\n./.git/logs\n./.git/branches\n./.git/hooks\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['./src', './src/discover', './src/parser', './src/learn', './.claude']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 2 -name '*.toml'", + "family": "find", + "raw": { + "stdout": "./Cargo.toml\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: invalid value 'axdepth' for '--max ': invalid digit found in string\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "1,1610c1,56\n< mod cargo_cmd;\n< mod cc_economics;\n< mod ccusage;\n< mod config;\n< mod container;\n< mod curl_cmd;\n< mod deps;\n< mod diff_cmd;\n< mod discover;\n< mod display_helpers;\n< mod env_cmd;\n< mod filter;\n< mod find_cmd;\n< mod format_cmd;\n< mod gain;\n< mod gh_cmd;\n< mod git;\n< mod go_cmd;\n< mod golangci_cmd;\n< mod grep_cmd;\n< mod hook_audit_cmd;\n< mod init;\n< mod json_cmd;\n< mod learn;\n< mod lint_cmd;\n< mod local_llm;\n< mod log_cmd;\n< mod ls;\n< mod next_cmd;\n< mod npm_cmd;\n< mod parser;\n< mod pip_cmd;\n< mod playwright_cmd;\n< mod pnpm_cmd;\n< mod prettier_cmd;\n< mod prisma_cmd;\n< mod pytest_cmd;\n< mod read;\n< mod ruff_cmd;\n< mod runner;\n< mod summary;\n< mod tee;\n< mod tracking;\n< mod tree;\n< mod tsc_cmd;\n< mod utils;\n< mod vitest_cmd;\n< mod wc_cmd;\n< mod wget_cmd;\n< \n< use anyhow::{Context, Result};\n< use clap::{Parser, Subcommand};\n< use std::ffi::OsString;\n< use std::path::{Path, PathBuf};\n< \n< #[derive(Parser)]\n< #[command(\n< name = \"rtk\",\n< version,\n< about = \"Rust Toke", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['1,1610c1,56']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "wc -c src/main.rs", + "family": "wc", + "raw": { + "stdout": "50760 src/main.rs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "50760\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 45%)" + } + ], + "skipped_reason": null + }, + { + "command": "git show --name-only -1", + "family": "git-show", + "raw": { + "stdout": "commit 69eb6846f47dca60b36b98bcee4cb059ba257aa8 (HEAD -> refs/heads/feature/agentic-fuzzing)\nAuthor: Paul-Louis NECH \nDate: Thu Mar 19 19:19:41 2026 +0100\n\n feat: expand static tests to 65 across 17 families, add demo page\n \n New families: git-diff, git-show, git-branch, find, cargo-build,\n cargo-clippy, diff, env, curl. Fix cargo 2>&1 safety false positive.\n Found 8+ new bugs across ls, find, diff, git-branch, git-show, wc.\n\nscripts/fuzz-rtk.py\nscripts/fuzzer-demo.html\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "fatal: options '--name-only', '--name-status', '--check', and '-s' cannot be used together\n\n", + "exit_code": 128, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=128" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['commit', 'Author', 'Date', 'feat', 'New']" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%H %s'", + "family": "git-branch", + "raw": { + "stdout": "%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 15, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 0%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -a --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n remotes/origin/feature/agentic-fuzzing\n main\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n release/v0.22.4\n remotes/origin/release/v0.22.4\n fix/git-global-opts\n remotes/origin/fix/git-global-opts\n release/v0.22.3\n remotes/origin/release/v0.22.3\n fork/algolia-identity\n remotes/origin/fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 18, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "4/7 anchor tokens missing: ['remotes/origin/feature/agentic-fuzzing', 'remotes/origin/HEAD', 'remotes/origin/main', 'remotes/origin/release/v0.22.4']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 88%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --porcelain -v", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `porcelain'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --json --list", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `json'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git branc", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --quiet --name-only", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `name-only'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --all --oneline --graph -5", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `oneline'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git br", + "exit_code": 129, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) | %(committerdate:unix)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing | 1773944381\nfix/git-global-opts | 1773853165\nfork/algolia-identity | 1773783266\nmain | 1773939208\nrelease/v0.22.3 | 1773804219\nrelease/v0.22.4 | 1773858435\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing | 1773944381\n fix/git-global-opts | 1773853165\n fork/algolia-identity | 1773783266\n main | 1773939208\n release/v0.22.3 | 1773804219\n release/v0.22.4 | 1773858435\n origin | 1773931503\n origin/feature/agentic-fuzzing | 1773941055\n origin/fix/git-global-opts | 1773853165\n origin/fork/algolia-identity | 1773783266\n origin/main | 1773931503\n origin/release/v0.22.3 | 1773804219\n origin/release/v0.22.4 | 1773858435\n upstream/bug/critical-fixes | 1773147156\n upstream/chore/claude-config | 1771237628\n upstream/develop | 1773765602\n upstream/docs/add-ascii-diagrams | 1771768040\n upstream/docs/agent-agnostic-readme | 1773044951\n upstream/docs/functional-documentation | 1772820011\n upstream/docs/prompt-caching-faq | 1773395320\n upstream/docs/readme-revamp | 1772794320\n upstream/docs/session-summary-companion | 1771230835\n upstream/docs/v0.15.1-python-go-complete | 1771089657\n upstream/feat/add-support-native-claude-cmd | 1773047861\n upstream/fea", + "stderr": "", + "exit_code": 0, + "duration_ms": 21, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 15%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -r --sort=committerdate --format='%(refname:short) %h'", + "family": "git-branch", + "raw": { + "stdout": "upstream/docs/v0.15.1-python-go-complete %h\nupstream/feat/tee-output %h\nupstream/docs/session-summary-companion %h\nupstream/chore/claude-config %h\nupstream/feat/hook-audit-mode %h\nupstream/fix/install-local-bin %h\nupstream/feat/scaffold-command %h\nupstream/docs/add-ascii-diagrams %h\nupstream/fix/remove-personal-refs-claude-md %h\nupstream/feat/rtk-rewrite %h\nupstream/feat/telemetry %h\nupstream/fix/hook-rewrite-guard-and-exclude %h\nupstream/feat/claude-skills-pr-issue-triage %h\nupstream/fix/hook-outdated-warning %h\nupstream/fix/345-346-347-rewrite-json %h\nupstream/fix/prettier-false-positive %h\nupstream/fix/git-commit-flags %h\nupstream/fix/docker-compose-rewrite %h\nupstream/fix/lint-npx-prefix %h\nupstream/fix/linux-binary-release %h\nupstream/docs/readme-revamp %h\nupstream/fix/354-gh-diff-truncation %h\nupstream/fix/discord-release-notification %h\nupstream/docs/functional-documentation %h\nupstream/fix/cicd-add-secu-check-dev %h\nupstream/docs/agent-agnostic-readme %h\nupstream/feat/add-suppo", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "rtk": { + "stdout": "* \n upstream/docs/v0.15.1-python-go-complete %h\n upstream/feat/tee-output %h\n upstream/docs/session-summary-companion %h\n upstream/chore/claude-config %h\n upstream/feat/hook-audit-mode %h\n upstream/fix/install-local-bin %h\n upstream/feat/scaffold-command %h\n upstream/docs/add-ascii-diagrams %h\n upstream/fix/remove-personal-refs-claude-md %h\n upstream/feat/rtk-rewrite %h\n upstream/feat/telemetry %h\n upstream/fix/hook-rewrite-guard-and-exclude %h\n upstream/feat/claude-skills-pr-issue-triage %h\n upstream/fix/hook-outdated-warning %h\n upstream/fix/345-346-347-rewrite-json %h\n upstream/fix/prettier-false-positive %h\n upstream/fix/git-commit-flags %h\n upstream/fix/docker-compose-rewrite %h\n upstream/fix/lint-npx-prefix %h\n upstream/fix/linux-binary-release %h\n upstream/docs/readme-revamp %h\n upstream/fix/354-gh-diff-truncation %h\n upstream/fix/discord-release-notification %h\n upstream/docs/functional-documentation %h\n upstream/fix/cicd-add-secu-check-dev %h\n upstrea", + "stderr": "", + "exit_code": 0, + "duration_ms": 20, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 71%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --files-with-matches", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md\nsrc/env_cmd.rs\nCLAUDE.md\nsrc/tracking.rs\nsrc/read.rs\nsrc/init.rs\nsrc/prisma_cmd.rs\nsrc/deps.rs\nsrc/runner.rs\nsrc/tree.rs\nscripts/benchmark.sh\nsrc/curl_cmd.rs\nsrc/parser/mod.rs\nsrc/container.rs\nsrc/cc_economics.rs\nsrc/find_cmd.rs\nsrc/parser/README.md\nsrc/tsc_cmd.rs\nscripts/test-all.sh\nsrc/go_cmd.rs\nsrc/filter.rs\nsrc/parser/error.rs\nsrc/format_cmd.rs\nsrc/parser/formatter.rs\nsrc/log_cmd.rs\nscripts/fuzz-rtk.py\nbug-reports/2026-03-19-fuzz-findings.md\nsrc/wc_cmd.rs\nsrc/cargo_cmd.rs\nsrc/gh_cmd.rs\nsrc/git.rs\nsrc/tee.rs\nsrc/playwright_cmd.rs\nsrc/local_llm.rs\nsrc/pytest_cmd.rs\nsrc/display_helpers.rs\nsrc/vitest_cmd.rs\nsrc/pip_cmd.rs\nsrc/wget_cmd.rs\nsrc/ccusage.rs\nsrc/next_cmd.rs\nsrc/hook_audit_cmd.rs\nsrc/golangci_cmd.rs\nsrc/discover/mod.rs\nsrc/grep_cmd.rs\nsrc/prettier_cmd.rs\nsrc/pnpm_cmd.rs\nsrc/config.rs\nsrc/discover/registry.rs\nsrc/utils.rs\nsrc/npm_cmd.rs\nsrc/diff_cmd.rs\nsrc/ruff_cmd.rs\nsrc/discover/report.rs\nsrc/ls.rs\nsrc/discover/provider.rs\nscripts/fuzzer-demo.html\nsrc/lint_cm", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--files-with-matches' found\n\n tip: a similar argument exists: '--file-type'\n tip: to pass '--files-with-matches' as a value, use '-- --files-with-matches'\n\nUsage: rtk grep --file-type [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'src/env_cmd.rs', 'CLAUDE.md', 'src/tracking.rs', 'src/read.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --count", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:3\nscripts/benchmark.sh:4\nscripts/fuzzer-demo.html:7\nscripts/test-all.sh:2\nbug-reports/2026-03-19-fuzz-findings.md:3\nscripts/fuzz-rtk.py:10\nARCHITECTURE.md:13\ndocs/tracking.md:18\nsrc/vitest_cmd.rs:13\nsrc/tree.rs:8\nsrc/tracking.rs:25\nsrc/read.rs:6\nsrc/runner.rs:5\nsrc/init.rs:50\nsrc/discover/mod.rs:3\nsrc/next_cmd.rs:5\nsrc/cc_economics.rs:36\nsrc/container.rs:30\nsrc/gh_cmd.rs:47\nsrc/git.rs:49\nsrc/prettier_cmd.rs:5\nsrc/display_helpers.rs:55\nsrc/filter.rs:19\nsrc/playwright_cmd.rs:10\nsrc/deps.rs:6\nsrc/diff_cmd.rs:23\nsrc/discover/registry.rs:28\nsrc/ls.rs:11\nsrc/cargo_cmd.rs:52\nsrc/go_cmd.rs:15\nsrc/discover/provider.rs:18\nsrc/prisma_cmd.rs:16\nsrc/wget_cmd.rs:8\nsrc/pytest_cmd.rs:10\nsrc/tsc_cmd.rs:7\nsrc/discover/report.rs:7\nsrc/golangci_cmd.rs:6\nsrc/ccusage.rs:12\nsrc/parser/mod.rs:22\nsrc/format_cmd.rs:12\nsrc/main.rs:7\nsrc/summary.rs:10\nsrc/npm_cmd.rs:4\nsrc/log_cmd.rs:7\nsrc/local_llm.rs:13\nsrc/grep_cmd.rs:16\nsrc/env_cmd.rs:7\nsrc/learn/mod.rs:1\nsrc/parser/README.md:6\nsrc/gain.rs:14\nsrc/uti", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--count' found\n\n tip: a similar argument exists: '--context-only'\n tip: to pass '--count' as a value, use '-- --count'\n\nUsage: rtk grep --context-only [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:3', 'scripts/benchmark.sh:4', 'scripts/fuzzer-demo.html:7', 'scripts/test-all.sh:2', 'bug-reports/2026-03-19-fuzz-findings.md:3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' --no-filename", + "family": "grep", + "raw": { + "stdout": "* **hook:** use POSIX character classes for cross-platform grep compatibility ([#98](https://github.com/rtk-ai/rtk/issues/98)) ([4aafc83](https://github.com/rtk-ai/rtk/commit/4aafc832d4bdd438609358e2737a96bee4bb2467))\n- Refactored `insert_hook_entry()` to use idiomatic Rust `entry()` API\n* **migrate commands to OutputParser**: vitest, playwright, pnpm now use robust parsing\n# 4. Test: git status (should use rtk)\n**Golden Rule**: AI coding assistants should ALWAYS use `rtk` as a proxy for shell commands that generate verbose output (git, pnpm, npm, cargo test, vitest, docker, kubectl).\n- **Lazy regex compilation**: Compile once with `lazy_static!`, reuse forever\n- **ALWAYS** use `.context(\"description\")` with `?` operator\n- **NO unwrap()** in production code (tests only - use `expect(\"explanation\")` if needed)\nuse anyhow::{Context, Result};\n- Deep diving into external command documentation (use fixtures, don't research git/cargo internals)\n- Verifying API signatures across multiple crat", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--no-filename' found\n\n tip: a similar argument exists: '--line-numbers'\n tip: to pass '--no-filename' as a value, use '-- --no-filename'\n\nUsage: rtk grep --line-numbers [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['**Golden']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --json", + "family": "grep", + "raw": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn filter_git_log(input: &str) -> Result {\\n\"},\"line_number\":335,\"absolute_offset\":12739,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":359,\"absolute_offset\":13354,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":374,\"absolute_offset\":13813,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":48501,\"human\":\"0.000049s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_l", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--json' found\n\n tip: to pass '--json' as a value, use '-- --json'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":48501,\"human\":\"0.000049s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_lines\":3,\"matches\":3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --vimgrep", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nscripts/benchmark.sh:175:28:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\nscripts/benchmark.sh:175:59:bench \"grep fn\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/\"\nscripts/benchmark.sh:177:31:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\nscripts/benchmark.sh:177:62:bench \"grep -l 40\" \"grep -rn 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -l 40\"\nscripts/benchmark.sh:178:34:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\nscripts/benchmark.sh:178:76:bench \"grep --max 20\" \"grep -rn 'fn ' src/ | head -20 || true\" \"$RTK grep 'fn ' src/ --max 20\"\nscripts/benchmark.sh:179:29:bench \"grep -c\" \"grep -ron 'fn ' src/ || true\" \"$RTK grep 'fn ' src/ -c\"\nscript", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--vimgrep' found\n\n tip: to pass '--vimgrep' as a value, use '-- --vimgrep'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:335:5:pub', 'CLAUDE.md:359:5:pub', 'CLAUDE.md:374:5:pub', 'scripts/benchmark.sh:175:28:bench', 'scripts/benchmark.sh:175:59:bench']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' -A 0 -B 0", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nsrc/display_helpers.rs:pub fn format_duration(ms: u64) -> String {\nsrc/display_helpers.rs: fn icon() -> &'static str;\nsrc/display_helpers.rs: fn label() -> &'static str;\nsrc/display_helpers.rs: fn period(&self) -> String;\nsrc/display_helpers.rs: fn commands(&self) -> usize;\nsrc/display_helpers.rs: fn input_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn output_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn saved_tokens(&self) -> usize;\nsrc/display_helpers.rs: fn savings_pct(&self) -> f64;\nsrc/display_helpers.rs: fn total_time_ms(&self) -> u64;\nsrc/display_helpers.rs: fn avg_time_ms(&self) -> u64;\nsrc/display_helpers.rs: fn period_width() -> usize;\nsrc/display_helpers.rs: fn separator_width() -> usize;\nsrc/display_helpers.rs:", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-A' found\n\n tip: to pass '-A' as a value, use '-- -A'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:pub', 'CLAUDE.md:pub', 'CLAUDE.md:pub', 'src/display_helpers.rs:pub', 'src/display_helpers.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --quiet --files-with-matches", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--quiet' found\n\n tip: to pass '--quiet' as a value, use '-- --quiet'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "ls -l --human-readable", + "family": "ls", + "raw": { + "stdout": "total 252K\n-rw-rw-r-- 1 pln pln 56K Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30K Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1.5K Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4.0K Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 11K Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2.7K Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1.1K Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33K Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7.2K Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4.0K Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4.0K Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2.2K Mar 17 17:41 TEST_EXE", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 0B\nCargo.lock 0B\nCargo.toml 0B\nCHANGELOG.md 0B\nCLAUDE.md 0B\n.gitignore 339B\nINSTALL.md 0B\ninstall.sh 0B\nLICENSE 0B\nREADME.md 0B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 0B\nTEST_EXEC_TIME.md 0B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .toml, 1 no ext, 1 .gitignore, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + } + ], + "skipped_reason": null + }, + { + "command": "ls -1 -a --color=never", + "family": "ls", + "raw": { + "stdout": ".\n..\nARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\n.claude\nCLAUDE.md\ndocs\nFormula\n.git\n.github\n.gitignore\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\n.release-please-manifest.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.git/\n.github/\nhooks/\nscripts/\nsrc/\ntarget/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 10 dirs (8 .md, 2 .json, 1 .lock, 1 .sh, 1 .toml, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 51%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --format=long --sort=size", + "family": "ls", + "raw": { + "stdout": "total 252\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 7272 Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\ndrwxrwxr-x 2 pln pln 4096 Mar 19 19:19 scripts\ndrwxrwxr-x 5 pln pln 4096 Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4096 Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 2171 Mar 17 17:41 TEST_EXEC_TIME.md\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:4", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nREADME.md 32.6K\nCargo.lock 29.8K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\nINSTALL.md 10.5K\nSECURITY.md 7.1K\ninstall.sh 2.6K\nTEST_EXEC_TIME.md 2.1K\nCargo.toml 1.4K\nLICENSE 1.0K\nROADMAP.md 459B\n.gitignore 339B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 .sh, 1 no ext, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 19%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls -C --quoting-style=c", + "family": "ls", + "raw": { + "stdout": "\"ARCHITECTURE.md\" \"Formula\"\t\t\t \"ROADMAP.md\"\n\"bug-reports\"\t \"hooks\"\t\t\t \"scripts\"\n\"Cargo.lock\"\t \"INSTALL.md\"\t\t\t \"SECURITY.md\"\n\"Cargo.toml\"\t \"install.sh\"\t\t\t \"src\"\n\"CHANGELOG.md\"\t \"LICENSE\"\t\t\t \"target\"\n\"CLAUDE.md\"\t \"README.md\"\t\t\t \"TEST_EXEC_TIME.md\"\n\"docs\"\t\t \"release-please-config.json\"\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "(empty)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['ARCHITECTURE.md', 'bug-reports', 'Cargo.lock', 'Cargo.toml', 'CHANGELOG.md']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 2%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --time-style=long-iso --block-size=1M", + "family": "ls", + "raw": { + "stdout": "ARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nFormula\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "(empty)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'bug-reports', 'Cargo.lock', 'Cargo.toml', 'CHANGELOG.md']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -name '*.rs' -printf '%f %s\\n'", + "family": "find", + "raw": { + "stdout": "init.rs 51472\nread.rs 4610\ntracking.rs 33880\nenv_cmd.rs 5731\nprovider.rs 15078\nreport.rs 5531\nregistry.rs 20218\nmod.rs 8298\ndisplay_helpers.rs 9732\nplaywright_cmd.rs 13792\ngh_cmd.rs 47210\nformatter.rs 10757\nerror.rs 1168\ntypes.rs 3051\nmod.rs 10408\ngit.rs 54654\ngo_cmd.rs 16233\ncc_economics.rs 38506\ntree.rs 6191\ndeps.rs 9040\nprisma_cmd.rs 13715\nls.rs 9702\nmain.rs 50760\ndiff_cmd.rs 10655\nprettier_cmd.rs 5633\nnext_cmd.rs 7422\nvitest_cmd.rs 11942\nlint_cmd.rs 23986\nsummary.rs 9265\ngain.rs 17021\nnpm_cmd.rs 2720\ngolangci_cmd.rs 7467\nwget_cmd.rs 8100\nlocal_llm.rs 9700\nwc_cmd.rs 11630\nformat_cmd.rs 13258\nfind_cmd.rs 8063\ncurl_cmd.rs 3406\njson_cmd.rs 5475\ndetector.rs 21191\nreport.rs 5777\nmod.rs 3685\nconfig.rs 3069\nhook_audit_cmd.rs 9125\npip_cmd.rs 8458\ntee.rs 11730\nlog_cmd.rs 7766\ntsc_cmd.rs 8648\nruff_cmd.rs 12771\npnpm_cmd.rs 16537\nutils.rs 11346\ngrep_cmd.rs 13202\nccusage.rs 9523\npytest_cmd.rs 12080\ncargo_cmd.rs 53866\nfilter.rs 12156\ncontainer.rs 27918\nrunner.rs 8483\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-n' found\n\n tip: to pass '-n' as a value, use '-- -n'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['init.rs', 'read.rs', 'tracking.rs', 'env_cmd.rs', 'provider.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -printf '%y %n\\t%p\\n'", + "family": "find", + "raw": { + "stdout": "f 1\t./ARCHITECTURE.md\nf 1\t./SECURITY.md\nf 1\t./.gitignore\nf 1\t./src/init.rs\nf 1\t./src/read.rs\nf 1\t./src/tracking.rs\nf 1\t./src/env_cmd.rs\nf 1\t./src/discover/provider.rs\nf 1\t./src/discover/report.rs\nf 1\t./src/discover/registry.rs\nf 1\t./src/discover/mod.rs\nf 1\t./src/display_helpers.rs\nf 1\t./src/playwright_cmd.rs\nf 1\t./src/gh_cmd.rs\nf 1\t./src/parser/formatter.rs\nf 1\t./src/parser/error.rs\nf 1\t./src/parser/types.rs\nf 1\t./src/parser/README.md\nf 1\t./src/parser/mod.rs\nf 1\t./src/git.rs\nf 1\t./src/go_cmd.rs\nf 1\t./src/cc_economics.rs\nf 1\t./src/tree.rs\nf 1\t./src/deps.rs\nf 1\t./src/prisma_cmd.rs\nf 1\t./src/ls.rs\nf 1\t./src/main.rs\nf 1\t./src/diff_cmd.rs\nf 1\t./src/prettier_cmd.rs\nf 1\t./src/next_cmd.rs\nf 1\t./src/vitest_cmd.rs\nf 1\t./src/lint_cmd.rs\nf 1\t./src/summary.rs\nf 1\t./src/gain.rs\nf 1\t./src/npm_cmd.rs\nf 1\t./src/golangci_cmd.rs\nf 1\t./src/wget_cmd.rs\nf 1\t./src/local_llm.rs\nf 1\t./src/wc_cmd.rs\nf 1\t./src/format_cmd.rs\nf 1\t./src/find_cmd.rs\nf 1\t./src/curl_cmd.rs\nf 1\t./src/json_cmd.rs\nf 1\t./src/learn/detecto", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type d -printf '%d\\n'", + "family": "find", + "raw": { + "stdout": "0\n1\n2\n2\n2\n1\n2\n3\n2\n2\n3\n2\n2\n1\n2\n1\n1\n1\n2\n1\n2\n3\n3\n3\n3\n3\n2\n3\n3\n3\n3\n3\n1\n1\n1\n2\n2\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n3\n2\n3\n3\n3\n2\n3\n2\n2\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -iname '*.json' -printf '%i %M %m\\n'", + "family": "find", + "raw": { + "stdout": "64316454 -rw-rw-r-- 664\n64233117 -rw-rw-r-- 664\n64234938 -rw-r--r-- 644\n64233150 -rw-rw-r-- 664\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-i' found\n\n tip: to pass '-i' as a value, use '-- -i'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['64316454', '64233117', '64234938', '64233150']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -printf '---\\nPath: %p\\nSize: %s\\n---\\n'", + "family": "find", + "raw": { + "stdout": "---\nPath: ./ARCHITECTURE.md\nSize: 57226\n---\n---\nPath: ./SECURITY.md\nSize: 7272\n---\n---\nPath: ./.gitignore\nSize: 339\n---\n---\nPath: ./src/init.rs\nSize: 51472\n---\n---\nPath: ./src/read.rs\nSize: 4610\n---\n---\nPath: ./src/tracking.rs\nSize: 33880\n---\n---\nPath: ./src/env_cmd.rs\nSize: 5731\n---\n---\nPath: ./src/discover/provider.rs\nSize: 15078\n---\n---\nPath: ./src/discover/report.rs\nSize: 5531\n---\n---\nPath: ./src/discover/registry.rs\nSize: 20218\n---\n---\nPath: ./src/discover/mod.rs\nSize: 8298\n---\n---\nPath: ./src/display_helpers.rs\nSize: 9732\n---\n---\nPath: ./src/playwright_cmd.rs\nSize: 13792\n---\n---\nPath: ./src/gh_cmd.rs\nSize: 47210\n---\n---\nPath: ./src/parser/formatter.rs\nSize: 10757\n---\n---\nPath: ./src/parser/error.rs\nSize: 1168\n---\n---\nPath: ./src/parser/types.rs\nSize: 3051\n---\n---\nPath: ./src/parser/README.md\nSize: 8939\n---\n---\nPath: ./src/parser/mod.rs\nSize: 10408\n---\n---\nPath: ./src/git.rs\nSize: 54654\n---\n---\nPath: ./src/go_cmd.rs\nSize: 16233\n---\n---\nPath: ./src/cc_economics.rs\nSize: 38506\n---\n-", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['---', 'Path', 'Size', '---', '---']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -y src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-y' found\n\n tip: to pass '-y' as a value, use '-- -y'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --color=never src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "1,1610c1,56\n< mod cargo_cmd;\n< mod cc_economics;\n< mod ccusage;\n< mod config;\n< mod container;\n< mod curl_cmd;\n< mod deps;\n< mod diff_cmd;\n< mod discover;\n< mod display_helpers;\n< mod env_cmd;\n< mod filter;\n< mod find_cmd;\n< mod format_cmd;\n< mod gain;\n< mod gh_cmd;\n< mod git;\n< mod go_cmd;\n< mod golangci_cmd;\n< mod grep_cmd;\n< mod hook_audit_cmd;\n< mod init;\n< mod json_cmd;\n< mod learn;\n< mod lint_cmd;\n< mod local_llm;\n< mod log_cmd;\n< mod ls;\n< mod next_cmd;\n< mod npm_cmd;\n< mod parser;\n< mod pip_cmd;\n< mod playwright_cmd;\n< mod pnpm_cmd;\n< mod prettier_cmd;\n< mod prisma_cmd;\n< mod pytest_cmd;\n< mod read;\n< mod ruff_cmd;\n< mod runner;\n< mod summary;\n< mod tee;\n< mod tracking;\n< mod tree;\n< mod tsc_cmd;\n< mod utils;\n< mod vitest_cmd;\n< mod wc_cmd;\n< mod wget_cmd;\n< \n< use anyhow::{Context, Result};\n< use clap::{Parser, Subcommand};\n< use std::ffi::OsString;\n< use std::path::{Path, PathBuf};\n< \n< #[derive(Parser)]\n< #[command(\n< name = \"rtk\",\n< version,\n< about = \"Rust Toke", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--color' found\n\n tip: to pass '--color' as a value, use '-- --color'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "1/1 anchor tokens missing: ['1,1610c1,56']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --unified=3 src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--unified' found\n\n tip: to pass '--unified' as a value, use '-- --unified'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --brief src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--brief' found\n\n tip: to pass '--brief' as a value, use '-- --brief'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --side-by-side --color=never src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--side-by-side' found\n\n tip: to pass '--side-by-side' as a value, use '-- --side-by-side'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -c src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "*** src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n--- Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n***************\n*** 1,1610 ****\n! mod cargo_cmd;\n! mod cc_economics;\n! mod ccusage;\n! mod config;\n! mod container;\n! mod curl_cmd;\n! mod deps;\n! mod diff_cmd;\n! mod discover;\n! mod display_helpers;\n! mod env_cmd;\n! mod filter;\n! mod find_cmd;\n! mod format_cmd;\n! mod gain;\n! mod gh_cmd;\n! mod git;\n! mod go_cmd;\n! mod golangci_cmd;\n! mod grep_cmd;\n! mod hook_audit_cmd;\n! mod init;\n! mod json_cmd;\n! mod learn;\n! mod lint_cmd;\n! mod local_llm;\n! mod log_cmd;\n! mod ls;\n! mod next_cmd;\n! mod npm_cmd;\n! mod parser;\n! mod pip_cmd;\n! mod playwright_cmd;\n! mod pnpm_cmd;\n! mod prettier_cmd;\n! mod prisma_cmd;\n! mod pytest_cmd;\n! mod read;\n! mod ruff_cmd;\n! mod runner;\n! mod summary;\n! mod tee;\n! mod tracking;\n! mod tree;\n! mod tsc_cmd;\n! mod utils;\n! mod vitest_cmd;\n! mod wc_cmd;\n! mod wget_cmd;\n! \n! use anyhow::{Context, Result};\n! use clap::{Parser, Subcommand};\n! use std::ffi::OsString;\n! use ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-c' found\n\n tip: to pass '-c' as a value, use '-- -c'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['***', '---', '***************', '***']" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%H %s'", + "family": "git-branch", + "raw": { + "stdout": "%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n%H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* \n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n %H %s\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 0%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --all --sort=-committerdate", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n remotes/origin/feature/agentic-fuzzing\n main\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n release/v0.22.4\n remotes/origin/release/v0.22.4\n fix/git-global-opts\n remotes/origin/fix/git-global-opts\n release/v0.22.3\n remotes/origin/release/v0.22.3\n fork/algolia-identity\n remotes/origin/fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n main\n release/v0.22.4\n fix/git-global-opts\n release/v0.22.3\n fork/algolia-identity\n remotes/upstream/develop\n remotes/upstream/fix/read-json-corruption\n remotes/upstream/fix/clippy-fmt-warnings\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/fix/git-status-emoji-compat\n remotes/upstream/feat/toml-filters-batch\n remotes/upstream/fix/git-exit-codes\n remotes/upstream/fix/p1-exit-codes-and-bugs\n remotes/upstream/fix/p0-output-caps\n remotes/upstream/master\n remotes/upstream/release-please--branches--master--components--rtk\n remotes/upstream/fix/critical-bugs-audit\n remotes/upstream/fix/trust-boundary-followup\n remotes/upstream/fix/hook-bypass-permission\n remotes/upstream/fix/trust-boundary-SA-2025-RTK-002\n remotes/upstream/fix/git-log-oneline-regression\n remotes/upstream/fix/subcommand-routing-600\n remotes/upstream/fix/failing-new-cmd-rtk-verify\n remotes/upstream/fix/cicd-rework\n remotes/upstream/fix/address-issue-384\n remotes/u", + "stderr": "", + "exit_code": 0, + "duration_ms": 12, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "DATA_LOSS", + "detail": "4/7 anchor tokens missing: ['remotes/origin/feature/agentic-fuzzing', 'remotes/origin/HEAD', 'remotes/origin/main', 'remotes/origin/release/v0.22.4']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 88%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --porcelain", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `porcelain'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --quiet", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/upstream/feat/hook-rewrite-toml\n remotes/upstream/feat/new-tools-toml\n remotes/upstream/feat/pr-template-ci\n remotes/upstream/feat/rtk-rewrite\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/feat/scaffold-command\n remotes/upstre", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 11%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --format='%(refname:short) %(objectname)'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing 69eb6846f47dca60b36b98bcee4cb059ba257aa8\nfix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\nfork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\nmain f72e3f941646b3b7846cd8574814a77584163e8b\nrelease/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\nrelease/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing 69eb6846f47dca60b36b98bcee4cb059ba257aa8\n fix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\n fork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\n main f72e3f941646b3b7846cd8574814a77584163e8b\n release/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\n release/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n origin d5f3cfa0ac86b693bce326db8484dfc8996fde72\n origin/feature/agentic-fuzzing 8e61bcac36bb821d87216a0c73b3ca4fdc03b199\n origin/fix/git-global-opts 16c324e2fe171b99b7a9d72f76d3017a5f350444\n origin/fork/algolia-identity 1a4b175a540d2c53b907b9217798dfae1e8926ee\n origin/main d5f3cfa0ac86b693bce326db8484dfc8996fde72\n origin/release/v0.22.3 d2d8a340bef619c4967ae7f2985e4e0f8182bc4c\n origin/release/v0.22.4 f89894eaeea622f376b079dccb73041019580f55\n upstream/bug/critical-fixes 1ebd6a064188c12717cca464ad28b786605ae79a\n upstream/chore/claude-config 34db3e47382a5857cbe5c8fc0421bb4ed3a0be9e\n upstream/develop c2cc8f3c7271634370e20", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 94 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 26%)" + } + ], + "skipped_reason": null + }, + { + "command": "git branch --sort=creatordate --name-only", + "family": "git-branch", + "raw": { + "stdout": "", + "stderr": "error: unknown option `name-only'\nusage: git branch [] [-r | -a] [--merged] [--no-merged]\n or: git branch [] [-f] [--recurse-submodules] []\n or: git branch [] [-l] [...]\n or: git branch [] [-r] (-d | -D) ...\n or: git branch [] (-m | -M) [] \n or: git branch [] (-c | -C) [] \n or: git branch [] [-r | -a] [--points-at]\n or: git ", + "exit_code": 129, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "* \n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=129 rtk=0" + } + ], + "skipped_reason": null + }, + { + "command": "git branch -a --format='%(refname:lstrip=2) [%(committerdate:short)]'", + "family": "git-branch", + "raw": { + "stdout": "feature/agentic-fuzzing [2026-03-19]\nfix/git-global-opts [2026-03-18]\nfork/algolia-identity [2026-03-17]\nmain [2026-03-19]\nrelease/v0.22.3 [2026-03-18]\nrelease/v0.22.4 [2026-03-18]\norigin/HEAD [2026-03-19]\norigin/feature/agentic-fuzzing [2026-03-19]\norigin/fix/git-global-opts [2026-03-18]\norigin/fork/algolia-identity [2026-03-17]\norigin/main [2026-03-19]\norigin/release/v0.22.3 [2026-03-18]\norigin/release/v0.22.4 [2026-03-18]\nupstream/bug/critical-fixes [2026-03-10]\nupstream/chore/claude-config [2026-02-16]\nupstream/develop [2026-03-17]\nupstream/docs/add-ascii-diagrams [2026-02-22]\nupstream/docs/agent-agnostic-readme [2026-03-09]\nupstream/docs/functional-documentation [2026-03-06]\nupstream/docs/prompt-caching-faq [2026-03-13]\nupstream/docs/readme-revamp [2026-03-06]\nupstream/docs/session-summary-companion [2026-02-16]\nupstream/docs/v0.15.1-python-go-complete [2026-02-14]\nupstream/feat/add-support-native-claude-cmd [2026-03-09]\nupstream/feat/claude-skills-pr-issue-triage [2026-03-05]\nups", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "* \n feature/agentic-fuzzing [2026-03-19]\n fix/git-global-opts [2026-03-18]\n fork/algolia-identity [2026-03-17]\n main [2026-03-19]\n release/v0.22.3 [2026-03-18]\n release/v0.22.4 [2026-03-18]\n origin/HEAD [2026-03-19]\n origin/feature/agentic-fuzzing [2026-03-19]\n origin/fix/git-global-opts [2026-03-18]\n origin/fork/algolia-identity [2026-03-17]\n origin/main [2026-03-19]\n origin/release/v0.22.3 [2026-03-18]\n origin/release/v0.22.4 [2026-03-18]\n upstream/bug/critical-fixes [2026-03-10]\n upstream/chore/claude-config [2026-02-16]\n upstream/develop [2026-03-17]\n upstream/docs/add-ascii-diagrams [2026-02-22]\n upstream/docs/agent-agnostic-readme [2026-03-09]\n upstream/docs/functional-documentation [2026-03-06]\n upstream/docs/prompt-caching-faq [2026-03-13]\n upstream/docs/readme-revamp [2026-03-06]\n upstream/docs/session-summary-companion [2026-02-16]\n upstream/docs/v0.15.1-python-go-complete [2026-02-14]\n upstream/feat/add-support-native-claude-cmd [2026-03-09]\n upstrea", + "stderr": "", + "exit_code": 0, + "duration_ms": 13, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 80%)" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --count", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md:13\nCLAUDE.md:3\nbug-reports/2026-03-19-fuzz-findings.md:3\nscripts/benchmark.sh:4\nsrc/go_cmd.rs:15\nsrc/diff_cmd.rs:23\nsrc/gain.rs:14\nscripts/test-all.sh:2\nsrc/summary.rs:10\nsrc/main.rs:7\nsrc/runner.rs:5\nsrc/git.rs:49\nsrc/lint_cmd.rs:14\nscripts/fuzz-rtk.py:10\nsrc/ls.rs:11\nsrc/deps.rs:6\nsrc/container.rs:30\nsrc/vitest_cmd.rs:13\nsrc/prisma_cmd.rs:16\nsrc/filter.rs:19\ndocs/tracking.md:18\nsrc/next_cmd.rs:5\nsrc/prettier_cmd.rs:5\nsrc/tree.rs:8\nsrc/format_cmd.rs:12\nsrc/env_cmd.rs:7\nsrc/hook_audit_cmd.rs:14\nsrc/wget_cmd.rs:8\nsrc/cargo_cmd.rs:52\nsrc/wc_cmd.rs:22\nsrc/config.rs:8\nsrc/parser/mod.rs:22\nsrc/cc_economics.rs:36\nsrc/golangci_cmd.rs:6\nsrc/tracking.rs:25\nsrc/pytest_cmd.rs:10\nsrc/npm_cmd.rs:4\nsrc/local_llm.rs:13\nsrc/parser/README.md:6\nsrc/curl_cmd.rs:6\nsrc/read.rs:6\nsrc/json_cmd.rs:6\nsrc/ccusage.rs:12\nsrc/log_cmd.rs:7\nsrc/tee.rs:23\nsrc/ruff_cmd.rs:9\nscripts/fuzzer-demo.html:7\nsrc/tsc_cmd.rs:7\nsrc/parser/error.rs:1\nsrc/pip_cmd.rs:11\nsrc/pnpm_cmd.rs:16\nsrc/init.rs:50\nsrc/utils.rs", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--count' found\n\n tip: a similar argument exists: '--context-only'\n tip: to pass '--count' as a value, use '-- --count'\n\nUsage: rtk grep --context-only [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md:13', 'CLAUDE.md:3', 'bug-reports/2026-03-19-fuzz-findings.md:3', 'scripts/benchmark.sh:4', 'src/go_cmd.rs:15']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' -l", + "family": "grep", + "raw": { + "stdout": "ARCHITECTURE.md\nCHANGELOG.md\nINSTALL.md\ninstall.sh\nCLAUDE.md\nscripts/test-aristote.sh\nREADME.md\nbug-reports/2026-03-19-fuzz-findings.md\nscripts/fuzz-rtk.py\nsrc/tracking.rs\nhooks/rtk-awareness.md\nsrc/read.rs\nsrc/go_cmd.rs\nsrc/init.rs\nsrc/playwright_cmd.rs\nSECURITY.md\nsrc/git.rs\nsrc/env_cmd.rs\nsrc/display_helpers.rs\nsrc/find_cmd.rs\nsrc/runner.rs\ndocs/TROUBLESHOOTING.md\nsrc/vitest_cmd.rs\nsrc/gh_cmd.rs\nsrc/format_cmd.rs\nscripts/rtk-economics.sh\nsrc/npm_cmd.rs\nsrc/discover/mod.rs\nsrc/next_cmd.rs\nsrc/gain.rs\nsrc/discover/registry.rs\nsrc/container.rs\nsrc/summary.rs\nsrc/wc_cmd.rs\nsrc/discover/report.rs\nsrc/lint_cmd.rs\nsrc/prettier_cmd.rs\nsrc/discover/provider.rs\nsrc/filter.rs\nsrc/golangci_cmd.rs\nsrc/parser/mod.rs\nsrc/local_llm.rs\nsrc/deps.rs\nsrc/wget_cmd.rs\nsrc/diff_cmd.rs\nsrc/log_cmd.rs\nsrc/cargo_cmd.rs\nsrc/tree.rs\nsrc/json_cmd.rs\nsrc/config.rs\nsrc/pytest_cmd.rs\ndocs/tracking.md\nsrc/curl_cmd.rs\nsrc/tee.rs\nsrc/parser/README.md\nsrc/main.rs\nsrc/hook_audit_cmd.rs\nsrc/cc_economics.rs\nsrc/ccusage.r", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-l' found\n\n tip: to pass '-l' as a value, use '-- -l'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['ARCHITECTURE.md', 'CHANGELOG.md', 'INSTALL.md', 'install.sh', 'CLAUDE.md']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --no-filename", + "family": "grep", + "raw": { + "stdout": "pub fn filter_git_log(input: &str) -> Result {\npub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\npub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\n- `rtk grep 'pub ' -l`\n- `rtk grep 'pub ' -A 2 -B 2`\n- `rtk grep 'pub ' --no-filename --count-matches`\nassert_ok \"rtk grep pattern\" rtk grep \"pub fn\" src/\nassert_contains \"rtk grep finds results\" \"pub fn\" rtk grep \"pub fn\" src/\nassert_ok \"rtk grep with file type\" rtk grep \"pub fn\" src/ -t rust\n \"note\": \"RTK grep wraps ripgrep. Use patterns that will match (e.g. 'fn ', 'use ', 'pub ').\",\npub struct Tracker {\n pub fn new() -> Result;\n pub fn record(\n pub fn get_summary(&self) -> Result;\n pub fn get_all_days(&self) -> Result>;\n pub fn get_by_week(&self) -> Result>;\n pub fn get_by_month(&self) -> Result>;\n pub fn get_recent(&self, limit: usize) -> Result>;\npub", + "stderr": "", + "exit_code": 0, + "duration_ms": 8, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--no-filename' found\n\n tip: a similar argument exists: '--line-numbers'\n tip: to pass '--no-filename' as a value, use '-- --no-filename'\n\nUsage: rtk grep --line-numbers [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "5/5 anchor tokens missing: ['pub', 'pub', 'pub', 'assert_ok', 'assert_contains']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'fn ' --vimgrep", + "family": "grep", + "raw": { + "stdout": "CLAUDE.md:335:5:pub fn filter_git_log(input: &str) -> Result {\nCLAUDE.md:359:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nCLAUDE.md:374:5:pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\nARCHITECTURE.md:419:1:fn calculate_total(items: &[Item]) -> i32 {\nARCHITECTURE.md:425:1:fn calculate_total(items: &[Item]) -> i32 {\nARCHITECTURE.md:430:1:fn calculate_total(items: &[Item]) -> i32 { ... }\nARCHITECTURE.md:584:5:pub fn run(command: &GoCommand, verbose: u8) -> Result<()> {\nARCHITECTURE.md:633:1:fn test_pytest_state_machine() {\nARCHITECTURE.md:646:1:fn test_go_test_ndjson_interleaved() {\nARCHITECTURE.md:1111:5:pub fn run(args: &[String], verbose: u8) -> Result<()> {\nARCHITECTURE.md:1133:1:fn execute_command(args: &[String]) -> Result {\nARCHITECTURE.md:1150:1:fn filter_output(raw: &str, verbose: u8) -> String {\nARCHITECTURE.md:1169:5: fn test_filter_output() {\nARCHITECTURE.md:1313:5:pub fn run(args: &[String], verbose: u8) -> R", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--vimgrep' found\n\n tip: to pass '--vimgrep' as a value, use '-- --vimgrep'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['CLAUDE.md:335:5:pub', 'CLAUDE.md:359:5:pub', 'CLAUDE.md:374:5:pub', 'ARCHITECTURE.md:419:1:fn', 'ARCHITECTURE.md:425:1:fn']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' -A 2 -B 2", + "family": "grep", + "raw": { + "stdout": "CHANGELOG.md-### Bug Fixes\nCHANGELOG.md-\nCHANGELOG.md:* **hook:** use POSIX character classes for cross-platform grep compatibility ([#98](https://github.com/rtk-ai/rtk/issues/98)) ([4aafc83](https://github.com/rtk-ai/rtk/commit/4aafc832d4bdd438609358e2737a96bee4bb2467))\nCHANGELOG.md-\nCHANGELOG.md-## [0.15.1](https://github.com/rtk-ai/rtk/compare/v0.15.0...v0.15.1) (2026-02-12)\n--\nCHANGELOG.md-\nCHANGELOG.md-### Changed\nCHANGELOG.md:- Refactored `insert_hook_entry()` to use idiomatic Rust `entry()` API\nCHANGELOG.md-- Simplified `hook_already_present()` logic with iterator chains\nCHANGELOG.md-- Improved atomic write error messages for better debugging\n--\nCHANGELOG.md- - Tier 3: Passthrough with truncated raw output and error markers\nCHANGELOG.md- - Guarantees RTK never returns false data silently\nCHANGELOG.md:* **migrate commands to OutputParser**: vitest, playwright, pnpm now use robust parsing\nCHANGELOG.md- - JSON parsing with safe fallbacks for all modern JS tooling\nCHANGELOG.md- ", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-A' found\n\n tip: to pass '-A' as a value, use '-- -A'\n\nUsage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['CHANGELOG.md-###', 'CHANGELOG.md-', 'CHANGELOG.md:*', 'CHANGELOG.md-', 'CHANGELOG.md-##']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'pub ' --json", + "family": "grep", + "raw": { + "stdout": "{\"type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"}}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn filter_git_log(input: &str) -> Result {\\n\"},\"line_number\":335,\"absolute_offset\":12739,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":359,\"absolute_offset\":13354,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub fn execute_with_filter(cmd: &str, args: &[&str]) -> Result<()> {\\n\"},\"line_number\":374,\"absolute_offset\":13813,\"submatches\":[{\"match\":{\"text\":\"pub \"},\"start\":0,\"end\":4}]}}\n{\"type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":46262,\"human\":\"0.000046s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_l", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--json' found\n\n tip: to pass '--json' as a value, use '-- --json'\n\nUsage: rtk grep [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['type\":\"begin\",\"data\":{\"path\":{\"text\":\"CLAUDE.md', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"match\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"lines\":{\"text\":\"pub', 'type\":\"end\",\"data\":{\"path\":{\"text\":\"CLAUDE.md\"},\"binary_offset\":null,\"stats\":{\"elapsed\":{\"secs\":0,\"nanos\":46262,\"human\":\"0.000046s\"},\"searches\":1,\"searches_with_match\":1,\"bytes_searched\":25702,\"bytes_printed\":775,\"matched_lines\":3,\"matches\":3']" + } + ], + "skipped_reason": null + }, + { + "command": "rg 'use ' --files-with-matches --quiet", + "family": "grep", + "raw": { + "stdout": "", + "stderr": "", + "exit_code": 0, + "duration_ms": 10, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--files-with-matches' found\n\n tip: a similar argument exists: '--file-type'\n tip: to pass '--files-with-matches' as a value, use '-- --files-with-matches'\n\nUsage: rtk grep --file-type [PATH] [EXTRA_ARGS]...\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "ls -l --color=never", + "family": "ls", + "raw": { + "stdout": "total 252\n-rw-rw-r-- 1 pln pln 57226 Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30515 Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1476 Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26314 Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 25702 Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4096 Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4096 Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 10738 Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2675 Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1075 Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33408 Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4096 Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7272 Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4096 Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4096 Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2171 Ma", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 no ext, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 20%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls --format=long --human-readable", + "family": "ls", + "raw": { + "stdout": "total 252K\n-rw-rw-r-- 1 pln pln 56K Mar 18 20:02 ARCHITECTURE.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 17:28 bug-reports\n-rw-rw-r-- 1 pln pln 30K Mar 18 20:02 Cargo.lock\n-rw-rw-r-- 1 pln pln 1.5K Mar 18 20:02 Cargo.toml\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CHANGELOG.md\n-rw-rw-r-- 1 pln pln 26K Mar 18 20:02 CLAUDE.md\ndrwxrwxr-x 3 pln pln 4.0K Mar 18 04:21 docs\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 Formula\ndrwxrwxr-x 2 pln pln 4.0K Mar 17 17:41 hooks\n-rw-rw-r-- 1 pln pln 11K Mar 18 04:21 INSTALL.md\n-rw-rw-r-- 1 pln pln 2.7K Mar 18 20:02 install.sh\n-rw-rw-r-- 1 pln pln 1.1K Mar 17 17:41 LICENSE\n-rw-rw-r-- 1 pln pln 33K Mar 18 20:02 README.md\n-rw-rw-r-- 1 pln pln 181 Mar 17 17:41 release-please-config.json\n-rw-rw-r-- 1 pln pln 459 Mar 17 17:41 ROADMAP.md\ndrwxrwxr-x 2 pln pln 4.0K Mar 19 19:19 scripts\n-rw-rw-r-- 1 pln pln 7.2K Mar 18 04:21 SECURITY.md\ndrwxrwxr-x 5 pln pln 4.0K Mar 19 18:57 src\ndrwxr-xr-x 4 pln pln 4.0K Mar 18 18:48 target\n-rw-rw-r-- 1 pln pln 2.2K Mar 17 17:41 TEST_EXE", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 0B\nCargo.lock 0B\nCargo.toml 0B\nCHANGELOG.md 0B\nCLAUDE.md 0B\n.gitignore 339B\nINSTALL.md 0B\ninstall.sh 0B\nLICENSE 0B\nREADME.md 0B\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 0B\nTEST_EXEC_TIME.md 0B\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .lock, 1 no ext, 1 .toml, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 11, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "21 \u2192 25 lines" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['total', '-rw-rw-r--', 'drwxrwxr-x', '-rw-rw-r--', '-rw-rw-r--']" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 21%)" + } + ], + "skipped_reason": null + }, + { + "command": "ls -c --color=never -1", + "family": "ls", + "raw": { + "stdout": "scripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 no ext, 1 .gitignore, 1 .sh, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "20 \u2192 25 lines" + }, + { + "code": "FORMAT_ALTERED", + "detail": "Machine-readable output altered (similarity: 22%)" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -printf '%p %M %u\\n'", + "family": "find", + "raw": { + "stdout": ". drwxrwxr-x pln\n./ARCHITECTURE.md -rw-rw-r-- pln\n./SECURITY.md -rw-rw-r-- pln\n./.gitignore -rw-rw-r-- pln\n./src drwxrwxr-x pln\n./src/init.rs -rw-rw-r-- pln\n./src/read.rs -rw-rw-r-- pln\n./src/tracking.rs -rw-rw-r-- pln\n./src/env_cmd.rs -rw-rw-r-- pln\n./src/discover drwxrwxr-x pln\n./src/discover/provider.rs -rw-rw-r-- pln\n./src/discover/report.rs -rw-rw-r-- pln\n./src/discover/registry.rs -rw-rw-r-- pln\n./src/discover/mod.rs -rw-rw-r-- pln\n./src/display_helpers.rs -rw-rw-r-- pln\n./src/playwright_cmd.rs -rw-rw-r-- pln\n./src/gh_cmd.rs -rw-rw-r-- pln\n./src/parser drwxrwxr-x pln\n./src/parser/formatter.rs -rw-rw-r-- pln\n./src/parser/error.rs -rw-rw-r-- pln\n./src/parser/types.rs -rw-rw-r-- pln\n./src/parser/README.md -rw-rw-r-- pln\n./src/parser/mod.rs -rw-rw-r-- pln\n./src/git.rs -rw-rw-r-- pln\n./src/go_cmd.rs -rw-rw-r-- pln\n./src/cc_economics.rs -rw-rw-r-- pln\n./src/tree.rs -rw-rw-r-- pln\n./src/deps.rs -rw-rw-r-- pln\n./src/prisma_cmd.rs -rw-rw-r-- pln\n./src/ls.rs -rw-rw-r-- pln\n./src/main.rs -r", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['./ARCHITECTURE.md', './SECURITY.md', './.gitignore', './src', './src/init.rs']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -type f -name '*.rs' -ls", + "family": "find", + "raw": { + "stdout": " 64233644 52 -rw-rw-r-- 1 pln pln 51472 Mar 18 04:21 ./src/init.rs\n 64233235 8 -rw-rw-r-- 1 pln pln 4610 Mar 17 17:41 ./src/read.rs\n 64233242 36 -rw-rw-r-- 1 pln pln 33880 Mar 19 18:57 ./src/tracking.rs\n 64233185 8 -rw-rw-r-- 1 pln pln 5731 Mar 17 17:41 ./src/env_cmd.rs\n 64233169 16 -rw-rw-r-- 1 pln pln 15078 Mar 18 04:21 ./src/discover/provider.rs\n 64233130 8 -rw-rw-r-- 1 pln pln 5531 Mar 18 04:21 ./src/discover/report.rs\n 64233181 20 -rw-rw-r-- 1 pln pln 20218 Mar 17 17:41 ./src/discover/registry.rs\n 64233178 12 -rw-rw-r-- 1 pln pln 8298 Mar 17 17:41 ./src/discover/mod.rs\n 64233184 12 -rw-rw-r-- 1 pln pln 9732 Mar 17 17:41 ./src/display_helpers.rs\n 64233227 16 -rw-rw-r-- 1 pln pln 13792 Mar 17 17:41 ./src/playwright_cmd.rs\n 64233192 48 -rw-rw-r-- 1 pln pln 47210 Mar 19 1", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-n' found\n\n tip: to pass '-n' as a value, use '-- -n'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['64233644', '64233235', '64233242', '64233185', '64233169']" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -iname '*.json' -print0", + "family": "find", + "raw": { + "stdout": "./.claude/settings.local.json\u0000./.release-please-manifest.json\u0000./target/.rustc_info.json\u0000./release-please-config.json\u0000", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-i' found\n\n tip: to pass '-i' as a value, use '-- -i'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "find . -maxdepth 3 -printf '%y %p\\n'", + "family": "find", + "raw": { + "stdout": "d .\nf ./ARCHITECTURE.md\nf ./SECURITY.md\nf ./.gitignore\nd ./src\nf ./src/init.rs\nf ./src/read.rs\nf ./src/tracking.rs\nf ./src/env_cmd.rs\nd ./src/discover\nf ./src/discover/provider.rs\nf ./src/discover/report.rs\nf ./src/discover/registry.rs\nf ./src/discover/mod.rs\nf ./src/display_helpers.rs\nf ./src/playwright_cmd.rs\nf ./src/gh_cmd.rs\nd ./src/parser\nf ./src/parser/formatter.rs\nf ./src/parser/error.rs\nf ./src/parser/types.rs\nf ./src/parser/README.md\nf ./src/parser/mod.rs\nf ./src/git.rs\nf ./src/go_cmd.rs\nf ./src/cc_economics.rs\nf ./src/tree.rs\nf ./src/deps.rs\nf ./src/prisma_cmd.rs\nf ./src/ls.rs\nf ./src/main.rs\nf ./src/diff_cmd.rs\nf ./src/prettier_cmd.rs\nf ./src/next_cmd.rs\nf ./src/vitest_cmd.rs\nf ./src/lint_cmd.rs\nf ./src/summary.rs\nf ./src/gain.rs\nf ./src/npm_cmd.rs\nf ./src/golangci_cmd.rs\nf ./src/wget_cmd.rs\nf ./src/local_llm.rs\nf ./src/wc_cmd.rs\nf ./src/format_cmd.rs\nf ./src/find_cmd.rs\nf ./src/curl_cmd.rs\nf ./src/json_cmd.rs\nd ./src/learn\nf ./src/learn/detector.rs\nf ./src/learn/report.rs\nf", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-p' found\n\n tip: to pass '-p' as a value, use '-- -p'\n\nUsage: rtk find [OPTIONS] [PATH]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=0 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "\ud83d\udcca src/main.rs \u2192 Cargo.toml\n +56 added, -1610 removed, ~0 modified\n\n- 1 mod cargo_cmd;\n+ 1 [package]\n- 2 mod cc_economics;\n+ 2 name = \"rtk\"\n- 3 mod ccusage;\n+ 3 version = \"0.22.4\"\n- 4 mod config;\n+ 4 edition = \"2021\"\n- 5 mod container;\n+ 5 authors = [\"Patrick Szymkowiak\"]\n- 6 mod curl_cmd;\n+ 6 description = \"Rust Token Killer - High-performance CLI proxy to minimize LLM...\n- 7 mod deps;\n+ 7 license = \"MIT\"\n- 8 mod diff_cmd;\n+ 8 homepage = \"https://www.rtk-ai.app\"\n- 9 mod discover;\n+ 9 repository = \"https://github.com/algolia/rtk\"\n- 10 mod display_helpers;\n+ 10 readme = \"README.md\"\n- 11 mod env_cmd;\n+ 11 keywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\n- 12 mod filter;\n+ 12 categories = [\"command-line-utilities\", \"development-tools\"]\n- 13 mod find_cmd;\n+ 13 \n- 14 mod format_cmd;\n+ 14 [dependencies]\n- 15 mod gain;\n+ 15 clap = { version = \"4\", features = [\"derive\"] }\n- 16 mod gh_cmd;\n+ 16 anyhow = \"1.0\"\n- 17 mod git;\n+ 17 ig", + "stderr": "", + "exit_code": 0, + "duration_ms": 5, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=0" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -y src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "mod cargo_cmd;\t\t\t\t\t\t |\t[package]\nmod cc_economics;\t\t\t\t\t |\tname = \"rtk\"\nmod ccusage;\t\t\t\t\t\t |\tversion = \"0.22.4\"\nmod config;\t\t\t\t\t\t |\tedition = \"2021\"\nmod container;\t\t\t\t\t\t |\tauthors = [\"Patrick Szymkowiak\"]\nmod curl_cmd;\t\t\t\t\t\t |\tdescription = \"Rust Token Killer - High-performance CLI proxy\nmod deps;\t\t\t\t\t\t |\tlicense = \"MIT\"\nmod diff_cmd;\t\t\t\t\t\t |\thomepage = \"https://www.rtk-ai.app\"\nmod discover;\t\t\t\t\t\t |\trepository = \"https://github.com/algolia/rtk\"\nmod display_helpers;\t\t\t\t\t |\treadme = \"README.md\"\nmod env_cmd;\t\t\t\t\t\t |\tkeywords = [\"cli\", \"llm\", \"token\", \"filter\", \"productivity\"]\nmod filter;\t\t\t\t\t\t |\tcategories = [\"command-line-utilities\", \"development-tools\"]\nmod find_cmd;\t\t\t\t\t\t |\nmod format_cmd;\t\t\t\t\t\t |\t[dependencies]\nmod gain;\t\t\t\t\t\t |\tclap = { version = \"4\", features = [\"derive\"] }\nmod gh_cmd;\t\t\t\t\t\t |\tanyhow = \"1.0\"\nmod git;\t\t\t\t\t\t |\tignore = \"0.4\"\nmod go_cmd;\t\t\t\t\t\t |\twalkdir = \"2\"\nmod golangci_cmd;\t\t\t\t\t", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-y' found\n\n tip: to pass '-y' as a value, use '-- -y'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "8/8 anchor tokens missing: ['mod', 'mod', 'mod', 'mod', 'mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff --color=never -u src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n+++ Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- ", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--color' found\n\n tip: to pass '--color' as a value, use '-- --color'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -c src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "*** src/main.rs\t2026-03-19 17:37:48.208602553 +0100\n--- Cargo.toml\t2026-03-18 20:02:49.730761414 +0100\n***************\n*** 1,1610 ****\n! mod cargo_cmd;\n! mod cc_economics;\n! mod ccusage;\n! mod config;\n! mod container;\n! mod curl_cmd;\n! mod deps;\n! mod diff_cmd;\n! mod discover;\n! mod display_helpers;\n! mod env_cmd;\n! mod filter;\n! mod find_cmd;\n! mod format_cmd;\n! mod gain;\n! mod gh_cmd;\n! mod git;\n! mod go_cmd;\n! mod golangci_cmd;\n! mod grep_cmd;\n! mod hook_audit_cmd;\n! mod init;\n! mod json_cmd;\n! mod learn;\n! mod lint_cmd;\n! mod local_llm;\n! mod log_cmd;\n! mod ls;\n! mod next_cmd;\n! mod npm_cmd;\n! mod parser;\n! mod pip_cmd;\n! mod playwright_cmd;\n! mod pnpm_cmd;\n! mod prettier_cmd;\n! mod prisma_cmd;\n! mod pytest_cmd;\n! mod read;\n! mod ruff_cmd;\n! mod runner;\n! mod summary;\n! mod tee;\n! mod tracking;\n! mod tree;\n! mod tsc_cmd;\n! mod utils;\n! mod vitest_cmd;\n! mod wc_cmd;\n! mod wget_cmd;\n! \n! use anyhow::{Context, Result};\n! use clap::{Parser, Subcommand};\n! use std::ffi::OsString;\n! use ", + "stderr": "", + "exit_code": 1, + "duration_ms": 4, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-c' found\n\n tip: to pass '-c' as a value, use '-- -c'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "4/4 anchor tokens missing: ['***', '---', '***************', '***']" + } + ], + "skipped_reason": null + }, + { + "command": "diff --brief src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files src/main.rs and Cargo.toml differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 2, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--brief' found\n\n tip: to pass '--brief' as a value, use '-- --brief'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + }, + { + "command": "diff -u --label=file1 --label=file2 src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "--- file1\n+++ file2\n@@ -1,1610 +1,56 @@\n-mod cargo_cmd;\n-mod cc_economics;\n-mod ccusage;\n-mod config;\n-mod container;\n-mod curl_cmd;\n-mod deps;\n-mod diff_cmd;\n-mod discover;\n-mod display_helpers;\n-mod env_cmd;\n-mod filter;\n-mod find_cmd;\n-mod format_cmd;\n-mod gain;\n-mod gh_cmd;\n-mod git;\n-mod go_cmd;\n-mod golangci_cmd;\n-mod grep_cmd;\n-mod hook_audit_cmd;\n-mod init;\n-mod json_cmd;\n-mod learn;\n-mod lint_cmd;\n-mod local_llm;\n-mod log_cmd;\n-mod ls;\n-mod next_cmd;\n-mod npm_cmd;\n-mod parser;\n-mod pip_cmd;\n-mod playwright_cmd;\n-mod pnpm_cmd;\n-mod prettier_cmd;\n-mod prisma_cmd;\n-mod pytest_cmd;\n-mod read;\n-mod ruff_cmd;\n-mod runner;\n-mod summary;\n-mod tee;\n-mod tracking;\n-mod tree;\n-mod tsc_cmd;\n-mod utils;\n-mod vitest_cmd;\n-mod wc_cmd;\n-mod wget_cmd;\n-\n-use anyhow::{Context, Result};\n-use clap::{Parser, Subcommand};\n-use std::ffi::OsString;\n-use std::path::{Path, PathBuf};\n-\n-#[derive(Parser)]\n-#[command(\n- name = \"rtk\",\n- version,\n- about = \"Rust Token Killer - Minimize LLM token co", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '--label' found\n\n tip: to pass '--label' as a value, use '-- --label'\n\nUsage: rtk diff --ultra-compact [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 4, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + }, + { + "code": "DATA_LOSS", + "detail": "7/7 anchor tokens missing: ['---', '+++', '-mod', '-mod', '-mod']" + } + ], + "skipped_reason": null + }, + { + "command": "diff -q --label=left --label=right src/main.rs Cargo.toml", + "family": "diff", + "raw": { + "stdout": "Files left and right differ\n", + "stderr": "", + "exit_code": 1, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "", + "stderr": "error: unexpected argument '-q' found\n\n tip: to pass '-q' as a value, use '-- -q'\n\nUsage: rtk diff [OPTIONS] [FILE2]\n\nFor more information, try '--help'.\n", + "exit_code": 2, + "duration_ms": 3, + "error": null + }, + "verdict": "FAIL", + "issues": [ + { + "code": "EXIT_CODE_MISMATCH", + "detail": "raw=1 rtk=2" + } + ], + "skipped_reason": null + } + ], + "warnings": [ + { + "command": "git branch -v", + "family": "git-branch", + "raw": { + "stdout": "* feature/agentic-fuzzing 69eb684 feat: expand static tests to 65 across 17 families, add demo page\n fix/git-global-opts 16c324e feat: support git -C (directory) global option for cross-repo commands\n fork/algolia-identity 1a4b175 ci: use actions/cache@v4 for Rust build cache (zero third-party trust)\n main f72e3f9 [ahead 3] fix: passthrough git log when format/detail flags are present\n release/v0.22.3 d2d8a34 release: bump to v0.22.3, drop homebrew job, update version refs\n release/v0.22.4 f89894e release: update version refs to 0.22.4 across docs\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 6, + "error": null + }, + "rtk": { + "stdout": "* feature/agentic-fuzzing\n fix/git-global-opts\n fork/algolia-identity\n main\n release/v0.22.3\n release/v0.22.4\n remotes/upstream/bug/critical-fixes\n remotes/upstream/chore/claude-config\n remotes/upstream/develop\n remotes/upstream/docs/add-ascii-diagrams\n remotes/upstream/docs/agent-agnostic-readme\n remotes/upstream/docs/functional-documentation\n remotes/upstream/docs/prompt-caching-faq\n remotes/upstream/docs/readme-revamp\n remotes/upstream/docs/session-summary-companion\n remotes/upstream/docs/v0.15.1-python-go-complete\n remotes/upstream/feat/add-support-native-claude-cmd\n remotes/upstream/feat/claude-skills-pr-issue-triage\n remotes/upstream/feat/claude-tooling-agents-rules-skills\n remotes/upstream/feat/hook-audit-mode\n remotes/upstream/feat/hook-rewrite-toml\n remotes/upstream/feat/new-tools-toml\n remotes/upstream/feat/pr-template-ci\n remotes/upstream/feat/rtk-rewrite\n remotes/upstream/feat/rtk-triage-skill\n remotes/upstream/feat/scaffold-command\n remotes/upstre", + "stderr": "git branch\n", + "exit_code": 0, + "duration_ms": 9, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "6 \u2192 86 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls -1", + "family": "ls", + "raw": { + "stdout": "ARCHITECTURE.md\nbug-reports\nCargo.lock\nCargo.toml\nCHANGELOG.md\nCLAUDE.md\ndocs\nFormula\nhooks\nINSTALL.md\ninstall.sh\nLICENSE\nREADME.md\nrelease-please-config.json\nROADMAP.md\nscripts\nSECURITY.md\nsrc\ntarget\nTEST_EXEC_TIME.md\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 3, + "error": null + }, + "rtk": { + "stdout": "bug-reports/\n.claude/\ndocs/\nFormula/\n.github/\nhooks/\nscripts/\nsrc/\nARCHITECTURE.md 55.9K\nCargo.lock 29.8K\nCargo.toml 1.4K\nCHANGELOG.md 25.7K\nCLAUDE.md 25.1K\n.gitignore 339B\nINSTALL.md 10.5K\ninstall.sh 2.6K\nLICENSE 1.0K\nREADME.md 32.6K\nrelease-please-config.json 181B\n.release-please-manifest.json 20B\nROADMAP.md 459B\nSECURITY.md 7.1K\nTEST_EXEC_TIME.md 2.1K\n\n\ud83d\udcca 15 files, 8 dirs (8 .md, 2 .json, 1 .toml, 1 .gitignore, 1 .lock, +2 more)\n", + "stderr": "", + "exit_code": 0, + "duration_ms": 7, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "20 \u2192 25 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls -R -t -h", + "family": "ls", + "raw": { + "stdout": ".:\nscripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n\n./scripts:\nfuzz-rtk.py\nfuzzer-demo.html\nFUZZ-RTK.md\ncheck-installation.sh\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nbenchmark.sh\n\n./src:\ntracking.rs\ngit.rs\ngrep_cmd.rs\nmain.rs\ngh_cmd.rs\nwc_cmd.rs\ntree.rs\nruff_cmd.rs\nsummary.rs\ntee.rs\nlog_cmd.rs\nparser\npip_cmd.rs\nlint_cmd.rs\ninit.rs\nlearn\ngolangci_cmd.rs\ngain.rs\nfind_cmd.rs\nformat_cmd.rs\ncontainer.rs\ndiscover\ncc_economics.rs\nccusage.rs\nwget_cmd.rs\nrunner.rs\ntsc_cmd.rs\nutils.rs\nvitest_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs\npytest_cmd.rs\nread.rs\nnpm_cmd.rs\nlocal_llm.rs\nls.rs\nnext_cmd.rs\nhook_audit_cmd.rs\njson_cmd.rs\ngo_cmd.rs\nenv_cmd.rs\nfilter.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndisplay_helpers.rs\ncargo_cmd.rs\nconf", + "stderr": "", + "exit_code": 0, + "duration_ms": 17, + "error": null + }, + "rtk": { + "stdout": "scripts/\n.claude/\nsrc/\nbug-reports/\ndocs/\nhooks/\nFormula/\n.github/\nobjects/\nhooks/\nlogs/\nrefs/\nbranches/\ninfo/\n69/\n6e/\n97/\nd6/\nd7/\nfa/\nd3/\nff/\n6d/\nb6/\n05/\n8e/\n17/\nc0/\n2a/\n45/\nf7/\na0/\n07/\nca/\n1a/\n85/\n03/\n49/\n19/\n67/\naf/\n78/\n0d/\n87/\n56/\na5/\nc9/\n08/\n82/\nd5/\nb9/\nf4/\n42/\nbe/\n89/\nc8/\n3c/\n9d/\nbb/\n92/\nf8/\nde/\ncf/\n1d/\n13/\n4c/\ned/\nf1/\n11/\ndd/\n16/\n83/\n1e/\ndc/\n21/\n57/\ne4/\nd2/\n91/\n4b/\n12/\n2f/\n5f/\n27/\n64/\na8/\n3e/\n7e/\nc6/\n48/\n5a/\nb5/\nb4/\nb3/\n09/\n39/\n18/\ndf/\nbf/\ne6/\n22/\n4e/\nb7/\nf2/\n75/\n94/\n36/\n34/\n2c/\n35/\n93/\n25/\na2/\n8f/\na6/\n54/\nab/\ne9/\n0c/\n23/\n77/\nf9/\ne3/\n4f/\n43/\n0a/\n66/\n9b/\nfb/\n2e/\nd0/\n32/\n61/\n68/\na3/\nce/\nc7/\nf3/\n99/\nac/\n76/\na7/\n01/\n79/\n9e/\n4d/\n60/\n3d/\nee/\n06/\n29/\nfe/\npack/\ninfo/\nrefs/\nheads/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nchore/\nbug/\nheads/\ntags/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nbug/\nchore/\nskills/\nagents/\nrules/\nhooks/\ncommands/\nrtk-tdd/\nrefe", + "stderr": "", + "exit_code": 0, + "duration_ms": 72, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "2559 \u2192 4488 lines" + } + ], + "skipped_reason": null + }, + { + "command": "ls -R -S -t", + "family": "ls", + "raw": { + "stdout": ".:\nscripts\nsrc\nbug-reports\ninstall.sh\nREADME.md\nCargo.lock\nCargo.toml\nCLAUDE.md\nARCHITECTURE.md\nCHANGELOG.md\ntarget\ndocs\nSECURITY.md\nINSTALL.md\nhooks\nrelease-please-config.json\nROADMAP.md\nTEST_EXEC_TIME.md\nLICENSE\nFormula\n\n./scripts:\nfuzz-rtk.py\nfuzzer-demo.html\nFUZZ-RTK.md\ncheck-installation.sh\ninstall-local.sh\nrtk-economics.sh\ntest-all.sh\ntest-aristote.sh\ntest-tracking.sh\nupdate-readme-metrics.sh\nvalidate-docs.sh\nbenchmark.sh\n\n./src:\ntracking.rs\ngit.rs\ngrep_cmd.rs\nmain.rs\ngh_cmd.rs\nwc_cmd.rs\ntree.rs\nruff_cmd.rs\nsummary.rs\ntee.rs\nlog_cmd.rs\nparser\npip_cmd.rs\nlint_cmd.rs\ninit.rs\nlearn\ngolangci_cmd.rs\ngain.rs\nfind_cmd.rs\nformat_cmd.rs\ncontainer.rs\ndiscover\ncc_economics.rs\nccusage.rs\nwget_cmd.rs\nrunner.rs\ntsc_cmd.rs\nutils.rs\nvitest_cmd.rs\nplaywright_cmd.rs\npnpm_cmd.rs\nprettier_cmd.rs\nprisma_cmd.rs\npytest_cmd.rs\nread.rs\nnpm_cmd.rs\nlocal_llm.rs\nls.rs\nnext_cmd.rs\nhook_audit_cmd.rs\njson_cmd.rs\ngo_cmd.rs\nenv_cmd.rs\nfilter.rs\ncurl_cmd.rs\ndeps.rs\ndiff_cmd.rs\ndisplay_helpers.rs\ncargo_cmd.rs\nconf", + "stderr": "", + "exit_code": 0, + "duration_ms": 16, + "error": null + }, + "rtk": { + "stdout": "scripts/\n.claude/\nsrc/\nbug-reports/\ndocs/\nhooks/\nFormula/\n.github/\nobjects/\nhooks/\nlogs/\nrefs/\nbranches/\ninfo/\n69/\n6e/\n97/\nd6/\nd7/\nfa/\nd3/\nff/\n6d/\nb6/\n05/\n8e/\n17/\nc0/\n2a/\n45/\nf7/\na0/\n07/\nca/\n1a/\n85/\n03/\n49/\n19/\n67/\naf/\n78/\n0d/\n87/\n56/\na5/\nc9/\n08/\n82/\nd5/\nb9/\nf4/\n42/\nbe/\n89/\nc8/\n3c/\n9d/\nbb/\n92/\nf8/\nde/\ncf/\n1d/\n13/\n4c/\ned/\nf1/\n11/\ndd/\n16/\n83/\n1e/\ndc/\n21/\n57/\ne4/\nd2/\n91/\n4b/\n12/\n2f/\n5f/\n27/\n64/\na8/\n3e/\n7e/\nc6/\n48/\n5a/\nb5/\nb4/\nb3/\n09/\n39/\n18/\ndf/\nbf/\ne6/\n22/\n4e/\nb7/\nf2/\n75/\n94/\n36/\n34/\n2c/\n35/\n93/\n25/\na2/\n8f/\na6/\n54/\nab/\ne9/\n0c/\n23/\n77/\nf9/\ne3/\n4f/\n43/\n0a/\n66/\n9b/\nfb/\n2e/\nd0/\n32/\n61/\n68/\na3/\nce/\nc7/\nf3/\n99/\nac/\n76/\na7/\n01/\n79/\n9e/\n4d/\n60/\n3d/\nee/\n06/\n29/\nfe/\npack/\ninfo/\nrefs/\nheads/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nchore/\nbug/\nheads/\ntags/\nremotes/\nfeature/\nrelease/\nfix/\nfork/\norigin/\nupstream/\nfeature/\nrelease/\nfix/\nfork/\nfix/\nfeat/\nfeature/\ndocs/\nbug/\nchore/\nskills/\nagents/\nrules/\nhooks/\ncommands/\nrtk-tdd/\nrefe", + "stderr": "", + "exit_code": 0, + "duration_ms": 100, + "error": null + }, + "verdict": "WARN", + "issues": [ + { + "code": "LINE_EXPANSION", + "detail": "2559 \u2192 4488 lines" + } + ], + "skipped_reason": null + } + ] +} \ No newline at end of file diff --git a/bug-reports/2026-03-19-gh-json-output-rewritten.md b/bug-reports/2026-03-19-gh-json-output-rewritten.md new file mode 100644 index 000000000..08bd7bbf0 --- /dev/null +++ b/bug-reports/2026-03-19-gh-json-output-rewritten.md @@ -0,0 +1,29 @@ +# RTK rewrites `gh` JSON output into human-readable format + +**Date**: 2026-03-19 + +**Command**: +```bash +gh run list --workflow="Claude AI PR Review" --limit 5 --json databaseId,conclusion,createdAt,headBranch +``` + +**Expected output** (raw JSON array): +```json +[{"conclusion":"success","createdAt":"2025-11-25T09:47:59Z","databaseId":19665221905,"headBranch":"feature/pr-review-skill-ci"}, ...] +``` + +**Actual RTK output**: +``` +🏃 Workflow Runs + ✅ Claude AI PR Review [19665221905] + ✅ Claude AI PR Review [19466389770] + ✅ Claude AI PR Review [19463012443] +``` + +**Impact**: Any downstream JSON parsing (`python3 -c "json.load(sys.stdin)"`, `jq`, etc.) fails with `JSONDecodeError`. The `--json` flag explicitly requests structured output, but RTK intercepts and reformats it into a lossy human-readable summary that drops most fields. + +Also affects `gh pr list --json`, `gh api` (paginated), and any `gh` subcommand with `--json`. + +**Workaround**: `command gh` bypasses RTK, but this is fragile and easy to forget. Also doesn't work inside `subprocess.run(['gh', ...])` in Python scripts. + +**Suggested fix**: RTK should pass through output verbatim when `--json` flag is present in `gh` commands, or when stdout is being piped (not a TTY). diff --git a/bug-reports/FUZZ-001-git-format-flags-not-passthrough.md b/bug-reports/FUZZ-001-git-format-flags-not-passthrough.md new file mode 100644 index 000000000..a4b2e569a --- /dev/null +++ b/bug-reports/FUZZ-001-git-format-flags-not-passthrough.md @@ -0,0 +1,46 @@ +# FUZZ-001: git log/show filter applied on custom format flags + +**Severity**: HIGH +**Status**: FIXED (round 1 — 9ece88c) +**Discovered by**: Agentic fuzzer, 2026-03-19 +**Affected modules**: `src/git.rs` (run_log, run_show) + +## Summary + +RTK applied its condensing filter and injected `--no-merges` even when the user requested a custom output format via `--format`, `--pretty`, `--oneline`, `--raw`, or `--graph`. This silently altered machine-readable output that scripts and tooling depend on. + +## Reproduction + +```bash +# Raw git produces custom format +git log --format='%H' -5 +# a1b2c3d4... +# e5f6g7h8... + +# RTK mangled it — injected --no-merges, applied filter +rtk git log --format='%H' -5 +# (filtered output, missing merge commits) +``` + +Same pattern for `git show`: +```bash +git show --name-only HEAD # lists changed files +rtk git show --name-only HEAD # filter garbled the output +``` + +## Root cause + +`run_log()` and `run_show()` unconditionally applied RTK's git filter regardless of whether format-changing flags were present. The filter assumes standard `git log` output format. + +## Fix + +Detect format-changing flags (`--format`, `--pretty`, `--oneline`, `--raw`, `--graph`, `--name-only`, `--name-status`, `--no-patch`, `-p`) and passthrough verbatim — no filter, no `--no-merges` injection. + +## Impact + +Broke scripting workflows that parse git output (CI/CD, commit hooks, release tools). Any `git log --format=...` piped to `awk`/`sed`/`jq` would receive unexpected input. + +## Heuristics triggered + +- FORMAT_ALTERED (custom format mangled) +- DATA_LOSS (merge commits dropped by --no-merges injection) diff --git a/bug-reports/FUZZ-002-cargo-message-format-json-mangled.md b/bug-reports/FUZZ-002-cargo-message-format-json-mangled.md new file mode 100644 index 000000000..c492bbb7f --- /dev/null +++ b/bug-reports/FUZZ-002-cargo-message-format-json-mangled.md @@ -0,0 +1,41 @@ +# FUZZ-002: cargo --message-format=json output mangled by filter + +**Severity**: HIGH +**Status**: FIXED (round 2 — 3553b33) +**Discovered by**: Agentic fuzzer, 2026-03-19 +**Affected modules**: `src/cargo_cmd.rs` (run_build, run_clippy, run_check) + +## Summary + +RTK's cargo filter assumed human-readable compiler output on stderr, but `--message-format=json` (and `--message-format=short`) produce machine-readable output. The filter parsed and mangled JSON lines, breaking downstream consumers. + +## Reproduction + +```bash +# Raw cargo produces NDJSON on stdout +cargo build --message-format=json 2>/dev/null +# {"reason":"compiler-artifact","package_id":"...","target":{...},...} + +# RTK filtered it — broke JSON structure +rtk cargo build --message-format=json 2>/dev/null +# (mangled output, invalid JSON) +``` + +Same for `cargo clippy --message-format=json` and `cargo check --message-format=json`. + +## Root cause + +`run_build()`, `run_clippy()`, and `run_check()` unconditionally applied `filter_cargo_build()` which expects human-readable `error[E0xxx]` / `warning:` lines. When `--message-format=json` is present, cargo emits structured JSON instead. + +## Fix + +Added `has_message_format_flag()` detection and `run_cargo_passthrough()` function. When `--message-format` is present in args, bypass filtering entirely and print raw output. + +## Impact + +Broke IDE integrations (rust-analyzer, IntelliJ Rust) and CI pipelines that consume cargo's JSON output for error reporting, artifact tracking, and dependency resolution. + +## Heuristics triggered + +- JSON_MANGLED (valid JSON in, invalid JSON out) +- FORMAT_ALTERED (machine-readable flag present, output altered) diff --git a/bug-reports/FUZZ-003-git-diff-name-only-filtered.md b/bug-reports/FUZZ-003-git-diff-name-only-filtered.md new file mode 100644 index 000000000..296cc9d23 --- /dev/null +++ b/bug-reports/FUZZ-003-git-diff-name-only-filtered.md @@ -0,0 +1,50 @@ +# FUZZ-003: git diff --name-only/--name-status filtered incorrectly + +**Severity**: MEDIUM +**Status**: FIXED (round 2 — 3553b33) +**Discovered by**: Agentic fuzzer, 2026-03-19 +**Affected modules**: `src/git.rs` (run_diff) + +## Summary + +RTK's git diff filter expected unified diff format (`+`/`-` lines, `@@` hunks), but `--name-only` produces bare filenames and `--name-status` produces tab-separated status+filename lines. The filter produced garbled output or silently dropped lines. + +## Reproduction + +```bash +# Raw git diff lists changed files +git diff --name-only HEAD~3 +# src/main.rs +# src/git.rs + +# RTK tried to parse as unified diff +rtk git diff --name-only HEAD~3 +# (garbled or empty — filter couldn't find +/- markers) +``` + +## Root cause + +`run_diff()` checked for `--stat` to decide passthrough, but didn't account for `--name-only` or `--name-status` which also produce non-unified-diff output. + +## Fix + +Extended the passthrough condition in `run_diff()` to detect `--name-only` and `--name-status` flags alongside `--stat`. + +```rust +let wants_name_only = args + .iter() + .any(|arg| arg == "--name-only" || arg == "--name-status"); + +if wants_stat || wants_name_only || !wants_compact { + // passthrough +} +``` + +## Impact + +Broke `git diff --name-only | xargs` patterns common in pre-commit hooks, CI scripts, and code review tooling. + +## Heuristics triggered + +- DATA_LOSS (filenames missing from output) +- FORMAT_ALTERED (bare filename list mangled into diff-like format) diff --git a/bug-reports/FUZZ-004-grep-h-clap-interception.md b/bug-reports/FUZZ-004-grep-h-clap-interception.md new file mode 100644 index 000000000..a59ab3f4b --- /dev/null +++ b/bug-reports/FUZZ-004-grep-h-clap-interception.md @@ -0,0 +1,49 @@ +# FUZZ-004: grep -h intercepted by Clap as help flag + +**Severity**: MEDIUM +**Status**: FIXED (round 2 — 3553b33) +**Discovered by**: Agentic fuzzer, 2026-03-19 +**Affected modules**: `src/main.rs` (Grep command definition) + +## Summary + +Running `rtk grep pattern . -h` showed RTK's help text instead of passing `-h` through to ripgrep. In GNU grep, `-h` means "suppress filename in output" (`--no-filename`). In rg, `-h` is rg's own help. Either way, Clap intercepted it before the flag reached the underlying tool. + +## Reproduction + +```bash +# Expected: rg interprets -h +rg 'fn ' src/ -h +# (rg's help output) + +# Actual: Clap intercepted -h as RTK help +rtk grep 'fn ' src/ -h +# "Compact grep - strips whitespace, truncates, groups by file +# Usage: rtk grep [OPTIONS] [PATH] [EXTRA_ARGS]..." +``` + +## Root cause + +Clap's default behavior reserves `-h` for `--help` on every subcommand. Since RTK's Grep subcommand didn't opt out, `-h` was consumed by Clap before reaching the `extra_args` trailing var arg. + +## Fix + +Added `disable_help_flag = true` to the Grep command definition and re-added `--help` as a long-only flag: + +```rust +#[command(disable_help_flag = true)] +Grep { + /// Print help (use --help; -h is reserved for rg's --no-filename) + #[arg(long, action = clap::ArgAction::Help)] + help: Option, + // ... +} +``` + +## Impact + +Subtle UX bug — users seeing help text would think they mistyped the command rather than understanding that Clap ate their flag. Particularly confusing for users migrating from GNU grep where `-h` is a commonly used flag. + +## Heuristics triggered + +- EXIT_CODE_MISMATCH (RTK exits 0 with help text, raw command exits differently) diff --git a/bug-reports/FUZZ-005-missing-flag-support-diff-q-ls-l-git-show.md b/bug-reports/FUZZ-005-missing-flag-support-diff-q-ls-l-git-show.md new file mode 100644 index 000000000..fe053e943 --- /dev/null +++ b/bug-reports/FUZZ-005-missing-flag-support-diff-q-ls-l-git-show.md @@ -0,0 +1,61 @@ +# FUZZ-005: Missing flag support — diff -q, ls -l, git branch --format/--sort + +**Severity**: MEDIUM +**Status**: FIXED (rounds 1-3 — 9ece88c, e1e168e) +**Discovered by**: Agentic fuzzer, 2026-03-19 +**Affected modules**: `src/main.rs`, `src/diff_cmd.rs`, `src/ls.rs`, `src/git.rs` + +## Summary + +Several RTK command definitions had Clap schemas narrower than the real tool's interface. Valid flags were rejected or filtered when they should have been accepted or passed through. This is a **bug class**, not an individual bug — the fuzzer found multiple instances of the same pattern. + +## Instances + +### 5a. `diff -q` — rejected by Clap + +```bash +diff -q src/main.rs Cargo.toml # "Files differ" +rtk diff -q src/main.rs Cargo.toml # "error: unexpected argument '-q'" +``` + +**Root cause**: RTK's Diff command only defined `file1` and `file2` positional args, no `-q`/`--brief` flag. +**Fix**: Added `-q`/`--brief` flag mapped to `run_brief()` passthrough to system diff. + +### 5b. `ls -l` — filtered when it should passthrough + +```bash +ls -l # detailed listing with permissions, sizes, dates +rtk ls -l # RTK's tree-style output (lost all metadata) +``` + +**Root cause**: `ls` filter ran unconditionally regardless of flags. +**Fix**: Detect `-l` flag and passthrough to system ls. + +### 5c. `git branch --format/--sort` — filtered custom output + +```bash +git branch --format='%(refname:short) %(objectname:short)' +# feature/main a1b2c3d + +rtk git branch --format='%(refname:short) %(objectname:short)' +# (RTK's condensed branch list, ignoring user's format) +``` + +**Root cause**: `run_branch()` didn't check for format-changing flags. +**Fix**: Detect `--format` and `--sort` flags and passthrough. + +## Pattern + +RTK's Clap schema was designed for the common case but didn't account for the long tail of valid flags. The fuzzer systematically explored this long tail by generating commands with format-changing flags. + +**The fix pattern is always the same**: detect the flag, bypass the filter, passthrough raw output. + +## Impact + +Users encounter cryptic Clap errors or silently wrong output when using less-common but perfectly valid flags. Particularly frustrating because the raw command works fine — only the RTK proxy breaks. + +## Heuristics triggered + +- EXIT_CODE_MISMATCH (Clap rejection → exit 2, real tool → exit 0 or 1) +- DATA_LOSS (filter drops content from format-changed output) +- FORMAT_ALTERED (machine-readable flags present, output altered) diff --git a/bug-reports/FUZZ-006-docker-all-flags-rejected.md b/bug-reports/FUZZ-006-docker-all-flags-rejected.md new file mode 100644 index 000000000..047b25c19 --- /dev/null +++ b/bug-reports/FUZZ-006-docker-all-flags-rejected.md @@ -0,0 +1,51 @@ +# FUZZ-006: Docker — All flags rejected by Clap + +**Severity**: HIGH +**Status**: OPEN +**Discovered by**: Agentic fuzzer round 3, 2026-03-20 +**Affected modules**: `src/container.rs` (DockerCommands::Ps, DockerCommands::Images) + +## Summary + +RTK's Docker Clap schema defines fixed-shape commands with zero extra arguments. Every flag beyond the bare command (`-a`, `-q`, `--format`, `--no-trunc`, `--filter`, `--digests`) causes Clap rejection with exit code 2. + +## Reproduction + +```bash +# All of these work raw: +docker ps -a +docker ps -q +docker ps --format '{{.Names}} {{.Status}}' +docker ps --no-trunc +docker ps -a --filter status=running +docker ps --format json +docker images -q +docker images --format '{{.Repository}}:{{.Tag}}' +docker images --no-trunc +docker images --digests +docker images --format json + +# All of these fail through RTK: +rtk docker ps -a # "error: unexpected argument '-a'" (exit 2) +rtk docker ps --format json # "error: unexpected argument '--format'" (exit 2) +rtk docker images -q # "error: unexpected argument '-q'" (exit 2) +``` + +## Root cause + +`DockerCommands::Ps` and `DockerCommands::Images` in `src/container.rs` don't have `#[arg(trailing_var_arg = true, allow_hyphen_values = true)]` or any extra flag definitions. The Clap enum variants are completely fixed-shape. + +Only bare `docker ps` and `docker images` work. Any flag triggers Clap rejection. + +## Fix pattern + +Add `trailing_var_arg = true` + `allow_hyphen_values = true` to the Ps and Images variants, OR detect format-changing flags and passthrough. Same pattern as PR #5 fix for git args. + +## Impact + +12 of 139 fuzzer tests fail — the single largest failure cluster. Docker users can only use the most basic commands through RTK. All customization is blocked. + +## Heuristics triggered + +- EXIT_CODE_MISMATCH (raw=0, rtk=2 across all tests) +- DATA_LOSS (100% data loss — no output produced) diff --git a/bug-reports/FUZZ-007-pip-format-override-show-broken.md b/bug-reports/FUZZ-007-pip-format-override-show-broken.md new file mode 100644 index 000000000..17adc8c61 --- /dev/null +++ b/bug-reports/FUZZ-007-pip-format-override-show-broken.md @@ -0,0 +1,63 @@ +# FUZZ-007: pip — Format override + show/list broken + +**Severity**: HIGH +**Status**: OPEN +**Discovered by**: Agentic fuzzer round 3, 2026-03-20 +**Affected modules**: `src/pip_cmd.rs` + +## Summary + +Three distinct issues in pip handling: + +1. `pip list` forces `--format=json` internally, rejecting user's `--format=columns|freeze` +2. `pip show ` returns exit 1 instead of 0 +3. `pip list --not-required` rejected by Clap + +## Reproduction + +### 7a. Format override +```bash +pip list --format=freeze # absl-py==2.3.1 (exit 0) +rtk pip list --format=freeze # "error: unexpected argument" (exit 2) + +pip list --format=columns # Package Version (exit 0) +rtk pip list --format=columns # "error: unexpected argument" (exit 2) +``` + +### 7b. pip show broken +```bash +pip show requests # Name: requests\nVersion: 2.32.3 (exit 0) +rtk pip show requests # (nothing or error) (exit 1) + +pip show pip # Name: pip\nVersion: 25.0.1 (exit 0) +rtk pip show pip # (exit 1) +``` + +### 7c. --not-required rejected +```bash +pip list --not-required # lists packages not depended on (exit 0) +rtk pip list --not-required # "error: unexpected argument" (exit 2) +``` + +## Root cause + +- **7a**: `run_list()` always appends `--format=json` to args. If user also passes `--format=X`, pip receives both and the second one (json) wins — but Clap rejects the user's flag before it reaches pip. +- **7b**: `pip show` is routed through `run_passthrough()` but something in the argument handling loses the package name or routes incorrectly. +- **7c**: `--not-required` not in Clap schema; no trailing_var_arg to accept unknown flags. + +## Fix pattern + +- Detect user's `--format` flag and skip injecting `--format=json` (passthrough if non-json format) +- Add `trailing_var_arg = true` for list subcommand to accept unknown flags +- Debug `pip show` routing to find where package name is lost + +## Impact + +7 of 139 fuzzer tests fail. pip is widely used in Python development. Format freeze output is standard for requirements.txt generation — breaking it disrupts Python workflows. + +## Heuristics triggered + +- EXIT_CODE_MISMATCH (exit 2 for Clap rejection, exit 1 for show) +- DATA_LOSS (100% content loss on rejected commands) +- FORMAT_ALTERED (3% similarity when format overridden) +- STDERR_LOSS (pip list --outdated stderr warnings lost) diff --git a/bug-reports/FUZZ-008-npm-hardcoded-run.md b/bug-reports/FUZZ-008-npm-hardcoded-run.md new file mode 100644 index 000000000..dc14b1723 --- /dev/null +++ b/bug-reports/FUZZ-008-npm-hardcoded-run.md @@ -0,0 +1,47 @@ +# FUZZ-008: npm — Hardcoded to `npm run` + +**Severity**: MEDIUM +**Status**: OPEN +**Discovered by**: Agentic fuzzer round 3, 2026-03-20 +**Affected modules**: `src/npm_cmd.rs` + +## Summary + +RTK's npm handler hardcodes all input as `npm run `. Any npm subcommand other than `run` fails because RTK prepends `run` to whatever the user typed. + +## Reproduction + +```bash +npm list --depth=0 # lists dependencies (exit 0) +rtk npm list --depth=0 # "npm ERR! Missing script: list" (exit 1) + +npm list --depth=0 --json # valid JSON dependency tree +rtk npm list --depth=0 --json # "npm ERR!" — JSON_MANGLED + +npm config list # shows npm config (exit 0) +rtk npm config list # "npm ERR! Missing script: config" (exit 1) +``` + +## Root cause + +`npm_cmd.rs` constructs the command as: +``` +npm run +``` + +So `rtk npm list` becomes `npm run list`, which looks for a script named "list" in package.json. Since no such script exists, npm errors. + +## Fix pattern + +Detect the first argument as a subcommand. Route known subcommands (`list`, `outdated`, `view`, `config`, `install`) appropriately instead of always prepending `run`. + +## Impact + +3 of 139 fuzzer tests fail. `npm list` and `npm config` are commonly used commands. JSON output from `npm list --json` is consumed by CI pipelines and dependency auditing tools. + +## Heuristics triggered + +- EXIT_CODE_MISMATCH (raw=0, rtk=1) +- DATA_LOSS (100% — no output) +- JSON_MANGLED (npm list --json: valid JSON in, error text out) +- FORMAT_ALTERED (6% similarity) diff --git a/bug-reports/FUZZ-009-gh-pr-diff-output-truncated.md b/bug-reports/FUZZ-009-gh-pr-diff-output-truncated.md new file mode 100644 index 000000000..8b24f32b5 --- /dev/null +++ b/bug-reports/FUZZ-009-gh-pr-diff-output-truncated.md @@ -0,0 +1,56 @@ +# FUZZ-009: gh pr diff — Output Truncated by RTK Renderer + +**Severity**: MEDIUM +**Status**: OPEN +**Discovered by**: Live agentic usage (pr-review skill smoke test), 2026-03-20 +**Affected modules**: `src/gh_cmd.rs` (or equivalent gh output renderer) + +## Summary + +`gh pr diff` output is visually truncated when passed through RTK. The raw patch data is silently cut, leaving the consuming agent with an incomplete diff. The agent noted it was "visually truncated by the RTK renderer" and had to fall back to `gh pr diff --jq` / `gh pr view --json` to retrieve sufficient data. + +## Reproduction + +```bash +# Raw: full unified diff, potentially thousands of lines +gh pr diff 1074 --repo algolia/conversational-ai + +# Via RTK: diff truncated — only first N lines rendered, rest silently dropped +rtk gh pr diff 1074 --repo algolia/conversational-ai + +# Workaround that worked reliably: +gh pr view 1074 --repo algolia/conversational-ai --json files,additions,deletions,body +``` + +## Observed behavior + +- The agent (running inside a subagent task) called `gh pr diff` and received a truncated response +- No error, no warning — output just ends mid-diff +- Retry with `--jq` field extraction on `gh pr view --json` worked consistently +- `gh pr view` (metadata only) was unaffected + +## Root cause hypothesis + +RTK likely applies a line-count or byte-count cap when rendering `gh` output, similar to how `head -n` would truncate. For large diffs (PR #1074 was ~400 lines of patch), the renderer hits the cap and stops without signaling truncation to the caller. + +Alternatively, RTK may be transforming `gh pr diff` into a `gh pr view --patch` variant that has different output limits. + +## Impact + +- Agents doing PR review receive incomplete diffs → miss findings in later files +- Silent truncation: no exit code change, no stderr warning — agent has no signal to retry +- Workaround exists (`--json` + field extraction) but requires the agent to know about it + +## Heuristics triggered + +- DATA_LOSS (partial — tail of diff silently dropped) +- No EXIT_CODE_MISMATCH (exit 0 in both cases) +- No FORMAT_ALTERED (the portion received is correct unified diff format) + +## Workaround + +Use `gh pr view --json files` for file list, then read individual file diffs via `gh api` or `git diff` against the PR branch. Alternatively `gh pr diff | head -n 9999` is explicitly blocked by RTK's SIGPIPE rules — use `run_in_background` + `Read` on output file instead. + +## Context + +Found during smoke test of `pr-review` skill migration (algolia/conversational-ai PR #1076). The review agent completed successfully using the `--json` workaround but flagged this as a pipeline friction point worth fixing. diff --git a/bug-reports/FUZZ-ROUND3-SUMMARY.md b/bug-reports/FUZZ-ROUND3-SUMMARY.md new file mode 100644 index 000000000..3e7157f31 --- /dev/null +++ b/bug-reports/FUZZ-ROUND3-SUMMARY.md @@ -0,0 +1,218 @@ +# Fuzzer Round 3: Expanded Coverage Results + +**Date**: 2026-03-20 +**Fuzzer version**: v3 (35 families, 139 static tests, 7 heuristics) +**Branch**: `feature/agentic-fuzzing` + +## Results Summary + +| Metric | Value | +|--------|-------| +| Total tests | 139 | +| Executed | 129 | +| Passed | 82 | +| Warnings | 9 | +| **Failures** | **38** | +| Skipped | 10 | +| **Failure rate** | **29%** | + +## Issue Distribution + +| Issue Type | Count | Description | +|------------|-------|-------------| +| DATA_LOSS | 29 | Output content missing or mangled | +| EXIT_CODE_MISMATCH | 28 | RTK returns different exit code than raw command | +| STDERR_LOSS | 8 | Stderr content consumed by filter, not passed through | +| FORMAT_ALTERED | 3 | Machine-readable output format changed | +| JSON_MANGLED | 1 | Valid JSON input produces invalid JSON output | + +## New Bug Classes Discovered + +### FUZZ-006: Docker — All flags rejected by Clap (12 failures) + +**Severity**: HIGH +**Status**: OPEN +**Affected**: `docker ps`, `docker images` — every flag beyond the bare command + +RTK's Docker Clap schema defines zero extra args for `ps` and `images`. Any flag (`-a`, `-q`, `--format`, `--no-trunc`, `--filter`, `--digests`) causes Clap rejection (exit 2). + +```bash +docker ps -a # works +rtk docker ps -a # "error: unexpected argument '-a'" + +docker images --format json # works +rtk docker images --format json # "error: unexpected argument '--format'" +``` + +**Root cause**: `DockerCommands::Ps` and `DockerCommands::Images` have no `#[arg(trailing_var_arg)]` or extra flag definitions. Fixed-shape command only. + +**Impact**: Docker users can only use bare `docker ps` and `docker images` through RTK. All customization flags rejected. + +--- + +### FUZZ-007: pip — Format override + show/list broken (7 failures) + +**Severity**: HIGH +**Status**: OPEN +**Affected**: `pip list`, `pip show`, `pip list --outdated`, `pip list --not-required` + +Two distinct issues: + +**7a.** `pip list` forces `--format=json` internally, ignoring user's `--format=columns` or `--format=freeze`: +```bash +pip list --format=freeze # absl-py==2.3.1\n... +rtk pip list --format=freeze # error: unexpected argument '--format=freeze' +``` + +**7b.** `pip show ` exits 1 instead of 0: +```bash +pip show requests # Name: requests\nVersion: 2.32.3\n... (exit 0) +rtk pip show requests # (nothing or error) (exit 1) +``` + +**7c.** `pip list --not-required` rejected by Clap: +```bash +pip list --not-required # works (exit 0) +rtk pip list --not-required # error: unexpected argument (exit 2) +``` + +**Root cause**: pip module takes raw `args: &[String]` but list/outdated always force `--format=json`. Other subcommand args not validated against Clap properly. + +--- + +### FUZZ-008: npm — Hardcoded to `npm run` (3 failures) + +**Severity**: MEDIUM +**Status**: OPEN +**Affected**: `npm list`, `npm config`, and any npm subcommand that isn't `run` + +```bash +npm list --depth=0 # lists dependencies (exit 0) +rtk npm list --depth=0 # "npm ERR! Missing script: list" (exit 1) + +npm list --depth=0 --json # valid JSON output +rtk npm list --depth=0 --json # "npm ERR! Missing script: list" + mangled JSON +``` + +**Root cause**: `npm_cmd.rs` hardcodes `npm run` as the base command. ALL args are appended after `run`. So `rtk npm list` becomes `npm run list` which fails. + +**Impact**: Only `npm run + + + diff --git a/src/cargo_cmd.rs b/src/cargo_cmd.rs index ec6d82b11..8d0f8e4b9 100644 --- a/src/cargo_cmd.rs +++ b/src/cargo_cmd.rs @@ -57,9 +57,18 @@ where .unwrap_or(if output.status.success() { 0 } else { 1 }); let filtered = filter_fn(&raw); + // Preserve output channel: cargo clippy/check produce on stderr + let use_stderr = stdout.trim().is_empty() && !stderr.trim().is_empty(); + if let Some(hint) = crate::tee::tee_and_hint(&raw, &format!("cargo_{}", subcommand), exit_code) { - println!("{}\n{}", filtered, hint); + if use_stderr { + eprintln!("{}\n{}", filtered, hint); + } else { + println!("{}\n{}", filtered, hint); + } + } else if use_stderr { + eprintln!("{}", filtered); } else { println!("{}", filtered); } @@ -78,7 +87,60 @@ where Ok(()) } +/// Passthrough: run cargo subcommand and print raw output without filtering. +fn run_cargo_passthrough(subcommand: &str, args: &[String], verbose: u8) -> Result<()> { + let timer = tracking::TimedExecution::start(); + + let mut cmd = Command::new("cargo"); + cmd.arg(subcommand); + for arg in args { + cmd.arg(arg); + } + + if verbose > 0 { + eprintln!( + "Running (passthrough): cargo {} {}", + subcommand, + args.join(" ") + ); + } + + let output = cmd + .output() + .with_context(|| format!("Failed to run cargo {}", subcommand))?; + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + + if !stdout.is_empty() { + print!("{}", stdout); + } + if !stderr.trim().is_empty() { + eprint!("{}", stderr); + } + + timer.track_passthrough( + &format!("cargo {} {}", subcommand, args.join(" ")), + &format!("rtk cargo {} {}", subcommand, args.join(" ")), + ); + + let exit_code = output.status.code().unwrap_or(1); + if !output.status.success() { + std::process::exit(exit_code); + } + + Ok(()) +} + +/// Detect --message-format flag that changes cargo output to JSON/short — +/// must passthrough raw output to avoid breaking machine-readable consumers. +fn has_message_format_flag(args: &[String]) -> bool { + args.iter().any(|a| a.starts_with("--message-format")) +} + fn run_build(args: &[String], verbose: u8) -> Result<()> { + if has_message_format_flag(args) { + return run_cargo_passthrough("build", args, verbose); + } run_cargo_filtered("build", args, verbose, filter_cargo_build) } @@ -87,10 +149,16 @@ fn run_test(args: &[String], verbose: u8) -> Result<()> { } fn run_clippy(args: &[String], verbose: u8) -> Result<()> { + if has_message_format_flag(args) { + return run_cargo_passthrough("clippy", args, verbose); + } run_cargo_filtered("clippy", args, verbose, filter_cargo_clippy) } fn run_check(args: &[String], verbose: u8) -> Result<()> { + if has_message_format_flag(args) { + return run_cargo_passthrough("check", args, verbose); + } run_cargo_filtered("check", args, verbose, filter_cargo_build) } diff --git a/src/cc_economics.rs b/src/cc_economics.rs index b38bba2f9..cf135ac39 100644 --- a/src/cc_economics.rs +++ b/src/cc_economics.rs @@ -14,6 +14,7 @@ use crate::utils::{format_cpt, format_tokens, format_usd}; // ── Constants ── +#[allow(dead_code)] const BILLION: f64 = 1e9; // API pricing ratios (verified Feb 2026, consistent across Claude models <=200K context) diff --git a/src/ccusage.rs b/src/ccusage.rs index 822cca15c..77634810a 100644 --- a/src/ccusage.rs +++ b/src/ccusage.rs @@ -115,6 +115,7 @@ fn build_command() -> Option { } /// Check if ccusage CLI is available (binary or via npx) +#[allow(dead_code)] pub fn is_available() -> bool { build_command().is_some() } diff --git a/src/container.rs b/src/container.rs index 759154ba1..becbb159b 100644 --- a/src/container.rs +++ b/src/container.rs @@ -1,4 +1,5 @@ use crate::tracking; +use crate::utils; use anyhow::{Context, Result}; use std::ffi::OsString; use std::process::Command; @@ -15,8 +16,8 @@ pub enum ContainerCmd { pub fn run(cmd: ContainerCmd, args: &[String], verbose: u8) -> Result<()> { match cmd { - ContainerCmd::DockerPs => docker_ps(verbose), - ContainerCmd::DockerImages => docker_images(verbose), + ContainerCmd::DockerPs => docker_ps(args, verbose), + ContainerCmd::DockerImages => docker_images(args, verbose), ContainerCmd::DockerLogs => docker_logs(args, verbose), ContainerCmd::KubectlPods => kubectl_pods(args, verbose), ContainerCmd::KubectlServices => kubectl_services(args, verbose), @@ -24,23 +25,45 @@ pub fn run(cmd: ContainerCmd, args: &[String], verbose: u8) -> Result<()> { } } -fn docker_ps(_verbose: u8) -> Result<()> { +/// Format-changing flags for docker ps/images that should trigger passthrough. +const DOCKER_FORMAT_FLAGS: &[&str] = &["--format", "-q", "--quiet"]; + +fn docker_ps(args: &[String], verbose: u8) -> Result<()> { + // Format-changing flags → passthrough raw output + if utils::has_output_format_flag(args, DOCKER_FORMAT_FLAGS) { + return docker_passthrough_with_args("ps", args, verbose); + } + let timer = tracking::TimedExecution::start(); - let raw = Command::new("docker") - .args(["ps"]) + // Build raw command (for token tracking) — includes user's content flags + let mut raw_cmd = Command::new("docker"); + raw_cmd.arg("ps"); + for arg in args { + raw_cmd.arg(arg); + } + let raw = raw_cmd .output() .map(|o| String::from_utf8_lossy(&o.stdout).to_string()) .unwrap_or_default(); - let output = Command::new("docker") - .args([ - "ps", - "--format", - "{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}", - ]) - .output() - .context("Failed to run docker ps")?; + // Build filtered command — user's content flags + our format template + let mut cmd = Command::new("docker"); + cmd.args([ + "ps", + "--format", + "{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Image}}\t{{.Ports}}", + ]); + for arg in args { + cmd.arg(arg); + } + let output = cmd.output().context("Failed to run docker ps")?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + eprintln!("{}", stderr.trim()); + std::process::exit(output.status.code().unwrap_or(1)); + } let stdout = String::from_utf8_lossy(&output.stdout); let mut rtk = String::new(); @@ -60,7 +83,12 @@ fn docker_ps(_verbose: u8) -> Result<()> { if parts.len() >= 4 { let id = &parts[0][..12.min(parts[0].len())]; let name = parts[1]; - let short_image = parts.get(3).unwrap_or(&"").split('/').last().unwrap_or(""); + let short_image = parts + .get(3) + .unwrap_or(&"") + .split('/') + .next_back() + .unwrap_or(""); let ports = compact_ports(parts.get(4).unwrap_or(&"")); if ports == "-" { rtk.push_str(&format!(" {} {} ({})\n", id, name, short_image)); @@ -81,19 +109,36 @@ fn docker_ps(_verbose: u8) -> Result<()> { Ok(()) } -fn docker_images(_verbose: u8) -> Result<()> { +fn docker_images(args: &[String], verbose: u8) -> Result<()> { + // Format-changing flags → passthrough raw output + if utils::has_output_format_flag(args, DOCKER_FORMAT_FLAGS) { + return docker_passthrough_with_args("images", args, verbose); + } + let timer = tracking::TimedExecution::start(); - let raw = Command::new("docker") - .args(["images"]) + let mut raw_cmd = Command::new("docker"); + raw_cmd.arg("images"); + for arg in args { + raw_cmd.arg(arg); + } + let raw = raw_cmd .output() .map(|o| String::from_utf8_lossy(&o.stdout).to_string()) .unwrap_or_default(); - let output = Command::new("docker") - .args(["images", "--format", "{{.Repository}}:{{.Tag}}\t{{.Size}}"]) - .output() - .context("Failed to run docker images")?; + let mut cmd = Command::new("docker"); + cmd.args(["images", "--format", "{{.Repository}}:{{.Tag}}\t{{.Size}}"]); + for arg in args { + cmd.arg(arg); + } + let output = cmd.output().context("Failed to run docker images")?; + + if !output.status.success() { + let stderr = String::from_utf8_lossy(&output.stderr); + eprintln!("{}", stderr.trim()); + std::process::exit(output.status.code().unwrap_or(1)); + } let stdout = String::from_utf8_lossy(&output.stdout); let lines: Vec<&str> = stdout.lines().collect(); @@ -508,7 +553,7 @@ fn compact_ports(ports: &str) -> String { // Extract just the port numbers let port_nums: Vec<&str> = ports .split(',') - .filter_map(|p| p.split("->").next().and_then(|s| s.split(':').last())) + .filter_map(|p| p.split("->").next().and_then(|s| s.split(':').next_back())) .collect(); if port_nums.len() <= 3 { @@ -522,6 +567,35 @@ fn compact_ports(ports: &str) -> String { } } +/// Passthrough for docker subcommands with format-changing flags (e.g. `docker ps --format json`) +fn docker_passthrough_with_args(subcmd: &str, args: &[String], verbose: u8) -> Result<()> { + let timer = tracking::TimedExecution::start(); + + if verbose > 0 { + eprintln!( + "docker {} passthrough (format flag detected): {:?}", + subcmd, args + ); + } + let mut cmd = Command::new("docker"); + cmd.arg(subcmd); + for arg in args { + cmd.arg(arg); + } + let status = cmd.status().context("Failed to run docker")?; + + let args_str = args.join(" "); + timer.track_passthrough( + &format!("docker {} {}", subcmd, args_str), + &format!("rtk docker {} {} (passthrough)", subcmd, args_str), + ); + + if !status.success() { + std::process::exit(status.code().unwrap_or(1)); + } + Ok(()) +} + /// Runs an unsupported docker subcommand by passing it through directly pub fn run_docker_passthrough(args: &[OsString], verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); @@ -546,13 +620,80 @@ pub fn run_docker_passthrough(args: &[OsString], verbose: u8) -> Result<()> { Ok(()) } +/// Global compose flags that consume the next token as a value. +const COMPOSE_FLAGS_WITH_VALUE: &[&str] = &[ + "-f", + "--file", + "-p", + "--project-name", + "--project-directory", + "--profile", + "--env-file", + "--progress", + "--ansi", + "--parallel", +]; + +/// Split `docker compose ` into (global_flags, subcmd_and_rest). +/// Returns `None` for subcmd_and_rest when there is no subcommand (flags only). +fn split_compose_args(args: &[String]) -> (Vec, Vec) { + let mut global_flags: Vec = Vec::new(); + let mut i = 0; + + while i < args.len() { + let arg = &args[i]; + if COMPOSE_FLAGS_WITH_VALUE.contains(&arg.as_str()) { + global_flags.push(arg.clone()); + i += 1; + if i < args.len() { + global_flags.push(args[i].clone()); + } + } else if arg.starts_with('-') { + global_flags.push(arg.clone()); + } else { + // First non-flag: subcommand starts here + return (global_flags, args[i..].to_vec()); + } + i += 1; + } + + (global_flags, vec![]) +} + +/// Route `docker compose` args, splitting global flags from the subcommand. +/// Handles e.g. `docker compose -f custom.yml build svc` correctly. +pub fn run_compose(args: &[String], verbose: u8) -> Result<()> { + let (global_flags, subcmd_and_rest) = split_compose_args(args); + + if subcmd_and_rest.is_empty() { + let all: Vec = args.iter().map(OsString::from).collect(); + return run_compose_passthrough(&all, verbose); + } + + let subcmd = subcmd_and_rest[0].as_str(); + let sub_args = &subcmd_and_rest[1..]; + + match subcmd { + "ps" => run_compose_ps(&global_flags, verbose), + "logs" => run_compose_logs(&global_flags, sub_args.first().map(String::as_str), verbose), + "build" => run_compose_build(&global_flags, sub_args.first().map(String::as_str), verbose), + _ => { + let mut all: Vec = global_flags.iter().map(OsString::from).collect(); + all.extend(subcmd_and_rest.iter().map(OsString::from)); + run_compose_passthrough(&all, verbose) + } + } +} + /// Run `docker compose ps` with compact output -pub fn run_compose_ps(verbose: u8) -> Result<()> { +pub fn run_compose_ps(global_flags: &[String], verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); // Raw output for token tracking let raw_output = Command::new("docker") - .args(["compose", "ps"]) + .arg("compose") + .args(global_flags) + .arg("ps") .output() .context("Failed to run docker compose ps")?; @@ -565,8 +706,9 @@ pub fn run_compose_ps(verbose: u8) -> Result<()> { // Structured output for parsing (same pattern as docker_ps) let output = Command::new("docker") + .arg("compose") + .args(global_flags) .args([ - "compose", "ps", "--format", "{{.Name}}\t{{.Image}}\t{{.Status}}\t{{.Ports}}", @@ -592,11 +734,13 @@ pub fn run_compose_ps(verbose: u8) -> Result<()> { } /// Run `docker compose logs` with deduplication -pub fn run_compose_logs(service: Option<&str>, verbose: u8) -> Result<()> { +pub fn run_compose_logs(global_flags: &[String], service: Option<&str>, verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); let mut cmd = Command::new("docker"); - cmd.args(["compose", "logs", "--tail", "100"]); + cmd.arg("compose"); + cmd.args(global_flags); + cmd.args(["logs", "--tail", "100"]); if let Some(svc) = service { cmd.arg(svc); } @@ -630,11 +774,17 @@ pub fn run_compose_logs(service: Option<&str>, verbose: u8) -> Result<()> { } /// Run `docker compose build` with summary output -pub fn run_compose_build(service: Option<&str>, verbose: u8) -> Result<()> { +pub fn run_compose_build( + global_flags: &[String], + service: Option<&str>, + verbose: u8, +) -> Result<()> { let timer = tracking::TimedExecution::start(); let mut cmd = Command::new("docker"); - cmd.args(["compose", "build"]); + cmd.arg("compose"); + cmd.args(global_flags); + cmd.arg("build"); if let Some(svc) = service { cmd.arg(svc); } @@ -852,4 +1002,65 @@ api-1 | Connected to database"; let result = compact_ports("0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp, 0.0.0.0:9090->9090/tcp"); assert!(result.contains("..."), "should truncate for >3 ports"); } + + // ── split_compose_args ───────────────────────────────── + + fn s(v: &[&str]) -> Vec { + v.iter().map(|s| s.to_string()).collect() + } + + #[test] + fn test_split_compose_no_flags() { + let (flags, rest) = split_compose_args(&s(&["build", "web"])); + assert!(flags.is_empty()); + assert_eq!(rest, s(&["build", "web"])); + } + + #[test] + fn test_split_compose_f_flag_before_subcommand() { + // regression: docker compose -f custom.yml build + let (flags, rest) = split_compose_args(&s(&["-f", "custom.yml", "build"])); + assert_eq!(flags, s(&["-f", "custom.yml"])); + assert_eq!(rest, s(&["build"])); + } + + #[test] + fn test_split_compose_f_flag_with_service() { + // docker compose -f deploy/docker-compose.yml build svc + let (flags, rest) = + split_compose_args(&s(&["-f", "deploy/docker-compose.yml", "build", "svc"])); + assert_eq!(flags, s(&["-f", "deploy/docker-compose.yml"])); + assert_eq!(rest, s(&["build", "svc"])); + } + + #[test] + fn test_split_compose_multiple_global_flags() { + // docker compose -f a.yml -p myproject logs + let (flags, rest) = split_compose_args(&s(&["-f", "a.yml", "-p", "myproject", "logs"])); + assert_eq!(flags, s(&["-f", "a.yml", "-p", "myproject"])); + assert_eq!(rest, s(&["logs"])); + } + + #[test] + fn test_split_compose_boolean_flag() { + // docker compose --verbose ps + let (flags, rest) = split_compose_args(&s(&["--verbose", "ps"])); + assert_eq!(flags, s(&["--verbose"])); + assert_eq!(rest, s(&["ps"])); + } + + #[test] + fn test_split_compose_flags_only() { + // docker compose -f foo.yml (no subcommand) + let (flags, rest) = split_compose_args(&s(&["-f", "foo.yml"])); + assert_eq!(flags, s(&["-f", "foo.yml"])); + assert!(rest.is_empty()); + } + + #[test] + fn test_split_compose_ps_no_flags() { + let (flags, rest) = split_compose_args(&s(&["ps"])); + assert!(flags.is_empty()); + assert_eq!(rest, s(&["ps"])); + } } diff --git a/src/curl_cmd.rs b/src/curl_cmd.rs index 9fa0ba02e..e9e8198f3 100644 --- a/src/curl_cmd.rs +++ b/src/curl_cmd.rs @@ -1,4 +1,3 @@ -use crate::json_cmd; use crate::tracking; use crate::utils::truncate; use anyhow::{Context, Result}; @@ -47,37 +46,49 @@ pub fn run(args: &[String], verbose: u8) -> Result<()> { Ok(()) } +/// Max lines of pretty-printed JSON to show before truncating. +const MAX_JSON_LINES: usize = 80; +/// Max lines for non-JSON output. +const MAX_TEXT_LINES: usize = 30; + fn filter_curl_output(output: &str) -> String { let trimmed = output.trim(); - // Try JSON detection: starts with { or [ + // Try JSON detection: pretty-print with actual values preserved. + // Previous behaviour replaced values with types (schema mode) which + // destroyed data needed for API debugging. if (trimmed.starts_with('{') || trimmed.starts_with('[')) && (trimmed.ends_with('}') || trimmed.ends_with(']')) { - if let Ok(schema) = json_cmd::filter_json_string(trimmed, 5) { - return schema; + if let Ok(parsed) = serde_json::from_str::(trimmed) { + let pretty = serde_json::to_string_pretty(&parsed).unwrap_or_default(); + return truncate_lines(&pretty, MAX_JSON_LINES); } } // Not JSON: truncate long output - let lines: Vec<&str> = trimmed.lines().collect(); - if lines.len() > 30 { - let mut result: Vec<&str> = lines[..30].to_vec(); - result.push(""); - let msg = format!( - "... ({} more lines, {} bytes total)", - lines.len() - 30, - trimmed.len() - ); - return format!("{}\n{}", result.join("\n"), msg); - } + truncate_lines(trimmed, MAX_TEXT_LINES) +} - // Short output: return as-is but truncate long lines - lines - .iter() - .map(|l| truncate(l, 200)) - .collect::>() - .join("\n") +/// Keep at most `max` lines, appending a summary when truncated. +/// Long individual lines are capped at 200 chars. +fn truncate_lines(text: &str, max: usize) -> String { + let lines: Vec<&str> = text.lines().collect(); + if lines.len() > max { + let kept: Vec = lines[..max].iter().map(|l| truncate(l, 200)).collect(); + format!( + "{}\n\n... ({} more lines, {} bytes total)", + kept.join("\n"), + lines.len() - max, + text.len() + ) + } else { + lines + .iter() + .map(|l| truncate(l, 200)) + .collect::>() + .join("\n") + } } #[cfg(test)] @@ -85,19 +96,33 @@ mod tests { use super::*; #[test] - fn test_filter_curl_json() { + fn test_filter_curl_json_preserves_values() { let output = r#"{"name": "test", "count": 42, "items": [1, 2, 3]}"#; let result = filter_curl_output(output); - assert!(result.contains("name")); - assert!(result.contains("string")); - assert!(result.contains("int")); + // Must preserve actual values — not replace with types + assert!(result.contains("\"test\""), "should keep string value"); + assert!(result.contains("42"), "should keep numeric value"); + assert!(result.contains("name"), "should keep key name"); + assert!(!result.contains(": string"), "must NOT schema-ify values"); + assert!(!result.contains(": int"), "must NOT schema-ify values"); } #[test] - fn test_filter_curl_json_array() { - let output = r#"[{"id": 1}, {"id": 2}]"#; + fn test_filter_curl_json_array_preserves_values() { + let output = r#"[{"id": 1, "title": "hello"}, {"id": 2, "title": "world"}]"#; let result = filter_curl_output(output); - assert!(result.contains("id")); + assert!(result.contains("\"hello\""), "should keep string values"); + assert!(result.contains("2"), "should keep numeric values"); + } + + #[test] + fn test_filter_curl_json_pretty_prints() { + let output = r#"{"a":1,"b":"two"}"#; + let result = filter_curl_output(output); + // Pretty-printed should have newlines + assert!(result.contains('\n'), "should be multi-line"); + assert!(result.contains("\"a\""), "should keep key"); + assert!(result.contains("\"two\""), "should keep value"); } #[test] @@ -117,4 +142,20 @@ mod tests { assert!(result.contains("Line 29")); assert!(result.contains("more lines")); } + + #[test] + fn test_filter_curl_large_json_truncated() { + // Build a JSON object with many keys to exceed MAX_JSON_LINES + let mut obj = serde_json::Map::new(); + for i in 0..200 { + obj.insert( + format!("key_{}", i), + serde_json::Value::String(format!("value_{}", i)), + ); + } + let output = serde_json::to_string(&obj).unwrap(); + let result = filter_curl_output(&output); + assert!(result.contains("more lines"), "should truncate large JSON"); + assert!(result.contains("key_0"), "should keep early keys"); + } } diff --git a/src/diff_cmd.rs b/src/diff_cmd.rs index 136082540..769dc18ae 100644 --- a/src/diff_cmd.rs +++ b/src/diff_cmd.rs @@ -1,6 +1,6 @@ use crate::tracking; use crate::utils::truncate; -use anyhow::Result; +use anyhow::{Context, Result}; use std::fs; use std::path::Path; @@ -30,7 +30,7 @@ pub fn run(file1: &Path, file2: &Path, verbose: u8) -> Result<()> { &raw, &rtk, ); - return Ok(()); + return Ok(()); // exit 0: files identical } rtk.push_str(&format!("📊 {} → {}\n", file1.display(), file2.display())); @@ -62,6 +62,58 @@ pub fn run(file1: &Path, file2: &Path, verbose: u8) -> Result<()> { &raw, &rtk, ); + + // Match diff convention: exit 1 when files differ + std::process::exit(1); +} + +/// Run diff -q (brief mode): passthrough to system diff +pub fn run_brief(file1: &Path, file2: Option<&Path>, verbose: u8) -> Result<()> { + let timer = tracking::TimedExecution::start(); + + let mut cmd = std::process::Command::new("diff"); + cmd.arg("-q"); + cmd.arg(file1); + if let Some(f2) = file2 { + cmd.arg(f2); + } + + if verbose > 0 { + eprintln!( + "Running: diff -q {} {}", + file1.display(), + file2.map(|f| f.display().to_string()).unwrap_or_default() + ); + } + + let output = cmd.output().context("Failed to run diff -q")?; + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + + if !stdout.is_empty() { + print!("{}", stdout); + } + if !stderr.trim().is_empty() { + eprint!("{}", stderr); + } + + timer.track_passthrough( + &format!( + "diff -q {} {}", + file1.display(), + file2.map(|f| f.display().to_string()).unwrap_or_default() + ), + &format!( + "rtk diff -q {} {}", + file1.display(), + file2.map(|f| f.display().to_string()).unwrap_or_default() + ), + ); + + let exit_code = output.status.code().unwrap_or(1); + if !output.status.success() { + std::process::exit(exit_code); + } Ok(()) } diff --git a/src/discover/provider.rs b/src/discover/provider.rs index e9218b2db..ae0852d2b 100644 --- a/src/discover/provider.rs +++ b/src/discover/provider.rs @@ -18,6 +18,7 @@ pub struct ExtractedCommand { /// Whether the tool_result indicated an error pub is_error: bool, /// Chronological sequence index within the session + #[allow(dead_code)] pub sequence_index: usize, } @@ -347,7 +348,7 @@ mod tests { let cmds = provider.extract_commands(jsonl.path()).unwrap(); assert_eq!(cmds.len(), 1); assert_eq!(cmds[0].command, "git commit --ammend"); - assert_eq!(cmds[0].is_error, true); + assert!(cmds[0].is_error); assert!(cmds[0].output_content.is_some()); assert_eq!( cmds[0].output_content.as_ref().unwrap(), @@ -365,8 +366,8 @@ mod tests { let provider = ClaudeProvider; let cmds = provider.extract_commands(jsonl.path()).unwrap(); assert_eq!(cmds.len(), 2); - assert_eq!(cmds[0].is_error, false); - assert_eq!(cmds[1].is_error, true); + assert!(!cmds[0].is_error); + assert!(cmds[1].is_error); } #[test] diff --git a/src/discover/report.rs b/src/discover/report.rs index fdc164275..a72ed90a2 100644 --- a/src/discover/report.rs +++ b/src/discover/report.rs @@ -143,7 +143,7 @@ pub fn format_text(report: &DiscoverReport, limit: usize, verbose: bool) -> Stri out.push_str(&"-".repeat(52)); out.push('\n'); - out.push_str("-> github.com/rtk-ai/rtk/issues\n"); + out.push_str("-> github.com/algolia/rtk/issues\n"); } out.push_str("\n~estimated from tool_result output sizes\n"); diff --git a/src/find_cmd.rs b/src/find_cmd.rs index 679288eb8..bcafca5db 100644 --- a/src/find_cmd.rs +++ b/src/find_cmd.rs @@ -1,5 +1,5 @@ use crate::tracking; -use anyhow::Result; +use anyhow::{Context, Result}; use ignore::WalkBuilder; use std::collections::HashMap; use std::path::Path; @@ -57,7 +57,7 @@ pub fn run( }; let ft = entry.file_type(); - let is_dir = ft.as_ref().map_or(false, |t| t.is_dir()); + let is_dir = ft.as_ref().is_some_and(|t| t.is_dir()); // Filter by type if want_dirs && !is_dir { @@ -202,6 +202,68 @@ pub fn run( Ok(()) } +/// System-find predicates that indicate the user wants system find, not RTK's glob finder. +const FIND_PREDICATES: &[&str] = &[ + "-name", + "-iname", + "-type", + "-maxdepth", + "-mindepth", + "-exec", + "-printf", + "-print0", + "-regex", + "-path", + "-perm", + "-newer", + "-size", + "-mtime", + "-atime", + "-ctime", + "-delete", + "-ls", + "-print", + "-quit", + "-prune", + "-empty", + "-readable", + "-writable", + "-executable", + "-user", + "-group", +]; + +/// Check if extra_args contain system-find predicates (e.g. -name, -type, -maxdepth) +pub fn has_system_find_predicates(extra_args: &[String]) -> bool { + extra_args + .iter() + .any(|a| FIND_PREDICATES.contains(&a.as_str())) +} + +/// Delegate to system find when predicates are detected. +/// Takes raw args as passed by user (e.g. ["..", "-maxdepth", "2", "-name", "*.rs"]) +pub fn run_system_find_raw(args: &[String], _verbose: u8) -> Result<()> { + let timer = tracking::TimedExecution::start(); + + let mut cmd = std::process::Command::new("find"); + for arg in args { + cmd.arg(arg); + } + + let status = cmd.status().context("Failed to run system find")?; + + let args_str = args.join(" "); + timer.track_passthrough( + &format!("find {}", args_str), + &format!("rtk find {} (passthrough to system find)", args_str), + ); + + if !status.success() { + std::process::exit(status.code().unwrap_or(1)); + } + Ok(()) +} + #[cfg(test)] mod tests { use super::*; diff --git a/src/format_cmd.rs b/src/format_cmd.rs index 10d756ae0..232e17a55 100644 --- a/src/format_cmd.rs +++ b/src/format_cmd.rs @@ -169,7 +169,7 @@ fn filter_black_output(output: &str) -> String { // Split by comma to handle both parts for part in trimmed.split(',') { let part_lower = part.to_lowercase(); - let words: Vec<&str> = part.trim().split_whitespace().collect(); + let words: Vec<&str> = part.split_whitespace().collect(); if part_lower.contains("would be reformatted") { // Parse "X file(s) would be reformatted" diff --git a/src/gain.rs b/src/gain.rs index f715296d7..e9bb507b3 100644 --- a/src/gain.rs +++ b/src/gain.rs @@ -6,6 +6,7 @@ use colored::Colorize; // added: terminal colors use serde::Serialize; use std::io::IsTerminal; // added: TTY detection for graceful degradation +#[allow(clippy::too_many_arguments)] pub fn run( graph: bool, history: bool, diff --git a/src/gh_cmd.rs b/src/gh_cmd.rs index f52ed80d8..34ea1105f 100644 --- a/src/gh_cmd.rs +++ b/src/gh_cmd.rs @@ -110,6 +110,15 @@ fn filter_markdown_segment(text: &str) -> String { /// Run a gh command with token-optimized output pub fn run(subcommand: &str, args: &[String], verbose: u8, ultra_compact: bool) -> Result<()> { + // When --json is explicitly requested, the caller wants structured output (for jq, python, etc.) + // Passthrough verbatim — filtering would break downstream JSON consumers. + if args + .iter() + .any(|a| a == "--json" || a.starts_with("--json=")) + { + return run_passthrough("gh", subcommand, args); + } + match subcommand { "pr" => run_pr(args, verbose, ultra_compact), "issue" => run_issue(args, verbose, ultra_compact), @@ -1058,7 +1067,9 @@ fn pr_diff(args: &[String], _verbose: u8) -> Result<()> { print!("{}", msg); msg.to_string() } else { - let compacted = git::compact_diff(&raw, 100); + // PR diffs need more room than local diffs — 100 silently truncated + // multi-file PRs, causing DATA_LOSS for review agents (FUZZ-009/gh) + let compacted = git::compact_diff(&raw, 500); println!("{}", compacted); compacted }; @@ -1455,4 +1466,67 @@ ___ assert!(result.contains("## Test Plan")); assert!(result.contains("Filter HTML comments")); } + + // Regression: --json flag must trigger passthrough (no filtering) + #[test] + fn test_json_flag_detected() { + let args_json: Vec = vec!["list".into(), "--json".into(), "number,title".into()]; + assert!(args_json + .iter() + .any(|a| a == "--json" || a.starts_with("--json="))); + + let args_json_eq: Vec = vec!["list".into(), "--json=number,title".into()]; + assert!(args_json_eq + .iter() + .any(|a| a == "--json" || a.starts_with("--json="))); + + let args_no_json: Vec = vec!["list".into(), "--limit".into(), "5".into()]; + assert!(!args_no_json + .iter() + .any(|a| a == "--json" || a.starts_with("--json="))); + } + + // --- FUZZ-009/gh regression: pr diff must not silently truncate multi-file PRs --- + + #[test] + fn test_pr_diff_not_truncated_at_100_lines() { + // Simulate a 5-file PR diff that generates ~250 compacted lines + let mut diff = String::new(); + for i in 0..5 { + diff.push_str(&format!( + "diff --git a/src/file{}.rs b/src/file{}.rs\n", + i, i + )); + diff.push_str(&format!("--- a/src/file{}.rs\n", i)); + diff.push_str(&format!("+++ b/src/file{}.rs\n", i)); + for h in 0..3 { + diff.push_str(&format!( + "@@ -{},10 +{},12 @@ fn func{}() {{\n", + h * 10, + h * 10, + h + )); + for l in 0..15 { + diff.push_str(&format!("+ let x{} = {};\n", l, l)); + } + } + } + + // With old limit of 100, this would truncate after ~2 files + let compacted = git::compact_diff(&diff, 500); + + // All 5 files must appear in output + for i in 0..5 { + assert!( + compacted.contains(&format!("file{}.rs", i)), + "file{}.rs missing from compacted diff — truncated too early", + i + ); + } + // Should NOT contain the truncation marker + assert!( + !compacted.contains("more changes truncated"), + "5-file PR diff should not be truncated at max_lines=500" + ); + } } diff --git a/src/git.rs b/src/git.rs index 3709e79f0..a8ced51df 100644 --- a/src/git.rs +++ b/src/git.rs @@ -19,8 +19,33 @@ pub enum GitCommand { Worktree, } -pub fn run(cmd: GitCommand, args: &[String], max_lines: Option, verbose: u8) -> Result<()> { - match cmd { +/// Build a `Command` for git, prepending `-C ` when a directory override is active. +/// +/// Every git invocation in this module MUST use `git_cmd()` instead of `Command::new("git")` +/// so that `-C` is threaded through consistently. +fn git_cmd() -> Command { + let mut cmd = Command::new("git"); + if let Some(dir) = GIT_DIRECTORY.with(|d| d.borrow().clone()) { + cmd.arg("-C").arg(dir); + } + cmd +} + +use std::cell::RefCell; + +thread_local! { + static GIT_DIRECTORY: RefCell> = const { RefCell::new(None) }; +} + +pub fn run( + cmd: GitCommand, + args: &[String], + max_lines: Option, + verbose: u8, + directory: Option<&str>, +) -> Result<()> { + GIT_DIRECTORY.with(|d| *d.borrow_mut() = directory.map(|s| s.to_string())); + let result = match cmd { GitCommand::Diff => run_diff(args, max_lines, verbose), GitCommand::Log => run_log(args, max_lines, verbose), GitCommand::Status => run_status(args, verbose), @@ -33,23 +58,30 @@ pub fn run(cmd: GitCommand, args: &[String], max_lines: Option, verbose: GitCommand::Fetch => run_fetch(args, verbose), GitCommand::Stash { subcommand } => run_stash(subcommand.as_deref(), args, verbose), GitCommand::Worktree => run_worktree(args, verbose), - } + }; + GIT_DIRECTORY.with(|d| *d.borrow_mut() = None); + result } fn run_diff(args: &[String], max_lines: Option, verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); - // Check if user wants stat output + // Check if user wants stat output or a format-changing flag let wants_stat = args .iter() .any(|arg| arg == "--stat" || arg == "--numstat" || arg == "--shortstat"); + // Flags that produce non-standard diff output — passthrough verbatim + let wants_name_only = args + .iter() + .any(|arg| arg == "--name-only" || arg == "--name-status"); + // Check if user wants compact diff (default RTK behavior) let wants_compact = !args.iter().any(|arg| arg == "--no-compact"); - if wants_stat || !wants_compact { + if wants_stat || wants_name_only || !wants_compact { // User wants stat or explicitly no compacting - pass through directly - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("diff"); for arg in args { cmd.arg(arg); @@ -77,7 +109,7 @@ fn run_diff(args: &[String], max_lines: Option, verbose: u8) -> Result<() } // Default RTK behavior: stat first, then compacted diff - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("diff").arg("--stat"); for arg in args { @@ -95,7 +127,7 @@ fn run_diff(args: &[String], max_lines: Option, verbose: u8) -> Result<() println!("{}", stat_stdout.trim()); // Now get actual diff but compact it - let mut diff_cmd = Command::new("git"); + let mut diff_cmd = git_cmd(); diff_cmd.arg("diff"); for arg in args { diff_cmd.arg(arg); @@ -126,7 +158,7 @@ fn run_diff(args: &[String], max_lines: Option, verbose: u8) -> Result<() fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); - // If user wants --stat or --format only, pass through + // If user wants specific output format, pass through verbatim let wants_stat_only = args .iter() .any(|arg| arg == "--stat" || arg == "--numstat" || arg == "--shortstat"); @@ -135,8 +167,15 @@ fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<() .iter() .any(|arg| arg.starts_with("--pretty") || arg.starts_with("--format")); - if wants_stat_only || wants_format { - let mut cmd = Command::new("git"); + let wants_detail = args.iter().any(|arg| { + matches!( + arg.as_str(), + "--name-only" | "--name-status" | "--raw" | "--no-patch" | "--patch" | "-p" + ) + }); + + if wants_stat_only || wants_format || wants_detail { + let mut cmd = git_cmd(); cmd.arg("show"); for arg in args { cmd.arg(arg); @@ -161,7 +200,7 @@ fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<() } // Get raw output for tracking - let mut raw_cmd = Command::new("git"); + let mut raw_cmd = git_cmd(); raw_cmd.arg("show"); for arg in args { raw_cmd.arg(arg); @@ -172,7 +211,7 @@ fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<() .unwrap_or_default(); // Step 1: one-line commit summary - let mut summary_cmd = Command::new("git"); + let mut summary_cmd = git_cmd(); summary_cmd.args(["show", "--no-patch", "--pretty=format:%h %s (%ar) <%an>"]); for arg in args { summary_cmd.arg(arg); @@ -187,7 +226,7 @@ fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<() println!("{}", summary.trim()); // Step 2: --stat summary - let mut stat_cmd = Command::new("git"); + let mut stat_cmd = git_cmd(); stat_cmd.args(["show", "--stat", "--pretty=format:"]); for arg in args { stat_cmd.arg(arg); @@ -200,7 +239,7 @@ fn run_show(args: &[String], max_lines: Option, verbose: u8) -> Result<() } // Step 3: compacted diff - let mut diff_cmd = Command::new("git"); + let mut diff_cmd = git_cmd(); diff_cmd.args(["show", "--pretty=format:"]); for arg in args { diff_cmd.arg(arg); @@ -298,21 +337,74 @@ pub(crate) fn compact_diff(diff: &str, max_lines: usize) -> String { fn run_log(args: &[String], _max_lines: Option, verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("log"); - // Check if user provided format flags - let has_format_flag = args.iter().any(|arg| { - arg.starts_with("--oneline") || arg.starts_with("--pretty") || arg.starts_with("--format") + // Check if user provided format flags — if so, they want exact control. + // Passthrough: no RTK format injection, no --no-merges, no output filtering. + let has_format_flag = args + .iter() + .any(|arg| arg.starts_with("--pretty") || arg.starts_with("--format")); + // --oneline is a format shorthand but produces simple output RTK can still compress + let has_oneline = args.iter().any(|arg| arg == "--oneline"); + + // --graph, --stat, --numstat, --shortstat, --patch, --raw, --name-only, --name-status + // all produce output that RTK's compact filter would mangle + let has_detail_flag = args.iter().any(|arg| { + matches!( + arg.as_str(), + "--graph" + | "--stat" + | "--numstat" + | "--shortstat" + | "--patch" + | "-p" + | "--raw" + | "--name-only" + | "--name-status" + ) }); + // When user specifies format or detail flags, passthrough to git directly + if has_format_flag || has_detail_flag { + for arg in args { + cmd.arg(arg); + } + + let output = cmd.output().context("Failed to run git log")?; + let exit_code = output.status.code().unwrap_or(1); + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + + if !stderr.is_empty() { + eprint!("{}", stderr); + } + if !stdout.is_empty() { + print!("{}", stdout); + } + + timer.track( + &format!("git log {}", args.join(" ")), + "rtk git log (passthrough)", + &stdout, + &stdout, + ); + + if exit_code != 0 { + std::process::exit(exit_code); + } + return Ok(()); + } + + // --- Default RTK compact mode (no user format flags) --- + // Check if user provided limit flag - let has_limit_flag = args.iter().any(|arg| { - arg.starts_with('-') && arg.chars().nth(1).map_or(false, |c| c.is_ascii_digit()) - }); + let has_limit_flag = args + .iter() + .any(|arg| arg.starts_with('-') && arg.chars().nth(1).is_some_and(|c| c.is_ascii_digit())); - // Apply RTK defaults only if user didn't specify them - if !has_format_flag { + // Apply RTK defaults + if !has_oneline { cmd.args(["--pretty=format:%h %s (%ar) <%an>"]); } @@ -320,10 +412,9 @@ fn run_log(args: &[String], _max_lines: Option, verbose: u8) -> Result<() cmd.arg("-10"); 10 } else { - // Extract limit from args if provided args.iter() .find(|arg| { - arg.starts_with('-') && arg.chars().nth(1).map_or(false, |c| c.is_ascii_digit()) + arg.starts_with('-') && arg.chars().nth(1).is_some_and(|c| c.is_ascii_digit()) }) .and_then(|arg| arg[1..].parse::().ok()) .unwrap_or(10) @@ -337,7 +428,6 @@ fn run_log(args: &[String], _max_lines: Option, verbose: u8) -> Result<() cmd.arg("--no-merges"); } - // Pass all user arguments for arg in args { cmd.arg(arg); } @@ -347,7 +437,6 @@ fn run_log(args: &[String], _max_lines: Option, verbose: u8) -> Result<() if !output.status.success() { let stderr = String::from_utf8_lossy(&output.stderr); eprintln!("{}", stderr); - // Propagate git's exit code std::process::exit(output.status.code().unwrap_or(1)); } @@ -357,7 +446,6 @@ fn run_log(args: &[String], _max_lines: Option, verbose: u8) -> Result<() eprintln!("Git log output:"); } - // Post-process: truncate long messages, cap lines let filtered = filter_log_output(&stdout, limit); println!("{}", filtered); @@ -528,7 +616,7 @@ fn run_status(args: &[String], verbose: u8) -> Result<()> { // If user provided flags, apply minimal filtering if !args.is_empty() { - let output = Command::new("git") + let output = git_cmd() .arg("status") .args(args) .output() @@ -557,13 +645,13 @@ fn run_status(args: &[String], verbose: u8) -> Result<()> { // Default RTK compact mode (no args provided) // Get raw git status for tracking - let raw_output = Command::new("git") + let raw_output = git_cmd() .args(["status"]) .output() .map(|o| String::from_utf8_lossy(&o.stdout).to_string()) .unwrap_or_default(); - let output = Command::new("git") + let output = git_cmd() .args(["status", "--porcelain", "-b"]) .output() .context("Failed to run git status")?; @@ -588,7 +676,7 @@ fn run_status(args: &[String], verbose: u8) -> Result<()> { fn run_add(args: &[String], verbose: u8) -> Result<()> { let timer = tracking::TimedExecution::start(); - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("add"); // Pass all arguments directly to git (flags like -A, -p, --all, etc.) @@ -614,7 +702,7 @@ fn run_add(args: &[String], verbose: u8) -> Result<()> { if output.status.success() { // Count what was added - let status_output = Command::new("git") + let status_output = git_cmd() .args(["diff", "--cached", "--stat", "--shortstat"]) .output() .context("Failed to check staged files")?; @@ -658,7 +746,7 @@ fn run_add(args: &[String], verbose: u8) -> Result<()> { } fn build_commit_command(messages: &[String]) -> Command { - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("commit"); for msg in messages { cmd.args(["-m", msg]); @@ -692,7 +780,7 @@ fn run_commit(messages: &[String], verbose: u8) -> Result<()> { // Extract commit hash from output like "[main abc1234] message" let compact = if let Some(line) = stdout.lines().next() { if let Some(hash_start) = line.find(' ') { - let hash = line[1..hash_start].split(' ').last().unwrap_or(""); + let hash = line[1..hash_start].split(' ').next_back().unwrap_or(""); if !hash.is_empty() && hash.len() >= 7 { format!("ok ✓ {}", &hash[..7.min(hash.len())]) } else { @@ -738,7 +826,7 @@ fn run_push(args: &[String], verbose: u8) -> Result<()> { eprintln!("git push"); } - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("push"); for arg in args { cmd.arg(arg); @@ -799,7 +887,7 @@ fn run_pull(args: &[String], verbose: u8) -> Result<()> { eprintln!("git pull"); } - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("pull"); for arg in args { cmd.arg(arg); @@ -907,7 +995,7 @@ fn run_branch(args: &[String], verbose: u8) -> Result<()> { // Write operation: action flags, or positional args without list flags (= branch creation) if has_action_flag || (has_positional_arg && !has_list_flag) { - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("branch"); for arg in args { cmd.arg(arg); @@ -945,8 +1033,44 @@ fn run_branch(args: &[String], verbose: u8) -> Result<()> { return Ok(()); } + // Detect flags that change output format — must passthrough verbatim + let has_format_flag = args + .iter() + .any(|a| a.starts_with("--format") || a.starts_with("--sort")); + + if has_format_flag { + let mut cmd = git_cmd(); + cmd.arg("branch"); + for arg in args { + cmd.arg(arg); + } + let output = cmd.output().context("Failed to run git branch")?; + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + if !stdout.is_empty() { + print!("{}", stdout); + } + if !stderr.trim().is_empty() { + eprint!("{}", stderr); + } + timer.track_passthrough( + &format!("git branch {}", args.join(" ")), + &format!("rtk git branch {}", args.join(" ")), + ); + let code = output.status.code().unwrap_or(1); + if code != 0 { + std::process::exit(code); + } + return Ok(()); + } + + // Detect if user explicitly asked for remotes + let user_wants_remotes = args + .iter() + .any(|a| a == "-a" || a == "--all" || a == "-r" || a == "--remotes"); + // List mode: show compact branch list - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("branch"); if !has_list_flag { cmd.arg("-a"); @@ -960,7 +1084,7 @@ fn run_branch(args: &[String], verbose: u8) -> Result<()> { let stdout = String::from_utf8_lossy(&output.stdout); let raw = stdout.to_string(); - let filtered = filter_branch_output(&stdout); + let filtered = filter_branch_output(&stdout, user_wants_remotes); println!("{}", filtered); timer.track( @@ -973,7 +1097,7 @@ fn run_branch(args: &[String], verbose: u8) -> Result<()> { Ok(()) } -fn filter_branch_output(output: &str) -> String { +fn filter_branch_output(output: &str, show_all_remotes: bool) -> String { let mut current = String::new(); let mut local: Vec = Vec::new(); let mut remote: Vec = Vec::new(); @@ -1008,18 +1132,29 @@ fn filter_branch_output(output: &str) -> String { } if !remote.is_empty() { - // Filter out remotes that already exist locally - let remote_only: Vec<&String> = remote - .iter() - .filter(|r| *r != ¤t && !local.contains(r)) - .collect(); - if !remote_only.is_empty() { - result.push(format!(" remote-only ({}):", remote_only.len())); - for b in remote_only.iter().take(10) { + if show_all_remotes { + // User explicitly asked for remotes — show all without dedup + result.push(format!(" remote ({}):", remote.len())); + for b in remote.iter().take(20) { result.push(format!(" {}", b)); } - if remote_only.len() > 10 { - result.push(format!(" ... +{} more", remote_only.len() - 10)); + if remote.len() > 20 { + result.push(format!(" ... +{} more", remote.len() - 20)); + } + } else { + // RTK auto-added -a — show only remote-only branches (dedup against local) + let remote_only: Vec<&String> = remote + .iter() + .filter(|r| *r != ¤t && !local.contains(r)) + .collect(); + if !remote_only.is_empty() { + result.push(format!(" remote-only ({}):", remote_only.len())); + for b in remote_only.iter().take(10) { + result.push(format!(" {}", b)); + } + if remote_only.len() > 10 { + result.push(format!(" ... +{} more", remote_only.len() - 10)); + } } } } @@ -1034,7 +1169,7 @@ fn run_fetch(args: &[String], verbose: u8) -> Result<()> { eprintln!("git fetch"); } - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("fetch"); for arg in args { cmd.arg(arg); @@ -1080,7 +1215,7 @@ fn run_stash(subcommand: Option<&str>, args: &[String], verbose: u8) -> Result<( match subcommand { Some("list") => { - let output = Command::new("git") + let output = git_cmd() .args(["stash", "list"]) .output() .context("Failed to run git stash list")?; @@ -1099,7 +1234,7 @@ fn run_stash(subcommand: Option<&str>, args: &[String], verbose: u8) -> Result<( timer.track("git stash list", "rtk git stash list", &raw, &filtered); } Some("show") => { - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.args(["stash", "show", "-p"]); for arg in args { cmd.arg(arg); @@ -1122,7 +1257,7 @@ fn run_stash(subcommand: Option<&str>, args: &[String], verbose: u8) -> Result<( } Some("pop") | Some("apply") | Some("drop") | Some("push") => { let sub = subcommand.unwrap(); - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.args(["stash", sub]); for arg in args { cmd.arg(arg); @@ -1153,7 +1288,7 @@ fn run_stash(subcommand: Option<&str>, args: &[String], verbose: u8) -> Result<( } _ => { // Default: git stash (push) - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("stash"); for arg in args { cmd.arg(arg); @@ -1222,7 +1357,7 @@ fn run_worktree(args: &[String], verbose: u8) -> Result<()> { }); if has_action { - let mut cmd = Command::new("git"); + let mut cmd = git_cmd(); cmd.arg("worktree"); for arg in args { cmd.arg(arg); @@ -1257,7 +1392,7 @@ fn run_worktree(args: &[String], verbose: u8) -> Result<()> { } // Default: list mode - let output = Command::new("git") + let output = git_cmd() .args(["worktree", "list"]) .output() .context("Failed to run git worktree list")?; @@ -1300,16 +1435,14 @@ fn filter_worktree_list(output: &str) -> String { } /// Runs an unsupported git subcommand by passing it through directly -pub fn run_passthrough(args: &[OsString], verbose: u8) -> Result<()> { +pub fn run_passthrough(args: &[OsString], verbose: u8, directory: Option<&str>) -> Result<()> { + GIT_DIRECTORY.with(|d| *d.borrow_mut() = directory.map(|s| s.to_string())); let timer = tracking::TimedExecution::start(); if verbose > 0 { eprintln!("git passthrough: {:?}", args); } - let status = Command::new("git") - .args(args) - .status() - .context("Failed to run git")?; + let status = git_cmd().args(args).status().context("Failed to run git")?; let args_str = tracking::args_display(args); timer.track_passthrough( @@ -1343,9 +1476,9 @@ mod tests { } #[test] - fn test_filter_branch_output() { + fn test_filter_branch_output_dedup() { let output = "* main\n feature/auth\n fix/bug-123\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n remotes/origin/feature/auth\n remotes/origin/release/v2\n"; - let result = filter_branch_output(output); + let result = filter_branch_output(output, false); assert!(result.contains("* main")); assert!(result.contains("feature/auth")); assert!(result.contains("fix/bug-123")); @@ -1354,10 +1487,24 @@ mod tests { assert!(result.contains("release/v2")); } + #[test] + fn test_filter_branch_output_show_all_remotes() { + let output = "* main\n feature/auth\n fix/bug-123\n remotes/origin/HEAD -> origin/main\n remotes/origin/main\n remotes/origin/feature/auth\n remotes/origin/release/v2\n"; + let result = filter_branch_output(output, true); + assert!(result.contains("* main")); + // When user passes -a, ALL remotes shown (no dedup) + assert!(result.contains("remote (3):")); + assert!(result.contains("main")); + assert!(result.contains("feature/auth")); + assert!(result.contains("release/v2")); + // Should NOT say "remote-only" + assert!(!result.contains("remote-only")); + } + #[test] fn test_filter_branch_no_remotes() { let output = "* main\n develop\n"; - let result = filter_branch_output(output); + let result = filter_branch_output(output, false); assert!(result.contains("* main")); assert!(result.contains("develop")); assert!(!result.contains("remote-only")); @@ -1564,7 +1711,7 @@ no changes added to commit (use "git add" and/or "git commit -a") // Create branch via run_branch run_branch(&[branch.to_string()], 0).expect("run_branch should succeed"); // Verify it exists - let output = Command::new("git") + let output = git_cmd() .args(["branch", "--list", branch]) .output() .expect("git branch --list should work"); @@ -1575,7 +1722,7 @@ no changes added to commit (use "git add" and/or "git commit -a") branch ); // Cleanup - let _ = Command::new("git").args(["branch", "-d", branch]).output(); + let _ = git_cmd().args(["branch", "-d", branch]).output(); } /// Regression test: `git branch ` must create from commit. @@ -1585,7 +1732,7 @@ no changes added to commit (use "git add" and/or "git commit -a") let branch = "test-rtk-create-from-commit"; run_branch(&[branch.to_string(), "HEAD".to_string()], 0) .expect("run_branch with start-point should succeed"); - let output = Command::new("git") + let output = git_cmd() .args(["branch", "--list", branch]) .output() .expect("git branch --list should work"); @@ -1595,7 +1742,7 @@ no changes added to commit (use "git add" and/or "git commit -a") "Branch '{}' was not created from commit.", branch ); - let _ = Command::new("git").args(["branch", "-d", branch]).output(); + let _ = git_cmd().args(["branch", "-d", branch]).output(); } #[test] diff --git a/src/golangci_cmd.rs b/src/golangci_cmd.rs index ca55a0ce5..ab3176f88 100644 --- a/src/golangci_cmd.rs +++ b/src/golangci_cmd.rs @@ -9,8 +9,10 @@ use std::process::Command; struct Position { #[serde(rename = "Filename")] filename: String, + #[allow(dead_code)] #[serde(rename = "Line")] line: usize, + #[allow(dead_code)] #[serde(rename = "Column")] column: usize, } @@ -19,6 +21,7 @@ struct Position { struct Issue { #[serde(rename = "FromLinter")] from_linter: String, + #[allow(dead_code)] #[serde(rename = "Text")] text: String, #[serde(rename = "Pos")] diff --git a/src/grep_cmd.rs b/src/grep_cmd.rs index 03c5a8508..493e96835 100644 --- a/src/grep_cmd.rs +++ b/src/grep_cmd.rs @@ -4,6 +4,7 @@ use regex::Regex; use std::collections::HashMap; use std::process::Command; +#[allow(clippy::too_many_arguments)] pub fn run( pattern: &str, path: &str, @@ -23,8 +24,41 @@ pub fn run( // Fix: convert BRE alternation \| → | for rg (which uses PCRE-style regex) let rg_pattern = pattern.replace(r"\|", "|"); + // Detect flags that change rg's output format away from file:linenum:content. + // These must bypass RTK's grouping filter and passthrough raw output. + let is_passthrough_mode = extra_args.iter().any(|a| { + matches!( + a.as_str(), + "-c" | "--count" + | "--count-matches" + | "-l" + | "--files-with-matches" + | "-L" + | "--files-without-match" + | "--json" + | "--vimgrep" + | "-h" + | "--no-filename" + ) + }); + // Context flags (-A/-B/-C) add separator lines (--) that break the parser + let has_context_flags = extra_args.iter().any(|a| { + a == "-A" + || a == "-B" + || a == "-C" + || a.starts_with("-A=") + || a.starts_with("-B=") + || a.starts_with("-C=") + }); + let is_passthrough_mode = is_passthrough_mode || has_context_flags; + let mut rg_cmd = Command::new("rg"); - rg_cmd.args(["-n", "--no-heading", &rg_pattern, path]); + if is_passthrough_mode { + // Passthrough: let rg handle output format natively + rg_cmd.args([&rg_pattern, path]); + } else { + rg_cmd.args(["-n", "--no-heading", &rg_pattern, path]); + } if let Some(ft) = file_type { rg_cmd.arg("--type").arg(ft); @@ -48,6 +82,27 @@ pub fn run( let raw_output = stdout.to_string(); + // Passthrough mode: output is already in the format the user requested + if is_passthrough_mode { + if !raw_output.is_empty() { + print!("{}", raw_output); + } + let stderr = String::from_utf8_lossy(&output.stderr); + if !stderr.trim().is_empty() { + eprint!("{}", stderr); + } + timer.track( + &format!("grep '{}' {}", pattern, path), + "rtk grep (passthrough)", + &raw_output, + &raw_output, + ); + if exit_code != 0 { + std::process::exit(exit_code); + } + return Ok(()); + } + if stdout.trim().is_empty() { // Show stderr for errors (bad regex, missing file, etc.) if exit_code == 2 { @@ -248,6 +303,83 @@ mod tests { assert!(!cleaned.is_empty()); } + // Format-changing rg flags trigger passthrough mode + #[test] + fn test_passthrough_flags_detected() { + let passthrough_flags: &[&str] = &[ + "-c", + "--count", + "--count-matches", + "-l", + "--files-with-matches", + "-L", + "--files-without-match", + "--json", + "--vimgrep", + "-h", + "--no-filename", + ]; + for flag in passthrough_flags { + let args = [flag.to_string()]; + assert!( + args.iter().any(|a| matches!( + a.as_str(), + "-c" | "--count" + | "--count-matches" + | "-l" + | "--files-with-matches" + | "-L" + | "--files-without-match" + | "--json" + | "--vimgrep" + | "-h" + | "--no-filename" + )), + "Flag {} should trigger passthrough", + flag + ); + } + } + + // Context flags (-A/-B/-C) also trigger passthrough + #[test] + fn test_context_flags_trigger_passthrough() { + for flag in &["-A", "-B", "-C"] { + let args = [flag.to_string(), "2".to_string()]; + assert!( + args.iter().any(|a| a == "-A" || a == "-B" || a == "-C"), + "Context flag {} should trigger passthrough", + flag + ); + } + } + + // Non-passthrough flags should NOT trigger passthrough + #[test] + fn test_normal_flags_no_passthrough() { + let normal_flags: &[&str] = &["-i", "-w", "--glob", "-e"]; + for flag in normal_flags { + let args = [flag.to_string()]; + assert!( + !args.iter().any(|a| matches!( + a.as_str(), + "-c" | "--count" + | "--count-matches" + | "-l" + | "--files-with-matches" + | "-L" + | "--files-without-match" + | "--json" + | "--vimgrep" + | "-h" + | "--no-filename" + )), + "Flag {} should NOT trigger passthrough", + flag + ); + } + } + // Fix: BRE \| alternation is translated to PCRE | for rg #[test] fn test_bre_alternation_translated() { diff --git a/src/init.rs b/src/init.rs index 961e4ac30..54ccdd15c 100644 --- a/src/init.rs +++ b/src/init.rs @@ -443,7 +443,7 @@ pub fn uninstall(global: bool, verbose: u8) -> Result<()> { fs::write(&claude_md_path, cleaned).with_context(|| { format!("Failed to write CLAUDE.md: {}", claude_md_path.display()) })?; - removed.push(format!("CLAUDE.md: removed @RTK.md reference")); + removed.push("CLAUDE.md: removed @RTK.md reference".to_string()); } } @@ -491,7 +491,7 @@ fn patch_settings_json(hook_path: &Path, mode: PatchMode, verbose: u8) -> Result }; // Check idempotency - if hook_already_present(&root, &hook_command) { + if hook_already_present(&root, hook_command) { if verbose > 0 { eprintln!("settings.json: hook already present"); } @@ -516,7 +516,7 @@ fn patch_settings_json(hook_path: &Path, mode: PatchMode, verbose: u8) -> Result } // Deep-merge hook - insert_hook_entry(&mut root, &hook_command); + insert_hook_entry(&mut root, hook_command); // Backup original if settings_path.exists() { @@ -558,7 +558,7 @@ fn clean_double_blanks(content: &str) -> String { if line.trim().is_empty() { // Count consecutive blank lines let mut blank_count = 0; - let start = i; + let _start = i; while i < lines.len() && lines[i].trim().is_empty() { blank_count += 1; i += 1; @@ -566,9 +566,7 @@ fn clean_double_blanks(content: &str) -> String { // Keep at most 2 blank lines let keep = blank_count.min(2); - for _ in 0..keep { - result.push(""); - } + result.extend(std::iter::repeat_n("", keep)); } else { result.push(line); i += 1; @@ -1429,9 +1427,9 @@ More notes let serialized = serde_json::to_string(&parsed).unwrap(); // Keys should appear in same order - let original_keys: Vec<&str> = original.split("\"").filter(|s| s.contains(":")).collect(); - let serialized_keys: Vec<&str> = - serialized.split("\"").filter(|s| s.contains(":")).collect(); + let _original_keys: Vec<&str> = original.split('"').filter(|s| s.contains(':')).collect(); + let _serialized_keys: Vec<&str> = + serialized.split('"').filter(|s| s.contains(':')).collect(); // Just check that keys exist (preserve_order doesn't guarantee exact order in nested objects) assert!(serialized.contains("\"env\"")); diff --git a/src/learn/detector.rs b/src/learn/detector.rs index 87f0e1627..94ef2bf37 100644 --- a/src/learn/detector.rs +++ b/src/learn/detector.rs @@ -5,6 +5,7 @@ use regex::Regex; pub enum ErrorType { UnknownFlag, CommandNotFound, + #[allow(dead_code)] WrongSyntax, WrongPath, MissingArg, @@ -229,9 +230,8 @@ pub fn find_corrections(commands: &[CommandExecution]) -> Vec { } // Look ahead for correction within CORRECTION_WINDOW - for j in (i + 1)..std::cmp::min(i + 1 + CORRECTION_WINDOW, commands.len()) { - let candidate = &commands[j]; - + let window_end = std::cmp::min(i + 1 + CORRECTION_WINDOW, commands.len()); + for candidate in &commands[(i + 1)..window_end] { let similarity = command_similarity(&cmd.command, &candidate.command); // Must meet minimum similarity diff --git a/src/lint_cmd.rs b/src/lint_cmd.rs index 15f3fed2d..a62a29c82 100644 --- a/src/lint_cmd.rs +++ b/src/lint_cmd.rs @@ -36,11 +36,13 @@ struct PylintDiagnostic { module: String, #[allow(dead_code)] obj: String, + #[allow(dead_code)] line: usize, #[allow(dead_code)] column: usize, path: String, symbol: String, // rule code like "unused-variable" + #[allow(dead_code)] message: String, #[serde(rename = "message-id")] message_id: String, // e.g., "W0612" diff --git a/src/log_cmd.rs b/src/log_cmd.rs index 36da10548..8fb0732c8 100644 --- a/src/log_cmd.rs +++ b/src/log_cmd.rs @@ -101,7 +101,7 @@ fn analyze_logs(content: &str) -> String { let total_warnings: usize = warn_counts.values().sum(); let total_info: usize = info_counts.values().sum(); - result.push(format!("📊 Log Summary")); + result.push("📊 Log Summary".to_string()); result.push(format!( " ❌ {} errors ({} unique)", total_errors, diff --git a/src/ls.rs b/src/ls.rs index a6b9df338..734fbeea7 100644 --- a/src/ls.rs +++ b/src/ls.rs @@ -38,6 +38,11 @@ pub fn run(args: &[String], verbose: u8) -> Result<()> { .iter() .any(|a| (a.starts_with('-') && !a.starts_with("--") && a.contains('a')) || a == "--all"); + // Detect if user explicitly requested long format — passthrough verbatim + let has_long_flag = args + .iter() + .any(|a| (a.starts_with('-') && !a.starts_with("--") && a.contains('l')) || a == "--long"); + let flags: Vec<&str> = args .iter() .filter(|a| a.starts_with('-')) @@ -89,6 +94,17 @@ pub fn run(args: &[String], verbose: u8) -> Result<()> { } let raw = String::from_utf8_lossy(&output.stdout).to_string(); + + // User explicitly requested -l: passthrough raw ls output + if has_long_flag { + print!("{}", raw); + timer.track_passthrough( + &format!("ls {}", args.join(" ")), + &format!("rtk ls {}", args.join(" ")), + ); + return Ok(()); + } + let filtered = compact_ls(&raw, show_all); if verbose > 0 { diff --git a/src/main.rs b/src/main.rs index fcb393031..0879c423f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -122,6 +122,10 @@ enum Commands { /// Git commands with compact output Git { + /// Run as if git was started in (like git -C) + #[arg(short = 'C')] + directory: Option, + #[command(subcommand)] command: GitCommands, }, @@ -182,18 +186,14 @@ enum Commands { }, /// Find files with compact tree output + #[command(disable_help_flag = true)] Find { - /// Pattern to search (glob) - pattern: String, - /// Path to search in - #[arg(default_value = ".")] - path: String, - /// Maximum results to show - #[arg(short, long, default_value = "50")] - max: usize, - /// Filter by type: f (file), d (directory) - #[arg(short = 't', long, default_value = "f")] - file_type: String, + /// Print help + #[arg(long, action = clap::ArgAction::Help)] + help: Option, + /// All remaining arguments (parsed manually to support system-find predicates) + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, }, /// Ultra-condensed diff (only changed lines) @@ -202,6 +202,9 @@ enum Commands { file1: PathBuf, /// Second file (optional if stdin) file2: Option, + /// Brief mode: just report whether files differ (passthrough to diff -q) + #[arg(short = 'q', long)] + brief: bool, }, /// Filter and deduplicate log output @@ -230,28 +233,32 @@ enum Commands { }, /// Compact grep - strips whitespace, truncates, groups by file + #[command(disable_help_flag = true)] Grep { + /// Print help (use --help; -h is reserved for rg's --no-filename) + #[arg(long, action = clap::ArgAction::Help)] + help: Option, /// Pattern to search pattern: String, /// Path to search in #[arg(default_value = ".")] path: String, - /// Max line length - #[arg(short = 'l', long, default_value = "80")] + /// Max line length (no short flag — -l is rg's --files-with-matches) + #[arg(long, default_value = "80")] max_len: usize, - /// Max results to show - #[arg(short, long, default_value = "50")] + /// Max results to show (no short flag — -m is rg's --max-count) + #[arg(long, default_value = "50")] max: usize, - /// Show only match context (not full line) - #[arg(short, long)] + /// Show only match context (not full line; no short — -c is rg's --count) + #[arg(long)] context_only: bool, - /// Filter by file type (e.g., ts, py, rust) + /// Filter by file type (e.g., ts, py, rust) — matches rg -t #[arg(short = 't', long)] file_type: Option, /// Show line numbers (always on, accepted for grep/rg compatibility) #[arg(short = 'n', long)] line_numbers: bool, - /// Extra ripgrep arguments (e.g., -i, -A 3, -w, --glob) + /// Extra ripgrep arguments (e.g., -i, -A 3, -w, -l, -c, --glob) #[arg(trailing_var_arg = true, allow_hyphen_values = true)] extra_args: Vec, }, @@ -665,40 +672,28 @@ enum PnpmCommands { #[derive(Subcommand)] enum DockerCommands { /// List running containers - Ps, + Ps { + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, + }, /// List images - Images, + Images { + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, + }, /// Show container logs (deduplicated) Logs { container: String }, /// Docker Compose commands with compact output Compose { - #[command(subcommand)] - command: ComposeCommands, + /// Compose arguments (global flags + subcommand + args) + #[arg(trailing_var_arg = true, allow_hyphen_values = true)] + args: Vec, }, /// Passthrough: runs any unsupported docker subcommand directly #[command(external_subcommand)] Other(Vec), } -#[derive(Subcommand)] -enum ComposeCommands { - /// List compose services (compact) - Ps, - /// Show compose logs (deduplicated) - Logs { - /// Optional service name - service: Option, - }, - /// Build compose services (summary) - Build { - /// Optional service name - service: Option, - }, - /// Passthrough: runs any unsupported compose subcommand directly - #[command(external_subcommand)] - Other(Vec), -} - #[derive(Subcommand)] enum KubectlCommands { /// List pods @@ -885,57 +880,62 @@ fn main() -> Result<()> { local_llm::run(&file, &model, force_download, cli.verbose)?; } - Commands::Git { command } => match command { - GitCommands::Diff { args } => { - git::run(git::GitCommand::Diff, &args, None, cli.verbose)?; - } - GitCommands::Log { args } => { - git::run(git::GitCommand::Log, &args, None, cli.verbose)?; - } - GitCommands::Status { args } => { - git::run(git::GitCommand::Status, &args, None, cli.verbose)?; - } - GitCommands::Show { args } => { - git::run(git::GitCommand::Show, &args, None, cli.verbose)?; - } - GitCommands::Add { args } => { - git::run(git::GitCommand::Add, &args, None, cli.verbose)?; - } - GitCommands::Commit { message } => { - git::run( - git::GitCommand::Commit { messages: message }, - &[], - None, - cli.verbose, - )?; - } - GitCommands::Push { args } => { - git::run(git::GitCommand::Push, &args, None, cli.verbose)?; - } - GitCommands::Pull { args } => { - git::run(git::GitCommand::Pull, &args, None, cli.verbose)?; - } - GitCommands::Branch { args } => { - git::run(git::GitCommand::Branch, &args, None, cli.verbose)?; - } - GitCommands::Fetch { args } => { - git::run(git::GitCommand::Fetch, &args, None, cli.verbose)?; - } - GitCommands::Stash { subcommand, args } => { - git::run( - git::GitCommand::Stash { subcommand }, - &args, - None, - cli.verbose, - )?; - } - GitCommands::Worktree { args } => { - git::run(git::GitCommand::Worktree, &args, None, cli.verbose)?; - } - GitCommands::Other(args) => { - git::run_passthrough(&args, cli.verbose)?; + Commands::Git { directory, command } => { + let dir = directory.as_deref(); + match command { + GitCommands::Diff { args } => { + git::run(git::GitCommand::Diff, &args, None, cli.verbose, dir)?; + } + GitCommands::Log { args } => { + git::run(git::GitCommand::Log, &args, None, cli.verbose, dir)?; + } + GitCommands::Status { args } => { + git::run(git::GitCommand::Status, &args, None, cli.verbose, dir)?; + } + GitCommands::Show { args } => { + git::run(git::GitCommand::Show, &args, None, cli.verbose, dir)?; + } + GitCommands::Add { args } => { + git::run(git::GitCommand::Add, &args, None, cli.verbose, dir)?; + } + GitCommands::Commit { message } => { + git::run( + git::GitCommand::Commit { messages: message }, + &[], + None, + cli.verbose, + dir, + )?; + } + GitCommands::Push { args } => { + git::run(git::GitCommand::Push, &args, None, cli.verbose, dir)?; + } + GitCommands::Pull { args } => { + git::run(git::GitCommand::Pull, &args, None, cli.verbose, dir)?; + } + GitCommands::Branch { args } => { + git::run(git::GitCommand::Branch, &args, None, cli.verbose, dir)?; + } + GitCommands::Fetch { args } => { + git::run(git::GitCommand::Fetch, &args, None, cli.verbose, dir)?; + } + GitCommands::Stash { subcommand, args } => { + git::run( + git::GitCommand::Stash { subcommand }, + &args, + None, + cli.verbose, + dir, + )?; + } + GitCommands::Worktree { args } => { + git::run(git::GitCommand::Worktree, &args, None, cli.verbose, dir)?; + } + GitCommands::Other(args) => { + git::run_passthrough(&args, cli.verbose, dir)?; + } } - }, + } Commands::Gh { subcommand, args } => { gh_cmd::run(&subcommand, &args, cli.verbose, cli.ultra_compact)?; @@ -992,17 +992,25 @@ fn main() -> Result<()> { env_cmd::run(filter.as_deref(), show_all, cli.verbose)?; } - Commands::Find { - pattern, - path, - max, - file_type, - } => { - find_cmd::run(&pattern, &path, max, &file_type, cli.verbose)?; + Commands::Find { args, .. } => { + if find_cmd::has_system_find_predicates(&args) { + find_cmd::run_system_find_raw(&args, cli.verbose)?; + } else { + // Parse RTK-style: rtk find [path] [--max N] [--file-type f|d] + let pattern = args.first().map(|s| s.as_str()).unwrap_or("*"); + let path = args.get(1).map(|s| s.as_str()).unwrap_or("."); + find_cmd::run(pattern, path, 50, "f", cli.verbose)?; + } } - Commands::Diff { file1, file2 } => { - if let Some(f2) = file2 { + Commands::Diff { + file1, + file2, + brief, + } => { + if brief { + diff_cmd::run_brief(&file1, file2.as_deref(), cli.verbose)?; + } else if let Some(f2) = file2 { diff_cmd::run(&file1, &f2, cli.verbose)?; } else { diff_cmd::run_stdin(cli.verbose)?; @@ -1018,29 +1026,18 @@ fn main() -> Result<()> { } Commands::Docker { command } => match command { - DockerCommands::Ps => { - container::run(container::ContainerCmd::DockerPs, &[], cli.verbose)?; + DockerCommands::Ps { args } => { + container::run(container::ContainerCmd::DockerPs, &args, cli.verbose)?; } - DockerCommands::Images => { - container::run(container::ContainerCmd::DockerImages, &[], cli.verbose)?; + DockerCommands::Images { args } => { + container::run(container::ContainerCmd::DockerImages, &args, cli.verbose)?; } DockerCommands::Logs { container: c } => { container::run(container::ContainerCmd::DockerLogs, &[c], cli.verbose)?; } - DockerCommands::Compose { command: compose } => match compose { - ComposeCommands::Ps => { - container::run_compose_ps(cli.verbose)?; - } - ComposeCommands::Logs { service } => { - container::run_compose_logs(service.as_deref(), cli.verbose)?; - } - ComposeCommands::Build { service } => { - container::run_compose_build(service.as_deref(), cli.verbose)?; - } - ComposeCommands::Other(args) => { - container::run_compose_passthrough(&args, cli.verbose)?; - } - }, + DockerCommands::Compose { args } => { + container::run_compose(&args, cli.verbose)?; + } DockerCommands::Other(args) => { container::run_docker_passthrough(&args, cli.verbose)?; } @@ -1094,6 +1091,7 @@ fn main() -> Result<()> { file_type, line_numbers: _, // no-op: line numbers always enabled in grep_cmd::run extra_args, + help: _, } => { grep_cmd::run( &pattern, @@ -1494,6 +1492,7 @@ mod tests { match cli.command { Commands::Git { command: GitCommands::Commit { message }, + .. } => { assert_eq!(message, vec!["fix: typo"]); } @@ -1516,6 +1515,7 @@ mod tests { match cli.command { Commands::Git { command: GitCommands::Commit { message }, + .. } => { assert_eq!(message, vec!["feat: add support", "Body paragraph here."]); } @@ -1540,10 +1540,60 @@ mod tests { match cli.command { Commands::Git { command: GitCommands::Commit { message }, + .. } => { assert_eq!(message, vec!["title", "body", "footer"]); } _ => panic!("Expected Git Commit command"), } } + + #[test] + fn test_git_dash_c_directory_parsed() { + let cli = Cli::try_parse_from(["rtk", "git", "-C", "/tmp/other-repo", "log", "--oneline"]) + .unwrap(); + match cli.command { + Commands::Git { + directory, + command: GitCommands::Log { args }, + } => { + assert_eq!(directory.as_deref(), Some("/tmp/other-repo")); + assert_eq!(args, vec!["--oneline"]); + } + _ => panic!("Expected Git Log with -C directory"), + } + } + + #[test] + fn test_git_without_dash_c_has_none_directory() { + let cli = Cli::try_parse_from(["rtk", "git", "status"]).unwrap(); + match cli.command { + Commands::Git { + directory, + command: GitCommands::Status { .. }, + } => { + assert!(directory.is_none()); + } + _ => panic!("Expected Git Status without directory"), + } + } + + #[test] + fn test_git_dash_c_with_passthrough_subcommand() { + let cli = Cli::try_parse_from(["rtk", "git", "-C", "/tmp", "rebase", "main"]).unwrap(); + match cli.command { + Commands::Git { + directory, + command: GitCommands::Other(args), + } => { + assert_eq!(directory.as_deref(), Some("/tmp")); + let args_str: Vec = args + .iter() + .map(|a| a.to_string_lossy().to_string()) + .collect(); + assert_eq!(args_str, vec!["rebase", "main"]); + } + _ => panic!("Expected Git Other with -C directory"), + } + } } diff --git a/src/npm_cmd.rs b/src/npm_cmd.rs index 639cbfde4..806ff9832 100644 --- a/src/npm_cmd.rs +++ b/src/npm_cmd.rs @@ -3,6 +3,17 @@ use anyhow::{Context, Result}; use std::process::Command; pub fn run(args: &[String], verbose: u8, skip_env: bool) -> Result<()> { + let subcommand = args.first().map(|s| s.as_str()).unwrap_or("run"); + + match subcommand { + // npm run