22 KiB
22 KiB
Changelog
All notable changes to this project are documented here.
Format follows Keep a Changelog; versions use CalVer (YYYY.M.D with -N suffix for same-day releases) and match git tags.
Update policy and release automation live in .claude/rules/git.md § Changelog.
[Unreleased]
Removed
- Remove the empty untracked
packages/web-ui/andpackages/slack/husks, plus the stale Slack workspace and entrypoint references. (#213) - Remove the obsolete on-disk SPEC v0.6 artifact so
.claude/specs/only exposes canonical tracked specs. (#213) - BREAKING:
oh harness adddeprecated;mifune(and any other harness pack) installs viagit clone+ manualcpper the pack's README for v1. The CLI-driven pack installer was deleted along withpackages/sandbox/in US-006; itsfetchGitPack(command-injection-prone) andregisterComposeOverlays(path-traversal-prone) plumbing is gone with it. A redesigned, security-first standalone installer (~50 LOC) tracked for v0.8 in #211: URL allowlisting, signature/SHA verification, sandboxed install, command-injection-safespawnSync, path-traversal-safe overlay resolution, atomic registry write. Per SPEC v0.7 §"Pack mechanism status in v0.7". (#210) - BREAKING: workspace template emptied of pi-coupled scaffolding. Deleted
workspace/HEARTBEAT.md,workspace/IDENTITY.md,workspace/MEMORY.md,workspace/SOUL.md,workspace/TOOLS.md,workspace/USER.md(six identity files belonging to the v0 multi-agent persona);workspace/heartbeats/(replaced by rootcrons/per US-002),workspace/.ralph/,workspace/.codexsymlink,workspace/.openharnesssymlink, andworkspace/memory/(instance state in template);workspace/.claude/skills/{compress,content-gate,eval-conciseness,quality-gate,wiki-ingest,wiki-lint,wiki-query,ralph,prd,ci-status}/(ten workspace skills);workspace/.claude/agents/{council,critic,implementer,pm,agent-builder,command-builder,rule-builder,skill-builder}.md(eight sub-agents); andworkspace/.claude/hooks/notify_slack.sh(Slack hook + its references inworkspace/.claude/settings.local.json). Rewroteworkspace/AGENTS.md(and theCLAUDE.mdsymlink) as a generic ~22-line agent-runtime stub. Kept:workspace/AGENTS.md,workspace/startup.sh,workspace/.claude/.example.env.claude,workspace/.claude/rules/{code-quality,git,token-conservation}.md,workspace/.claude/settings.local.json,workspace/.claude/screenshots/.gitkeep. The workspace template is now agent-runtime-agnostic; identity, skills, sub-agents, and routines come from a harness pack (e.g.@ryaneggz/mifune), not from this directory. Per SPEC v0.7 §"Harness Packs". (#210) - BREAKING: orchestrator skill set triaged to a defensible 4-skill core. Deleted
.claude/skills/{delegate,harness-audit,strategic-proposal,skill-lint,prd,ralph}/(six skill directories that mapped to v0 multi-agent / autonomous-agent flows). Converted.claude/skills/{provision,destroy,repair}/to plain Markdown documentation atdocs/operations/{provision,destroy,repair}.md(the operations are nowdocker composeinvocations, not skills). Surviving orchestrator skills:/release,/ci-status,/cloudflared-tunnel,/agent-browser. Stale heartbeat/daemon/worktree-discovery docs (docs/heartbeats/,docs/architecture/daemon.md,docs/architecture/worktrees.md) deleted alongside; incidentalworkspace/heartbeats/references indocs/guide/{configuration,workspace}.mdanddocs/agents/{overview,claude-code}.mdrewritten to point at the croner runtime +crons/. Pack-side counterparts forcloudflared-tunnelandagent-browsertracked inryaneggz/mifune#1and#2. Per SPEC v0.7 §"Orchestrator vs workspace agent skills". (#210) - BREAKING: multi-agent comparison narrative archived. Deleted the still-draft
blog/2026-04-29-worktree-per-agent.md; movedblog/2026-04-28-byoh.mdtoblog/archive/2026-04-28-byoh.mdwitharchived: truefrontmatter and a top-of-post note that v1 framing differs. Stripped the residual "side-by-side" wording fromdocs/agents/overview.md. Per SPEC v0.7 §"oh CLI" + §"Documentation source"; the v1 ICP statement at.claude/ICP.mdnow explicitly rejects multi-agent comparison-shopping framing as out-of-scope. (#210) - BREAKING:
@openharness/sandboxCLI removed;docker composeis the canonical substrate. Deleted thepackages/sandbox/workspace package (CLI binary + harness/onboard/lib/tools source + tests), the entry frompnpm-workspace.yaml, thelink:cliscript from rootpackage.json, the now-stale.github/workflows/ci.yml(sandbox-only CI), and the duplicate.github/workflows/build.yml(which had been pushing a driftedghcr.io/ryaneggz/open-harnessimage alongside the canonicalghcr.io/ryaneggz/openharnessproduced byrelease.yml). The CLI build/symlink block in.devcontainer/entrypoint.shthat wired/usr/local/bin/openharnessand/usr/local/bin/ohis gone.release.ymlis now the sole image producer. Per SPEC v0.7 §"oh CLI". (#210) - BREAKING: heartbeat daemon removed. Deleted
packages/sandbox/src/lib/heartbeat/(~1,752 LOC),packages/sandbox/src/cli/heartbeat-daemon.ts,packages/sandbox/src/cli/actions/heartbeat.ts,packages/sandbox/src/tools/heartbeat.ts, theoh heartbeat {start,stop,status}command group, theheartbeat-daemonpackage bin, the sevenheartbeat-*.test.tssuites, and.claude/skills/heartbeat/. Heartbeat env vars (HEARTBEAT_ACTIVE_START/_END/_AGENT) stripped from.devcontainer/docker-compose.yml; the legacy daemon-startup blocks ininstall/entrypoint.shand the/usr/local/bin/heartbeat-daemonsymlink in.devcontainer/entrypoint.share gone;install/banner.shno longer advertisesheartbeat-daemon status. The croner runtime (scripts/cron-runtime.ts, US-002/US-003/US-004) is the canonical replacement per SPEC v0.7 §"Croner runtime". (#210) - BREAKING:
@mariozechner/pi-coding-agentis no longer a dependency. The pi agent CLI and Mom Slack bot have been extracted to a separate harness pack atryaneggz/mifune(npm:@ryaneggz/mifune). Install withoh harness add @ryaneggz/mifune. (#208)
Added
- v1 Ideal Customer Profile statement at
.claude/ICP.md: primary persona (single working developer, one project, agent-tended), top three jobs-to-be-done, top three needs, and explicit anti-ICP (not multi-tenant SaaS, not non-developers, not production agent operators, not comparison-shopping tinkerers). (#210) - Seeded the two SPEC-reserved crons:
crons/heartbeat.md(hourly pulse,0 * * * *) andcrons/cleanup-tasks.md(Sunday 23:00,0 23 * * 0). Bodies follow SPEC v0.7 §"Croner runtime" + §"Weekly cleanup cron"; substrate stays empty otherwise so users add their own. (#210) .devcontainer/entrypoint.shnow startsscripts/cron-runtime.tsin asystem-crontmux session on container boot, replacing the legacyheartbeat-daemonwatchdog block. Idempotent (tmux has-sessionguard); restart policy is per-container-start per SPEC v0.7 §"Croner runtime". (#210)scripts/cron-runtime.ts— minimal croner-backed runtime (≤120 LOC) that readscrons/*.mdfrontmatter, schedules per-cron tasks, runs the body as a prompt toclaude -p(or$CRON_AGENT_BIN), logs tocrons/cron-runtime.log, and uses a PID-lock atcrons/.pidto prevent double-firing. Replaces the 1,900-LOC heartbeat daemon per SPEC v0.7. (#210)- SPEC v0.7 amendments at
.claude/specs/structure-spec-v0.7.md— additive-only revision resolving seven v0.6 conflicts (canonical image name, docs path,ohCLI deprecation, croner runtime contract, hook execution mechanism, memory directory format, tasks vs.ralphpaths) and adding sections for harness packs, orchestrator-vs-workspace skill scope, and shrunk prose on Docusaurus config / eval flakiness / wiki-sync rubric / blog authorship / weekly cleanup. (#210) - README "Docker only (no installer)" section — concise compose-based deploy path for hosts that have only Docker + git.
- Per-page OpenGraph + canonical link tags via theme.config.tsx head function (#140).
- Blog post draft: Worktree-per-agent — stages for Wed publish (#145).
- Blog section at /blog and About page nav entry (#143).
- Blog post: BYOH — stop installing agent CLIs on your laptop (#144).
- Root
CHANGELOG.mdand Keep-a-Changelog workflow documented in.claude/rules/git.md;/releasenow promotes[Unreleased]to the new version section at tag time. - Generate
sitemap.xmlandrobots.txtduring docs build vianext-sitemap(#141). - Launch runbook consolidating manual cutover steps (DNS, GH settings, OG validation, GSC, promotion).
- Docusaurus v3 docs site at
apps/docsdeployed to oh.mifune.dev (#164).
Changed
- Aligned the remaining flat-format memory references in tracked docs to the directory-per-day form per SPEC v0.7 §"Memory structure". Updated
docs/guide/workspace.md(tree comment + daily-logs paragraph),docs/guide/identity.md(file table + memory protocol step + how-it-works paragraph), anddocs/architecture/container-runtime.md(workspace tree comment) to usememory/YYYY-MM-DD/log.md. Flatmemory/<date>.mdfiles are deprecated. (#210) - BREAKING:
CLAUDE.mdrewritten fordocker compose-only orchestrator instructions. The Lifecycle (Setup/Validate/Teardown), Permissions, "What You Do", "Exposing apps", and Project Structure sections no longer referenceopenharness sandbox/list/shell/clean/heartbeatoroh expose/oh harness add; commands now usedocker compose -f .devcontainer/docker-compose.yml up -d --build,docker compose ps,docker exec -it -u sandbox openharness zsh, anddocker compose ... down -v. Skills table trimmed to the 4-skill triaged set (/release,/ci-status,/cloudflared-tunnel,/agent-browser); provision/destroy/repair are documented indocs/operations/. The orphanedpackages/sandbox/entry in the project-structure block is removed andscripts/+crons/are added..claude/skills/cloudflared-tunnel/SKILL.mdno longer referencesoh expose(the gateway relationship is now described via.claude/rules/gateway-routing.md);.claude/skills/ci-status/SKILL.mdupdated to the actual workflow nameCI: Harness. Per SPEC v0.7 §"oh CLI" + §"Orchestrator vs workspace agent skills". (#210) - BREAKING:
docs/installation.md,docs/onboarding.md,docs/sandbox-lifecycle.md, anddocs/connecting.mdrewritten to removeohCLI references. Installation is nowdocker compose -f .devcontainer/docker-compose.yml up -d --build; sandbox lifecycle usesdocker compose up/stop/down -v; connecting usesdocker exec -it -u sandbox <name> zsh. Onboarding is now a manual checklist run inside the sandbox (gh auth, claude, optional ssh / cloudflared / pack-supplied Slack). Deleted the entiredocs/cli/reference tree (overview, oh-sandbox, oh-shell, oh-clean, oh-onboard) and aligned strayoh expose/oh cleanmentions indocs/integrations/{cloudflare,github,postgres}.md,docs/architecture/{overview,container-runtime}.md, anddocs/guide/overlays.md. Per SPEC v0.7 §"oh CLI". (#210) - BREAKING:
README.md,docs/intro.md, anddocs/quickstart.mdrewritten for single-project framing. The "run Claude, Codex, Gemini, and Pi side-by-side" tagline is gone; the harness is now framed as a Docker-based agent harness for one project, agent-tended over time. Quickstart leads withdocker compose -f .devcontainer/docker-compose.yml up -d --build; allohCLI references in these three files are gone (multi-agent setups now point at the@ryaneggz/mifuneharness pack). Per SPEC v0.7 §"oh CLI". (#210) - BREAKING:
install.shrewritten as a docker-compose-only installer. Removed--cli,--with-cli,--install-nodeflags and the auto-detect / 3-waychoose_pathprompt; removeddetect_node,install_nvm, the nvm SHA-256 pin, thepnpm setup+pnpm link --global ./packages/sandboxblock, and the local-repopackages/sandbox/package.jsondetection at the repo-resolution step. The script now only checks Docker + git, clones / pulls into~/openharness, prepares host auth dirs (~/.claude,~/.codex,~/.claude.json), writes.devcontainer/.env, runsdocker compose -f .devcontainer/docker-compose.yml up -d --build, and prints next-steps usingdocker exec -it -u sandbox <name> zshanddocker compose ... down -v. Per SPEC v0.7 §"oh CLI". (#210) install.shcurl-pipe target renamed~/.openharness→~/openharnessso the cloned project no longer collides with the in-repo.openharness/config dir (~/.openharness/.openharness/was visually and semantically confusing). One-time migration: existing~/.openharnessclones aremv'd to~/openharnessautomatically when the new path is absent. In-container paths (/home/sandbox/.openharness) are unchanged. (#200)- Reverted the sandbox/orchestrator vocabulary realignment (#170, #172). The in-container Linux user is
sandboxagain (UID/GID 1000 preserved); theORCHESTRATOR_USER/ORCHESTRATOR_HOMEconstants are removed. The package name@openharness/sandbox, compose service, container default,SANDBOX_NAMEenv var,POSTGRES_USER, andsandbox_*Pi tool prefix were never changed.install/banner.shcarries an inverted migration guard for users coming back from a renamed image. (#198) - Consolidate documentation:
/docs/is now the single source of truth, served by Docusaurus fromapps/docs/viapath: '../../docs'. Enabled blog at/blog/. Removed the duplicateapps/docs/docs/tree. (#178) - Installer auto-detects Node 20+; new
--cli/--docker-only/--install-nodeflags;--with-clideprecated. (#176). - README and installation docs now use the short
https://oh.mifune.dev/install.shURL (302 redirect to the raw GitHub install script onmain) instead of the longraw.githubusercontent.comURL. /releasenow executes the[Unreleased]→[$VERSION]promotion (was prose-only) andrelease.ymlsources the GitHub Release body from the promoted CHANGELOG section viabody_pathinstead ofgenerate_release_notes, so the GitHub Release notes match the changelog byte-for-byte.- Revert prior secondary product name; "Open Harness" is the sole brand across README, docs, and onboarding (#157).
- Cloudflare onboarding step now requires an explicit public hostname (no default domain) (#157).
- Slim README to ~110 lines, lead with oh CLI flow (#139).
- Wiki promoted from
workspace/wiki/todocs/wiki/— same structure (pages/,sources/,index.md,log.md), now top-level alongside human-curated docs. - 26 docs pages converted from Nextra MDX to plain markdown rendered by GitHub.
Fixed
- Correct the container runtime documentation to show Dockerfile
ENTRYPOINT ["entrypoint.sh"]invoking.devcontainer/entrypoint.shdirectly, withinstall/banner.shonly sourced for interactive shell status. (#213) - Restored six orchestrator skills removed in error during the v0.7 convergence (US-012, commit
fb71365):/ralph(PRD →prd.jsonconverter),/prd(PRD generator),/harness-audit(parallel-sub-agent codebase audit),/skill-lint(skill staleness scorer),/delegate(parallel execution coordinator), and/strategic-proposal(council-based roadmap planning). The triage rationale ("workspace-agent skills, not orchestrator") was wrong: the orchestrator actively uses theprd.jsonschema for its own task management (e.g.tasks/openharness-v07-convergence/prd.json), so removing the tools that produce that schema was a regression.scripts/ralph.sh(the runner) was kept all along — only the wrapper skills were lost. Restored fromfb71365^unchanged; CLAUDE.md skills table updated. install.shnow auto-disables the*-host.ymloverlays in.openharness/config.jsonwhen host UID ≠ 1000 (was: a multi-line warning telling the user to do it by hand). Mode-0600 credential files in~/.claude/~/.codex/~/.pican't be read across UIDs, and mode-0700 dirs (e.g.~/.pi/agent/sessions/) reject writes from non-owner UIDs — the sandbox user (UID 1000) would EACCES onoh/claude/codex/pi. The new logic usesjqto filterclaude-host.yml,codex-host.yml,pi-host.ymlout ofcomposeOverridesso the base named volumes take over. The original warning is retained as ajq-missing fallback. (#202)- Host auth (
~/.claude,~/.codex,~/.pi) is shared into the sandbox again.install.shnow pre-creates the three auth dirs and~/.claude.json(empty if missing) before sandbox bring-up so docker can't auto-create them root-owned, andclaude-host.yml/codex-host.yml/pi-host.ymlare restored to defaultcomposeOverrides. UID-mismatch hosts (UID ≠ 1000) get a loud install-time warning telling them to drop the overlays from.openharness/config.json(mode-0600 credential files can't be read across UIDs). Together this restores the convenience that was lost in #194 / #195 without re-introducing the EACCES failure mode that motivated those PRs. (#196) oh/claude/codexno longer fail withEACCES(or silent re-auth) on freshinstall.shinstalls. Removeddocker-compose.claude-host.yml,docker-compose.codex-host.yml, anddocker-compose.pi-host.ymlfrom the defaultcomposeOverridesin.openharness/config.json. Each overlay's own header documents that it requires host UID 1000 + the source dir to pre-exist; shipping them as defaults broke any host where either condition wasn't met (docker auto-creates missing source dirs as root → sandbox user (UID 1000) can't write). The base compose'sclaude-auth/codex-auth/pi-authnamed volumes now take effect by default;entrypoint.shchowns them to UID 1000 on first boot. Single-laptop developers wanting cross-sandbox auth sharing can opt back in by appending the relevant overlay(s) to.openharness/config.json. (#194)oh sandboxno longer fails on freshinstall.shinstalls with a Caddyfile bind-mount error. Removeddocker-compose.gateway.ymlanddocker-compose.cloudflared.ymlfrom the defaultcomposeOverridesin.openharness/config.json; both are additive overlays now loaded only when needed (oh exposere-adds the gateway viaSandboxConfig.addOverride()). (#192)install.shnext-steps now leads with a numbered "source your shell rc" step that detects$SHELL(bash→~/.bashrc,zsh→~/.zshrc,fish→~/.config/fish/config.fish) so users don't have to exit + reopen their shell to pick upoh/node/pnpm. Curl-piped install runs in a child bash whose exports cannot reach the parent shell — the source step is now Step 1 of next-steps (was a buried "Reminder").install.shbootstrapsPNPM_HOMEbeforepnpm link --globalso the CLI install no longer dies withERR_PNPM_NO_GLOBAL_BIN_DIRon fresh nvm-installed Node. Runspnpm setup(writesPNPM_HOMEexport to~/.bashrc+~/.zshrc) and also exportsPNPM_HOME/PATHinline so the link step succeeds in the current shell regardless of rc state.install.shno longer silently exits when sourcing a pre-existing~/.nvm/nvm.shunderset -euo pipefail. nvm + corepack calls are bracketed with relaxed strict mode and explicit$?checks, anERRtrap surfaces unexpected failures with the failing command and line, and pnpm is pinned to10.33.0(matchespackage.json#packageManager) instead of resolvingpnpm@latestover the network on every install.- Slack bot no longer drops oversized agent replies with cascading
msg_too_longerrors. Main message is capped at 2,900 chars with a_message truncated — full response in thread_footer; full content spills to thread replies;setWorking(false)always clears the working indicator. (#135)
Removed
- Removed legacy
/docs/{plans,wiki,launch-runbook,blog}/andapps/docs/docs/tree (consolidated into/docs/). (#178) - Nextra docs site and the
.github/workflows/docs.ymldeployment — documentation is now plain markdown indocs/, read in the GitHub UI. - Reference Next.js application at
workspace/projects/next-app/, along with its CI jobs (workspace/projects/next-apppaths inci.yml/release.yml) and the release pre-flight gate referencing it. - Root
package.jsonscripts:dev,docs:dev,docs:build,docs:preview.
Deprecated
Security
Release history prior to this file: see git tags and GitHub Releases. Most recent pre-changelog tag: 2026.4.22.