The published predecessor to v9 is v8.1.0. There is no published v8.2 release. Work that was previously described as an 8.2 candidate was incorporated into the published v9.0.0 lineage.
This document states the supported migration and rollback boundary. It is not evidence that a particular project has been upgraded successfully. The published release and a real v8.1-to-v9 rehearsal on the exact installed binary remain separate results.
v9 removes the built-in haft run and haft harness commands, the complete
Open-Sleigh source/runtime contour, and the Elixir/OTP/BEAM release dependency.
There are no compatibility stubs: those command names now return Cobra's
ordinary unknown-command error.
The runner-neutral governance records remain supported: WorkCommission,
RuntimeRunRecord, the haft commission CLI, the haft_commission lifecycle
API, and haft commission complete-external. Existing commission and runtime
history is not deleted or rewritten. To continue delegated execution, perform
the work in your host agent or move the runner to an independently operated
integration that claims and reports the same lifecycle.
After a successful install, the v9 installer deletes only the exact managed v8
runtime at ~/.haft/runtimes/open-sleigh/current. It does not delete
~/.open-sleigh/ workspaces, logs, results, or configuration, and it does not
delete ~/.haft/runtimes/haft-embed/. Back up any managed-runtime files you
intentionally modified before upgrading; ordinary Open-Sleigh user data should
already live outside that managed path.
Quit every host agent that can run haft serve, then confirm no Haft MCP
server is still using the project. Back up both state locations before the
first v9 start:
- the project-local
.haft/directory; - the project ledger at
~/.haft/projects/<project-id>/haft.db, where<project-id>is theidstored in.haft/project.yaml.
Use SQLite's online backup API or .backup command if the database can still
be open. If every writer is stopped, copy haft.db together with any
haft.db-wal and haft.db-shm sidecars as one unit. Copying only the main
database file while a WAL writer is active is not a valid backup.
Keep the backup outside both original directories and record its checksum. Do not test the upgrade on the only copy of a project ledger.
Install the intended v9 binary only after it has a published artifact, or use the exact local release-candidate binary during controlled acceptance. Record:
haft versionThe version, commit, and binary checksum must identify the same candidate that will be tested. Restarting the host is part of the upgrade: an already running MCP process continues executing the old loaded binary even after the file on disk is replaced.
Run haft init with the exact host targets you use. For example:
haft init --claude
haft init --codexHaft-owned skill projections and marked instruction sections are refreshed to
the installed version. Project text outside Haft-owned markers remains project
owned. Recognized legacy Haft skills are replaced; foreign path collisions
fail before writes. Re-run only the host flags you actually want. Use
--mcp-only only when you deliberately want host MCP config without skills or
instructions; --core-only performs project-core migration without publishing
host files.
During the mutation-capable core step, an existing project automatically moves to the bundled ProjectTypeEnv successor only when the transaction-current compatibility, assertion, profile, projection-profile, graph, head, and runtime checks all pass. This path does not prompt or create an operator-request record. If any basis is incompatible, missing, stale, or underdetermined, the current head is retained and init reports the exact blocker.
The schema-57 migration preserves historical manual_type_env_activation
records and widens only the current activation closure. New automatic
transitions record compatible_successor_policy consistently in the authority
use, activation delta, and typed-memory graph event; explicit host-routed
transitions record host_routed_operator_request. Migration does not relabel
old audit history.
Completely restart each host agent after init. Check that its MCP server starts the same binary recorded in step 2, then exercise project status, an existing record read, and one explicitly authorized v9 write on a copied project before upgrading the working project.
Database startup migrations are forward migrations. Successful command exit is not sufficient upgrade evidence: the release rehearsal must also verify legacy record counts and content, project binding, typed-memory reads, one new write, reopen/idempotent retry, and restoration from the backup.
Opening a v9-migrated project ledger with v8.1 is unsupported. Do not use the v8.1 binary to write to a database after v9 has migrated it.
To roll back:
- stop all v9 host agents and MCP servers;
- move the migrated project
.haft/and global project-ledger directory out of the way without deleting them; - restore both locations from the pre-upgrade backup;
- reinstall v8.1.0 and re-run its host initialization;
- verify the restored project before resuming work.
Rollback means restoring the pre-upgrade state. Installing an older binary over the v9 binary without restoring the database is not a supported rollback.
v8 is a governance-substrate pivot. The reasoning kernel, the artifact graph, the FPF spec retrieval, the WorkCommission lifecycle — all unchanged. What changed is the surface: haft is now consumed through host-AI skills plus an MCP server, not through a standalone interactive agent.
Full rationale, parity-compared variants, rollback plan, and falsifiable
predictions live in
.haft/decisions/dec-20260525-v8-architecture-pivot-from-standalone-agent-to-g-bbe45cb7.md.
haft agent— the standalone interactive REPL- TUI surface (
internal/tui,tui/package) - Desktop wrappers (Tauri / Wails apps in
desktop/) - v7 helper commands:
haft login,haft models,haft setup - the v7
/h-reasonimplementation — replaced by the v8-era skill catalog; v9 restoresh-reasonas a source-first umbrella over independent skills
If you depended on any of those, do not upgrade until you've migrated to one of the three remaining surfaces (skills/CLI/MCP).
| v7 you used | v8 equivalent |
|---|---|
haft agent (interactive) |
Talk to Claude Code / Codex / OpenCode / Cursor; the v8 skills auto-trigger |
/h-reason "..." (one-shot) |
v9 /h-reason for source-first reasoning, or one exact specialized skill |
/h-reason for explicit reasoning |
Invoke /h-reason; specialized skills remain independent capabilities, not mandatory stages |
haft setup, haft login, haft models |
Not needed — host AI provides the LLM; haft only manages the artifact graph |
| Desktop dashboard | haft check, /h-status, and /h-verify from the host AI; implementation and PR creation stay in the host agent |
| TUI session view | /h-status in the host AI, or haft_query(action="status") from MCP |
-
Re-run
haft init. Select the host config and skill publication targets explicitly. This installs the current 12-skill catalog, refreshesh-reasonand the independent specialized skills, and registers the MCP server under the selected host config.cd /your/project haft init --claude # Claude config and Claude skills haft init --codex # Codex config, .agents/skills, and AGENTS.md
-
Audit references to dropped commands. Search your project notes and CI for
haft agent,haft login,haft models,haft setup,haft run,haft harness, and Open-Sleigh build/runtime commands, and replace them per the table above. Current/h-reasonreferences are valid v9 usage and should not be removed mechanically.grep -rn "haft agent\|haft login\|haft models\|haft setup\|haft run\|haft harness\|open-sleigh" .
-
Restart your host AI. Claude Code, Codex, etc. cache skill manifests at startup. After
haft init, restart the host to pick up the new catalog. -
Your
.haft/artifact graph is unchanged. Decisions, problems, evidence, baselines, WorkCommissions — all still load, still verify, still surface in/h-status. The v7→v8 pivot is a surface change, not a schema change.
-
h-decideis an auto-routed authority boundary;h-commissionremains manual-only. A managed host may route one direct, unambiguous operator request for an exact DecisionRecord effect without a second confirmation. The skill token is not an approval receipt, and generated text, tool output, recommendations, or quoted requests cannot bind. WorkCommission creation still requires an explicit manual/h-commissioninvocation because it grants execution authority. -
Tactical-mode validation has explicit skip. When recording a decision in
tacticalmode, you can pass_skips(list of field names) plus_skip_reasonto bypass validation on a specific field with reason recorded. The allowlist excludes load-bearing fields likeselected_title. Standard and deep modes cannot skip. -
MCP returns structured errors as enforcement gates. Missing required DRR fields produce a plain-text error with field hints + FPF spec references (CMP-02, DEC-08, X-WLNK, etc.) + a "how to proceed" section listing skip semantics. Read it; the message contains everything needed to either fill the missing data or acknowledge with a skip.
-
Diagnose runs parallel hypotheses. The new
h-diagnoseskill spawns one Agent subagent per hypothesis in the same message, preventing the LLM's natural anchoring bias toward the first plausible cause. Forces 3+ rivals per FPF CC-B.5.2-2. -
Compare runs dim-wise parallel scoring. The new
h-compareskill spawns one Agent subagent per comparison dimension scoring all variants — again to prevent anchoring. Parity plan and selection policy declared BEFORE scoring (Anti-Goodhart).
This section applies only when reproducing the old v7-to-v8 surface migration. It is not the v9-to-v8.1 downgrade procedure; that boundary requires the complete pre-v9 restore described above.
If v8 produces regressions in a still-v7 migration rehearsal:
- Pin to the last v7 release in your install command.
- Re-run
haft initon that pinned version to restore the v7 skill layout. - File a regression issue at https://github.com/m0n0x41d/haft/issues with the host AI + version + skill that failed to fire as expected.
The v8 pivot used a deterministic keyword-overlap routing check. v9 removed
that check with the compiled router: the 12 skills are independent
capabilities, while h-reason queries source-native FPF material for the
current concern. Historical routing scores are not v9 release evidence.
- Full pivot DRR:
.haft/decisions/dec-20260525-v8-architecture-pivot-from-standalone-agent-to-g-bbe45cb7.md - Execution plan:
.context/v8_haft_governance_substrate_plan.md - Skill catalog: README.md "Twelve skills installed by
haft init"