duckduckgo-search-cli v0.7.7
GAP-WS-49 (CRITICAL, runtime) — v0.7.6 closed
cargo installbut real queries returned ZERO results silently. This patch restores the Chrome/Safari TLS fingerprint emulation that bypasses DDG'sanomaly-modal.
What's new in v0.7.7
Critical runtime fix (GAP-WS-49)
- Zero-result regression fixed. v0.7.6 passed all
--probeand--probe-deepsmoke tests (status 200/ok) while real queries silently returnedresultados: 0withcascade_level: 0andusou_endpoint_fallback: false. Local reproduction: 6/6 queries returned 0 results with 1.0–1.6s latency. - Root cause:
wreq 6.0.0-rc.29does not bundle theemulationfeature. The Chrome/Safari TLS fingerprint emulation lived only inwreq-util 3.0.0-rc.12viadefault = ["emulation"]. v0.7.6 removedwreq-util(along with thebrotlifeature) to close GAP-WS-48, and without emulation,wreq 6.0.0-rc.29with BoringSSL plain produces a JA3/JA4 fingerprint that Cloudflare Bot Management detects. DDG servesanomaly-modalHTML (45 occurrences) to any client without a real browser fingerprint. - Cross-confirmation:
curlwith real browser headers (User-Agent: Chrome/120,Accept-Encoding: br,Sec-Fetch-*) also receivedanomaly-modalat test time (2026-06-14 09:25 UTC), confirming the upstream tightening. - Fix:
- Re-added
wreq-util 3.0.0-rc.12withdefault-features = false, features = ["emulation"]. - Re-added
"brotli"feature towreq(required byemulation). - Added 3 direct dep pins to
Cargo.tomlto force compatible versions incargo install:brotli-decompressor = "=5.0.1"— last version with hardalloc-no-stdlib = "2.0"pin, before 5.0.2 widened to>=2.0.4, <4.alloc-no-stdlib = "=2.0.4"— exact version brotli 8.0.3 hard-requires.brotli = { version = "8.0.3", default-features = false }— nostdfeature, doesn't pullalloc-stdlib 0.2.3.
cargo update -p alloc-no-stdlib@3.0.0 --precise 2.0.4removes 3.0.0 from the lockfile.
- Re-added
- Post-fix validation:
cargo tree --offline— graph contains exactlyalloc-no-stdlib v2.0.4andbrotli-decompressor v5.0.1, zero 3.0.0/0.2.3.cargo build --release --offline— success in 24.04s.cargo install --path . --locked --offline— success in 34.32s, binary functional.- 292 lib tests pass.
- Real query
"rust async runtime"(local) —quantidade_resultados: 5, latency 1087ms, real results.
⚠️ GAP-WS-48 residual: cargo install without --locked still fails
Because cargo install regenerates the lockfile, the solver adds BOTH alloc-no-stdlib 2.0.4 (from the direct pin) and alloc-no-stdlib 3.0.0 (from brotli-decompressor 5.0.2 or transitive alloc-stdlib 0.2.3). This triggers the same E0277 as GAP-WS-48. Users must use --locked:
cargo install duckduckgo-search-cli --version 0.7.7 --lockedThe committed Cargo.lock was prepared with cargo update -p alloc-no-stdlib@3.0.0 --precise 2.0.4 to make --locked produce a clean graph.
Impact
- Binary: +160KB (brotli 8.0.3 + brotli-decompressor 5.0.1 + wreq-util 3.0.0-rc.12).
cargo installbuild time: ~24s (vs ~37s v0.7.6).- Supply chain surface: +3 crates.
- Functionality restored: real queries return 5+ results with a TLS fingerprint identical to real Chrome/Safari (subject to DDG's tightening state).
Install
cargo install duckduckgo-search-cli --version 0.7.7 --lockedWhat's NOT changed
- No CLI changes
- No JSON schema changes
- No skill file semantic changes (only version bump + GAP-WS-49 documentation)
Verification
cargo build --release --offline— success in 24.04scargo install --path . --locked --offline— success in 34.32scargo test --lib --offline— 292 passed; 0 failedcargo fmt --check— cleancargo clippy --all-targets --offline -- -D warnings— clean- Query test (local):
quantidade_resultados: 5, real results
See CHANGELOG.md for the full GAP-WS-49 narrative.