Pii Safe Documents
danyuchn/pii-guard
Processes sensitive local documents through PII Guard and a local Ollama model into a reversible redacted copy, without letting the main agent read the original or restored contents.
Benchmark and compare LLM models for SUB/WAVE's on-air calls — track picks, segments, listener requests, DJ scripts, banter, and programme beats — in both candidate-pool and agent modes, using…
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install perminder-klair/subwave subwave-llm-bench --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .claude/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .claude/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-benchType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install perminder-klair/subwave subwave-llm-bench --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .agents/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .agents/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install perminder-klair/subwave subwave-llm-bench --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .cursor/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .cursor/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/perminder-klair/subwave.git --path .claude/skills/subwave-llm-bench--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install perminder-klair/subwave subwave-llm-bench --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .gemini/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .gemini/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install perminder-klair/subwave subwave-llm-benchInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .github/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .github/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add perminder-klair/subwave --skill subwave-llm-bench -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install perminder-klair/subwave subwave-llm-bench --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/perminder-klair/subwave.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/subwave-llm-bench .opencode/skills/subwave-llm-bench && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "subwave-llm-bench" agent skill from https://github.com/perminder-klair/subwave/tree/develop/.claude/skills/subwave-llm-bench into .opencode/skills/subwave-llm-bench/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "subwave-llm-bench", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
subwave-llm-benchBenchmark and compare LLM models for SUB/WAVE's on-air calls — track picks, segments, listener requests, DJ scripts, banter, and programme beats — in both candidate-pool and agent modes, using…
Subwave LLM Bench is an agent skill from perminder-klair/subwave. Benchmark and compare LLM models for SUB/WAVE's on-air calls — track picks, segments, listener requests, DJ scripts, banter, and programme beats — in both candidate-pool and agent modes, using controller/scripts/llm-bench (the matrix harness) or the legacy picker-only controller/scripts/picker-test.mjs. Use this skill whenever the user wants to assess, benchmark, compare, or test which LLM model to run the station on — phrases like "which model should I use", "benchmark the picker / the DJ / this model", "test…
Its SKILL.md is about 2.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files, including scripts (for example `scripts/assess-models.sh`).
It sits in AI & LLM Engineering, covering LLM inference and serving. It works with Ollama. The repository describes itself as: Personal internet radio: Agentic AI DJ. The licence is MIT.
2 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 7dbc57c. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Shell), which the agent can run.
Shell commands in SKILL.md call:
npmdockernpxFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use npm, docker and npx, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names these keys or tokens, usually read from environment variables:
OPENROUTER_API_KEYFrom names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Subwave LLM Bench loads about 2.4k tokens when it runs. Until then it costs about 257 tokens; SKILL.md has 1,021 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
from `state/secrets.env` and `controller/.env` automaticallyAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from perminder-klair/subwave at commit 7dbc57c, republished under its MIT licence (© perminder-klair). 1,021 words, ~2,365 tokens.
.claude/skills/subwave-llm-bench/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.Two harnesses, one job: measure how well a provider + model handles the station's real LLM calls before trusting it on air.
llm-bench (controller/scripts/llm-bench/, npm run llm-bench) — the
primary harness. A matrix runner over every on-air call kind: pool picks
(pickNextTrack), agent picks (djAgentPick), pool + agent segments
(generateSegment / djAgentSegment), request matching (matchRequest /
djAgentRequest), the free-text scripts (intro, link, station ID, hourly),
banter, and the programme family (plan, beats, exchanges). Scores
reliability + deterministic rule checks, prints a per-model comparison
table, writes a diffable JSON report.picker-test.mjs — the legacy picker-only deep-dive. Still useful for
high-iteration picker runs comparable with historical results, and it has a
bundled orchestration script (see the legacy section at the end).Both import the live prompts and schemas from src/ (never copies), fake
everything external (library, tools, weather/news data), and override
provider/model only inside their own short-lived process — the live
controller's configured model is never touched.
@ai-sdk/* provider
translates tools / structured output differently. Canonical case:
deepseek-v4-flash scored 0/4 via the deepseek direct provider but
4/4 via openrouter. Always benchmark through the routing you'll
actually deploy — "is model X good?" is the wrong question; "is
provider+X good?" is the right one.djAgentPick/long-context (full prompt +
tool loop), generateSegment/dull-weather (the model must decline to air
— small models botch the silence encoding; a huge wall-clock here means the
structured-output retry rescued a failed first attempt), and the
multi-voice JSON kinds (generateBanter, generateProgrammeExchange).subwave-log-analysis.subwave-control.Runs on the host from a repo clone (it imports TS source via tsx; prod
containers ship only compiled dist/). The running stack is not required —
keys resolve from state/secrets.env and controller/.env automatically
(existing env vars win). If a key exists only inside a prod container's env,
copy it out first: export OPENROUTER_API_KEY=$(docker exec sub-wave-controller printenv OPENROUTER_API_KEY).
cd <repo>/controller
npm run llm-bench -- \
--models openrouter:google/gemma-4-31b-it,ollama:qwen3:8b \
--iterations 3Flags:
--models (required) — comma list of provider:model, split on the FIRST
colon, so Ollama tags keep theirs (ollama:qwen3:8b). Providers: ollama |
openai-compatible | anthropic | openai | google | deepseek | openrouter |
requesty | gateway.--kinds — groups (pick,segment,request,scripts,banter,programme) or
exact kind names. Default: all.--modes — pool,agent (default both). Mode-independent kinds run once
either way. If the operator runs pool mode live (Agentic picker off),
--modes pool is the honest benchmark — agent cells they'll never use
just add noise and cost.--iterations — per scenario. 1 to smoke, 3 to screen (default), 5+ to
confirm a winner. Full matrix ≈ 32 scenario cells, so ~100 calls per model
at 3 iterations.--out — report path (default scripts/llm-bench/reports/<ts>.json,
gitignored).A full run takes many minutes (every call is a real model call, agent cells
can take 45 s each). Run it in the background with a long timeout and don't
poll; OLLAMA_URL=http://localhost:11434 translates the container-internal
Ollama address for host runs.
Each run is ok, violation (call succeeded, named rule checks failed), or
thrown (bucketed: no-object-generated, timeout, unreachable,
thrown). The summary prints pass% + p50 latency per cell, then per-model
histograms of rule failures and thrown buckets.
Judge in this order:
no-object-generated on structured kinds = weak structured output;
everything landing at ~45 s = too slow for the loop, not incapable.
unreachable = provider/config problem, not the model — fix and re-run.hallucinated-id (invents track ids — dangerous), banned-phrase:* /
stage-direction:* / wrapping-quotes (would be read aloud by TTS),
digits-in-spoken-time / clock-leak (hourly/link discipline),
opener-repeat (ignores anti-repeat lists), unusable-exchange /
single-voice (can't hold multi-voice JSON), variety:same-artist
(editorial-pressure miss — informative, not disqualifying).Reports are JSON with every run record — keep old ones to diff a model across prompt changes or across model updates.
Do not apply the change. The operator sets llm.provider + llm.model
(and the Agentic picker toggle) in admin Settings — those are global, their
call.
For picker-only, high-iteration runs comparable with historical results:
# DEV stack (src bind-mounted in container):
docker exec sub-wave-controller npx tsx scripts/picker-test.mjs <provider> <model> [iterations] [short|long]
# Host (works regardless of stack):
( cd <repo>/controller && STATE_DIR=<repo>/state OLLAMA_URL=http://localhost:11434 \
npx tsx scripts/picker-test.mjs <provider> <model> [iterations] [short|long] )long is the verdict mode (realistic session window); short is a sanity
check. The bundled scripts/assess-models.sh (in this skill's directory) runs
one or more models in both modes, auto-detects dev/prod, and summarises event-
log failures: assess-models.sh <provider> [iterations] <model>... — with
ollama and no models it discovers and tests everything installed.
Failure strings glossary (from the event log, kind: pickerTest):
agent did not call the done tool before stopping — model ignored the
tool protocol. Check routing before rejecting the model (see surprise #1).agentTimeoutMs (45000) with tools=0 — a latency
failure, not incapability; the deadline aborted it mid-loop.Failed after N attempts … Internal Server Error — provider outage;
re-run later, don't reject the model on this.hallucinated-id / no-object-generated — weak structured output.Cross-check live behaviour in /admin/debug → llm.recentCalls: the via
field shows which path produced each result (ai-sdk:agent:native = clean
native path; …:recovery = rescued by the done-tool recovery; a thrown
djAgentPick falls back to the pool picker, so the station never goes
silent).
state/logs/events-*.jsonl) and, if LLM_DEBUG_RAW is on, raw request
bodies to state/logs/llm-debug.log. Harmless, filterable.docs/llm-calls.md; the harness design spec at
docs/superpowers/specs/2026-07-09-llm-bench-design.md.© perminder-klair, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in .claude/skills/subwave-llm-bench of perminder-klair/subwave.
Open the folder on GitHubat commit 7dbc57c
Subwave LLM Bench next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Subwave LLM Bench this skillperminder-klair/subwave | 1.4k | — | ~2.4k | Automated safety check: Notes | MIT | |
| Pii Safe Documentsdanyuchn/pii-guard | 249 | — | ~2.7k | Automated safety check: Pass | MIT | |
| Visiongridaco/grida | 2.7k | — | ~1.5k | Automated safety check: Pass | Apache-2.0 | |
| Domodomo Local AI Maintenancedarknecrocities/DomoDomo---All-in-one-Tool | 239 | — | ~17k | Automated safety check: Pass | None | |
| Cc Ollamamathruffian-dot/claude-code-lazy-packs | 254 | — | ~118 | Automated safety check: Pass | MIT | |
| Bdistill Knowledge Extractionsickn33/agentic-awesome-skills | 47k | 2 repos | ~926 | Automated safety check: Pass | MIT |
danyuchn/pii-guard
Processes sensitive local documents through PII Guard and a local Ollama model into a reversible redacted copy, without letting the main agent read the original or restored contents.
gridaco/grida
Query images with a local Ollama vision model without loading the image into the main agent context.
darknecrocities/DomoDomo---All-in-one-Tool
Maintain DomoDomo private local AI features, Ollama connections, browser inference, streaming UX, embeddings, RAG, memory, and agent interfaces.
mathruffian-dot/claude-code-lazy-packs
Claude Code 安裝本地 AI Ollama。說「安裝 Ollama」「本地 AI」時載入. An agent skill from mathruffian-dot/claude-code-lazy-packs.
sickn33/agentic-awesome-skills
Extract structured domain knowledge from AI models in-session or from local open-source models via Ollama.
davila7/claude-code-templates
Measure local AI task latency, token usage, errors and verified outcomes using Pudu AI hardware evidence and installed Ollama models.
perminder-klair/subwave
Stage a SUB/WAVE git worktree so the dev stack can run from it, then start it.
perminder-klair/subwave
Start or stop the SUB/WAVE radio stack (a personal internet radio station) in dev or production mode — no builds, no rebuilds, no config rendering.
perminder-klair/subwave
Draft a Discord release announcement for SUB/WAVE from a release PR, tag, or version number.
perminder-klair/subwave
Open a release pull request from develop to main for SUB/WAVE, and keep develop from drifting behind main.
perminder-klair/subwave
Write a news post for the SUB/WAVE "Dispatches" page, a short human-friendly tutorial about a feature, fix, or release.
perminder-klair/subwave
Drive a controller/admin-UI change end-to-end from a worktree without touching the live station — isolated controller on a spare port + temp STATEDIR, worktree Next dev server, Playwright against…
Works with
Categories
Benchmark and compare LLM models for SUB/WAVE's on-air calls — track picks, segments, listener requests, DJ scripts, banter, and programme beats — in both candidate-pool and agent modes, using…. Subwave LLM Bench is an agent skill from perminder-klair/subwave.mjs.
Subwave LLM Bench fits situations like: the user wants to assess; test which LLM model to run the station on — phrases like which model should I use; benchmark the picker / the DJ / this model; test these models.
Run `npx skills add perminder-klair/subwave --skill subwave-llm-bench -a claude-code`. Or copy the skill folder (.claude/skills/subwave-llm-bench in perminder-klair/subwave) into .claude/skills/subwave-llm-bench in your project. Claude Code loads it when a task matches its description.
Run `npx skills add perminder-klair/subwave --skill subwave-llm-bench -a codex`. Or copy the skill folder (.claude/skills/subwave-llm-bench in perminder-klair/subwave) into .agents/skills/subwave-llm-bench in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add perminder-klair/subwave --skill subwave-llm-bench -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/subwave-llm-bench, .gemini/skills/subwave-llm-bench, .github/skills/subwave-llm-bench and .opencode/skills/subwave-llm-bench in your project.
Going by SKILL.md and its folder, Subwave LLM Bench needs a shell for the scripts in its folder, the command-line tools its instructions call (npm, docker and npx) and credentials named OPENROUTER_API_KEY. Our summary lists: Node.js; A Bash shell; Docker; A credential in OPENROUTER_API_KEY.
SKILL.md contains no URLs. Its commands use npm, docker and npx, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (mentions a .env file), nothing it rates as a warning. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Subwave LLM Bench is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 2.4k tokens (SKILL.md is roughly 9.5k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Subwave LLM Bench: Pii Safe Documents (danyuchn/pii-guard, 249 stars), Vision (gridaco/grida, 2.7k stars), Domodomo Local AI Maintenance (darknecrocities/DomoDomo---All-in-one-Tool, 239 stars) and Cc Ollama (mathruffian-dot/claude-code-lazy-packs, 254 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
perminder-klair (a GitHub user) maintains it in perminder-klair/subwave, which has 1,420 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 10, 2026.
Source: perminder-klair/subwave on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.