Resilient public-page reading and OSINT keyword search — web_search (allowlisted-provider OSINT) and web_fetch (curl_cffi TLS-impersonation grid + headless-browser fallback that gets past WAF/403/anti-bot). Use when a fetch is blocked, a page is JS-rendered, or you need open-web OSINT about a target/org.
69
85%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
Two tools front the sandbox open-web engine (decepticon.sandbox_web):
web_search(query, provider="duckduckgo") — keyword OSINT over an
allowlisted search provider. Target-EXEMPT (it hits the provider, not the
target), so no engagement scope is required. Use it to DISCOVER: the org's
public footprint, exposed tech / version-specific advisories, leaked
references, doc/changelog/status pages, third-party subdomains and assets
named in the wild.web_fetch(url, selector="", device="auto") — read ONE page's content,
escalating past WAF / anti-bot blocks. RoE target-gated (the url must be
in plan/roe.json scope) and SSRF-safe. Prefer it over curl-in-bash
whenever a public page is blocked, returns a challenge, or is JS-rendered.Typical flow: web_search to find a URL → web_fetch to read it.
web_fetch runs an escalation ladder inside the sandbox automatically:
.rss, X tweet-result/oEmbed/
syndication, YouTube yt-dlp) BEFORE any WAF grid. Just pass the normal page
URL; a Phase-0 win shows verdict with profile=phase0:<platform>.You never pick a TLS profile, transform, or browser — the engine detects the WAF
and chooses. Your only knobs are selector and device.
The engine validates every response (4-layer: challenge markers / body size /
cookie sensor / your selector). A 200 that is actually a challenge or empty
SPA shell is reported as a FAILURE, not content. Trust the tool's verdict /
[web_fetch OK|FAILED] line, never a raw status. Always pass a selector
(e.g. article, #content, [class*='product']) when you know the content
marker — it upgrades a "looks clean" guess into proven success.
When web_fetch returns [web_fetch FAILED] it includes stop_reason= and
grid_exhausted=. Do not declare a page unreadable on the first FAILED.
stop_reason is auth_required (login/paywall) or
not_found (404). These are real: record it and move on; retrying cannot
help.challenge, blocked, rate_limited, or a
non-exhausted grid) still has escalation left:
device="mobile" (mobile TLS + m. subdomain often
walk past a desktop block) and/or a precise selector.stop_reason may you honestly conclude the page is
unreachable.This is the whole point of the engine: the cheap path failing is the start of escalation, not permission to stop.
web_search is OSINT → not scope-gated (allowlisted provider egress only).web_fetch is target-gated → the url must be in plan/roe.json scope; an
out-of-scope fetch returns ROE_REFUSED. SSRF-blocked (internal/metadata/
private) hosts are refused regardless.bash/http_request
for ACTIVE probing of in-scope target infrastructure; use web_fetch to READ
pages (the target's own blocked/JS pages, or in-scope public assets).| Need | Pass to web_fetch |
|---|---|
| Reddit thread/sub | the reddit.com/... URL (auto .rss) |
| A specific tweet / X profile | the x.com/.../status/... or profile URL |
| YouTube metadata / captions | the youtube.com/watch?v=... URL (yt-dlp) |
| GitHub repo (metadata, stars, language) | the github.com/<owner>/<repo> URL → repos API JSON |
| npm package (deps, versions, maintainers) | the npmjs.com/package/<pkg> URL → registry JSON |
| PyPI package (versions, deps, urls) | the pypi.org/project/<pkg> URL → JSON API |
| Any WAF-protected article/page | the page URL — the grid + browser tier handle it |
GitHub/npm/PyPI return structured JSON (great for supply-chain / source recon) instead of HTML — just pass the normal page URL and the engine routes it.
For keyword discovery on a platform (e.g. "what's said about X on Reddit"),
web_search("site:reddit.com <topic>") first, then web_fetch the result URLs.
31e1c8e
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.