Skip to content
Back to skills

Review

ASecurity

Audit the current Claude Code harness health: check configured components, detect drift from the codebase, and suggest fixes or tier upgrades. Trigger phrases: "review harness", "check setup", "harness health", "what's missing", "upgrade tier", "audit claude config".

  • 10 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added August 31, 2026
developmentpythongojavasqlnodespringgitapibackendsecurity

Works with

  • claude code
  • cli
  • api
  • mcp

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned August 31, 2026

npx -y skills add ShipWithAI/shipwithai-plugins --skill review --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Review?

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

Security grade badge for Review
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/shipwithai-review/badge)](https://www.skillsdirectory.com/skills/shipwithai-review)

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: review
description: >
  Audit the current Claude Code harness health: check configured components,
  detect drift from the codebase, and suggest fixes or tier upgrades.
  Trigger phrases: "review harness", "check setup", "harness health",
  "what's missing", "upgrade tier", "audit claude config".
argument-hint: "[--drift-only] [--tier-check]"
---

# /review

Audit full harness health. Detect drift. Suggest next actions.

## Flag Handling

- `--drift-only` — skip component scoring (Step 1), run drift detection only (Step 2)
- `--tier-check` — skip drift detection (Step 2), show current tier and what is missing for the next tier upgrade

## Step 1 — Score Components

Read and score each component:

```
starter-context.json    → version current (1.4) ✅ / outdated ⚠️ / missing ❌
CLAUDE.md               → populated ✅ / has-placeholder ⚠️ / missing ❌
CLAUDE.md workflow      → present ✅ / opted-out ✅ / missing ⚠️
.claude/settings.json   → configured ✅ / exists-empty ⚠️ / missing ❌
settings.json hooks     → hooks configured ✅ / empty ⚠️ / missing ❌
.mcp.json               → servers configured ✅ / exists-empty ⚠️ / missing ❌
.claude/agents/         → agents present ✅ / missing ❌
docs/architecture.md    → exists ✅ / missing ❌
docs/adr/               → ADRs present ✅ / index-only ⚠️ / missing ❌
.claude/memory/         → lifecycle complete ✅ / legacy-layout ⚠️ / incomplete ⚠️ / missing ❌ (Tier 3)
                          ✅ lifecycle: MEMORY.md + HANDOFF.md + decisions/ + conventions/ +
                             load-memory.sh & remind-save.sh hooks + .claude/skills/save-memory/
                          ⚠️ legacy: project.md / team.md present (pre-2.4.0 static memory) → offer migration
                          ⚠️ incomplete: .claude/memory/ exists but hooks or /save-memory missing
.claude/hooks/observe.py  → present ✅ / missing (Tier 3 opt-in) ❌
.claude/logs/ in .gitignore → in gitignore ✅ / tracked by git ⚠️ / not applicable ✅
```

**Schema version check:**
```
Read .claude/starter-context.json:
  → not found                    → ❌ not initialized
  → version == "1.4"             → ✅ current
  → version == "1.3"             → ⚠️ outdated — run init --update (adds stack_plugins_selected field)
  → version == "1.2"             → ⚠️ outdated — run init --update (adds skills_selected, stack_plugins_selected)
  → version < "1.2" or absent    → ⚠️ outdated — run init --update
```

**Workflow section check (smart opt-out):**
```
starter-context.json exists:
  → workflow_gates absent                → ⚠️ schema outdated — run init --update
  → workflow_gates == ["none"] or []     → ✅ explicitly opted out
  → workflow_gates has values            → check CLAUDE.md has "Development workflow" section
      present                            → ✅
      missing                            → ⚠️ context set but CLAUDE.md not updated

starter-context.json not found:
  → check CLAUDE.md for "## Development workflow" section
      present                            → ✅
      missing                            → ⚠️ no workflow section found
```

Detect current tier from the `Harness config` section of `CLAUDE.md`.
If CLAUDE.md is missing: treat as Tier 0 (not configured).
If CLAUDE.md exists but tier is not specified: infer from what is present.

## Step 2 — Detect Drift

```
CLAUDE.md tech stack  ←→  package.json / pyproject.toml / go.mod
  New dependency not mentioned in CLAUDE.md?         → flag ⚠️ undocumented
  Dependency removed but still listed in CLAUDE.md?  → flag ⚠️ stale

Hooks in settings.json  ←→  tools present in project
  Hook references a tool no longer in devDependencies or PATH?  → flag ⚠️ stale

.mcp.json servers  ←→  services referenced in codebase (imports, env vars)
  Service used in code but no MCP server configured?  → flag ⚠️ missing

docs/architecture.md last modified  ←→  git log
  File not updated in 30+ days AND new directories added since?  → flag ⚠️ outdated

docs/adr/  ←→  git log
  Commits in past 30 days added/removed directories, changed framework,
  or modified core config (package.json, pyproject.toml)?
  AND no new ADR written?  → flag ⚠️ decision not recorded

workflow_gates  ←→  architecture.sensitive_areas
  sensitive_areas present in starter-context.json
  AND "security-review" not in workflow_gates?
  → flag ⚠️ "Sensitive areas detected but no security-review gate configured"
```

## Step 2b — Static Analysis

Run for ALL tiers. No runtime logs required.

### Hook binary check

For each hook command in `.claude/settings.json`:
- Extract effective binary: `npx <pkg>` → check `<pkg>`; `python3 <script>` → check `python3`; otherwise check first token
- Binary in `devDependencies` / `dependencies` (package.json) OR `which <binary>` returns a path → ✅
- Neither found → flag ⚠️ `Hook [hook-id] references [binary] but it's not installed`

### Hook pattern match check

For hook commands that filter by file extension (e.g. `case "$CLAUDE_TOOL_INPUT_PATH" in *.ts|*.tsx`):
- Extract file extensions from the command (patterns after `*.`)
- `find . -name "*.<ext>" -not -path "*/node_modules/*"` returns results → ✅
- No matching files in project → flag ⚠️ `Hook [hook-id] matches [pattern] but no matching files found`

### MCP usage vs codebase

Compare `.mcp.json` servers vs actual imports/usage in source files. Check both directions:

| MCP server | Detect usage by looking for |
|------------|----------------------------|
| github     | `@octokit/*`, `octokit` (JS imports), `gh` CLI calls |
| linear     | `@linear/sdk` import |
| slack      | `@slack/bolt`, `@slack/web-api` import |
| sentry     | `@sentry/*` import, `sentry-sdk` (Python) |
| postgres   | `pg`, `postgres` (JS), `psycopg2`, `sqlalchemy` (Python) |
| notion     | `@notionhq/client` import |
| jira       | `jira-client` (JS), `jira` (Python) |

**Configured but no usage found:**
→ flag ⚠️ `MCP [name] configured but no related usage found — consider removing`

**Usage found but no MCP configured:**
→ flag ⚠️ `Code imports [package] but no [service] MCP configured — consider adding`

### Project skills staleness

For each `.claude/skills/<id>/SKILL.md` that has a `template_version` in frontmatter:
- Compare against the matching entry's `version` in this plugin's `setup-skills/skills-catalog.json`
- `template_version` < catalog `version` (compare as semver — numeric components, not lexically) → flag ⚠️ `[id] skill is v[X]; current template is v[Y] — re-run /shipwithai-starter:setup-skills to refresh`
- Skills without a `template_version` (hand-written) → skip, do not flag

### Stack plugin coverage

Read `../init/stack-recipes.json`. Determine the project stack (from
`starter-context.json.stack`, else detect like init Step 1: `pom.xml`/`build.gradle` → Java).
For each recipe whose `detect` matches (a `files` entry exists AND, if `content` is set,
one of those strings appears in it):

```
verifyArtifact file exists (e.g. .claude/hooks/jpa-guardrail.py)   → ✅ wired
artifact absent BUT stack_plugins_selected lists recommendPlugin   → ⚠️ selected but not installed —
                                                                       re-run [setupCommand]
artifact absent AND not selected                                   → ⚠️ [label] detected —
                                                                       [recommendPlugin] available but not set up
no recipe matches the stack                                        → not applicable (no row)
```

Recommend only; do not claim the plugin is installed when its `verifyArtifact` is absent.
If the plugin is not enabled in the marketplace, note that the user must enable
`[marketplace]` first.

## Step 3 — Health Report

```
## Harness Health — [project name]
Current tier: [Essential / Standard / Full]
Checked: YYYY-MM-DD

| Component            | Status | Issue                                      |
|----------------------|--------|--------------------------------------------|
| Schema version       | ⚠️     | v1.0 → v1.1 available (workflow_gates)     |
| CLAUDE.md            | ✅     | —                                          |
| CLAUDE.md workflow   | ⚠️     | Schema outdated — run init --update        |
| settings.json        | ✅     | —                                          |
| Hooks                | ⚠️     | prettier hook but prettier not in project  |
| .mcp.json            | ❌     | Redis used in code, no MCP server          |
| docs/architecture.md | ⚠️     | Not updated in 45 days                     |
| ADRs                 | ✅     | 3 ADRs present                             |
| .claude/memory/      | ⚠️     | Legacy project.md/team.md — migrate to lifecycle |
| Observability        | ❌     | observe.py not installed (Tier 3 opt-in)   |
| Hook binaries        | ⚠️     | jest-on-stop: jest not in devDeps or PATH  |
| Hook patterns        | ✅     | —                                          |
| MCP alignment        | ⚠️     | GitHub MCP configured, no octokit imports  |
| Project skills       | ✅     | —                                          |
| Stack plugin         | ⚠️     | Spring Boot — java-backend-toolkit not set up |

Drift detected: [list of flagged items, or "None"]
Static analysis: [list of flagged items, or "None"]
```

## Step 4 — Suggest Actions

Prioritize by severity: ❌ first, then ⚠️. Suggest one action at a time:

> "Want to fix [highest priority issue] now?"

If user accepts: invoke the relevant skill directly:
- Schema outdated → `/shipwithai-starter:init --update` ("Plugin has new questions (v1.1). Run init --update to answer only new questions — existing answers are preserved.")
- Workflow missing (schema current) → `/shipwithai-starter:init --update`
- Hooks issue → `/shipwithai-starter:setup-hooks`
- MCP issue → `/shipwithai-starter:setup-mcp`
- Agents issue → `/shipwithai-starter:setup-agents`
- SSOT/docs issue → `/shipwithai-starter:update-ssot`
- Observability missing (Tier 3) → `/shipwithai-starter:setup-observability`
- Memory legacy/incomplete/missing (Tier 3) → `/shipwithai-starter:setup-memory --memory-only`
  (migrates legacy `project.md`/`team.md` without deleting them; adds missing hooks + `/save-memory`)
- Stale project skill (template_version behind catalog) → `/shipwithai-starter:setup-skills`
- Stack plugin available but not set up → run the recipe's `setupCommand` (e.g. `/shipwithai-java-backend-toolkit:setup`); if not enabled, enable the recipe's marketplace first
- Logs tracked by git → warn: run `git rm -r --cached .claude/logs/` and add to .gitignore

Tier upgrade path:
- Tier 1 → list Standard tier items not yet configured
- Tier 2 → list Full tier items not yet configured
- To upgrade: run `/shipwithai-starter:init`

If `.claude/logs/` exists and contains log files spanning ≥7 calendar days:
> For runtime-based suggestions (usage patterns, hook coverage): `/shipwithai-starter:optimize-harness`

Files in this skill

  • SKILL.md11.1 KB
  • evals.json2.6 KB

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…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.