audit
Voice
Read ../persona.md at the start of this skill. That persona is
canonical for all output of this skill.
Scope: local to this skill's execution only. Once the final report is printed, revert to the session default voice immediately.
Language
Adapt all output to match the user's language. If the user writes in French, respond in French; if English, in English; if mixed, follow their lead. Technical identifiers (file paths, code symbols, CLI flags, tool names) stay in their original form regardless of language.
What this skill does
Audits every plugin's SKILL.md, AGENT.md, persona.md, README banner reference,
assets/banner.png, and assets/BANNER_PROMPT.md against the _templates/
source of truth.
No auto-fix — reports deviations, the human decides what to do.
linear-devotee is the existing visual reference banner. Audit it like every
other plugin; its image is the style target, not a rules exception.
Step 1 — Preconditions
Verify _templates/ exists and contains the required templates:
test -f _templates/skill/claudecode/SKILL.md && \
test -f _templates/agent/AGENT.md && \
test -f _templates/persona/persona.md && \
test -f _templates/plugin/BANNER_PROMPT.md && \
echo "templates ok" || echo "ERROR: _templates/ missing or incomplete"
If templates are missing, abort with: "les formules manquent. _templates/ est absent ou incomplet."
Step 2 — Load template requirements
Read the <!-- template-meta --> block from each template:
_templates/skill/claudecode/SKILL.md→ for all SKILL.md files_templates/agent/AGENT.md→ for all AGENT.md files_templates/persona/persona.md→ for all persona.md files_templates/plugin/BANNER_PROMPT.md→ for all plugin banner prompts
Requirements extracted:
- SKILL.md: required_frontmatter
[name, description], required_sections["## Workflow", "## Never"] - AGENT.md: required_frontmatter
[name, description], required_sections[] - persona.md: required_frontmatter
[name, tagline], required_sections["## Language", "## Hard rule"] - BANNER_PROMPT.md: required guidance: README banner, visible mascot/persona, existing nuthouse style, setting from persona world, functional props secondary, user-centered personas keep the user offscreen/implied/abstract, 3:1 target, no readable text unless exact English text is requested, final asset path
assets/banner.png - Banner assets:
<plugin>/assets/banner.pngmust exist when the plugin README references it; no stalebanner.jpeg,banner-old.png,banner-love.png, or other archive banner files should remain.
Step 3 — Discover all artefacts
# Plugins
ls */persona.md 2>/dev/null | cut -d/ -f1
# Skills
ls */skills/*/SKILL.md 2>/dev/null
# Agents
ls */agents/*.md 2>/dev/null
# Personas
ls */persona.md 2>/dev/null
# Banner prompts
ls */assets/BANNER_PROMPT.md 2>/dev/null
# Banner assets
ls */assets/banner.png 2>/dev/null
ls */banner.jpeg */banner.jpg */assets/banner-old.* */assets/banner-love.* 2>/dev/null
Step 4 — Check each file
For each file, check against the matching template's requirements.
SKILL.md checks (in order):
- Frontmatter contains
namefield — ❌ CRITIQUE if missing - Frontmatter contains
descriptionfield — ❌ CRITIQUE if missing ## Workflowsection present — ❌ CRITIQUE if missing (new format)## Neversection present — ❌ CRITIQUE if missing (new format)## Voicesection present WITHOUT## Workflow— ⚠️ WARNING: old format, migrate to compact## Workflow+## Never## Languagesection present WITHOUT## Workflow— ⚠️ WARNING: old format artifact, migrate to intro-line pattern
AGENT.md checks:
- Frontmatter contains
namefield — ❌ CRITIQUE if missing - Frontmatter contains
descriptionfield — ❌ CRITIQUE if missing - Frontmatter contains
tools:block (non-empty list) — ❌ CRITIQUE if missing or empty (every agent must have an explicit allowlist) - Agent
namematches a persona/role word (seer,oracle,acolyte,spirit,muse,ghost,herald, etc.) — ⚠️ WARNING: persona-coded agent name; rename to a functional role
persona.md checks:
- Frontmatter contains
namefield — ❌ CRITIQUE if missing - Frontmatter contains
taglinefield — ⚠️ WARNING if missing ## Languagesection present — ❌ CRITIQUE if missing## Hard rulesection present — ❌ CRITIQUE if missing
BANNER_PROMPT.md checks (per plugin):
<plugin>/assets/BANNER_PROMPT.mdexists — ⚠️ WARNING if missing- Contains guidance that the mascot/persona is visible — ❌ CRITIQUE if missing
- Contains guidance to match the existing nuthouse banner style — ❌ CRITIQUE if missing
- Contains guidance that the setting comes from the persona's world — ❌ CRITIQUE if missing
- Contains guidance that task/domain props are secondary — ⚠️ WARNING if missing
- Contains guidance for user-centered personas: user offscreen/implied/abstract, no competing deity/boss/mascot — ❌ CRITIQUE if missing
- Contains the 3:1 README banner target — ❌ CRITIQUE if missing
- Contains no-readable-text guidance unless exact English text is requested — ❌ CRITIQUE if missing
- Contains final-path guidance for
assets/banner.png— ⚠️ WARNING if missing
Banner asset checks (per plugin):
- If README references
./assets/banner.png,<plugin>/assets/banner.pngexists — ❌ CRITIQUE if missing - If
<plugin>/assets/banner.pngexists, README references it — ⚠️ WARNING if missing - No stale root banner image such as
<plugin>/banner.jpegor<plugin>/banner.jpg— ⚠️ WARNING if present - No archive banner image such as
assets/banner-old.*orassets/banner-love.*— ⚠️ WARNING if present
Step 5 — Report
Output format:
## audit — nuthouse
### <plugin-name>
✅ skills/<skill>/SKILL.md
❌ skills/<skill>/SKILL.md — missing ## Language [CRITIQUE]
⚠️ persona.md — missing tagline in frontmatter [WARNING]
⚠️ assets/BANNER_PROMPT.md — absent [WARNING]
❌ assets/BANNER_PROMPT.md — missing persona-world setting rule [CRITIQUE]
❌ assets/banner.png — README references missing banner [CRITIQUE]
⚠️ banner.jpeg — stale banner image [WARNING]
### <plugin-name>
✅ agents/<agent>.md
✅ persona.md
✅ assets/BANNER_PROMPT.md
✅ assets/banner.png
---
<N> critiques · <N> warnings · <N> ok
If zero critiques and zero warnings: "le labo est propre. toutes les créatures sont conformes. 🧪"