Skip to content
Back to skills

Skills Guide

ASecurity

Grouped catalog of every Splotch skill — what each one does and how related skills chain together (the audit lifecycle, the PR flow, ADRs, handoffs). Use when asked what skills are available, which skill fits a task, or how skills relate — and to register a skill you just created, renamed, or deleted.

  • 7 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 29, 2026
testinggoawstestinggitapiperformancedocumentation

Works with

  • claude code
  • cli
  • api

Security analysis

A100/100

Scanned September 29, 2026

npx -y skills add KyleMit/Splotch --skill skills-guide --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Skills Guide?

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

Security grade badge for Skills Guide
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/kylemit-skills-guide/badge)](https://www.skillsdirectory.com/skills/kylemit-skills-guide)

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
---
name: skills-guide
description: Grouped catalog of every Splotch skill — what each one does and how related skills chain together (the audit lifecycle, the PR flow, ADRs, handoffs). Use when asked what skills are available, which skill fits a task, or how skills relate — and to register a skill you just created, renamed, or deleted.
---

# Skills guide

Every repo skill, grouped by the workflow it belongs to. Each skill's own `description` frontmatter
stays the canonical trigger text; this guide's job is the **grouping** and the **arrows between
skills** — which ones consult, feed, or undo each other.

## Codebase reference — consult before working in an area

Standalone lookups; none depend on another skill.

| Skill          | Covers                                                                           |
| -------------- | -------------------------------------------------------------------------------- |
| `architecture` | Tech stack, source map of `web/src/`, route table, canonical UI element glossary |
| `design`       | Design tokens, primitives, voice & copy, brand — and the public `/design` page   |
| `api`          | Every `/api/*` endpoint plus the CORS, rate-limiting, and auth model             |
| `mobile`       | Android/iOS/Capacitor toolchain, on-device testing, store-release checklists     |
| `testing`      | Three-tier test strategy (Vitest, Playwright, Maestro), commands, CI triggers    |

## Decisions — consult → weigh → document → reconcile

| Skill                   | Role in the chain                                                              |
| ----------------------- | ------------------------------------------------------------------------------ |
| `adrs`                  | Entry point: index of all ADRs; read before proposing any architectural change |
| `walk-through-decision` | Weigh an open decision in plain language: stakes, real options, one pick       |
| `create-adr`            | Document a significant decision just made — adds a new ADR                     |

`adrs` stays first for architectural decisions, and the ordering is not a formality: what has
already been decided is an input to weighing anything, which is why `walk-through-decision`'s own
grounding step sends you to `docs/adrs/` before the first trade-off is written. A decision the ADRs
have nothing to say about — a naming call, a process change, a product question — skips straight to
weighing.

`walk-through-decision` then runs *before* a decision exists: it explains one and recommends an
option, and deliberately stops there. It writes nothing and implements nothing, so recording the
outcome stays an explicit later ask to `create-adr`. Its `mode=autonomous` is how the unattended
skills (`ship-issue`, `address-pr-review`, `ship-campaign`) answer a question they would otherwise
have stopped to ask: the agent's own calls are locked after a `run-rival-agent` review (marked
unreviewed if none can run), and the user's are parked for them. The last link of the chain,
`reconcile-adrs`, lives with the other reconcile skills under Recurring maintenance.

## Performance — interaction matrices and page load

| Skill                        | Measures or drives                                                                                             |
| ---------------------------- | -------------------------------------------------------------------------------------------------------------- |
| `start-capture-session`      | **Start here for physical-device work** — takes the iPad/Android rig over and proves it will capture           |
| `release-capture-session`    | The mirror image — stops every rig process any checkout owns and resets the phone, for a clean next start      |
| `profiling`                  | Drawing/canvas **interaction** performance (`npm run perf:*` harness, jank, regressions)                       |
| `capture-performance-matrix` | Serial cross-target drawing, undo, and discrete-action capture across web/native targets                       |
| `improve-performance-matrix` | Freshly inventory the matrix, improve current scoreable reds, and ship causal clusters as reviewed stacked PRs |
| `audit-page-load`            | **Page-load** performance / Core Web Vitals on a throttled device; also an audit producer                      |

`capture-performance-matrix` is the capture and refresh workflow. `improve-performance-matrix`
consumes that evidence and owns the sustained improvement campaign through zero current, scoreable,
unexplained reds on the release-gate rows (a red cell with an ADR-recorded, evidence-backed
disposition counts as explained — ADR-0160) or a user-requested merge-ready wrap-up.

## Recurring maintenance — audit → vet → burn down / fix, reconcile

Recurring maintenance skills are named by family, so the prefix says what a run does (the naming
standard in the root `CLAUDE.md`): **`audit-*`** finds work and changes no code, **`burn-down-*`**
shrinks a measured count toward a target, **`reconcile-*`** brings an artifact back in line with
current reality. The audit cycle chains them: audit producers stage findings in `docs/AUDIT.md`,
`vet-audits` promotes survivors to `type:audit` GitHub issues and deletes the staging file, and
`fix-audits` works the issues — or `burn-down-audits` vets and fixes a huge staged backlog in one
unattended run. Shared rules for the producers live in `.claude/audit-conventions.md`.

### `audit-*` — find work, change no code

| Skill                     | What it finds                                                                      |
| ------------------------- | ---------------------------------------------------------------------------------- |
| `audit-code`              | Broad perf/readability/maintainability/architecture sweep → `docs/AUDIT.md`        |
| `audit-extractions`       | Inline code blocks worth extracting into named functions → `docs/AUDIT.md`         |
| `audit-page-load`         | Page-load opportunities → `docs/AUDIT.md` (primary home: Performance)              |
| `audit-session`           | End-of-session retrospective on repo friction → `docs/AUDIT.md`                    |
| `audit-compatibility`     | Browser/OS floor, API risk register, and feature-probe drift → `docs/AUDIT.md`     |
| `audit-dependency-health` | Provenance/license/maintenance review of every dependency → `docs/DEPENDENCIES.md` |

### Screening and fixing audit findings

`vet-audits` and `fix-audits` keep verb-noun names outside the three families: in both, "audits"
means the findings, not the act. `improve-agent-workflow` also stays outside: it applies the config
changes it recommends, so `audit-*` would understate what a run does (it lives under Repo hygiene &
meta).

| Skill        | What it does                                                                    |
| ------------ | ------------------------------------------------------------------------------- |
| `vet-audits` | Adversarially validate findings; file survivors as `type:audit` issues          |
| `fix-audits` | Autonomously clear open `type:audit` issues, one commit each, on its own branch |

### `burn-down-*` — shrink a count toward its target

| Skill                             | The count it shrinks                                                                    |
| --------------------------------- | --------------------------------------------------------------------------------------- |
| `burn-down-audits`                | Staged `docs/AUDIT.md` findings — vets and fixes a huge backlog with run controls       |
| `burn-down-outdated-dependencies` | Outdated dependencies — upgraded one at a time with migration guides (user-invoke only) |
| `burn-down-dependabot-prs`        | Open Dependabot PRs — verify, sequence the merges, close the rest                       |
| `burn-down-flaky-tests`           | Masked Playwright retry events — fix current flakes or track a narrow quarantine        |
| `burn-down-oversized-code`        | Files or functions over the size caps — paid back down to their soft targets, one PR    |
| `burn-down-code-smells`           | Verified code-smell findings — audited in waves, each fixed in its own merged PR        |

### `reconcile-*` — bring an artifact back in line with reality

| Skill                      | What it reconciles                                                                                                                       |
| -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `reconcile-adrs`           | Existing ADRs against the current code and recent decisions — amends drift                                                               |
| `reconcile-agent-memories` | Claude Code project memory (Claude-only) and its index against the current repo and GitHub state — fixes or retires drift                |
| `reconcile-code-map`       | `docs/CODE-MAP.md` against the current tree — regenerates tables, rewrites prose                                                         |
| `reconcile-docs-with-code` | Living docs, skills, and rules against the code — stale identifiers, prose about renamed or deleted things, and doc-reference exemptions |
| `reconcile-with-main`      | A long-running branch against current `main`, hunting the *semantic* conflicts                                                           |

`burn-down-dependabot-prs` is the human-side pass downstream of the automated Dependabot review
(`.github/workflows/dependabot-review.yml`, `docs/DEPENDABOT.md`, and
[ADR-0081 on the Dependabot review workflow](../../../docs/adrs/0081-dependabot-claude-review-workflow.md)),
which posts an advisory verdict but never merges. It pairs with `burn-down-outdated-dependencies`
and the two do not overlap: that skill picks packages the repo is behind on and drives the bumps
itself, this one triages PRs Dependabot has already opened.

`burn-down-oversized-code` runs in `mode=files` (`max-lines`) or `mode=functions`
(`max-lines-per-function`). It is user-invoked only, because invoking it authorizes a multi-agent
fan-out: a proposer and an adversarial reviewer per unit, then an implementer per split in its own
worktree with a fresh commit checker. Its `measure.mjs` reads every cap from `eslint.config.js`.
Line limits are treated as smells: a unit that does not separate cleanly gets a per-file cap raise,
never a counter-driven split.

`burn-down-code-smells` is the time-boxed, unattended code-quality campaign. It is user-invoked
only, for the same fan-out reason. The run:

* audits in waves with parallel read-only auditors: principles first, then the repo's own
  conventions, the component layer and test quality, then one pass per uncovered area;
* clusters the verified findings into small file-disjoint units, and ships each as a rival-reviewed,
  merged PR through `ship-campaign parallel=<n>`;
* ends by folding the rules it earned into `docs/CODING-STANDARDS.md`.

Unlike the audit cycle above, it stages nothing in `docs/AUDIT.md`: it finds and fixes in one
sitting.

`reconcile-code-map` keeps the lines-of-code snapshot current: `npm run gen:code-map` owns the
tables, and the skill teaches the rules about new areas and misplaced files and rewrites the prose.
It finds work rather than doing it — sharp growth becomes an issue. `audit-code` uses the map to
shard an exhaustive whole-repo pass, so refresh it first when it is weeks behind.

`reconcile-docs-with-code` is the judgment half of a split: `npm run check:doc-refs` already fails
CI on a living doc naming a repo path or npm script that does not resolve, so the PR that renames a
file fixes the docs naming it. The skill sorts the advisory identifier list that check prints,
follows renames and deletions into prose no path check can see, and re-justifies the exemptions.

`reconcile-agent-memories` covers the Claude Code project memory directory outside the repo. Its
checker runs on demand because CI has no access to personal memories. The skill is a Claude-only
direct provider package: this host has no tested Codex indexed-memory store to give a second
implementation. See its provider note for the first hand-run and the split decision.

`reconcile-with-main` exists because a clean `git merge` proves almost nothing about a branch that
has been open a while: it detects overlapping line edits and nothing else. The skill surveys the
incoming commits before merging (the range vanishes once `main` is an ancestor), then checks them
against the branch's own changes for stranded call sites, changed contracts, and duplicated work.
Reach for it before `address-pr-review` on a stale PR — reviewer comments written against a
pre-merge diff are hard to triage until the branch is current.

## Cross-agent execution

| Skill             | Use when you are…                                                                                                                                                                        |
| ----------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `run-rival-agent` | **Pairing** this session, as the native handler, with the other vendor's CLI as a rival agent for an independent review it can verify through you — Codex from Claude, Claude from Codex |

One name, two packages: each provider tree carries the package that launches the *other* vendor, so
a shared skill can name `run-rival-agent` without knowing which runner it is on.

## Pull requests — author, review, respond

These augment the built-in PR flows rather than replacing them.

| Skill                     | Use when you are…                                                                                                                        |
| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `create-stacked-prs`      | **Sequencing** dependent changes into a chain of stacked PRs, when the user asks for one                                                 |
| `pr-screenshots`          | **Opening** a PR that touches UI — screenshot/before-after/gif conventions                                                               |
| `create-pr-review-prompt` | **Handing off** this session's PRs to an independent reviewer — builds the prompt                                                        |
| `leave-pr-review`         | **Authoring** a review — local checkout, empirical verification, posts by default                                                        |
| `address-pr-review`       | **Receiving** a review — triage every comment, fix or rebut, reply and resolve                                                           |
| `drive-pr-to-mergeable`   | **Driving** one open PR to mergeable — rival review, address, two-round bound, CI to green, verdict; never merges                        |
| `ship-issue`              | **Shipping** one issue or task end to end — implement, PR, rival review, address, drive to mergeable; merges too under `mode=autonomous` |
| `ship-campaign`           | **Campaigning** through a queue of issues unattended — each shipped and merged via `ship-issue` before the next starts from fresh `main` |
| `orchestrate-sessions`    | **Coordinating** human-relayed worker sessions — batch work, emit prompts, verify reports and evidence preservation before advancing     |

`create-stacked-prs` decides the *shape* of a chain before any single PR exists, and every later
skill in the group respects that shape while a chain is open. Stacks are opt-in: a multi-issue
campaign merges as it goes (`ship-campaign`), so reach for a stack only when the user asks for
dependent changes to land together. Its one rule — no new commit on a PR once another PR sits above
it — is why `address-pr-review` carries a stacked-campaign mode: inside an active stack it sweeps
the feedback from the whole chain and lands every fix in a single feedback PR at the tip, reused
across review rounds, instead of committing onto the reviewed branch. Read `create-stacked-prs`
first anyway — it defines the shape that mode preserves.

`create-pr-review-prompt` sits between authoring and review: at the end of a session it enumerates
every PR produced (the whole chain, in a stack), adds the session's own doubts as extra focus areas,
and emits the prompt that has an independent agent run `leave-pr-review` — full sweep first, focus
areas after. `leave-pr-review` posts its findings by default (invoking it is the authorization;
`mode=chat` and `mode=issues` redirect them), and `address-pr-review` then works the comments on the
author's side.

`drive-pr-to-mergeable` is the shared core of this group: given one open PR, it builds the reviewer
prompt with `create-pr-review-prompt`, gets the independent review from the rival agent
(`run-rival-agent`), works every thread with `address-pr-review`, runs that as a **bounded** loop —
two rounds at most, after which whatever is still open is reported as an action item rather than
chased into a third round — then drives CI to green, reconciles conflicts, and returns a
shippable-or-leftovers verdict. It never opens a PR, never merges, and never files an issue: it
drafts the follow-ups for the user. Every skill that opens PRs reaches it by name and states only
its own overrides — `create-stacked-prs` runs it on each layer while that layer is the tip,
`ship-issue` and `fix-audits` run it with no overrides, `improve-performance-matrix` makes round two
unconditional — so reviewer independence and the CI-failure policy read the same everywhere: the
rival is the reviewer (a same-runner subagent only as a named, weaker fallback), and a failure the
PR did not introduce is named in the thread and drafted, never absorbed or filed.

`ship-issue` is the single-unit pipeline through this whole group: it takes one issue number or a
free-form task, implements it, opens the PR, and hands it to `drive-pr-to-mergeable`. Both modes
take the PR all the way to **mergeable**. Invoked as `mode=autonomous` it also **merges** the PR,
but only behind a full gate — a real rival review that posted, every required check green on the
merged head, every thread resolved, nothing unpushed — and a downgraded reviewer withdraws that
authority rather than lowering the bar.

`ship-campaign` is `ship-issue mode=autonomous` in a loop, for a queue — an explicit list, an epic's
children (via `enumerate-sub-issues`), or `backlog`, the newest unclaimed issues picked one at a
time. Every unit merges before the next branches from the new `main`, so the rival reviews each
change as it lands instead of a premise compounding through a stack. What it adds is the campaign's
own discipline: a preflight run while the user is still present, quarantining a stuck unit instead
of stalling the queue, never ending the turn to ask, and a morning report verified against GitHub.
`profile=performance` wraps `improve-performance-matrix`'s causal-cluster unit. `parallel=<n>` runs
up to `n` file-disjoint units at once, with the session as orchestrator:

* it admits a unit only when that unit shares no files and no import dependency with any unit in
  flight;
* it performs every merge itself, one at a time, only against a `main` the unit has gated;
* it broadcasts contract changes to units still running.

When `main` moves under a unit, the `reconcile-with-main` survey's relation verdict decides between
a trial merge (`unrelated` or `adjacent`) and the full semantic pass (`coupled`).

`orchestrate-sessions` is the attended counterpart: it maintains a durable plan and gives the user
one prompt at a time to carry to separate Claude or Codex workers. Workers use `ship-issue` or
`ship-campaign`; the orchestrator verifies their pasted reports against GitHub and the underlying
preserved evidence before choosing a follow-up for that worker or the next batch. It never
implements or launches workers itself, and a merged PR does not discharge an outstanding
preservation obligation.

## Session continuity — pause ↔ resume, keep the lessons

| Skill            | Direction                                                                                               |
| ---------------- | ------------------------------------------------------------------------------------------------------- |
| `create-handoff` | Hand off in-flight work: a copyable continuation prompt by default, a `docs/handoff/` packet on request |
| `resume-handoff` | Pick a packet back up: verify against the repo, delete it, continue the work                            |
| `self-heal`      | Sweep the session for durable lessons; write each into the home the next tripped-up session will see    |

End-of-session reflexes divide by what survives the session: in-flight *work* goes into a handoff
packet; a *lesson* with a clear fix and home is applied on the spot by `self-heal`; recurring
*friction* that needs adversarial vetting or a later fix agent is staged by `audit-session`; a
*decision* that drifted is `reconcile-adrs`' job (both under Recurring maintenance). `self-heal` is
also the general form of the audit skills' shared §3 — folding a run's method learnings back into
the skill that ran is its in-file special case.

## Running & previewing the app

| Skill                     | Use for                                                                         |
| ------------------------- | ------------------------------------------------------------------------------- |
| `run-splotch`             | Launch, drive, and screenshot the web app locally to verify a change works      |
| `cloud-preview`           | Cloud sessions only: dev server + reverse tunnel for a public phone-preview URL |
| `critique-page-inventory` | Independently review every light/night portrait/landscape inventory capture     |

## Shipping

| Skill               | Use for                                                                      |
| ------------------- | ---------------------------------------------------------------------------- |
| `cut-release`       | Draft and review notes, then bump, commit, tag, push, and create the release |
| `build`             | Build the signed release artifacts (Android `.aab`, iOS `.ipa`)              |
| `publish-artifacts` | Attach the built artifacts to the GitHub Release, verifying their versions   |

These three run **in order, and the order is load-bearing**: an artifact can only carry a version
that is already committed, so `cut-release` creates the GitHub Release with nothing attached,
`build` produces the binaries for the version it just tagged, and `publish-artifacts` attaches them
— refusing any artifact whose embedded version does not match. Attaching at release time is how
v1.4.0 shipped a 1.2.0 bundle; see ADR-0077.

## External image services

| Skill             | Use for                                                                              |
| ----------------- | ------------------------------------------------------------------------------------ |
| `vectorize-image` | Trace a bitmap to SVG/PDF/EPS/DXF/PNG through Vectorizer.AI's metered credit account |

The account is a 50-credit metered plan, so the tool defaults to Vectorizer.AI's free watermarked
test mode and spends a credit only behind an explicit flag. **This skill is a pointer, not a
package** — the driver, runbook, and inlined API documentation live in `tools/vectorize/`, so the
bulk is not copied into both `.claude/` and `.agents/` on every Ruler run. It is standalone: the
asset-generation pipeline in `tools/asset-gen/` (AI line art and fills) is unrelated and documents
its own decisions under `tools/asset-gen/docs/`.

## Repo hygiene & meta

| Skill                         | Use for                                                                             |
| ----------------------------- | ----------------------------------------------------------------------------------- |
| `enumerate-sub-issues`        | Enumerate an epic's children from the sub-issues API, classify, and order them      |
| `prune-git-workspace`         | Salvage and prune agent worktrees, delete dead local branches, triage `origin`      |
| `improve-agent-workflow`      | Review Claude Code config + session history vs. best practice; apply approved fixes |
| `analyze-session-transcripts` | Mine past local session transcripts into factual, evidence-anchored reports         |
| `skills-guide`                | This guide                                                                          |

`analyze-session-transcripts` has independent registered Claude and Codex packages because their
session stores and record envelopes differ. It is user-invoked only — a batch run spawns a subagent
per session, so it never fires on model initiative.

`prune-git-workspace` runs three cleanups in a fixed order — worktrees, then local branches, then
remote branches — because each frees something the next one classifies. Its scripts under
`tools/git-housekeeping/` are dry runs by default; the local-branch judgment pass exists to give any
finding on an unmerged branch a durable home (an issue, an ADR via `create-adr`, a scratchpad note —
the `self-heal` judgment) *before* the branch goes, and the remote pass still hands the user a
deletion script rather than deleting `origin` refs itself.

## Keeping this guide current

Every skill must appear here in exactly one primary group (cross-reference a second group in prose
when a skill genuinely spans two, as `audit-page-load` does). Most skills are generated from
`.ruler/skills/` or `.ruler/skill-forks/`. Direct packages are registered, with the providers each
ships for, in `tools/ruler/lib/direct-provider-skills.mjs`. When editing one, change only the
declared provider; never copy one implementation into an undeclared provider tree.

**When you add, rename, or delete a skill, update this guide in the same change**, then run
`npm run ruler:apply` for generated surfaces. If a new skill fits no existing group, add a group
rather than forcing it into one.

Naming: workflow skills (perform a procedure with side effects) get verb-noun names (`create-adr`,
`fix-audits`); reference skills (only load knowledge) get plain noun names (`architecture`, `adrs`).
A recurring maintenance skill takes a family prefix — `audit-*`, `burn-down-*`, or `reconcile-*` —
only when that prefix is honest about what its run does. The name alone should tell you whether
invoking the skill is passive or starts a procedure — see the skill-naming standard in the root
`CLAUDE.md`.

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.

Comments

Loading comments…