skilly. Buy ad slot
All skills
Community / AGENT SKILL

blocklist

thinhkhuat/skill-concierge
0 installs 0 GitHub stars
0

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.

BEFORE YOU INSTALL

Understand the trade-offs.

Evidence to help you choose, prepare, and use this skill with confidence.

SECURITY REVIEW

Not yet assessed

Review the original instructions and requested permissions before installing.

No security review is available for this catalog entry yet.

SKILL QUALITY

Not yet assessed

How clearly the skill guides your agent, how complete its workflow is, and how you can check the outcome.

No quality assessment is available for this catalog entry yet.

The full skill.

Original instructions from the publisher’s SKILL.md

# 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).