Borrowing it
Nothing to install: this file belongs to InDate/devharness. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/InDate/devharness/main/.claude/skills/network-interception/SKILL.mdgit clone --depth 1 https://github.com/InDate/devharnessWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/indate/devharness/network-interception)<a href="https://agentmods.dev/skills/indate/devharness/network-interception"><img src="https://agentmods.dev/badge/skills/indate/devharness/network-interception/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/indate/devharness/network-interception"><img src="https://agentmods.dev/badge/skills/indate/devharness/network-interception.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00114 | $0.02745 |
| Opus 5.5 | $0.00046 | $0.01098 |
| Sonnet 5.5 | $0.00023 | $0.00549 |
| Haiku 4.5 | $0.00011 | $0.00275 |
Grade A, and why
network-interception scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 29d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 141 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Network interception in devharness
The request this keeps arriving as: drive part of an app without the writes reaching the real system, with the decision on a replayable sequence.
The seam is an intercepting proxy between the browser and the server
(src/proxy/intercept-proxy.ts), started per browser by
connection({ action: 'launch', proxy: true }) and scoped to the app's host at launch
(src/proxy/registry.ts:28). It carries HTTP and socket frames through one
place. CDP Fetch is not used anywhere in src/ (grep -rn 'Fetch\.' src
returns nothing), and the observing tools (network) stay on CDP, which sees
cache hits and service-worker replies the proxy never does. The design
record for the identity function is docs/landscapes/match-identity.md.
What exists, and where
| Thing | Where | What it computes |
|---|---|---|
| Request pin | Pin, intercept-proxy.ts:22 |
urlIncludes substring, optional method and step; answers with status, headers, body; counts hits (:42) |
| Frame pin | FramePin, :750 |
textIncludes read as one "key":value field or as characters (fieldOf, :249); optional socket url, direction, step; replaceWith or drop |
| Request match | matchPin, :1417 |
narrowest accepted pin: constraints (method, step) first, then substring length |
| Event-stream messages | takeMessages in the HTTP answer path, src/proxy/intercept-proxy.ts |
each text/event-stream message is matched as a received frame and passed, replaced (its event:/id: lines kept) or dropped; a message is held until its blank line arrives; a compressed stream is piped unread |
| Frame match | matchFramePin, :1362 |
narrowest accepted pin: constraints (url, direction, step, field-on-a-parsed-frame) first, then text length; parses the frame once (objectOf, :266; carries, :278) |
| Step binding | underStep, src/proxy/intercept-proxy.ts |
a pin with step, or with steps, answers only while that replay step (or one of those) is the cursor (markNextCommand(cursorAt(i)) in src/tools/replay-executor.ts) |
| Refuse mode | refuseUnmatchedWrites, :880; branch at :1474 |
an unmatched request outside GET/HEAD/OPTIONS (SAFE_METHODS, :46) is answered 403, recorded answeredAs: 'refused', counted |
| Host scope | allowOnly, :858; BROWSER_SERVICE_HOSTS, :532 |
hosts outside the list are destroyed and counted; the app's host is on the list by construction (src/tools/bench-tools.ts:423) |
| Tool surface | src/tools/proxy-tools.ts:41 |
answer, answerFrame (with step, :50), withdraw, answers, refuse (unmatchedWrites, :51), status, events, sockets, body |
| Traffic hold | TrafficQueue, src/proxy/traffic-queue.ts; the network layer of src/hold.ts |
while the network is held, each frame, response and event-stream message waits at the proxy and crosses in arrival order on release, one per step; a frame is recorded as it crosses, so it lands under the step that let it through. An answer changes what crosses; a hold changes when |
| Bench rules | setBoundaryRule, src/bench-mode.ts:1079 |
a row's answer / block / hide becomes a pin; block is a 204 pin or a dropped frame; hide arms nothing |
| Responses on the file | responses in activity/_site/<host>-<port>.json (SiteActivity, src/sequence-activity.ts), each with mode optIn / optOut; responsesOn ({key, steps?}) and responsesOff in activity/<name>.json; boundaryRefuse on the sequence |
key, verb, method, url, direction, body, status, mode; a sequence's opt-ins with their steps, and its opt-outs |
| Arming from the file | armSavedRules, armSiteRules, setResponseUse, setResponseMode in src/bench-mode.ts |
opening a sequence arms each site response its use covers: optOut unless the sequence opts out, optIn only where it opts in; a use of a set of steps arms one pin with steps |
| Key derivation | keyOf, src/bench/frontend/crossing.tsx:57; frameMatch, :93 |
pathname for a request; for a frame, a naming key (:72) holding a value that does not move (:79), then the first such value, then the first non-digit string, then the first key |
What ships with it
1 file beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 29d ago Changed 5e1b2896166e
- 1mo ago Changed · +2 lines 7f715929f3ee
- 1mo ago First seen · 139 lines · 114 tokens per session scan A 50391566d51c
network-interception is a skill published in the GitHub repository InDate/devharness (19 stars, last pushed today), licensed MIT. It adds 114 tokens to every session and 2,745 once invoked, about $0.0005 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-09-25.
Other skills, from other repositories
browser
Use this skill when the user says browser, /browser, test in Chrome, inspect a webpage, verify a localhost app, capture screenshots, check console/network errors, run browser QA, or automate browser flows with the Mochi browser MCP.
browser-use
Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers hosted cloud browsers for AI agents: the browser-use Python library (Browser(usecloud=True)), Playwright, Puppeteer or any CDP client.
qa-runner
Use when asked to "run QA", "qa check", "test checklist", or execute QA checklists against a running app via browser automation. Requires the browser-bridge MCP server and Chrome extension.
test-e2e
Generates end-to-end tests for a user flow using Playwright or Cypress.
webapp-testing
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
webapp-testing
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.