traffic-triage-eval
Classify the traffic behind each client IP in edge logs (GCP load balancer, AWS ALB, AWS WAF, CloudFront, nginx, anything) as benign user, benign bot, AI…
Skill by SecurityMindedSolutions
Install
Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.
npx agentmarket install skill/securitymindedsolutions-traffic-triage-eval
Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.
Get the weekly diff
The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.
About
Use cases: spreadsheets, cloud, research, agent-building
Reviews
Write a reviewNo reviews yet. Installed it? Reviews come from verified installers only. How reviews work
Permissions
What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.
- Tools
- No tools found
- Secrets
- None asked for
- Install scripts
- None found
- Runs as
- Python package
Network hosts it talks to 1
codeload.github.com· found in install command
Files it touches
~/.claude/skills/traffic-triage-eval
What's inside
- Skill name
traffic-triage-eval- Description
- Classify the traffic behind each client IP in edge logs (GCP load balancer, AWS ALB, AWS WAF, CloudFront, nginx, anything) as benign user, benign bot, AI agent, internet background scanning, or malicious scanning and attack, using TypeSafe's Jev on a code-computed per-IP profile. The calling agent retrieves the logs however it can and writes them in one documented JSON schema; this skill validates them, profiles every IP in code, asks Jev a fixed set of questions, and writes a spreadsheet sorted attention-first. Takes a set of IPs or a time window. Use whenever the user wants to know whether traffic from an IP or a period was an attack, a scanner, a bot or a person, wants to triage WAF or load balancer logs, or asks "who was hitting us last night" - even if they do not say "TypeSafe" or "Jev". Research proof of concept; a triage signal, not an incident finding.
- License
- MIT
- Metadata
- summary: Triages edge-log traffic per client IP with TypeSafe Jev: benign user / benign bot / AI agent / background scan / malicious, with a 0-100 threat score, the signals and the evidence, from a documented JSON event schema the calling agent fills from any log source
- Instructions
- 229 lines in SKILL.md · view on GitHub
Before installing
- Ships executable scripts
- Instructions call the network
- Instructions read files in your home folder (~/.ssh, ~/.aws…)
Agent Skills spec issues
- allowed-tools: must be a space-separated string
Files (36)
- README.md
- SKILL.md
- app.md · mock-data/
- events.jsonl · mock-data/
- 103.99.1.7.jsonl · mock-data/example-output/investigate/
- 141.98.11.5.jsonl · mock-data/example-output/investigate/
- 176.65.144.71.jsonl · mock-data/example-output/investigate/
- 194.26.29.4.jsonl · mock-data/example-output/investigate/
- 198.18.0.1.jsonl · mock-data/example-output/investigate/
- 198.51.100.50.jsonl · mock-data/example-output/investigate/
- 203.0.113.12.jsonl · mock-data/example-output/investigate/
- 203.0.113.14.jsonl · mock-data/example-output/investigate/
- 23.129.64.1.jsonl · mock-data/example-output/investigate/
- 2a02_4780_1_1__1.jsonl · mock-data/example-output/investigate/
- 5.188.86.2.jsonl · mock-data/example-output/investigate/
- 89.248.165.2.jsonl · mock-data/example-output/investigate/
- README.md · mock-data/example-output/investigate/
- results-detail.csv · mock-data/example-output/
- results.csv · mock-data/example-output/
- results.json · mock-data/example-output/
- results.xlsx · mock-data/example-output/
- generate.py · mock-data/
- labels.csv · mock-data/
- methodology.md · references/
- schema.md · references/
- bootstrap.py · scripts/
- classify.py · scripts/
- evaluate.py · scripts/
- jev.py · scripts/
- limits.py · scripts/
- profile.py · scripts/
- questions.py · scripts/
- report.py · scripts/
- schema.py · scripts/
- signals.py · scripts/
- validate.py · scripts/
SKILL.md (first lines)
# Traffic Triage Eval > **Research proof of concept.** This skill reduces each IP's requests to a > profile in code and asks TypeSafe's Jev what the pattern means. It is a > triage signal for a person, not an incident finding: `malicious` means > "read these requests", not "block this address", and `benign_user` means > "nothing stood out", not "verified human". Verify against the raw log > before acting. Repeat the short form of this at the end of every run. ## What it does 1. **Validate.** `scripts/validate.py` reads the events you staged (JSONL, JSON array or CSV in the schema in `references/schema.md`), drops rows that fail a required field with a reason you can act on, applies the IP or time-window filter, and prints which optional fields are populated so you know which signals the run has. 2. **Profile.** `scripts/profile.py` groups by IP and computes everything numeric and temporal in code: counts, span, peak per minute, status mix, WAF verdicts, hosts, User-Agent classes, probe-path families, payload families, enumeration and route templates, directory and extension rollups, a coverage sentence, and short samples spent on the paths no rule described. Jev does not count and reads dates as text, so nothing numeric is left for it to do. 3. **Classify.** `scripts/classify.py` sends each profile with a paragraph about the site (`app`) to Jev in one request: a category choice, ten yes/no signals and a four-level threat rating. Code turns the answers into a 0-100 threat score with a band (Benign / Nuisance / Concerning / Attack), and raises the category where it is certain (payloads on real routes, credential volume with WAF evidence, scanner evidence with no app knowledge), never lowering it. About 3,500 tokens, 15 cents per thousand IPs, 340 ms median. 4. **Report and carve out.** `scripts/evaluate.py` runs all of it, prints two tables (category counts; the attention and malicious rows with their evidence), writes `results.xlsx` (Results, Details, Summary, Read me) plus CSV and JSON, one row per IP, attention rows first, and writes the **raw rows of every IP that is malicious, unclear or flagged** to `out/investigate/<ip>.jsonl` with an index `README.md`, so the investigation starts from the run directory and never re-queries the log source. With `--labels` it also scores agreement per category. 5. **Explain.** You, the agent, read the attention rows and tell the user what each flagged IP did, in plain words, with the paths. Every question, category, threshold and rule lives in `scripts/questions.py`. Every regex lives in `scripts/signals.py`. ## Workflow `SKILL_DIR` means the folder containing this SKILL.md. ### 1. Understand what the user wants - **"What was this IP doing?"** or **"Who was hitting us between X and Y?"**: they will name IPs or a window. Retrieval scope follows from that. - **"Triage our WAF / LB logs"**: a window, usually the last day or week. - **"Is this scanning or an attack?"**: same run; the answer is in the category, score and evidence columns. Ask for the window or IPs if neither is given. Ask which hosts are theirs if the site has several. ### 2. Get the events into the schema **This skill does not retrieve logs and does not dictate how.** Work out with the user how to pull them: a cloud CLI, an MCP server, Athena, a SIEM export, a log sink, a file they already have. Whatever the source, map each request to one JSON line in the schema in `references/schema.md` (four required fields: `ts`, `ip`, `method`, `path`; `status` and the rest add signals, and a WAF log without statuses is fine) and write the file into a staging folder (your scratchpad, or `$TMPDIR/traffic-triage-eval/<timestamp>/`), never into the user's working tree. The schema page has a field-source table for GCLB, ALB and AWS WAF to speed up the mapping. If you pull only a window, pull the whole window for every IP; a profile built from a slice of an IP's traffic is a slice. If the source fronts the origin with a CDN, the client IP is the CDN's; drop those rows or expect one profile per CDN node. Also write `app.md`: one paragraph on what the site is, which hostnames are its own, what its real route families are (API prefixes, page paths, the query parameters that matter), what health checks and schedulers it runs, and what it does **not** run (WordPress, PHP, Java, a CMS, `/admin`). Say if static buckets return 200 with the SPA shell for unknown paths. This is the `app` field Jev judges against; the difference between "background noise" and "malicious" is whether the traffic knows this application, and Jev only knows the application from this paragraph. ### 3. Check prerequisites ```bash python3 --version # 3.10 or newer test -n "$TYPESAFE_API_KEY" || test -f ~/.config/typesafe/env || echo "need a TypeSafe key" ``` Nothing to install. First run creates a private venv under the system temp dir for the one dependency (openpyxl). `uv run` works too. Key resolution: `TYPESAFE_API_KEY` in the environment, else `~/.config/typesafe/env`. Keys come from https://console.typesafe.ai/keys; if the user has none, stop and ask. ### 4. Validate, then dry-run, then run ```bash python3 "$SKILL_DIR/scripts/validate.py" --events "$STAGING/events.jsonl" ``` Read the drop reasons and the coverage table. If `ua`, `host` or `query` is near 0%, fix the mapping before spending Jev calls; those carry most of the signal. Then: ```bash python3 "$SKILL_DIR/scripts/evaluate.py" \ --events "$STAGING/events.jsonl" --app "$STAGING/app.md" \ --out "$STAGING/out" --dry-run ``` prints every IP with its code signals and token estimate and writes `profiles.json`, with no API calls. Then the real run, with `--ip A --ip B` to limit to named IPs, `--from` / `--to` (ISO 8601) for a window inside the file, `--min-requests N` to skip one-hit IPs, `--labels labels.csv` (columns `ip,label`) for agreement scoring, `--workers 8` for speed:
From SecurityMindedSolutions/ai-skills, MIT.
More from SecurityMindedSolutions/ai-skills
- 0.595score
audit-frontend
SecurityMindedSolutions
Comprehensive front-end architecture audit with parallel sub-agents.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
audit-security
SecurityMindedSolutions
Comprehensive security audit with parallel sub-agents.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
audit-backend
SecurityMindedSolutions
Backend application architecture audit.
SkillAFreshness: A★ 2Claude Code +9 - 0.590score
github-remediate-vulns
SecurityMindedSolutions
Scan GitHub org for Dependabot, code scanning, and secret scanning alerts.
SkillAFreshness: A★ 2Claude Code +9 - 0.563score
run-jev
SecurityMindedSolutions
Run an ad-hoc judgment over one thing or a batch of things with TypeSafe's Jev model, without re-deriving the API, credentials, or output handling every time.
SkillBFreshness: B★ 2Claude Code +9 - 0.558score
built-with
SecurityMindedSolutions
Passive, headless recon of a web app's frontend to infer its backend and tech stack - API endpoints, third-party vendors, CSP allow-lists, auth provider…
SkillBFreshness: B★ 2Claude Code +9 - 0.558score
code-audit-jev
SecurityMindedSolutions
Unit-level security judgment of a repository, a folder of repositories, or the units a pull request changed, with TypeSafe's Jev: code splits every source…
SkillBFreshness: B★ 2Claude Code +9 - 0.558score
prompt-injection-eval
SecurityMindedSolutions
Score prompts for prompt injection with TypeSafe's Jev before they reach an LLM: a reference gate function a backend can call (allow / review / block with a…
SkillBFreshness: B★ 2Claude Code +9 - 0.558score
resume-mirror-eval
SecurityMindedSolutions
Bulk-evaluate a folder of resumes against one job description and flag the ones whose wording mirrors the posting closely enough that a human should look…
SkillBFreshness: B★ 2Claude Code +9 - 0.554score
huh
SecurityMindedSolutions
Now, next, you.
SkillBFreshness: B★ 2Claude Code +9 - 0.554score
jev-email-analysis
SecurityMindedSolutions
Judge what an email is trying to get someone to do, with TypeSafe's Jev: a category across 16 kinds of mail (vendor payment fraud / BEC, fake invoice…
SkillBFreshness: B★ 2Claude Code +9 - 0.554score
ugh
SecurityMindedSolutions
One breath, the tldr.
SkillBFreshness: B★ 2Claude Code +9
Signals
- Stars
- 2
- Forks
- 0
- Open issues
- 0
- Last commit (this folder)
- Sep 22, 2026 (1 month ago)
From GitHub (fetched Oct 24, 2026).
Details
- License
- MIT
- First seen
- Oct 24, 2026
- Last checked
- Oct 24, 2026
- Source
- GitHubgithub-graphql
More from SecurityMindedSolutions
- 0.595score
audit-security
SecurityMindedSolutions
Comprehensive security audit with parallel sub-agents.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
audit-backend
SecurityMindedSolutions
Backend application architecture audit.
SkillAFreshness: A★ 2Claude Code +9 - 0.595score
audit-frontend
SecurityMindedSolutions
Comprehensive front-end architecture audit with parallel sub-agents.
SkillAFreshness: A★ 2Claude Code +9 - 0.590score
github-remediate-vulns
SecurityMindedSolutions
Scan GitHub org for Dependabot, code scanning, and secret scanning alerts.
SkillAFreshness: A★ 2Claude Code +9 - 0.563score
run-jev
SecurityMindedSolutions
Run an ad-hoc judgment over one thing or a batch of things with TypeSafe's Jev model, without re-deriving the API, credentials, or output handling every time.
SkillBFreshness: B★ 2Claude Code +9 - 0.558score
prompt-injection-eval
SecurityMindedSolutions
Score prompts for prompt injection with TypeSafe's Jev before they reach an LLM: a reference gate function a backend can call (allow / review / block with a…
SkillBFreshness: B★ 2Claude Code +9
Cite this page
traffic-triage-eval skill. Agent Mart. https://agentmart.dev/skills/securitymindedsolutions-traffic-triage-eval (last updated 2026-10-24)