Agent skill

Conformance Check

by ewhauser in ewhauser/shuck

Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/.

MITAuto-check passedTesting & QA

Install Conformance Check

skills CLI
$ npx skills add ewhauser/shuck --skill conformance-check -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install ewhauser/shuck conformance-check --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/ewhauser/shuck.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/conformance-check .claude/skills/conformance-check && rm -rf skills-src

Use ~/.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/

Facts

Skill name
conformance-check
GitHub stars
137
Token cost
~3.1k tokens
SKILL.md length
1,135 words
Files
1
Skills in repo
8
Repo updated
First seen
Licence
MIT

At a glance

Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/.

  • Works in 7 steps: Resolve the rule → Run the corpus test → Tally the delta → …
  • The user asks to check conformance
  • SKILL.md covers Overview, Step 1: Resolve the rule, Step 2: Run the corpus test and Step 3: Tally the delta, plus 4 more sections
  • Calls shellcheck, make and nix

What it does

Conformance Check is an agent skill from ewhauser/shuck. Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/. Use this skill whenever the user asks to check conformance, verify parity, run the corpus test for a rule, investigate shellcheck deltas, create a bug report for a rule's conformance gaps, or says things like "check C001 conformance", "verify SC2086 parity", "run corpus test for C006", "what's the delta for X023". Even if the user just says "conformance" or…

Its SKILL.md is about 3.1k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Testing & QA, covering QA and bug reports. The repository describes itself as: A lightning fast shell linter/formatter/LSP server with zsh support. The licence is MIT.

When your agent uses it

  • The user asks to check conformance
  • Run the corpus test for a rule
  • Investigate shellcheck deltas
  • Create a bug report for a rules conformance gaps

Example prompts

  • “s conformance gaps, or says things like”
  • “verify SC2086 parity”
  • “run corpus test for C006”
  • “/conformance-check”

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Resolve the rule
  2. Run the corpus test
  3. Tally the delta
  4. Sample and categorize deltas
  5. Write the bug document
  6. Allowlist reviewed divergences
  7. Report to the user

What it can do on your machine

Read from SKILL.md and the folder at commit 904974e. It shows what the files ask for, not the result of running them.

  • Tool permissions

    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.

  • Runs code

    Shell commands in SKILL.md call:

    • shellcheck
    • make
    • nix
    • jq

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Conformance Check loads about 3.1k tokens when it runs. Until then it costs about 146 tokens; SKILL.md has 1,135 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~146
When it runs · the whole SKILL.md, loaded when a task matches
~3.1k

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.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated 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); files beside SKILL.md are not scanned.

SKILL.md

The full file from ewhauser/shuck at commit 904974e, republished under its MIT licence (© ewhauser). 1,135 words, ~3,118 tokens.

Download SKILL.mdSave it as .claude/skills/conformance-check/SKILL.md (or your agent's skills folder).
name
conformance-check
description
Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/. Use this skill whenever the user asks to check conformance, verify parity, run the corpus test for a rule, investigate shellcheck deltas, create a bug report for a rule's conformance gaps, or says things like "check C001 conformance", "verify SC2086 parity", "run corpus test for C006", "what's the delta for X023". Even if the user just says "conformance" or "corpus test" with a rule code, this skill applies.

ShellCheck Conformance Check

This skill runs the large corpus comparison for a specific shuck rule, analyzes the deltas between shuck and ShellCheck, and produces a structured bug document that an AI agent can later pick up and work through systematically.

Overview

The goal is to answer: "How well does shuck rule CXXX match ShellCheck's SCYYYY on real-world scripts?" The output is a docs/bugs/CXXX.md file with categorized deltas, verdicts on each, and an actionable checklist.

Step 1: Resolve the rule

Given a rule code (e.g., C001, C005) or ShellCheck code (e.g., SC2086):

  1. Read the YAML definition in docs/rules/CXXX.yaml
  2. Extract: new_code, shellcheck_code, description, new_category
  3. Confirm the rule is implemented — check crates/shuck-linter/src/registry.rs for the rule code in the declare_rules! macro

If the rule isn't implemented yet, tell the user and suggest using /implement-rule first.

Step 2: Run the corpus test

Run a 10% sample first to get a quick read on the delta size:

bash
make test-large-corpus SHUCK_LARGE_CORPUS_RULES=CXXX SHUCK_LARGE_CORPUS_SAMPLE_PERCENT=10 SHUCK_LARGE_CORPUS_KEEP_GOING=1

This will likely fail (the test asserts zero deltas). That's expected — the failure output IS the data. Capture the full output.

If the 10% sample shows a manageable number of failures (under ~50), you can optionally run a larger sample or the full corpus to get more complete data. For large delta counts, 10% is sufficient to identify the patterns.

Reading the output

Each failure block in the test output follows this structure:

compatibility diff (code + location):
  SCXXXX: shellcheck=N shuck=M
  labels:
    location-only | directive-handling | shellcheck-parse-abort | ...
  shellcheck parse aborted: true|false
  shellcheck locations:
    SCXXXX=N
  shuck locations:
    SCXXXX=M
  shellcheck diagnostics:
    SC1234 line:col-endline:endcol level message
  shuck diagnostics:
    CXXX=>SCXXXX line:col-endline:endcol severity message

The key fields:

  • shellcheck=N shuck=M: count comparison. N>M means shuck is under-reporting, M>N means shuck is over-reporting
  • labels: automated classification hints (see label meanings below)
  • shellcheck diagnostics / shuck diagnostics: the actual warnings each tool emitted, which you need to compare line-by-line
Label meanings
  • location-only — same diagnostic codes, different spans. Usually a span anchoring difference, not a semantic issue.
  • shellcheck-parse-abort — ShellCheck hit a parse error and bailed. Deltas from these scripts are unreliable.
  • directive-handling — script has ShellCheck directives that may suppress differently.
  • project-closure — script has source/. commands; results depend on resolution.
  • unknown-shell-collapse — script starts with a non-shebang comment before the shell marker; shell detection may differ.

Step 3: Tally the delta

From the test output, compute:

  • Total fixtures sampled (from the progress output)
  • ShellCheck-only locations — diagnostics ShellCheck emits but shuck doesn't (count + script count)
  • Shuck-only locations — diagnostics shuck emits but ShellCheck doesn't (count + script count)
  • Location-only scripts — scripts where counts match but spans differ

Step 4: Sample and categorize deltas

Go through the failing fixtures and sample representative cases from each bucket. For each sample, read the actual script source to understand what the code does. You need enough samples to identify the distinct patterns — usually 3-8 samples per bucket is sufficient.

Categorization

For each distinct delta pattern, assign a verdict:

  • shuck-fix — Shuck's behavior is wrong and should be changed to match ShellCheck. This is the most common case: shuck over-reports (false positive) or under-reports (false negative) compared to ShellCheck's intentional behavior.

  • shellcheck-quirk — ShellCheck reports something but shuck intentionally does not, and we believe shuck is right to stay silent. ShellCheck's behavior appears to be a bug, limitation, or design choice we disagree with. Document why — cite the shell spec or semantic reasoning. These get added to the ShellCheck-side allowlist (crates/shuck/tests/testdata/allowlists/scNNNN.yaml).

  • shuck-correct — Shuck reports something that ShellCheck does not, and we've reviewed it and decided shuck is right to flag it. The diagnostic is genuinely useful even though ShellCheck misses it. Document why — cite the shell spec or semantic reasoning. These get added to the shuck-side allowlist (crates/shuck/tests/testdata/allowlists/shuck/cNNN.yaml).

  • location-only — Same diagnostic, different span anchoring. Not a semantic disagreement but worth tracking if the offset pattern is systematic.

  • environment — The delta comes from parse-abort, directive handling, source resolution, or other environmental differences. Not actionable at the rule level.

How to investigate a delta

For each failing fixture, the test output gives you the fixture name (e.g., HariSekhon__DevOps-Bash-tools__.bash.d__teamcity.sh). To find the actual script:

bash
find .cache/large-corpus -name "HariSekhon__DevOps-Bash-tools__.bash.d__teamcity.sh" -o \
  -path "*/scripts/HariSekhon__DevOps-Bash-tools__.bash.d__teamcity.sh"

Read the script around the lines mentioned in the diagnostics. Compare what ShellCheck flagged vs what shuck flagged. To understand ShellCheck's reasoning, you can run it directly through nix:

bash
nix --extra-experimental-features 'nix-command flakes' develop --command \
  shellcheck --format=json /path/to/script.sh 2>/dev/null | jq '.[] | select(.code == NNNN)'

Look for patterns across multiple samples — most deltas cluster into a few root causes.

Step 5: Write the bug document

Create or update docs/bugs/CXXX.md using this template:

markdown
# CXXX: [short title describing the conformance gap]

## Rule

| Field | Value |
|-------|-------|
| Shuck code | CXXX |
| ShellCheck code | SCYYYY |
| Category | [Correctness/Style/etc.] |
| Rule file | `crates/shuck-linter/src/rules/{category}/{name}.rs` |

## Delta snapshot

Sampled on [date] using `make test-large-corpus` at [N]% sample.

| Bucket | Locations | Scripts |
|--------|-----------|---------|
| ShellCheck-only | N | N |
| Shuck-only | N | N |
| Location-only | N | N |

## Delta analysis

### [Pattern name] `[verdict]`

**Bucket:** ShellCheck-only | Shuck-only | Location-only
**Impact:** N locations / N scripts in sample

[1-3 sentence description of the pattern and why it happens.]

**Samples:**
- `fixture_name:line` — [brief description of the specific case]
- `fixture_name:line` — [brief description]

---

### [Next pattern name] `[verdict]`

...repeat for each distinct pattern...

---

## Checklist

Each item links back to the delta pattern it addresses. Items are grouped by
implementation locality (changes to the same function/module are adjacent).

- [ ] **[Short task description]** — addresses: [Pattern name] `[verdict]`
  - [Implementation hint: what to change and where]
- [ ] **[Next task]** — addresses: [Pattern name] `[verdict]`
  - [Implementation hint]
- [ ] **Re-run corpus test and update this document**

## Allowlisted divergences

Entries added to suppress reviewed intentional divergences in the corpus test.

### ShellCheck allowlist (`crates/shuck/tests/testdata/allowlists/scNNNN.yaml`)

| Fixture | Line | Reason |
|---------|------|--------|
| [fixture_name] | N:N | [reason from the shellcheck-quirk pattern] |

### Shuck allowlist (`crates/shuck/tests/testdata/allowlists/shuck/cNNN.yaml`)

| Fixture | Line | Reason |
|---------|------|--------|
| [fixture_name] | N:N | [reason from the shuck-correct pattern] |

(Omit either section if no entries were added for that side.)

## Notes

[Any additional context: known ShellCheck bugs, upstream issues, spec references,
or decisions about which shellcheck-quirk/shuck-correct items we intentionally diverge on.]
Show full SKILL.md (452 more words)Show less
Template guidelines

The document is optimized for an AI agent to pick up later and work through:

  • The Rule table gives the agent immediate access to file paths and codes.
  • The Delta analysis sections each have a verdict so the agent knows which patterns need code changes and which are intentional divergences.
  • The Checklist items reference specific patterns, so the agent can trace each fix back to the delta that motivated it. Include implementation hints — file paths, function names, the general approach.
  • Verdict tags (shuck-fix, shellcheck-quirk, shuck-correct, location-only, environment) are inline with pattern names so they're scannable.
  • Only shuck-fix items should appear in the checklist. shellcheck-quirk and shuck-correct items are documented for the record but don't generate code change work items — instead they get allowlisted (see Step 6).

Step 6: Allowlist reviewed divergences

For deltas where we've reviewed the behavior and decided one tool is correct, add allowlist entries so the corpus test passes despite the intentional divergence.

There are two allowlist sides:

ShellCheck allowlists (for shellcheck-quirk verdicts)

When ShellCheck reports something that shuck intentionally does NOT report (because ShellCheck is wrong or we disagree), add an entry to filter out the ShellCheck diagnostic.

Location: crates/shuck/tests/testdata/allowlists/scNNNN.yaml

These are keyed by ShellCheck code (lowercase). The span values come from ShellCheck's diagnostic output.

Note: ShellCheck allowlists are currently loaded per-rule in the test harness (large_corpus_conforms_with_shellcheck()). If the SC code doesn't already have loading wired up, you'll need to add it — follow the sc2034_allowlist pattern as a model.

Shuck allowlists (for shuck-correct verdicts)

When shuck reports something that ShellCheck does NOT report, and we've reviewed it and decided shuck is right to flag it, add an entry to filter out the shuck diagnostic.

Location: crates/shuck/tests/testdata/allowlists/shuck/cNNN.yaml

These are keyed by shuck rule code (lowercase) and live in the shuck/ subdirectory. The span values come from shuck's diagnostic output. Unlike the ShellCheck side, shuck allowlists are auto-discovered — any YAML file in the shuck/ directory is loaded automatically. No test harness changes needed.

Allowlist format (same for both sides)
yaml
# Large-corpus allowlist entries for reviewed CXXX/SCNNNN divergences.
# Keep this file narrow and review-backed: every entry must name the exact
# location we intentionally diverge on and why.
entries:
  - path_suffix: "owner__repo__path__to__script.sh"
    line: 42
    end_line: 42
    column: 5
    end_column: 18
    reason: "brief explanation of why this divergence is intentional"

Fields:

  • path_suffix — the fixture filename (the __-delimited path form used in the corpus)
  • line, end_line, column, end_column — exact span from the tool's diagnostic
  • reason — a concise explanation citing the shell spec or semantic reasoning
What NOT to allowlist
  • shuck-fix verdicts — these need code changes, not allowlisting
  • environment verdicts — these are filtered by labels already
  • location-only verdicts — fix the span instead

Step 7: Report to the user

Summarize:

  • The delta snapshot (counts)
  • How many distinct patterns you found
  • The verdict breakdown (N shuck-fix, N shellcheck-quirk, N location-only, N environment)
  • How many allowlist entries were added (if any)
  • The path to the bug document
  • A recommendation: is this rule close to parity (small targeted fixes) or far off (needs significant rework)?

© ewhauser, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/conformance-check of ewhauser/shuck.

Open the folder on GitHubat commit 904974e

Compare with similar skills

Conformance Check 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.

Conformance Check compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Conformance Check this skillewhauser/shuck137—~3.1kAutomated safety check: PassMIT
Reproduce Chat Statesdifferent-ai/openwork24k—~673Automated safety check: PassCustom licence
Dynamo Jira TicketDynamoDS/Dynamo2k—~1.1kAutomated safety check: PassApache-2.0
Minimal Run And Auditlllllllama/RigorPilot-Skills4972 repos~691Automated safety check: PassMIT
Moav E2EMotherofallVPNs/MoaV448—~1.9kAutomated safety check: NotesMIT
Anchor Reprolynxlangya/techne1051 repos~1.2kAutomated safety check: PassMIT

Similar skills

  • Reproduce Chat States

    different-ai/openwork

    Fires known chat states in the running OpenWork desktop app, such as provider errors, retries and tool steps, so you can check how each renders.

    24k GitHub stars~673 tokensUpdated today
    Testing & QAAuto-check passed
  • Dynamo Jira Ticket

    DynamoDS/Dynamo

    Create structured Jira tickets for Dynamo from bug reports, failing tests, or feature requests.

    2k GitHub stars~1.1k tokensUpdated today
    Testing & QAAuto-check passed
  • Minimal Run And Audit

    lllllllama/RigorPilot-Skills

    Rigor Run skill for README-first deep learning repo reproduction.

    497 GitHub starsUsed in 2 repos~691 tokens
    Testing & QAAuto-check passed
  • Moav E2E

    MotherofallVPNs/MoaV

    Run and debug MoaV's end-to-end tests — real protocol connectivity (client-test.sh) and the moav CLI smoke test — against a LIVE server, via the self-hosted e2e workflow or a local test VPS.

    448 GitHub stars~1.9k tokensUpdated yesterday
    Testing & QAAuto-check: notes
  • Anchor Repro

    lynxlangya/techne

    Reproduce a behavioral bug before fixing it, record the failing probe, and verify the fix with the same probe.

    105 GitHub starsUsed in 1 repo~1.2k tokens
    Testing & QAAuto-check passed
  • Creating A Coral Task

    Human-Agent-Society/CORAL

    Author a new CORAL task — the three pieces that must line up (task.yaml, seed/, a packaged grader/), the coral init → coral validate → smoke-test loop, and how to pick a grader pattern (stdout…

    1k GitHub stars~2.2k tokensUpdated 1 mo ago
    Testing & QAAuto-check passed

More from ewhauser/shuck

All 8 skills in this repo
  • Profile Shuck Script

    ewhauser/shuck

    Profile shuck scripts and large-corpus fixtures, especially requests to profile a corpus script/fixture, reprofile after a shuck performance change, or produce a hotspot table from a samply profile.

    137 GitHub stars~1.3k tokensUpdated 3 days ago
    Auto-check passed
  • Bench Compare

    ewhauser/shuck

    Compare benchmark performance between two git worktrees (or the current worktree vs main).

    137 GitHub stars~2.4k tokensUpdated 3 days ago
    Auto-check passed
  • Fix Rule

    ewhauser/shuck

    Fix a shuck lint rule that has conformance deltas against ShellCheck.

    137 GitHub stars~3.2k tokensUpdated 3 days ago
    Auto-check passed
  • Implement Fix

    ewhauser/shuck

    Implement an autofix for an existing shuck-rs lint rule. An agent skill from ewhauser/shuck.

    137 GitHub stars~3.1k tokensUpdated 3 days ago
    Auto-check passed
  • Implement Rule

    ewhauser/shuck

    Implement a shuck-rs lint rule from its YAML definition in docs/rules/.

    137 GitHub stars~4.8k tokensUpdated 3 days ago
    Auto-check passed
  • Spec Writer

    ewhauser/shuck

    Write and update technical design specifications. An agent skill from ewhauser/shuck.

    137 GitHub stars~1.7k tokensUpdated 3 days ago
    Auto-check passed

Categories

Questions about Conformance Check

What does Conformance Check do?

Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/. Conformance Check is an agent skill from ewhauser/shuck. Verify ShellCheck conformance for a shuck rule by running the large corpus test, analyzing deltas, and producing a structured bug document in docs/bugs/.

When should I use Conformance Check?

Conformance Check fits situations like: the user asks to check conformance; run the corpus test for a rule; investigate shellcheck deltas; create a bug report for a rules conformance gaps.

How do I install Conformance Check in Claude Code?

Run `npx skills add ewhauser/shuck --skill conformance-check -a claude-code`. Or copy the skill folder (.claude/skills/conformance-check in ewhauser/shuck) into .claude/skills/conformance-check in your project. Claude Code loads it when a task matches its description.

How do I install Conformance Check in Codex?

Run `npx skills add ewhauser/shuck --skill conformance-check -a codex`. Or copy the skill folder (.claude/skills/conformance-check in ewhauser/shuck) into .agents/skills/conformance-check in your project. Codex loads it when a task matches its description.

Can I use Conformance Check in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ewhauser/shuck --skill conformance-check -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/conformance-check, .gemini/skills/conformance-check, .github/skills/conformance-check and .opencode/skills/conformance-check in your project.

What does Conformance Check need to run?

Going by SKILL.md and its folder, Conformance Check needs the command-line tools its instructions call (shellcheck, make, nix and jq).

Does Conformance Check access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Conformance Check safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Conformance Check use?

Conformance Check is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Conformance Check use?

About 3.1k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Conformance Check?

Skills that share tags, products or a category with Conformance Check: Reproduce Chat States (different-ai/openwork, 24k stars), Dynamo Jira Ticket (DynamoDS/Dynamo, 2k stars), Minimal Run And Audit (lllllllama/RigorPilot-Skills, 497 stars) and Moav E2E (MotherofallVPNs/MoaV, 448 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Conformance Check?

ewhauser (a GitHub user) maintains it in ewhauser/shuck, which has 137 GitHub stars. The repository holds 8 skills in this directory. The repository was last updated on October 5, 2026.

Source: ewhauser/shuck on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.