Klein-Harness 是一个 repo-local 的 agent runtime。它的目标不是“再包一层脚本”,而是把任务提交、路由、派发、执行、验证、控制这整条链路收进一个可审计、可恢复、可追踪的运行时里。
一句人话总结:
- 你把任务交给
harness harness先定边界和规则- worker 再去执行
- 运行时自己验收结果
- 整个过程都落在仓库本地的
.harness/里
适合这些场景:
- 你希望在一个真实仓库里持续跑 Codex worker,而不是每次手工复制上下文
- 你需要任务队列、tmux 会话、checkpoint、verify、handoff 这些运行时能力
- 你希望“执行的人不能自己宣布完成”,而是由 runtime 做验收和状态推进
- 你想把规划、执行、验证、控制面拆开,避免 agent 越界
它的核心边界是:
tmux只负责承载执行会话codex exec/codex exec resume只负责模型执行- Go runtime 才是控制面真相来源
- shell 脚本只是兼容入口,不是 runtime authority
Canonical implementation:
- CLI:
cmd/harness - Runtime:
internal/runtime - Bootstrap:
internal/bootstrap - Routing:
internal/route - Dispatch:
internal/dispatch - Lease:
internal/lease - Verify:
internal/verify - Query:
internal/query - Executor:
internal/executor/codex和internal/tmux
兼容层还保留着,但只是转发:
scripts/harness-*.shcmd/kh-codexcmd/kh-orchestratorcmd/kh-worker-supervisor
按仓库当前实现,建议把下面三样准备好:
codex- worker 实际是通过原生
codex exec/codex exec resume跑起来的
- worker 实际是通过原生
tmuxdaemon/dashboard/ bounded burst 执行会用到它install.sh会检测它;没有也能安装,但 bootstrap / daemon 能力会受限
go- 用来编译 canonical
harness二进制 - 如果没有 Go,安装脚本会跳过二进制构建,兼容 wrapper 仍可回退到仓库里的
go run
- 用来编译 canonical
最直接的方式:
./install.sh --force安装脚本会做这些事:
- 把 skills 安装到
$CODEX_HOME/skills,默认是~/.codex/skills - 把
harness编译到$CODEX_HOME/bin - 安装兼容 wrapper,例如
harness-submit、harness-control、harness-status - 更新
$CODEX_HOME/AGENTS.md里的 managed block,但不覆盖非托管内容 - 更新
$CODEX_HOME/config.toml里的 managed profiles,但不覆盖你自己的 profile
当前安装进去的关键 skills 包括:
klein-harnessblueprint-architectqiushi-executionsystematic-debuggingharness-log-search-cskillmarkdown-fetchgenerate-contributor-guide
下面这套命令,是现在这套库最推荐的最小路径。
harness init /path/to/repo这一步会在目标仓库下创建并初始化 .harness/ 运行时目录。
harness submit /path/to/repo \
--goal "Fix failing verify regression" \
--context docs/prd.md目前 submit 已确认支持这些 flag:
--goal--context--kind
harness daemon loop /path/to/repo --interval 30s常用可选项:
--model--approval-policy--sandbox-mode--worker-id--skip-git-repo-check
harness tasks /path/to/repo
harness task /path/to/repo T-001
harness control /path/to/repo task T-001 statusharness control /path/to/repo task T-001 attach在非交互环境里,这个命令会直接告诉你应该用哪条 tmux attach-session 命令去接入现场。
如果你是第一次接手一个 repo,可以直接按这个顺序:
harness init /path/to/repo
harness submit /path/to/repo --goal "实现某个需求"
harness daemon loop /path/to/repo --interval 30s
harness tasks /path/to/repo
harness control /path/to/repo task T-001 status如果你想开一个可视化面板,而不是只看命令行:
harness dashboard /path/to/repo --addr 127.0.0.1:7420当前 dashboard 默认会把调度循环一起带起来;如果你只想看页面,不想顺手启动 daemon:
harness dashboard /path/to/repo --no-daemon当前 canonical flow 是:
harness initharness submitharness daemon loop或harness dashboard- route task
- issue dispatch
- acquire and claim lease
- create real tmux session
- run native codex inside tmux
- persist checkpoint and outcome
- ingest verify
- expose query / control state
如果任务适合直接收口,runtime 会把它编成单个 slice 直接执行。 如果任务复杂,它会先冻结 shared context、task contract、verify skeleton,再把受控 slice 交给 worker。
重点不是“AI 去执行”,而是“runtime 先把执行边界定好”。
Canonical CLI:
harness init /path/to/repo
harness submit /path/to/repo --goal "Fix failing verify regression"
harness tasks /path/to/repo
harness task /path/to/repo T-001
harness control /path/to/repo task T-001 status
harness control /path/to/repo task T-001 attach
harness control /path/to/repo task T-001 restart-from-stage queued
harness control /path/to/repo task T-001 stop
harness control /path/to/repo task T-001 archive
harness daemon loop /path/to/repo --interval 30s
harness dashboard /path/to/repo --addr 127.0.0.1:7420兼容 wrapper 也还在:
harness-submit /path/to/repo --goal "Fix failing verify regression"
harness-tasks /path/to/repo
harness-task /path/to/repo T-001
harness-control /path/to/repo task T-001 status
harness-status /path/to/repo但它们只是兼容入口。真正的 runtime source of truth 还是 harness。
权威状态文件主要在这里:
.harness/requests/queue.jsonl.harness/task-pool.json.harness/state/dispatch-summary.json.harness/state/lease-summary.json.harness/state/session-registry.json.harness/state/runtime.json.harness/state/verification-summary.json.harness/state/tmux-summary.json.harness/checkpoints/*.harness/artifacts/*
其中最值得你先看的通常是:
task-pool.json- 当前任务池和状态总览
state/runtime.json- 当前 daemon / 调度运行时状态
state/tmux-summary.json- tmux 会话摘要
artifacts/<TASK>/<DISPATCH>/- 某个任务某次派发的 worker 产物、verify、handoff
派生视图包括:
.harness/state/completion-gate.json.harness/state/guard-state.json
这套库有几个很关键的设计选择:
- worker 只拥有 task-local execution 权限
- completion / archive / merge 不是 worker 说了算
- verify 是硬门,不是“最好做一下”
- runtime 会把 route、dispatch、lease、checkpoint、verify 统一收在 Go 控制面里
所以你会看到:
attach是控制动作restart-from-stage是控制动作archive也要服从 completion gate
单元测试:
go test ./...如果 macOS linker 报 libtapi.dylib 签名问题:
CGO_ENABLED=0 go test ./...
CGO_ENABLED=0 go build ./cmd/harness覆盖导向的 integration tests:
go test -tags=integration ./...如果你已经能跑起来,下一步建议按这个顺序读:
- 架构总览:docs/klein-architecture.md
- Runtime 事实模型:docs/runtime-mvp.md
- 命令面:docs/four-command-surface.md
- Operator 控制面:docs/operator-cli.md
- Guardrails:docs/guard-loop.md
- 迁移说明:docs/refactor-runtime-migration.md
- Qiushi 设计映射:docs/qiushi-integration.md
如果你更想看中文、并且想一次性看完整设计,推荐直接读:
如果你只记住一件事,那就是:
Klein-Harness 不是“帮 AI 跑任务的脚本集合”,而是“把任务的提交、执行、验证、控制和恢复统一收进 repo-local runtime 的控制面”。
