docs/archive/2026-07-ai-artifacts/claude-skills/feature-pipeline-preview/17-opus-pr-review/01-review/SKILL.md
> **ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE.** > Superseded by `codemap/` + root `AGENTS.md`. Scheduled for deletion once the pipeline is verified (Phase 6). > Manifest: `docs/archive/2026-07-ai-artifacts/MANIFEST.md` --- name: 01-review description: Opus reads the PR diff against the NeoHaskell quality rubric, writes findings to .pipeline/findings-17.json, and surfaces a digest in conversation. kind: leaf executor: opus model: claude-opus-4-7 --- # PR Review (Opus) Opus reads the open P
npx skillsauth add neohaskell/neohaskell docs/archive/2026-07-ai-artifacts/claude-skills/feature-pipeline-preview/17-opus-pr-review/01-reviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE. Superseded by
codemap/+ rootAGENTS.md. Scheduled for deletion once the pipeline is verified (Phase 6). Manifest:docs/archive/2026-07-ai-artifacts/MANIFEST.md
Opus reads the open PR diff and produces a structured findings file with proposed fixes. The maintainer reads the digest in-conversation, edits .pipeline/findings-17.json to accept/reject/defer each finding, then runs pipeline.py approve 17 to release the apply step.
pipeline.py get pr_number — the PR to reviewgh pr diff <pr_number> — the diff under reviewgit diff main..HEAD — full branch delta as cross-checkdocs/architecture/<adr_number>-<slug>.md — architecture doc; check all named files exist in the treedocs/decisions/<adr_number>-<slug>.md — ADR for contextcore/CLAUDE.md — style table (cite when raising style findings).pipeline/findings-17.json — an array of findings with proposed fixes (schema below).pipeline.py complete 17. STOP (PAUSE — maintainer reviews next).{
"rule": "<short-kebab-case-id>",
"severity": "high" | "medium" | "low",
"location": "<file:line[-line]>",
"explanation": "<one paragraph: what's wrong + why it matters>",
"proposed_fix": {
"kind": "edit" | "delete" | "rename" | "add",
"file": "<path>",
"summary": "<one sentence: what to change>"
},
"maintainer_decision": "pending"
}
The maintainer sets maintainer_decision to "accept", "reject", or "defer" per entry before running approve.
Cite core/CLAUDE.md for the exact rule. Common offenders:
$ used anywhere — should be |>where clauses — should be do letlet..in — should be do let<> / ++ on strings — should be [fmt|...|]Either — should be ResultIO in user code — should be Task err valpure / return — should be Task.yield valimport Foo (Foo); import Foo qualified! strictness annotations — nhcore has Strict globally; ! is redundantforall element result. etc.Ghc prefixAny import of Control.Concurrent.Async, Data.Either, Data.IORef, Data.Map, Data.Map.Strict, Data.Vector, etc. must be aliased with a Ghc prefix (e.g. import qualified Data.Map.Strict as GhcMap). Bare or differently-aliased Hackage imports are a finding.
Task.fromIO (… Task.runResult …) round-trip smellAny code that does Task.fromIO (someIoLib (Task.runResult task)) is escaping Task to use an IO library, then reconstructing Task. This means a needed nhcore primitive is missing. Propose extending nhcore (e.g. add AsyncTask.race) rather than perpetuating the escape pattern.
nilUuid = Uuid.nil)Task.yield unit after a step that already yields unit (ConcurrentVar.modify, Task.forEach, etc.)pass followed by Task.yield unitcase True/False over Bool — should be if/then/elsecase … of Err (ConnectionFailed _) -> pass or any Err _ -> pass on a fixture call — finding rule test-swallows-infra-failureemits / reads in chunks / logs / deletes / writes / updates / replays / resumes, body doesn't assert the named primitive — rule test-name-body-mismatchit "fails with <X>" whose setup is Subscriber.new <InMemory>.new Registry.empty (or equivalent empty fixture) and body asserts Err (<X> _) -> pass — rule test-trivial-fixture-error-pathlet _x = builder ... ; pass — rule test-panicky-let-non-behavioralFor every file path named in the architecture doc's "Module map" or similar section, verify the file exists in the tree. Each missing file → finding rule arch-doc-artifact-missing with severity high.
DROP TABLE in any file under core/service/ not matching *Spec.hs, /testlib/, /test-service/ → rule schema-drop-table-production, severity highCREATE TABLE in any application-startup code path (not in a file matching */Migrations/*.sql) → rule schema-migration-in-app-code, severity mediumAfter writing .pipeline/findings-17.json, surface a markdown digest like:
## Opus PR review — N findings
| # | Severity | Rule | Location | Proposed fix |
|---|----------|------|----------|--------------|
| 1 | high | ghc-async-in-task | core/service/.../Subscriber.hs:300-321 | Replace GhcAsync.race with AsyncTask.race |
| 2 | medium | redundant-yield-unit | core/service/.../Subscriber.hs:390 | Drop trailing Task.yield unit |
| ... | ... | ... | ... | ... |
Maintainer: edit `.pipeline/findings-17.json` to set `maintainer_decision` for each (accept / reject / defer), then run `pipeline.py approve 17`.
Then call python3 .claude/skills/feature-pipeline-preview/scripts/pipeline.py complete 17 and STOP.
gh pr diff returns non-zero → surface and refusedevelopment
> **ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE.** > Superseded by `codemap/` + root `AGENTS.md`. Scheduled for deletion once the pipeline is verified (Phase 6). > Manifest: `docs/archive/2026-07-ai-artifacts/MANIFEST.md` --- name: neohaskell-style-guide description: NeoHaskell coding style reference and enforcement rules. Load when writing, reviewing, or modifying any Haskell code in the NeoHaskell project. Triggers on 'NeoHaskell style', 'NeoHaskell conventions', 'how to write NeoHaskell', '
development
> **ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE.** > Superseded by `codemap/` + root `AGENTS.md`. Scheduled for deletion once the pipeline is verified (Phase 6). > Manifest: `docs/archive/2026-07-ai-artifacts/MANIFEST.md` --- name: neohaskell-security-review description: Security & Code Quality review for NeoHaskell. Use when reviewing code changes, PRs, or architectural decisions for security implications. Evaluates OWASP, NIST, EU compliance. Handles pipeline phases 2 (ADR review) and 10 (im
development
> **ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE.** > Superseded by `codemap/` + root `AGENTS.md`. Scheduled for deletion once the pipeline is verified (Phase 6). > Manifest: `docs/archive/2026-07-ai-artifacts/MANIFEST.md` --- name: neohaskell-qa-designer description: Testing QA Designer for NeoHaskell. Designs comprehensive test specifications with exhaustive edge cases, boundary conditions, and happy paths BEFORE implementation. Handles pipeline phase 6 (Test Spec Design). Outside-in TDD meth
development
> **ARCHIVAL KNOWLEDGE — DO NOT USE OR REFERENCE.** > Superseded by `codemap/` + root `AGENTS.md`. Scheduled for deletion once the pipeline is verified (Phase 6). > Manifest: `docs/archive/2026-07-ai-artifacts/MANIFEST.md` --- name: neohaskell-performance-review description: Performance review for NeoHaskell targeting 50k req/s throughput. Use when reviewing code for performance implications, INLINE pragmas, strictness, and allocation patterns. Handles pipeline phases 3 (ADR review) and 11 (imp