claude

ash

ASH engineering skills: 60 guardrail skills plus Layer 0 hooks, always-on norms, and reviewer agents. One install covers skills, hooks, norms, and agents; updates arrive on every push to main.

27 on GitHubby Ben GrahamApache-2.0updated 2 days ago
/

Plugin ash from marketplace ash-skills in randommonicle/claude-skills. Commands read from the repo's manifest — yesterday.

This plugin runs code on your machine — its hooks fire automatically on events like tool use. The exact commands are listed below; read them before installing.

What it installs

Skills (61)

  • ai-surface-discipline

    Apply input minimisation, output discipline, and a human-in-the-loop gate to every surface that sends data to an LLM. Triggers when building or editing any send-to-LLM path: an Edge Function calling a model, a draft-commentary or summary generator, an auto-resolver, a cash-allocation suggestion, a c

  • blast-radius-grep

    The unit of change is the action or the fact, never the named list of places someone handed you. Before shipping a gate, constraint, rename, drop, or a correction to any duplicated, mirrored, or denormalised value, grep the whole repo — app, tests, seeds, scripts, open branches, and the built or ren

  • checkpoint-log

    Keep a live, committed checkpoint log during any work unit expected to span multiple commits or sessions. Each commit ships with a short note in the log, what the commit did, the key decision and why, any deviation from plan; closing the unit requires an explicit walk of the checklist including the

  • commission-the-roster

    Before spawning a fleet of agents, publish a roster for the operator's approval - role, model tier, token budget, scope and single artifact per agent - and brief each agent with pre-verified facts instead of questions. Triggers when appointing a lead agent, delegating a multi-agent wave, planning a

  • committee-review

    Run a three-lens committee review of a whole project or major subsystem: positive, adversarial, and neutral-chair reviewers over one shared evidence base, with attribution-stripped consolidation and item-by-item voting. Use when the user asks for a committee review, a multi-perspective audit, a "thr

  • confirm-before-push

    Always ask explicitly before pushing to a remote or fast-forwarding a protected branch. Per-action authorisation, not standing approval. Triggers on any git push, merge, or branch fast-forward operation, regardless of whether previous pushes in the same session were approved.

  • constant-time-secret-compare

    Compare bearer tokens, API secrets, signatures, and password-equivalents with a constant-time comparison (hash both sides, then crypto.timingSafeEqual) — never == or short-circuiting string equality. Triggers when writing any code that checks a secret against a stored or expected value. Does not fir

  • context-economy

    Keep the context window small and its prefix stable, because every token in it is re-sent on every later turn. Read slices instead of whole files, cap tool and log output before it lands, isolate high-volume work behind a summary, and clear rather than compact between unrelated tasks. Triggers when

  • contract-review

    Review a contract or lease for one named party, grading each risk against the exact clause it rests on. Every finding quotes its clause; caps, indemnities and exits are graded only with their interacting clauses; statutory points go to a verification list unless retrieved this session. Triggers on "

  • cross-agent-review

    Adversarially review a specific change, design, or finding by having Claude debate one or more INDEPENDENT AI agents (Gemini via the agy CLI or GPT via the codex CLI, driven by Claude with no pasting; or a chat the user drives; several seats at once) over a shared file relay, with mandatory file:lin

  • date-parse-utc-safe

    In a UTC server or serverless runtime, new Date("YYYY-MM-DD") is UTC midnight and renders as the previous day in western timezones. Parse date-only strings into explicit local components (new Date(y, m-1, d)) anywhere a date becomes a display string or a day-of-week. Triggers when parsing a date-onl

  • db-migration-verification

    Every database migration plan ships with a post-apply verification query that reads catalog state directly, separate from any runtime tests. Triggers on any work involving a database migration, schema change, RLS policy change, trigger change, or constraint change.

  • deliverable-integrity

    Three gates for AI-rewritten claims, owner-only facts, and machine-parsed output in any generated document, plus the structural assertions a text diff cannot see, such as a document that opens on a blank page. Claims: diff an AI rewrite claim by claim against the source — the original wins unless th

  • dependency-upgrade-verification

    When a dependency major-bump could silently change on-disk formats or behaviour and runtime data cannot distinguish success from failure, answer the question from the dependency's own source: npm pack both versions and diff the file that decides the behaviour, offline, before hunting for a device re

  • earn-every-line

    Nothing enters a file without a present need. Code earns its place by a caller that exists, a comment by saying what the code cannot, flexibility by a stated requirement. Triggers on over-engineered, over-commented, YAGNI, speculative, gold-plating, "just in case", "future-proofing", "flexibility",

  • email-delivery-verification

    A 2xx from a transactional email API means accepted, not delivered. Verify actual delivery in the provider's dashboard or webhooks, check the account-level suppression list, verify every recipient leg of a multi-recipient flow, and confirm a mailbox exists before pointing a send at it. Triggers when

  • enforce-invariants-in-build

    A rule asserted only in prose — "single source of truth", "never auto-X", "these must match" — is a comment, not a control; if a violation can exist without failing the build, one eventually will and it will look official. Triggers when writing or encountering any comment, doc, or convention that as

  • enumerate-the-set

    A change, reset, guard or proof that touches some members of a set silently leaves the rest as they were, and the member nobody listed is the one that breaks. Name the set, list it from its source (the type, the schema, the catalogue, the directory, the enum) rather than from the change in front of

  • env-change-verification

    An environment variable change is not live until the artifact that reads it is rebuilt, redeployed, or re-reads it — and a wrong-but-present value fails silently. Know for each variable whether it is baked at build time or read at request time. Triggers when adding or editing any env var, CI secret,

  • findings-are-evidence

    A subagent, reviewer, or scout report is evidence, not findings — and so is your own first-hand defect analysis. Re-derive every Critical or High claim, everything touching a regulatory anchor, and the reasoning about the fix from the primary source before acting or writing it into a durable artifac

  • fixtures-from-reality

    A test is only as true as what it feeds the code. Build fixtures from what the real dependency sent on the pinned version, not from its documentation; give a fake the service's failure behaviour (expiry, a lost answer after the effect, what it saves against a key) and its comparison rules; reach a r

  • flag-deferred-items

    When proposing anything as deferred, out of scope, or "for a later phase", plant a grep-able flag at the place where the deferred work will land. Triggers whenever the words "deferred", "out of scope", "later commit", "later phase", "future work", or similar appear in plans, commits, or design discu

  • guard-the-spend-paths

    When creating or reviewing any endpoint or control that touches money or shared state, two rules apply together. Every endpoint that spends money (LLM, email, SMS, payment) or writes shared state (bookings, slots) gets a per-IP volume cap the day it is created — anyone can POST directly, bypassing t

  • handover

    Produce a structured handover note when the context window fills or the user asks to wrap up. Take the real percentage from /context or, in the Claude desktop app, the get_usage tool; never estimate, and where neither exists record the gap verbatim rather than inventing a figure. Triggers when the c

  • honest-failure-surfacing

    Playbook for the always-on norm "one message per failure mode; error level is for terminal states only". Load when writing a catch block, a user-facing error string, a disabled control, a progress indicator, or choosing telemetry levels. Does not fire on content loss through filters (no-silent-data-

  • instrument-reports-itself

    A broken instrument reads as a healthy one unless its failure is a distinct value and that value reaches a person in time. Record a failure as a failure rather than as a default, a zero, a sentinel or a silence; give every terminal failure on an unattended path one message to a human, sent before it

  • legal-citation-integrity

    Audit every citation in a finished or received legal document (statute, regulation, case, quoted authority, internal cross-reference) before anyone relies on it. A citation is Confirmed only with a retrieval behind it; every citation in the document appears in the audit table. Triggers on "check eve

  • legal-notice-handling

    Draft, reply to, or analyse a legal notice (rent or service-charge demand, forfeiture or breach notice, statutory notice, letter before action). Every deadline is a calendar date with its arithmetic; every threatened consequence is confirmed and lawfully available; an admitted fact never concedes a

  • live-data-surgery

    Any ad-hoc destructive operation against a shared or production-adjacent database outside a test harness — bulk delete, cleanup sweep, re-baseline — follows a fixed protocol: read-only inventory first, BEGIN-ROLLBACK dry run, complement-count proof with NULL-collapsed predicates, a self-check that r

  • live-state-first

    Playbook for the always-on norm "probe live state before building from any described state". Load when about to write code, SQL, config, or a fixture from a handover, memory note, README, audit tracker, or code comment, or when two documents disagree. Does not fire on repo/PR/branch state (parallel-

  • lock-at-the-chokepoint

    Serialise shared operations at the single module-level chokepoint every caller passes through, never in per-instance state — and cap fan-out there too. A check-then-act idempotency guard protects sequential retries but loses the race under concurrency. Triggers when adding a lock, in-flight guard, d

  • mass-red-triage

    When a test suite goes from green to broadly red, classify before debugging. Find the first root failure (cascades multiply one fault), check for rate-limit walls, truncated runs, and environment defects, and bound the change's blast radius via the lockfile and diff before attributing blame. Trigger

  • measure-per-route

    A platform fact measured on one access path, build, timing or machine is a fact about that route only. Record every measured platform property with the route, build, timing and machine it was measured on; measure again before relying on it elsewhere; compare routes over a whole range, not a sample;

  • no-silent-data-drop

    Playbook for the always-on norm "filters and gates hide empty things; they never drop content". Load when adding any filter, gate, continue, catch, or fallback to a rendering or export path, when parsing model output that carries content, or when two renderers must produce the same content. Does not

  • one-real-ride

    Before declaring any deployed or user-facing change done, shipped, or closed out, run one real end-to-end invocation through the real seams — the deployed function, a real login and JWT, the real model call, the real browser or device. Green CI, green smokes, and a clean typecheck prove the layers;

  • working-lean

    Gets faster, more accurate answers by keeping each conversation to one matter and sending the material that bears on it without the material that does not. Use when someone is about to attach a mailbox or file export, a whole drive or client folder, or many documents at once; when a conversation has

  • outbound-side-effect-idempotency

    Code that performs an external side effect (email, SMS, payment, webhook) and then records its status must choose which failure harms the recipient less — lost or duplicated — and design for that. A read-then-write "already sent?" check is not a lock. Triggers when writing any send-then-record path

  • parallel-work-recon

    On any repo worked from multiple machines, sessions, or agents, your knowledge of its state is a snapshot with a short half-life. Run git fetch, gh pr list, and git log --all at session start AND again immediately before committing; claim sequential identifiers (migration numbers, versions) by scann

  • pin-to-what-was-seen

    An action a person takes on state a screen showed carries that state with the request, and the server refuses it, doing nothing, when the state no longer holds. Send the value or version the screen drew; compare-and-set on it under the row lock (409 on a mismatch); on a 409 or an answer in doubt clo

  • plan-first

    State the file list, test list, and out-of-scope items before writing code on any non-trivial commit. Triggers on requests to implement a feature, add a schema-touching change, build a new module, or perform a multi-file refactor. Skip on trivial one-line fixes and doc typo corrections.

  • price-the-spend

    Price anything that recurs BEFORE it ships, and report what an action actually cost AFTER it runs. Triggers when adding or reviewing a cron job, scheduled workflow, nightly build, keep-warm ping, polling loop, always-on container, log retention or storage growth, a paid tier or subscription upgrade,

  • prove-it-can-fail

    Every test, seed, verification script, CI gate, or check must demonstrably be able to fail when the thing it guards is broken. Ask of each check "what does this print if the thing is broken?" Triggers when writing or reviewing any test, smoke, seed, verification file, or CI job, when marking a test

  • prove-it-can-pass

    A deny-list, pattern gate, scanner or guard is only half proved by a violation it catches; the other half is innocent input it must let through, and the violating forms nobody pictured. Before arming one, run it over a real corpus of legitimate input rather than invented examples, over the command a

  • reproduce-the-real-build

    Before pushing anything a CI or release pipeline will compile, run the exact production build command locally — the test runner tolerates syntax and dependency drift the release build rejects. Prove any toolchain fix by reconstructing from tracked manifests alone (npm ci into a clean directory). Tri

  • rerun-before-verdict

    No verdict from a single uncontrolled run. A fix is proven by re-running the case that failed; a component's deadness or value is proven by a with/without comparison on the current system; a surprisingly good result stays a candidate until three consistent datapoints or a controlled before/after dif

  • safe-smokes

    Never run destructive operations against shared or live data in tests, smokes, or seeds. Flip-and-restore with try/finally instead of delete; seed in beforeAll and tear down in afterAll; restore shared state exactly as found. Triggers when writing or editing any test, smoke, or seed script that conn

  • secrets-in-output

    Nothing that can carry a secret value may reach a tool result, because the transcript is a synced file re-sent on every turn. Check an env var by presence and length only, list names not values, read a .env file by its keys, capture provider status output and API responses into a variable and print

  • server-side-authority

    Four server-side authority rules for any client-facing backend. Never trust a client-supplied storage path or object id — derive it server-side from the row the caller owns. An RLS self-update policy must scope columns, not just rows, or a user can promote their own role. Every exposed table gets RL

  • skill-library-builder

    Turn a real repository into a project-specific skill library that preserves a senior engineer's operating knowledge, so juniors and smaller models can carry the project forward. Load when asked to build, refresh, or audit a skill library or engineering playbook for a codebase, to capture tribal know

  • spawn-from-declared-state

    A child agent or process inherits whatever its launcher happens to be carrying — settings, hooks, CLAUDE.md, auto-memory, API tokens, MCP servers, and the parent's lifetime — unless the launch declares otherwise. Launch headless agents from an explicit settings source, tool list and environment allo

  • statute-to-obligations-register

    Turn a statute, regulation or code (for example LTA 1985, BSA 2022, a RICS code) into an obligations register read from the current official text: one row per duty, each with its section, owner, trigger, evidence, deadline, control and commencement status. Triggers on "map our obligations under X" o

  • substantiate-outward-claims

    Any certification, award, statistic, or third-party performance claim shown to a customer needs a primary or independent source, or explicit attribution ("the manufacturer states…") — never asserted as fact, and never trusted from an AI summary, which blends marketing with real product names. Trigge

  • team-loop

    Keep a project's resume state in team/NOW.md, overwritten at every session end and checked against git at each start, and keep the operator's open decisions in one queue, the Ask board (a private claude.ai artifact, unregulated projects) or team/ASK.md (regulated projects), never both. In a project

  • tool-layer-bytes

    The shell and editing layers between Claude and a file rewrite bytes the author never touched (escapes dropped or turned into control bytes, CRLF turned LF, arguments rewritten), and the transcript still shows the command as written. Route any payload carrying a backslash, a quote of the enclosing k

  • trace-one-record

    Before combining two figures into a derived total, or asserting that one set of amounts sits outside another, trace a single record end to end through both sources to establish what each actually contains. Triggers on any total owed, due, outstanding, exposed or net; on adding, subtracting or nettin

  • unordered-events

    Webhooks, queues and retries do not arrive in the order the work happened, and a guard written for the state a handler expects lets the neighbouring states through. Write each handler's state machine down, guard every status write with the set of states it may move FROM, test every (event, current s

  • unslop-code

    Strips the tells that make source code read as AI-generated and forces code that fits the project instead of the model's default average. It does not write the code for you and it has no preferred style. It removes the surface tells (leftover chat artifacts, placeholder comments, emoji, swallowed er

  • unslop-text

    Strips the cues that make prose read as AI-generated and forces a deliberate human voice instead of the model's default register. It has no house style and does not write for you. It removes the cited tells (the em dash, the "it's not just X, it's Y" cadence, assistant boilerplate, the delve/tapestr

  • unslop-ui

    Strips the cues that make a website read as AI-generated and forces a deliberate, project-specific design choice instead of the model's default. It does not impose a look or hand you taste. It removes tells (default shadcn/Tailwind, AI-purple gradients, gradient heading text, unprompted neon glow, e

  • verified-citations

    Stops fabricated and drifted references in any document that cites code, schema, config or history. Load BEFORE writing or reviewing a handover, design doc, plan, spec, decision log, lessons entry, audit, review report, PR description, or commit message that points at files, line numbers, migrations

  • verify-the-effect

    Playbook for the always-on norm "never report success from a proxy signal — assert the actual effect or artifact". Load when a status signal (green CI step, HTTP 200, "accepted", exit 0, progress bar) is about to be read as success, when a step's entire output is a side effect, or when routed here f

Subagents (6)

  • code-reviewer

    Independent second-opinion review of a specific code change, diff, or file. Use when you want a fresh pair of eyes on logic, correctness, security, or test adequacy — separate from the agent that wrote the code. Not for whole-codebase audits; scope to a named change.

  • property-reg-reviewer

    Statutory-aware second-opinion review of a code or document change for UK property-management compliance and financial correctness. Use for diffs touching service-charge maths, demands, client money, leaseholder-facing output, retention or erasure, or AI surfaces. Knows LTA 1985, RICS Service Charge

  • tl-builder-regulated

    Team-loop builder for a regulated work package (service-charge maths, demands, client money, leaseholder-facing output, migrations and access policies, retention). Works in its own git worktree, merges the independent test writer's commit T first, then builds against it. Use at step 6 of the team lo

  • tl-builder

    Team-loop builder for an unregulated work package. Works in its own git worktree from a brief at team/packages/WP-nnn.md; writes the package's tests first in their own commit and stops, then builds when the lead resumes it. Use at steps 5 and 6 of the team loop. Not for regulated packages (tl-builde

  • tl-researcher

    Team-loop researcher. Investigates one named topic for the lead and writes one findings file, team/research/<topic>/FINDINGS.md, with sources and options. Use at step 1 of the team loop, at most two at once. Not for building, reviewing, or deciding.

  • tl-test-writer

    Team-loop test writer for a regulated work package. Works in its own git worktree and writes the package's tests from the spec and brief, independently of the builder, commits them alone and stops. Use at step 5 of the team loop for regulated packages only. Never writes implementation.

Hooks (13)

  • SessionStart

    node "${CLAUDE_PLUGIN_ROOT}/hooks/norms-inject.mjs"

  • SessionStart

    node "${CLAUDE_PLUGIN_ROOT}/hooks/session-recon.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/push-gate.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/sql-surgery-warn.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/secret-echo-guard.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/kill-guard.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/byte-layer-warn.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/secret-echo-guard.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/schedule-cost-warn.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/migration-write-warn.mjs"

  • PreToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/test-write-warn.mjs"

  • PostToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/skill-fire-log.mjs"

  • PostToolUse

    node "${CLAUDE_PLUGIN_ROOT}/hooks/lint-after-edit.mjs"

View source on GitHub bengraham.uk

Maintain ash?

This page updates itself from your repo. Add the badge to your README, or get it Featured to pin it above the organic results with a followed link to your site.

claude & codex pluginslisted