Skip to content
Back to skills

Blocklist

ASecurity

Manage skill-concierge's DISABLE list — skills the user ordered off, regardless of origin (personal, plugin, external catalog, or command-files surfaced as skills). Use this skill when the user wants to view, disable, block, or re-enable a skill, says "disable X", "block X", "stop using/offering X", "X is turned off", "re-enable/unblock X", "which skills are disabled", or asks why a Skill invocation was denied by the blocklist guard. Runs scripts/blocklist.py (list / add / remove); the blockl...

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 19, 2026
toolspythonbash

Security analysis

A100/100

Scanned October 19, 2026

npx -y skills add thinhkhuat/skill-concierge --skill blocklist --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Blocklist?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Blocklist
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/thinhkhuat-blocklist/badge)](https://www.skillsdirectory.com/skills/thinhkhuat-blocklist)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: blocklist
user-invocable: true
description: Manage skill-concierge's DISABLE list — skills the user ordered off, regardless of origin (personal, plugin, external catalog, or command-files surfaced as skills). Use this skill when the user wants to view, disable, block, or re-enable a skill, says "disable X", "block X", "stop using/offering X", "X is turned off", "re-enable/unblock X", "which skills are disabled", or asks why a Skill invocation was denied by the blocklist guard. Runs scripts/blocklist.py (list / add / remove); the blocklist lives under the canonical durable home (~/.claude/skill-concierge/blocklist.json) and is enforced by the enforcer (no offers/hints/routes), the engine (no search hits, get_skill refuses), and the PreToolUse guard (invocation denied) — ADR-0046.
argument-hint: "[list | add <skill> | remove <skill>]"
license: MIT
metadata:
  version: 0.1.0
---

# skill-concierge blocklist

The **disable tier**: skills the user ordered OFF. A skill on the blocklist is
never offered by the enforcer, never returned by `search_skills`, never served
by `get_skill`, and its Skill-tool invocation is **denied** by the PreToolUse
guard (`hooks/scripts/skill_guard.py`). This works for ANY skill regardless of
origin — personal skills, plugin skills, external catalog entries, and
command-files surfaced as skills (`~/.claude/commands/*.md`), which the index
deliberately excludes (ADR-0001) and which therefore only the invocation guard
can catch.

The list lives at `~/.claude/skill-concierge/blocklist.json` (canonical durable
home, preserved across `/plugin update`) and is read LIVE at query time — an
edit applies immediately, with no reindex and no restart.

## Name semantics

- A **BARE** entry (`resume-session`) blocks every qualified twin —
  `plugin:name`, `alias:name`, any origin. "Disable X" means X, everywhere.
- A **QUALIFIED** entry (`skill-concierge:keep-on`) blocks only that exact form —
  for when one origin must die but a same-named sibling must live.

## Steps

1. **View the disabled set:**

   ```bash
   python3 "$CLAUDE_PLUGIN_ROOT/scripts/blocklist.py" list
   ```

2. **Disable skill(s)** — reconciles the settings overrides immediately (a
   disabled skill is force-demoted from keep-on to name-only; `keep-on.json`
   itself is left untouched, so unblocking restores the allowlist):

   ```bash
   python3 "$CLAUDE_PLUGIN_ROOT/scripts/blocklist.py" add <skill-name> [<skill-name> ...]
   ```

3. **Re-enable skill(s):**

   ```bash
   python3 "$CLAUDE_PLUGIN_ROOT/scripts/blocklist.py" remove <skill-name> [<skill-name> ...]
   ```

## Layer map (what "disabled" means, mechanically)

| Layer | Effect |
|---|---|
| Enforcer (`hooks/scripts/enforcer.py`) | never offered, never hinted (CHAIN-HINT/ROUTE), never a deterministic route, no foreign-annex row |
| Engine (`vendor/skill-search/.../server.py`) | filtered from `search_skills` results; `get_skill` refuses to serve the body |
| Guard (`hooks/scripts/skill_guard.py`) | PreToolUse(Skill) **deny** — the deterministic layer that also catches command-files |
| Overrides (`scripts/apply-overrides.py`) | a blocked keep-on skill is forced name-only |

## Escape hatch

`SKILL_BLOCKLIST=0` turns the whole feature off everywhere (guard passes,
enforcer and engine stop filtering, overrides stop stripping) — the one-var
revert. `SKILL_CONCIERGE_BLOCKLIST` points all layers at an exact file (test
seam).

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.