name: railroad-review description: Review code changes against project conventions, specs, and definition-of-done — parallel review directions merged into one station review. Trigger on /railroad-review or "review this branch/PR/my changes". Args — directions: direction-set override; lanes: n[model-effort]; scope: branch|wip|all[base]; paths: pathspec; spec; focus: subject; refute-level: threshold; chunks: mode[maxFiles:maxLines]; expect-base-red: red-base waiver. author: Andreas Geßner version: 8.2 acdsl-context: ACTION-CONCEPT-, ACTION-IMPL-, ACTION-REVIEW-, RULE-PLAN-, RULE-COMMIT-, FACT- allowed-tools: Read, Write, Edit, Workflow, TaskOutput, ToolSearch, Bash(git diff*), Bash(git log*), Bash(git rev-parse*), Bash(git merge-base*), Bash(git rev-list*), Bash(git status*), Bash(git branch*), Bash(git worktree add*), Bash(git worktree remove*), Bash(git worktree list*), Bash(git add*), Bash(git write-tree*), Bash(git commit-tree*), Bash(jq *), Bash(mkdir *), Bash(cp ), Bash(go run ./cmd/acdsl ), Bash(make build), Bash(make test) argument-hint: "[directions] [lanes] [scope] [paths] [spec] [focus] [refute-level] [chunks] [expect-base-red]"
Railroad Review
Structural code review against the project's documented standards, specs, and plans. The review is organized as directions — independent lenses with their own context — fanned out to parallel lanes through the station protocol. The session running this skill is the dispatcher: it schedules the rounds, holds the human gate, and applies the fixes; it never reviews a lane itself. The skill is the procedure skeleton; the review standards themselves live in the project's context entries.
When to use
Use when: reviewing any code change against project conventions, specs, style guides, and definition-of-done criteria — pull requests, feature branches, commits, uncommitted work-in-progress, untracked files, or a single file. THE review skill, every scope; scope is an intake arg (see Args), not a routing boundary. Invoked via /railroad-review.
Don't use when: diagnosing a bug — /diagnose-debug. Checking test coverage — /coverage-increase. Evaluating a change's qualitative consequences — /fimpact. Verdict on existing (unchanged) code — /code-verdict.
Preconditions: an interactive non-plan-mode session with the Workflow tool (MODES-002); the project's context docs; branch/all scopes need a diff base; a green base (PROC-009, waivable via expect-base-red); the correctness direction needs a spec, plan, or request doc (dropped per DIR-004 without one).
Workflow position: standalone (see README.md § Skill map, smine repo).
Args
- directions: string list overriding the default direction set — values from the Directions table (
special-focusstill requiresfocus), e.g.directions: tests security contracts. An explicit set is binding: MODES-004 dynamic selection (diff-proportional drops, risk-map adds) is skipped, the override stated in the review record. Absent ⇒ defaults + MODES-004. - lanes: parallel lanes per direction with an optional per-lane model/effort bracket —
lanes: <n>[<model>-<effort>], e.g.lanes: 2[opus-medium]. Bracket tokens resolve by vocabulary: a token inlow | medium | high | xhigh | maxis the effort, anything else the model —2[opus],2[medium], and2[opus-medium]all parse. Default 2; absent bracket ⇒ lanes inherit the session model/effort. - spec: spec/plan/request doc for the correctness direction; absent ⇒ the DIR-003 table's default chain, and with no doc at all the direction drops (DIR-004).
- scope: what to review, with the diff base in an optional bracket —
branch[<base>](committed range, fork point → head tip),wip(working tree only: staged, unstaged, and untracked; base = HEAD, never a bracket),all[<base>](fork point → working tree including untracked), e.g.scope: branch[develop]. An explicit bracket base supersedes derivation: unresolvable (after theorigin/<base>retry) ⇒ stop and report, never a silent substitute; bracket absent ⇒ PROC-002 derivation with an explicit warning in chat naming the derived base. Scope absent ⇒ dynamic default:branchwhen the tree is clean,allwhen dirty — the chosen scope and why is stated in the review record. - paths: optional pathspec narrowing any scope to named files or directories — e.g.
paths: internal/server cmd/*.go. - focus: the special-focus direction's subject; the direction runs only with this argument — e.g.
focus: "goroutine lifecycle in the scheduler rewrite". - refute-level: severity threshold for per-candidate refutation, read like a log level — the value names the minimum severity that gets a fresh refuter, everything at that level and above is included.
blocker | major | minor | nit | info(blocker= blockers only,info= every candidate);nonedisables the stage (the station is the sole second confirmation). Defaultmajor. - expect-base-red: boolean flag — present waives the base-health gate (PROC-009), the review proceeds on a red base, stated in the review record; absent ⇒ a red base stops the review.
- chunks: chunked fan-out — partition mode with optional chunk-size bounds,
chunks: <mode>[maxFiles:maxLines]. Modes:layers(the dispatcher derives dependency-ordered layers from the repo's actual structure),languages(partition by file language), or explicit pathspec groups, e.g.chunks: domain=internal/model/**; api=internal/server/**. The bracket bounds each chunk over the reviewed code only — the PROC-005 pre-excluded set (vendor/, generated, deps, lockfiles) never counts; defaults 30 files / 2000 changed lines, e.g.chunks: layers[30:200],chunks: languages[40:1000]. Arg absent ⇒ no partition while the reviewed set fits the default bounds; over either bound the dispatcher partitions automatically (PROC-008). See MODES-005.
Scope resolution
SKILL-RAILROADREVIEW-SCOPE-001 [step] — Scope first: branch = committed range (PROC-001). wip/all = snapshot commit, never live tree — author maybe still typing.
SKILL-RAILROADREVIEW-SCOPE-002 [step] — Snapshot commit: built without touching branch, index, or working tree: copy the index to a temp GIT_INDEX_FILE, git add -A (captures untracked files — git diff cannot see a file never added), git write-tree, git commit-tree <tree> -p HEAD. headCommit = the snapshot SHA; baseCommit = HEAD for wip, the fork point for all.
SKILL-RAILROADREVIEW-SCOPE-003 [step] — Snapshot rounds: fixes land on the dispatcher's working tree. Each round new snapshot. "Head moved" (STATION-006) = new snapshot tree differs.
Directions
SKILL-RAILROADREVIEW-DIR-001 [review] — Definitions: direction = review lens. Lane = one agent walking one direction. Dispatcher = the session running this skill. Defaults (absent an explicit directions arg): code-style, correctness, critical; each direction fans to lanes lanes.
SKILL-RAILROADREVIEW-DIR-002 [gate] — Falsifiability bar (every direction except code-style, whose ground truth is the style doctrine): a candidate must name the concrete input, state, or sequence that produces the wrong behaviour — naming opinions, architecture preference, and unquantified robustness are rejected at the lane.
SKILL-RAILROADREVIEW-TPL-001 [payload] — Falsifiability bar, worked example:
Accepted: correctness-MAJ-1 · order.go:142 — ApplyDiscount divides by len(items) with no guard;
a cart emptied between validation and pricing (DELETE /cart/items racing checkout)
reaches this with len == 0 and panics.
Rejected: "the service layer could be more robust against empty inputs" (no concrete trigger)
Rejected: "OrderManager should be named OrderService" (naming)
Rejected: "this should use the repository pattern" (architecture preference)
SKILL-RAILROADREVIEW-DIR-003 [review] — Direction table: each direction is a goal plus a context requirement — the standards themselves are context, never restated here:
| Direction | Goal | Context |
| :--- | :--- | :--- |
| code-style | The change reads like the repo wrote it — naming, idiom, structure. | ACTION-REVIEW-QUALITY-*; the repo's style rules for the change's language |
| correctness | The change does exactly what the spec requires — nothing missing, nothing nobody asked for. | the spec/plan/request: invocation-named, else plans/{slug}/design/refined.md, else raw.md; ACTION-REVIEW-SPEC-* |
| critical | No high-risk defect class ships. | ACTION-CONCEPT-HOT-* (fallback one-liner: concurrency misuse, nil derefs, weakened guards, resource leaks) |
| special-focus | Whatever the focus argument names. | the focus arg |
| data-integrity | State-bearing changes keep the integrity doctrine. | ACTION-IMPL-INTEG-* (fallback one-liner: append-only migrations, no timer-driven transitions, claim-before-send, exhaustive enums) |
| contracts | A cross-boundary contract change lands on every side — no leftover old names in any language, fixture, or doc. | repo-wide search, all languages; ACTION-REVIEW-DEPLOY-002 |
| tests | Changed code is covered by on-pattern tests. | ACTION-REVIEW-TEST-*; nearest sibling test files |
| security | Only quantified, reproducible exploits. | the Security rules below |
SKILL-RAILROADREVIEW-DIR-004 [review] — No spec, no correctness: without a spec, plan, or request doc the correctness direction is dropped, named as dropped (MODES-004). Ticket text or stated request counts as minimal spec.
Modes
SKILL-RAILROADREVIEW-MODES-001 [step] — Railroad: bundled workflow per round, then station loop — human gate, ledger, fixes, two consecutive clean rounds.
SKILL-RAILROADREVIEW-MODES-002 [gate] — Runnability gate: plan-mode session or Workflow tool missing ⇒ stop, report railroad cannot run here (EXEC-002 — never a prompt, never a degraded single-context review). One direction is a valid railroad.
SKILL-RAILROADREVIEW-MODES-003 [step] — Workflow invocation: the dispatcher invokes the bundled workflow (workflows/railroad-review.js, base directory stated at skill load) once per round: {scriptPath, args: {base, head, baseCommit, headCommit, commitsAhead, scope, riskMap, chunks, refute, artifactsDir, diffFiles, round, directions, lanes, contextRefs, focus, laneModel, laneEffort, rejectedFindings}} — args as a real JSON object; the workflow interface stays decomposed, the dispatcher unpacks the intake brackets into it (scope[base] → base, lanes[model-effort] → laneModel/laneEffort, chunks[maxFiles:maxLines] → the computed chunks groups, refute-level → refute). artifactsDir = session scratchpad (absolute), artifacts under round-{r}/ outside every worktree. rejectedFindings = ledger content by value — worktrees fork from committed state, cannot see an uncommitted file. The range is re-resolved every round (PROC-001..004).
SKILL-RAILROADREVIEW-MODES-004 [step] — Direction selection: an explicit directions arg is binding — the selection is exactly that set, dynamic drops and adds skipped, the override stated in the review record. Absent ⇒ diff-proportional — a small diff may drop defaults; risk map (PROC-007) high for auth/crypto/input handling/persisted data MUST add security. Every drop and add named with reason in the review record.
SKILL-RAILROADREVIEW-MODES-005 [step] — Chunked fan-out (an explicit chunks arg, or automatic when the reviewed set exceeds the size bounds — PROC-008): the dispatcher partitions the reviewed files (derived layers, per-language groups, or explicit groups), states the partition. Fan-out = directions × chunks × lanes. Lane reads only its chunk, coverage per chunk. contracts chunk-exempt (cross-boundary). Cross-chunk suspicions flagged in notes.
Round (what the workflow does)
SKILL-RAILROADREVIEW-ROUND-001 [step] — Fan-out: lanes lanes per selected direction (× chunks per MODES-005), each in an isolated worktree at headCommit, blind to sibling lanes.
SKILL-RAILROADREVIEW-ROUND-002 [gate] — Lane premise: HEAD must equal headCommit with baseCommit an ancestor; when headCommit is a descendant of HEAD (snapshot scope), the lane runs git checkout -B <its claude/railroad-* branch> <headCommit> — the one sanctioned checkout, which also anchors the unreferenced snapshot. Any other mismatch ⇒ abort with the commit facts, never review from a different premise.
SKILL-RAILROADREVIEW-ROUND-003 [gate] — Lanes are review-only: no edits, no plan mode, no tree-mutating git; artifacts are written as a JSON+MD pair under round-{r}/ outside the worktree; the lane terminates after writing.
SKILL-RAILROADREVIEW-ROUND-004 [step] — Lane output is claims: before returning, the lane re-reads each claim's cited code and drops what does not survive, recording the check in evidence — the claim's first confirmation; it stays in question until refuted or station-verified.
SKILL-RAILROADREVIEW-ROUND-005 [step] — Coverage check (script, deterministic): each lane's files_reviewed is diffed against its assigned file list; gaps surface in the station review, never silently dropped.
SKILL-RAILROADREVIEW-ROUND-006 [step] — Dedup (semantic, per direction): a lightweight grouper agent — text-only, no worktree, no code access, low effort — groups the direction's same-defect claims across lanes; the script assembles the result deterministically: best-argued survivor, max group severity (so any lane's higher vote still reaches the refute-level threshold), absorbed ids kept as merged_from. In doubt the grouper keeps claims separate — a wrong merge silently drops a finding, a missed merge only costs one duplicate refutation.
SKILL-RAILROADREVIEW-ROUND-007 [step] — Refutation: every deduped claim at or above the refute-level threshold goes to a fresh refuter agent that did not produce it — isolated worktree (premise per ROUND-002, branch claude/railroad-refute-{finding-id}-r{r}-{hash6}), pipelined per direction, second confirmation per the Probe protocol.
SKILL-RAILROADREVIEW-ROUND-008 [review] — Refuter verdicts: confirmed (survived, artifact in hand) | debunked (refuted) | unverified (survives but not demonstrable here). "Could not reproduce" is a successful result; evidence is never manufactured. Cross-direction duplicates may refute twice — the station reconciles.
SKILL-RAILROADREVIEW-ROUND-009 [step] — Station (single barrier agent): isolated worktree forked after the fan-out (premise per ROUND-002), branch claude/railroad-station-r{r}-{hash6}; unions the directions' deduped claim sets, dedups across directions (within-direction dedup already happened, ROUND-006), reconciles divergent severities against the code.
SKILL-RAILROADREVIEW-ROUND-010 [gate] — Verdict intake: refuter verdicts are binding — mapped straight into dispositions with their reason, probe, and artifacts — unless internally inconsistent with the code; then the station re-verifies and says so.
SKILL-RAILROADREVIEW-ROUND-011 [step] — Below-threshold verification: claims without a refuter verdict the station second-confirms itself, adversarially — it attempts to refute, per the Probe protocol.
SKILL-RAILROADREVIEW-ROUND-012 [gate] — Dispositions (closed set, exactly one per claim): confirmed (twice-confirmed, enters the review) | unverified (kept, flagged) | rejected-with-reason (ledger or human) | duplicate-of | debunked (refuted, removed to the audit list).
SKILL-RAILROADREVIEW-ROUND-013 [review] — Unverified means kept: survives refutation, not demonstrable here — stays in the review body, flagged, with the concrete missing precondition ("needs a device with an expired subscription"). Never a bare "not demonstrated". Repeated in the report ending as needing a recorded re-check once the precondition is available.
SKILL-RAILROADREVIEW-ROUND-014 [step] — Reconciliation & routing: the station resolves spec-vs-code conflicts against decisions.md, separates real bugs from intentional deviations to canonicalize, and assigns every confirmed finding a route (OUT-006).
SKILL-RAILROADREVIEW-ROUND-015 [step] — Permanent checks: for every confirmed finding that is a recurring class, the station names the durable check that would catch the class (ACDSL rule, lint rule, assertion, golden file, test); the dispatcher relays these and offers to add them — never unasked.
SKILL-RAILROADREVIEW-ROUND-016 [step] — Build + tests once: the station runs the project's build and test suite in its worktree and reports both results; too slow ⇒ explicitly "skipped", never unmentioned.
SKILL-RAILROADREVIEW-ROUND-017 [step] — DoD walk: the station marks every [DoD]-marked context entry PASS/FAIL/N/A. The set is queried from the context dir (rules entries --marker DoD, or jq over context.json: .entries[] | select(.markers // [] | index("DoD"))) — never assumed to equal one file's contents.
SKILL-RAILROADREVIEW-ROUND-018 [step] — Handoff pair: the station writes the consolidated review as round-{r}/review.json + review.md.
SKILL-RAILROADREVIEW-ROUND-019 [review] — Escalate, don't bury: a suspected but undemonstrated defect in migrations, auth, concurrency, money, a public API contract, or persisted data goes at the top of review.md, never as one unverified line among many.
SKILL-RAILROADREVIEW-ROUND-020 [step] — Funnel: review.md ends with one line — claims produced / confirmed / unverified / duplicates / rejected / debunked.
SKILL-RAILROADREVIEW-ROUND-021 [step] — Cleanup: a final agent in the dispatcher's checkout runs the agent-toolset remove_agent_worktrees.sh --delete-branch per expected claude/railroad-* branch — safety-gated, never forced; refusals and unattributable worktrees return in cleanup and the dispatcher relays them.
Probe protocol (second confirmation)
SKILL-RAILROADREVIEW-PROBE-001 [step] — Deterministic probes: in ACDSL repos (acdsl/registry.json present or bin/acdsl vendored), the second confirmation is deterministic — per claim a debug probe, at least two authoring attempts before declaring the claim unprobeable.
SKILL-RAILROADREVIEW-PROBE-002 [step] — Probe anatomy: a probe is three parts: a task-lifetime rule line in an untracked railroad-probes-r{r}.acdsl at the worktree root (file-scoped anchor, why = the claim); a verifier under round-{r}/probes/ (files-list + key=value argv, exit 0 clean, exit 1 + file:line: message on hit); a merged registry under round-{r}/probes/ (repo registry + local overlay + the probe entries, absolute argv paths, timeout ≤ 60s). The hand-built files list for the validity self-check is transient scaffolding — written under the system temp dir, never persisted under probes/.
SKILL-RAILROADREVIEW-PROBE-003 [gate] — Validity first: the probe must exit 1 on a minimal fail fixture under round-{r}/probes/fixtures/ before the real run — a probe that cannot detect its own fixture is a failed attempt. The proving fixture's path is recorded on the probe's probes[] entry in review.json.
SKILL-RAILROADREVIEW-PROBE-004 [step] — Verdict: <acdsl binary> check -rule <probe-id> -registry <probe registry> — red on the claimed file ⇒ confirmed (probe recorded on the finding); green ⇒ debunked; unprobeable after two attempts ⇒ manual re-verification, flagged probe: "none: <why>".
SKILL-RAILROADREVIEW-PROBE-005 [step] — Probe persistence: exactly the scripts, fixtures/, registry.json, and the probes.acdsl rule-line mirror persist under round-{r}/probes/ and travel with the review copy — every confirmed claim stays mechanically recheckable. The probe→fixture→verdict index lives in review.json's probes[] field, never in sidecar files (no verdicts.md, no files lists).
SKILL-RAILROADREVIEW-PROBE-006 [step] — Manual path (non-ACDSL or unprobeable): the cheapest settling artifact, in preference order — a failing test, a command with actual and expected output, a reproduction sequence with the observed result — written under round-{r}/, named for the finding.
SKILL-RAILROADREVIEW-PROBE-007 [gate] — Both directions: a test demonstrates a claim only if it fails on the current tree for the reason the claim states and passes with the proposed fix — both directions checked and stated. The fix may be applied temporarily in the disposable worktree for this check and is restored exactly afterwards, never committed.
Execution requirements
SKILL-RAILROADREVIEW-EXEC-001 [review] — Dispatcher session: railroad runs from the dispatcher's session — lanes review-only in worktrees, the dispatcher keeps the session plan file as the consolidated record. After the human gate, fixes land on the review branch (STATION-005).
SKILL-RAILROADREVIEW-EXEC-002 [gate] — Never prompt. The review never calls AskUserQuestion or stops for input — resolve every input yourself, state the assumption in the review record, carry on; the genuinely unresolvable ends the review with a report. The only pause is the human gate (STATION-003), which presents a finished round and asks nothing.
Context
SKILL-RAILROADREVIEW-CTX-001 [review] — Dispatcher context: the dispatcher's doctrine arrives via this skill's frontmatter acdsl-context: declaration, injected at invocation by the skill-context hook.
SKILL-RAILROADREVIEW-CTX-002 [review] — Lane context: lanes get no injection (they never invoke a skill) — each lane's prompt names its direction's context requirement; the Directions table is the source, lanes read the named entries' files from the repo's context directory.
SKILL-RAILROADREVIEW-CTX-003 [gate] — Missing context: a context source a direction requires that cannot be found is a blocker finding in the review, never silently skipped.
SKILL-RAILROADREVIEW-CTX-004 [review] — Gate evidence: in ACDSL repos, gate output (acdsl check, projection blocks) is review evidence — directions skip what gates already enforce and cite rule IDs where relevant.
Review process (dispatcher)
SKILL-RAILROADREVIEW-PROC-001 [gate] — Guard: resolve the scope (SCOPE-001), then the range. The premise pin is the fork point — git merge-base <base> <head>, never the base tip; a base that advanced past the fork point is a recurring review killer.
SKILL-RAILROADREVIEW-PROC-002 [step] — Base resolution: an explicit scope-bracket base supersedes derivation — resolvable (retrying origin/<base> counts as resolution, not substitution) ⇒ used as given; unresolvable ⇒ stop and report (EXEC-002), never a silently derived substitute. No bracket ⇒ derive: the tracked upstream, else the repository's mainline — with an explicit warning in chat naming the derived base. An empty diff (snapshot tree identical to the base tree included) ⇒ stop and report (EXEC-002).
SKILL-RAILROADREVIEW-PROC-003 [review] — Wrong-base heuristic: a diff running to thousands of lines ⇒ suspect a stacked-branch base; settle the base before reviewing anything.
SKILL-RAILROADREVIEW-PROC-004 [step] — Diff: git diff <baseCommit> <headCommit>, narrowed by the paths arg when given.
SKILL-RAILROADREVIEW-PROC-005 [step] — Confirm scope: state inclusions and exclusions up front; vendor/ and generated files (per repo convention) are pre-excluded unless explicitly requested.
SKILL-RAILROADREVIEW-PROC-006 [step] — Read changed files in full — the whole file, not just the hunks.
SKILL-RAILROADREVIEW-PROC-007 [step] — Risk map: tier every changed file per the ACTION-REVIEW-RISK-* entries (fallback: high — migrations/auth/concurrency/money/API contracts/persisted data; medium — business logic/error handling; low — tests/renames/formatting/generated). Print the map, pass it as args.riskMap; attention goes to high and medium, low is read only for scope creep; the map drives MODES-004.
SKILL-RAILROADREVIEW-PROC-008 [step] — Size bounds ⇒ partition: counted after the PROC-005 exclusions; there is no total review cap. Within the bounds (chunks bracket, defaults 30 files / 2000 changed lines insertions+deletions) and no explicit chunks arg ⇒ no partition, lanes read the whole diff. Over either bound ⇒ the dispatcher partitions automatically (mode from chunks, layers when absent) until every chunk fits maxFiles:maxLines; a single file exceeding maxLines rides alone in its chunk, stated. The partition is always stated (MODES-005).
SKILL-RAILROADREVIEW-PROC-009 [gate] — Base health (once per review): build + tests at baseCommit in a disposable worktree (Makefile targets, else stack commands, else none — stated). Red ⇒ stop and report unless the expect-base-red flag is present (then stated: pre-existing breakage attributes to the base). Too slow ⇒ stated skip.
Station protocol
SKILL-RAILROADREVIEW-TPL-002 [payload] — Station-protocol flow:
flowchart TD
G[resolve scope + range<br>snapshot commit in wip/all] --> BH{base health?}
BH -- red, no waiver --> STOP1[stop and report]
BH -- green / expect-base-red --> RM[risk map, direction selection]
RM --> SC{over size bounds<br>or chunks arg?}
SC -- yes --> CH[partition into chunks<br>each within maxFiles:maxLines]
CH --> WF[workflow round r]
SC -- no --> WF
WF --> LN[lanes: directions x chunks x lanes<br>once-confirmed claims]
LN --> DD[grouper dedup per direction<br>same-defect claims -> survivor, max severity]
DD --> RF[refuters: fresh agent per claim >= threshold<br>second confirmation]
RF --> SM[station: one consolidator<br>cross-direction dedup, verdict intake, below-threshold verify,<br>DoD + build/test -> review.json + review.md]
SM --> HG{human review}
HG -- comments --> ADH[adjust dispositions,<br>rejections to ledger with reason]
HG -- no comment --> DEC
ADH --> DEC{confirmed findings?}
DEC -- yes --> FIX[apply fixes per finding route:<br>auto-fix inline / runner-fix / human]
FIX --> VERIFY[verify head moved or snapshot differs,<br>re-resolve range]
VERIFY --> NEXT[next round: clean-slate lanes + ledger only]
DEC -- clean round --> CNT{2 consecutive clean?}
CNT -- no --> NEXT
NEXT --> WF
CNT -- yes --> DONE[APPROVED -> package-commit]
SKILL-RAILROADREVIEW-STATION-001 [step] — Round: one workflow invocation; after it returns, copy the handoff pair and probes/ (when present) to plans/{slug}/reviews/round-{r}/ in the reviewed repo — the durable copy; the scratchpad pair stays the inter-agent handoff.
SKILL-RAILROADREVIEW-STATION-002 [gate] — Failed round: consolidation: null or non-empty abortedLanes — re-resolve the range and re-dispatch once; a second failure stops the review with the abort notes verbatim. Failed rounds never count as clean.
SKILL-RAILROADREVIEW-STATION-003 [step] — Human gate: present the station review (plan file + handoff paths). No comment ⇒ accepted as is; comments are binding — adjust dispositions before proceeding.
SKILL-RAILROADREVIEW-STATION-004 [gate] — Rejections permanent: every human-rejected finding appended with its reason to plans/{slug}/reviews/rejected.json ({finding_id, file, line, claim, reason, round, date}; slug = plan slug, else head branch slugified). Passed by content into every later round. Matching by file and claim substance, never by ID. A rejected finding never comes back.
SKILL-RAILROADREVIEW-STATION-005 [step] — Fix application: on the review branch (the dispatcher's working tree in snapshot scopes, SCOPE-003), routed per finding by route (OUT-006): auto-fix inline, runner-fix via a same-worktree delegate runner (/delegate /fimplement <review doc>), human to the author; the gate can override. Cross-branch handoff with merge-back is opt-in.
SKILL-RAILROADREVIEW-STATION-006 [step] — Head verification: after fixes land, verify the head moved (git rev-parse <head>; snapshot scopes: the new snapshot differs) and re-resolve the range before the next round.
SKILL-RAILROADREVIEW-STATION-007 [step] — Clean-slate rounds: the next round runs fresh lanes with no memory of prior rounds, carrying only the rejection ledger.
SKILL-RAILROADREVIEW-STATION-008 [gate] — Termination: finished only after two consecutive clean rounds (zero confirmed findings + human acceptance); any confirmed finding resets the counter. Then APPROVED → hand off to package-commit.
SKILL-RAILROADREVIEW-STATION-009 [gate] — Oscillation guard: the same finding confirmed again after its fix landed ⇒ stop and report; never a third automated attempt.
Security rules (security direction)
SKILL-RAILROADREVIEW-SEC-001 [review] — Attack math: quantify each exploit — attempts, window, cost; "insecure" without numbers is not a finding.
SKILL-RAILROADREVIEW-SEC-002 [review] — Exploit probe: confirm each exploit with a reproducible probe (one curl per exploit) where the environment allows.
SKILL-RAILROADREVIEW-SEC-003 [review] — Scope accounting: list what was removed from scope and why — an unexamined surface is itself a finding.
SKILL-RAILROADREVIEW-SEC-004 [review] — Release constraints: the user's release decisions are fixed constraints — findings propose mitigations within them, never release delays.
Stacked PRs
SKILL-RAILROADREVIEW-STACK-001 [review] — Finding attribution: attribute each finding to the branch that introduced it (git log <base>..<child>) and fix it there, not in the top branch.
SKILL-RAILROADREVIEW-STACK-002 [review] — Down-stack fixes: skip findings already fixed further down the stack.
Output Format
SKILL-RAILROADREVIEW-OUT-001 [step] — Findings table: one row per finding, a proposed fix in every row.
SKILL-RAILROADREVIEW-TPL-003 [payload] — Findings table format:
| ID | Severity | Route | Location | Finding | Proposed fix |
|----|----------|-------|----------|---------|--------------|
| code-style-NIT-1 | NIT | auto-fix | pkg/foo.go:42 | <the defect and the standard it violates> | <one-sentence fix or a short diff sketch> |
SKILL-RAILROADREVIEW-OUT-002 [review] — ID: <direction>-<SEV>-<n>, SEV ∈ BLK · MAJ · MIN · NIT · INF, numbered from 1 per direction and severity — so the author can reply "fix critical-BLK-1, strike code-style-NIT-2".
SKILL-RAILROADREVIEW-OUT-003 [review] — Proposed fix — never empty: the concrete edit, one sentence or a short diff sketch.
SKILL-RAILROADREVIEW-OUT-004 [review] — Coverage — every review states the files reviewed against the diff list; uncovered files listed explicitly, never silently dropped.
SKILL-RAILROADREVIEW-OUT-005 [review] — Severity by consequence (in order of urgency): BLOCKER — wrong behaviour on a production path, data loss, security, irreversible migration defect; MAJOR — wrong behaviour on a secondary path, missing requirement, stated edge case untested; MINOR — should be addressed; NIT — documentation, formatting, clarity; INFO — observation, no action required.
SKILL-RAILROADREVIEW-OUT-006 [review] — Route per confirmed finding: human (needs author judgment) | auto-fix (mechanical, dispatcher inline) | runner-fix (well-specified but large — delegate-runner batch). Consumed by STATION-005; the human gate can override.
SKILL-RAILROADREVIEW-OUT-007 [review] — Row order: rows ordered by severity; a Direction column keeps each finding's direction visible.
SKILL-RAILROADREVIEW-OUT-008 [step] — DoD table: end every review with the Definition-of-Done summary table.
SKILL-RAILROADREVIEW-TPL-004 [payload] — Definition of Done summary table format:
| Criterion | Status | Notes |
|-----------|--------|-------|
| Item 1 | PASS | |
| Item 2 | FAIL | Missing X |
| Item 3 | N/A | Not applicable |
SKILL-RAILROADREVIEW-OUT-009 [step] — Recommendation: APPROVE (mergeable as is) | CONDITIONAL (mergeable once the named fixes land) | REJECT (fundamental rework).
SKILL-RAILROADREVIEW-OUT-010 [step] — Probes index: a review that authored probes carries a Probes table in review.md (one row per probes[] entry: id, finding, script, fixture, tree verdict) before the funnel line — the reviewer navigates from the review doc to each probe and its fixture.
Delivering the review as the plan
SKILL-RAILROADREVIEW-DELIVER-001 [gate] — Plan-file record: the dispatcher maintains the session plan file, one section per round, each referencing the round's handoff paths. Never hand-write a plan.md in the repo — the plan system is the storage.
SKILL-RAILROADREVIEW-DELIVER-002 [gate] — Merge, don't overwrite: reviews accumulate in the session plan file — append new dated sections, preserve earlier ones.
SKILL-RAILROADREVIEW-DELIVER-003 [step] — Resolved findings: a superseded finding is marked resolved (strikethrough + pointer to the resolving review), never deleted — history stays traceable.
SKILL-RAILROADREVIEW-DELIVER-004 [step] — Re-review deltas: sync the worktree, confirm the spec is current, report deltas — carried over, new, resolved — instead of re-dumping.
SKILL-RAILROADREVIEW-DELIVER-005 [gate] — Section structure: each review section follows this structure:
SKILL-RAILROADREVIEW-TPL-005 [payload] — Review section structure:
## Review — <YYYY-MM-DD> — <base>...<head> — <directions, round>
<the findings table, per the Output Format>
### Definition of Done
<the DoD summary table>
### Recommendation
<APPROVE | CONDITIONAL | REJECT>
Model
- Suggested: frontier / high
- Reason: multi-standard compliance review; railroad orchestration
- Tested unviable: — (none yet)
Next.js App Router Expert
Development
A skill that turns Claude into a Next.js App Router expert.
README Generator
Development
Creates professional and comprehensive README.md files for your projects.
API Documentation Writer
Development
Generates comprehensive API documentation in OpenAPI/Swagger format.