Shipmoor × Claude Code

Shipmoor for Claude Code

Claude Code writes and edits across your repo. Shipmoor's harness re-scans every edit and holds the agent at the Stop event until the structural defects and claim gaps it introduced are fixed, with deterministic checks an LLM can never override.

  • Hard PostToolUse + Stop loop
  • Deterministic: an LLM never blocks
  • Local-first, no source upload

edit re-scan Stop blocked fix cleared done · the gate won't open on a defect.

Claude Code already writes most of the diff. The harness makes it run Shipmoor as part of that work, re-scanning each edit and refusing to let the session end while a blocking defect is present, without you switching tools. The local Shipmoor CLI does the scanning and stays the single source of truth.

  • hard loop
  • PostToolUse + Stop
  • CLI = source of truth
  • an LLM never blocks
  • no source upload

The hard loop: Claude Code can't talk its way past the gate

Most integrity checks are advisory: a rule that asks the agent to scan, which it ignores under load. On Claude Code, Shipmoor's harness is not advisory. It installs native hooks that turn the scan into an enforced gate.

  • PostToolUse Re-scan after every edit After the agent edits, re-scan the change so findings are always current, with no stale report to reason around.
  • Stop Block "done" until blockers clear When the agent tries to finish, scan the change-set. If a blocking finding is present, the hook blocks the stop and feeds the findings back, so the session can't end while defects remain. A loop bound keeps it from ever trapping the agent.

A rule that asks an agent to scan is weak. A gate that won't let it declare "done" until the blockers clear changes what the agent actually ships: the difference between knowledge and behavior. On Claude Code it works out of the box.

⏹  Stop → shipmoor scan --changed --json
 
✗ blocked: 1 high finding must clear before done
  SM-IMP-002  phantom import      src/auth/session.ts:4
              'verifyToken' is imported but never declared or exported
  SM-ERR-014  silenced error      src/auth/session.ts:39
              catch block swallows the error without rethrow or log
 
↩ findings fed back to the agent · session held open
  loop 1 / 3 · fix the high finding, then Stop re-runs

The Stop hook runs one shipmoor scan, blocks on the high finding, and hands the agent the findings to repair.

What the gate catches

The scan engine targets the structural failure modes agent-assisted edits introduce. These are deterministic checks; they decide. The scan --json output is rich enough that the hooks act on it directly: rule_id, severity, path, line, message, root cause, and a recommended fix.

  • 01

    Phantom & undeclared imports

    References to symbols and modules that were never declared, exported, or installed: code that reads as wired but isn't.

    deterministic
  • 02

    Placeholder & empty-body stubs

    Functions that return a placeholder, TODO bodies, and empty implementations that pattern-complete as "done".

    deterministic
  • 03

    Silenced errors

    Swallowed exceptions and discarded error returns: failure paths quietly removed so the change looks like it works.

    deterministic
  • Install the hard PostToolUse + Stop hooks

    shipmoor harness install claude
  • Start safe: report only, then escalate

    shipmoor harness mode observe
  • Check mode & adapter for this repo

    shipmoor harness status

Modes escalate as you trust it: observe (report only), feedback (loop findings back, bounded), block (non-zero verdict on a breach; pairs with CI).

Skills, so the agent scans on its own

shipmoor skills install claude writes always-applied instructions that make Claude Code scan its changes, triage, explain the blockers, and gate before "done", plus pre-edit discipline: inspect manifests, don't invent imports or APIs, no placeholder logic, never fake success.

Skills make the agent want to scan; the hooks make the scan happen and enforce the result. Use both.

Check the change against the task

Beyond defects, Claim Check compares the change to the task it was given, and flags work that runs but doesn't do what was asked.

Claim Check

Resolves intent from the ticket, the prompt, or the Claude Code agent session (secrets masked on ingest). A deterministic floor decides the verdict; the optional LLM advisory only comments and is excluded from the score.

Deterministic evidence decides: an LLM never blocks

A machine that can hallucinate is never the gate

Every finding that can hold the gate is deterministic. Shipmoor structurally bars LLM inference from producing a blocking verdict, and the optional advisory runs inside your own coding agent (Shipmoor hosts and calls no model), labeled as inference and excluded from the verdict.

Honest about scope: Shipmoor catches what didn't earn its claim and says "couldn't check" where it has no probe. It doesn't prove your change succeeded, and it checks structural risk, not logic or design. Tests and builds still run. It raises the floor and gives a repeatable checkpoint; it doesn't replace the reasoning.

Local first: your source never leaves

The scan engine runs on your machine or in your own CI runner. The Shipmoor Console handles licensing and billing only; it never receives your source. No source upload, at any tier.

PythonTypeScriptJavaScriptGo

Get started in Claude Code

Start free and local with no account, then add the hard harness loop and skills.

shipmoor scan --changed

Free, local, no account. Scan your current changes before you wire anything up.

  • Install always-applied skills

    shipmoor skills install claude
  • Install the PostToolUse + Stop hooks

    shipmoor harness install claude
  • Loop findings back to the agent

    shipmoor harness mode feedback

The Community CLI is free. Skills, Claim Check, and the harness are part of Shipmoor IC ($19/dev·mo, $190/yr). Self-serve, no sales call.

Run Shipmoor where Claude Code writes

One installer. One shipmoor command. Free Community scans, then a gate the agent can't declare done past.

curl -fsSL https://dl.shipmoor.dev/install.sh | bash

Agent Harness docs →

Claude Code FAQ

How the harness installs and enforces inside Claude Code.

Is the gate really hard, or just advisory?

Hard. The harness installs native PostToolUse and Stop hooks. The Stop hook blocks the agent from finishing while a blocking finding is present and feeds the findings back; the session can't end with the defect in place. A loop bound keeps it from ever trapping the agent. This shipped in CLI v0.5.0.

Can the LLM hallucinate its way past the gate?

No. Every finding that can hold the gate is deterministic. Shipmoor structurally bars LLM inference from producing a blocking verdict. The optional advisory runs inside your own coding agent and is labeled as inference, excluded from the verdict.

Does my code leave my machine?

No. The scan engine runs locally or in your own CI runner. The Shipmoor Console handles licensing and billing only and never receives your source. No source upload, at any tier.

How do skills relate to the harness?

A skill is the behavior the agent follows; the harness is the runtime that invokes the CLI against edits and feeds findings back. Skills make the agent want to scan; the hooks make the scan happen and enforce the result. Both are clients of the CLI, which stays the source of truth. Use both.