Skip to content
Back to skills

Adr

ASecurity

**Status:** Accepted **Date:** 2026-10-10

  • 4 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 10, 2026
ai-agentsgoshellnode

Works with

  • claude code
  • cli

Security analysis

A100/100

Pro scans all 12 files and shows the line behind each finding

Scanned November 10, 2026

npx -y skills add nordscope-fi/plain-english --skill adr --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Adr?

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

Security grade badge for Adr
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/nordscope-fi-adr/badge)](https://www.skillsdirectory.com/skills/nordscope-fi-adr)

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
# ADR-009: The checker ships inside a writing skill for Claude chat and Cowork

**Status:** Accepted
**Date:** 2026-10-10

## Context

The plugin did its job only in Claude Code. In Claude chat and Cowork, output
styles and mods do not load; skills do. Anthropic's platform page lists skills
as "Loads" on every surface, and output styles as "Ignored" outside Claude
Code.

A live test on 10 October ran the bundled checker from an uploaded skill in
chat on the web and in the phone app. Both printed `/opt/node22/bin/node` and
`v22.22.0`, found the three planted phrases, and passed the clean draft, with
nothing downloaded. No Anthropic page promises Node in chat; the docs say a
script runs in "what the code-execution environment provides". The test
covers one account.

Chat copies a skill's own folder and nothing else: "In chat on claude.ai, the
skill's whole folder, scripts included, is copied into the code execution
sandbox". The checker's core lived in `hooks/core/`, outside any skill.

The directory portal lists the existing plugin for Claude Code, Cowork and
the Claude apps, noting for the last two "Not used here: output styles. The
directory lists mods for Claude Code only."

## Decision

The checker's core moves into the writing skill, and the mod imports it from
there.

- The build writes the core to `skills/plain-english/scripts/core/`. The mod's
  two imports in `hooks/register.ts` point there, so one copy serves both.
- `scripts/check.mjs` in the skill reads a draft on standard input and calls
  `checkDraft`, a new core function. It returns `checked`, `incomplete` or
  `invalid`; the script adds `unavailable` when the core will not load. The
  script gives up after 10 seconds if its input never closes.
- `checkDraft` reads no file, keeps no state and makes no model call. The
  checks a judge makes in Claude Code come back as questions for Claude to
  answer about its own draft.
- `plain-english render` generates the skill's `SKILL.md` from the ruleset,
  with the same reply rules as the output style. Claude saves the draft to a
  file and the shell redirects it in, so no text in the draft can run as a
  command.

## Consequences

- One copy of the core. The directory scans it once per version.
- The mod's imports reach into the skill's folder. A probe of this layout on
  Claude Code 2.1.296 passed `claude plugin validate --strict` and the mod's
  36 tests.
- In Claude Code the skill's instructions say not to run the script, because
  the mod already checks there.
- Replies are checked only when the skill loads, and a skill loads only when a
  request fits its description. The plugin README offers a sentence a person
  adds to their profile instructions.
- The plugin's listing text now says what each app gets.

## Alternatives considered

- **Faking a Claude Code hook event.** The script could have wrapped each
  draft in a fake event for the existing hook path. It needs no core change,
  but it couples the skill to that event format, and a failed check looks the
  same as a clean draft.
- **The pre-commit integration's single-file CLI.** It is about 1.6 MB, over
  the directory's 262,144-byte limit per file.
- **A second copy of the core in the skill.** It leaves the mod untouched, but
  the directory rescans every version, so the same code would go through the
  scan twice, and a test would have to keep the copies equal.
- **A separate plugin for chat and Cowork.** Two listings and two reviews. The
  portal showed one plugin can be listed everywhere.

## Re-evaluation triggers

- Chat stops providing Node 20 or later, or another plan type turns out not to
  have it.
- The directory flags the mod importing from a skill's folder.
- The portal stops listing the plugin outside Claude Code.

Files in this skill

  • 001-two-layer-detection.md2.3 KB
  • 002-block-before-the-write.md2.4 KB
  • 003-severity-gradient.md2.6 KB
  • 004-ruleset-is-data.md2.1 KB
  • 005-graduated-escape-hatch.md2.7 KB
  • 006-model-checks-through-the-host.md7.7 KB
  • 007-term-approval-in-the-checker.md2.7 KB
  • 008-checker-runs-inside-the-mod.md7.9 KB
  • 009-checker-ships-in-a-skill.md3.7 KB
  • README.md1.5 KB
  • _template.md539 B

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.

View all in ai-agents →

Comments

Loading comments…

Newsletter

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