In release — preview. This surface is fully built and in the release process; it is not yet generally available. Treat the commands and behavior here as preview until GA.
The harness installs per project: from your repo root, one command wires the loop into the agent(s) you use, and one config key decides how intrusive the loop is.
Prerequisites
- The
shipmoorCLI installed (curl -fsSL https://dl.shipmoor.dev/install.sh | bash) and signed in with theagent_harnessentitlement — check withshipmoor-harness status. - For the Claude Code adapter: a
claudebinary at or above the hook-schema minimum; the adapter probes it and refuses older builds, naming both versions.
Install
shipmoor-harness install claude # or aider | codex | cursor | all
aider: wrote .aider.conf.yml
claude: wrote .claude/settings.json
codex: wrote AGENTS.md
cursor: wrote .cursor/rules/shipmoor-harness.md
The agent_harness entitlement is checked once, up front. Every install is marker-wrapped, byte-idempotent, and reversible: re-running changes nothing, your own config in the same files is preserved, and shipmoor-harness uninstall <agent> removes exactly the managed block — restoring your pre-install file shape. A pre-existing, unmarked Shipmoor footprint is reported as a conflict rather than overwritten.
If Agent Skills are installed in the same repo, the two coexist — distinct managed blocks, each owned by its installer.
Inspect
shipmoor-harness status
# CLI: /…/shipmoor (v0.4.0)
# Caps: agent_harness, intent_scan, repair_guidance
# State: ic_active
# Adapters:
# · aider … · cursor (soft)
# Watch: no report yet (run `shipmoor-harness watch`)
shipmoor-harness status --json # shipmoor.harness.status.v1 — script against this
status is informational and always exits 0. If it shows Caps: none or a locked state, install will refuse with the upgrade message — sign in first (shipmoor login).
The three modes
shipmoor-harness mode feedback
| Mode | Behavior |
|---|---|
observe | Scan and record; never interrupt. The default. |
feedback | Route concise findings back into the agent’s context after each edit. |
block | Stop the agent’s tool call (or exit non-zero) on a threshold breach. |
mode writes the harness: block of .shipmoor.yaml with targeted line surgery — every other key, comment, and blank line in the file is preserved:
harness:
mode: feedback # observe | feedback | block
max_feedback_cycles: 3 # caps re-prompts so a loop never spins
watch:
debounce_ms: 750
block requires the intent_scan entitlement; without it, the mode degrades to feedback unless you pass --force-structural (then status reports a mode_block_without_intent warning). The bounded loop (max_feedback_cycles) guarantees the agent is never trapped re-prompting forever — when the cap is reached, whatever remains is surfaced instead.
Exit codes (the harness’s own)
These are the shipmoor-harness wrapper’s codes — distinct from the CLI’s 0/1/2/3 scan contract it consumes:
| Surface | Codes |
|---|---|
status / mode / install / uninstall | 0 ok · 2 harness error |
codex wrapper | 0 clean · 1 findings remain (block) · 2 scan failed · 3 Codex failed |
watch | 0 ok/stopped · 1 block breach · 2 gate locked |
hook claude-code | 0 silent/feedback · 2 block (stderr fed to the agent) |
Environment overrides
SHIPMOOR_BIN— absolute path to theshipmoorCLI (elsePATH, then~/.shipmoor/bin/shipmoor).SHIPMOOR_CLAUDE_BIN— theclaudebinary the Claude adapter probes.
Next
- The self-correction loop — what block and feedback look like in a real session.
- Agent support — adapter-by-adapter wiring details.
- Watch mode — scan-on-change for agents without hooks.