Stop 2 of 7
Quickstart
Two commands install the plugin. One initializes a project. One starts every session after that. Everything else on this page is explaining what those four commands did.
Before you start
- The Claude Code CLI, working.
- git initialized in the project — the harness records and checks git identity, and there is nothing to check without a repo.
python3— used by the hooks and the features validator.jq(brew install jqon macOS) — used by the per-project build hooks that/harness-initwrites.
1 · Install the plugin
From inside any Claude Code session:
version is bumped, because that field is the update cache key.
Installing the plugin changes no repository. It makes the commands available. The per-project half appears in the next step.
2 · Initialize a project
Run this in any project that will span more than one session. Below five files and one sitting, the ceremony costs more than it returns.
It then does ten things, in order:
- Detects your tech stack
- Captures and confirms git identity
- Creates the
.harness/scaffolding —features.json,context_summary.md,init.sh, progress log - Installs async PostToolUse build hooks in
.claude/settings.json - Installs the PreToolUse hooks (
enforce-scope.sh,verify-git-identity.sh) - Installs the quality gate hook (
TaskCompleted) - Wires the status line and permissions allowlist; gitignores
.harness/SESSION_INCOMPLETE - Verifies the hooks actually execute
- Proposes initial features with scope and dependencies
- Commits
The propose-features step is where a spec gate can run: /harness-init
can spawn the read-only spec-verification agent to prove each proposed
feature is testable and unambiguous before anything gets built.
3 · Read what it wrote
Open these before you do anything else. They are the whole contract between this session and the next one.
Verify the hooks really run
A hook that exists but does not execute is worse than no hook, because you will trust it. Check one directly:
# exit 0 when tests pass, exit 2 when they fail
echo '{}' | bash .claude/hooks/verify-task-quality.sh; echo "exit: $?"
4 · Every session after that
/harness-continue adds what the hook cannot: mode choice, the
smoke test, and workflow planning.
The injected block is a summary of files that may have been written by a session that ended badly. If it warns about something, verify it against the file it came from before acting on it.
Keeping it current
Two separate things upgrade, and people forget the second one.
# the plugin itself
/plugin update vv-harness
# then each project initialized under an older version
/harness-doctor # report-first: never writes
/harness-doctor --fix # applies the mechanical upgrade steps
/harness-doctor is report-first by design: running it never changes
anything on disk. It checks python3/git presence, the hook set and its
executability, settings.json wiring, .gitignore rules,
.harness/ file validity, version drift, and whether a passing feature's
recorded test_file actually exists. A clean project prints one word:
healthy.