m0n0x41d/haft
GitHub: m0n0x41d/haft
为 AI 编程 Agent 提供基于第一性原理的工程决策治理框架,将问题框架、对比、决策和验证转化为可审计、带证据衰减管理的结构化工件。
Stars: 1375 | Forks: 103

*前身为 [quint-code](https://github.com/m0n0x41d/quint-code)*
**用于 AI 辅助软件交付的 FPF 治理基座。**
你的 agent(Claude Code、Codex)编写代码的速度很快。但大多数代码库尚未准备好
进行严肃的 harness 工程:目标系统规范不足,使能系统
隐含不露,术语映射缺失,并且运行时证据
与规范脱节。Haft 能够让项目在扩展执行规模之前变得可 harness。
## 什么是 Haft?
Haft 是一个**治理基座**,它使代码库能够进行
由主导者驱动的 FPF 工程工作。它将问题框架、对比、
决策、委托和证据转化为可审计的工件,并在 kernel 边界进行强制执行。
**规约 → 思考 → 运行 → 治理。**
它不是编程 agent。也不是文档生成器。它是工具
与手之间的把手:将原始的模型能力转化为正式的
规范、受治理的决策、有边界的委托以及有证据支撑的
工程工作的那一部分。
### 三个交互面,一个工件图
Haft 通过基于一个 `.haft/` 工件图的三个交互面来使用:
- 在你的编程 agent(Claude Code、Codex、OpenCode、Cursor)中的 **技能 + 斜杠命令** —— 工作流技能会自动触发;`/h-frame /h-decide /h-verify ...` 手动运行
- **CLI** (`haft problem`, `haft solution`, `haft decision`, ...) —— 手动访问,回路中没有 LLM
- **MCP server** (`haft serve`) —— 基于 Model Context Protocol 为任何 LLM agent 提供编程访问
kernel MCP server 是跨主机的强制执行表面:它在服务器端验证
参数,并为 FPF 违规(缺少必填字段、对等性差距、最薄弱环节遗漏、没有 verify_after 的预测)返回结构化错误。技能承载过程;kernel 把守关卡。
### v8 中发生了哪些变化
v8 弃用了独立的交互式 agent (`haft agent`)、TUI 和
桌面封装。Haft 不再在运行时表面上与通用编程 agent 竞争 —— 它在你已经使用的任何 agent 之上增加治理规范。带有对等性比较的变体、回滚计划和可证伪的预测的架构调整,记录在
`.haft/decisions/dec-20260525-v8-architecture-pivot-from-standalone-agent-to-g-bbe45cb7.md` 中。
从 v7 升级?请参阅 [MIGRATION-v8.md](MIGRATION-v8.md) —— 升级检查清单
以及被弃用的内容(`haft agent`、TUI、桌面版、v7 辅助命令)。
## 基于 First Principles Framework 构建
[FPF](https://github.com/ailev/FPF) 由
[Anatoly Levenchuk](https://www.linkedin.com/in/ailev/) 提出 —— 一种严谨的、
跨学科的思考架构。
这套技能集(`h-frame`、`h-explore`、`h-compare`、`h-decide`、`h-verify` 以及
下面的完整目录)为你的 agent 提供了一个原生的 FPF 操作系统,用于
工程决策:解决方案之前先建框架,比较之前先刻画,强制对等性,带有同余性惩罚的证据,
最薄弱环节保障,以及一个在证据老化或测量失败时
重新开启自身的循环。
框架和比较技能在操作员上下文中自动触发。绑定步骤(`h-decide`、`h-commission`)根据 Transformer Mandate 仅限手动:
agent 负责建立框架并进行比较;由人类主导者记录绑定选择。
`haft fpf search`(以及来自 MCP 的 `haft_query(action="fpf")`)搜索已索引的
FPF 规范。检索是混合型的:首先匹配精确的 pattern id,然后是关键字
(FTS5),并与内置 section 向量的语义召回相融合,因此即使是换种说法的“我
该如何思考 X”也能找到回答它的 pattern。向量内置于
二进制文件中;当缺少 embedding sidecar 时,语义召回会降级为关键字检索。
## 安装
```
curl -fsSL https://raw.githubusercontent.com/m0n0x41d/haft/main/install.sh | bash
```
安装 URL 仍然指向历史路径 `quint-code`。安装的二进制文件是
`haft`。
然后在你的项目中,使用你的宿主 agent 标志进行初始化:
```
haft init # Claude Code (default)
haft init --local # Claude Code, repo-local commands
haft init --codex # Codex CLI / Codex App
haft init --all # Claude Code + Codex
```
Claude Code 和 Codex 是受支持的宿主。Cursor、Gemini CLI 和 OpenCode
具有实验性配置标志(`--cursor`、`--gemini`、`--opencode`),同时它们的
运行时和文档也在不断收敛。
**Cursor:** 初始化后,打开 Settings → MCP → 找到 `haft` → 启用开关。
Cursor 在默认情况下会将添加的 MCP server 置为禁用状态。
### 初始化在各工具中的具体操作
二进制文件是相同的;只是 MCP 配置和命令/技能的安装位置
有所不同。
| 工具 | MCP 配置 | 命令 / 提示词 | 技能 |
|------|-----------|--------------------|--------|
| Claude Code | `.mcp.json` (项目根目录) | `~/.claude/commands/` (使用 `--local` 时为 `.claude/commands/`) | `~/.claude/skills/` (15 个技能) |
| Codex CLI / App | `.codex/config.toml` | `~/.codex/prompts/` (使用 `--local` 时为 `.codex/prompts/`) | `~/.agents/skills/` (15 个技能) |
项目级配置(`.mcp.json`、`.codex/config.toml`)使用可移植的
项目根路径,因此对于共享代码库,将它们提交到版本库是安全的。
现有项目?在初始化后运行 `/h-onboard`。它会构建一个可解析的
目标系统规范、使能系统规范、术语映射和规范覆盖图 ——
而不仅仅是代码库摘要。
在本地检查规范载体:
```
haft spec check
haft spec check --json
```
`haft spec check` 仅限确定性的 L0/L1/L1.5 检查:它解析围栏
`yaml spec-section` 块,检查必需的结构字段,验证已知的
载体形状,并确认术语映射载体可被解析。它不进行 L2
语义判断,不进行 LLM 审查,也不进行 L3 运行时声明。
## 工作原理
### 七个 MCP 工具
| 工具 | 功能说明 |
|------|-------------|
| `haft_note` | 微决策 —— 带有类型化锚点、验证和自动过期机制的原子事实 |
| `haft_problem` | 构建问题框架,声明带有指标角色的比较维度 |
| `haft_solution` | 在多样性检查下探索变体,在对等性下进行比较 |
| `haft_decision` | 决策契约:不变量、声明、证据、基线生命周期 |
| `haft_commission` | 用于执行 harness 的 WorkCommission 生命周期 |
| `haft_refresh` | 每种工件类型的生命周期管理 |
| `haft_query` | 搜索、状态看板、代码图(调用者/被调用者/影响/探索 —— 每个到达的符号都与管辖它的决策相融合)、FPF 规范搜索 |
### 通过 `haft init` 安装的十五个技能
| 技能 | 模式 | 功能说明 |
|---|---|---|
| **h-reason** | 自动(总括) | 在一个入口中提供完整的 FPF 推理体系 —— 框架构建、探索、比较、验证、笔记,以及 slideument 模式(Goldilocks、NQD、BLP、缩放定律视角)。手动调用 `/h-reason` 始终有效;在遇到没有特定技能能够精确匹配的宽泛“让我们仔细思考一下这个问题”的信号时会自动触发。 |
| **h-frame** | 自动 | 使用 B.4.1 稳定化 + 问题分类 + 伞形词修复来构建问题框架 |
| **h-diagnose** | 自动 | 使用并行假设测试诊断故障(每个假设分配一个 Agent subagent 以防止锚定) |
| **h-explore** | 自动 | 使用 NQD 多样性原则生成独特的候选变体(并行分配方向的 agent) |
| **h-compare** | 自动 | 公平比较,带有逐维度并行评分 + Pareto 前沿(而不是单一的标量赢家) |
| **h-decide** | **手动** | 记录具有完整 DRR 的绑定 DecisionRecord —— Transformer Mandate (`disable-model-invocation`) |
| **h-verify** | 自动 | 基线 → 测量 → 带有漂移检测的证据回路 |
| **h-status** | 自动 | 只读项目 FPF 状态看板 |
| **h-onboard** | 自动 | 针对初次使用 haft 的项目进行的首次框架构建仪式 |
| **h-spec-cover** | 自动 | 规范覆盖检查,带有盲区/陈旧模块分类 |
| **h-note** | 自动 | 轻量级微决策记录 |
| **h-commission** | **手动** | WorkCommission 生命周期 —— 根据 Transformer Mandate 手动执行 (`disable-model-invocation`) |
| **h-abduct** | 子程序 | 纯 B.5.2 溯因四步法(构建提示词 → ≥3 个竞争方案 → 过滤 → 提炼) |
| **h-boundary-unpack** | 子程序 | A.6.B 边界声明的 L/A/D/E 分解 |
| **h-semio-review** | 子程序 | X-FANOUT-AUDIT —— 概念重命名 / 规范一致性审计 |
当技能描述与操作员上下文匹配时,自动触发技能将开始运行。
仅手动技能(`h-decide`、`h-commission`)需要根据
Transformer Mandate 进行显式调用 —— 绑定工件来自人类主导者,而不是
agent。子程序(`h-abduct`、`h-boundary-unpack`、`h-semio-review`)被
其他技能调用,或在处理特定的 FPF 子学科时被显式调用。
路由可靠性是可测试的:`haft check routing` 运行 40 个黄金提示集
(当前通过率为 82.5%)。
### 证据工作流
使用 `haft_decision(action="evidence", ...)` 附加证据。证据带有
形式化级别(F0–F3)、同余性级别(CL0–CL3)和过期日期。信任分数
(R_eff) 会随着证据老化而下降;陈旧的证据会触发刷新。请使用
`haft_decision(action="measure", ...)` 进行实现后的验证。
### Harness —— 执行引擎(测试版,仅限 Codex)
harness 在隔离的工作空间中,由真实的 Codex agent 实现 `DecisionRecord` 工件下的代码。它是**测试版**,并且执行 agent **仅限 Codex** —— 没有 Claude 执行路径。单一委托的
`haft harness run` 是值得信赖的操作员路径;排空模式和自动应用已在文档类委托上得到验证,因此请将它们在生产环境代码委托上视为测试版。
有两个入口点可以生成引擎。`haft run` 直接实现一个决策:
```
haft run dec-20260414-001
```
它从图中读取决策的不变量、声明和受影响的文件,
构建包含完整推理上下文的提示词,生成一个以
不变量为护栏的 Codex agent,并在完成时拍摄基线快照。
`haft harness` 通过 Open-Sleigh 运行委托的工作,带有范围防护
(`allowed_paths` / `forbidden_paths`)、每个委托的锁以及离散的
可回滚应用提交:
```
haft harness run --prepare-only # create/reuse commissions, do not start runtime
haft harness run # create/reuse commissions and start Open-Sleigh
haft harness run --drain --concurrency 4 # drain the queue (apply still manual by default)
haft harness status # inspect active/recent runs
haft harness result wc-... # inspect one completed run and its workspace diff
haft harness apply wc-... # apply a completed workspace patch to this checkout
```
委托包含一个 `delivery_policy`。默认的 `workspace_patch_manual`
将更改保留在隔离的工作空间中,直到你运行 `haft harness apply`。
`workspace_patch_auto_on_pass` 将通过的运行作为离散提交应用;
`blocked_policy` / 失败的运行会等待操作员决策。
对于默认情况下的 `needs_onboard` 项目,广泛的 harness 执行会被阻止。对于
有意为之的战术性规范外工作,请传入 `--force-skip-specs "
"`;
haft 会将原因记录在被选中的委托上。
发布归档捆绑了 Open-Sleigh BEAM runtime,因此正常的 harness 使用
无需安装 Elixir/Mix:
```
~/.haft/runtimes/open-sleigh/current
```
较低级别的交互面是 `haft_commission` MCP 工具和 `haft commission`
CLI (`create-from-decision`, `create-batch`, `create-from-plan`, `list`, `show`,
`requeue`, `cancel`, `claim`, ...)。每一个委托动作都会成为一个类型化的
工件转换,绝不会是自由格式的提示词:
```
SpecSection(s) → DecisionRecord → WorkCommission → RuntimeRun → Evidence → SpecCoverage
```
## 实用手册 —— 常见工作流
### 记录架构选择
```
operator (to Claude Code): "we need to pick a queue for the new ingestion path"
↓ h-explore auto-triggers, generates 3+ distinct variants with NQD diversity
↓ h-compare auto-triggers, scores dim-wise in parallel, surfaces the Pareto front
↓ operator picks a variant, then explicitly types:
/h-decide
↓ kernel validates required DRR fields; missing fields → structured error
↓ on pass: DRR written to .haft/decisions/, ready for `haft run`
```
### 使用竞争假设诊断故障
```
operator: "tests are failing on the schema migration after the deploy"
↓ h-diagnose auto-triggers, spawns 3+ parallel Agent subagents, one per hypothesis
↓ each subagent reads only what its hypothesis needs (no anchoring)
↓ results merged, ranked by the FPF B.5.2 filter chain
↓ if confirmed: /h-note records the diagnosis; if architectural: /h-frame
```
### 验证决策是否依然有效
```
operator: "did dec-20260420-cache-redesign actually work"
↓ h-verify auto-triggers
↓ reads decision predictions + valid_until + baseline file hashes
↓ measures observable claims (test output, metric query, ...)
↓ writes evidence with CL/freshness; updates R_eff
↓ if R_eff < 0.5 → marks stale; if predictions failed → reopens the problem
```
### 快速操作员状态
```
haft check # CI-friendly governance verification (exit 0 clean / 1 findings)
haft check routing # sanity-check skill routing reliability
```
在宿主 agent 中:使用 `/h-status` 获取完整的看板。
## 它的不同之处
- **决策是鲜活的** —— 计算出的信任分数 (R_eff 会随着证据老化而下降
- **比较是诚实的** —— 强制对等性,带有感知约束的 Pareto 消除,反 Goodhart 观察指标
- **推理与代码融合** —— 当你阅读或遍历某个符号时,`haft_query` 会显示管辖该符号的决策,因此受治理的节点永远不会被读取为“可安全更改”状态
- **跨会话记忆** —— 在框架构建期间会浮现相关的过往决策,在探索期间会浮现相似的变体
- **闭环运行** —— 失败的测量会重新开启决策,证据衰退会触发审查,漂移检测会标记违规
- **决策即契约** —— 不变量、带有阈值的声明、回滚计划、有效期限
## 路线图
### v8 —— 治理基座调整(当前)
独立的交互式 agent、TUI 和桌面封装已被弃用。Haft 现在是一个
kernel + CLI + MCP server + 15 个技能的组合,在 Claude Code、Codex、
OpenCode 和 Cursor 之间通过一个 `.haft/` 工件图共享。kernel MCP 返回
结构化错误作为硬性执行关卡;根据 Transformer Mandate,绑定工件保持仅限手动状态。基本原理:
`dec-20260525-v8-architecture-pivot-...`。
已发布的历史记录位于 [CHANGELOG.md](CHANGELOG.md) 中。
### 下一步
具有优势的防御性边界是代码图与推理图的融合,
以及该推理图的鲜活度 —— 而不是原始的代码图覆盖范围。当前的活跃方向
(想法阶段,作为活跃问题记录在 `.haft/` 下):在受治理符号上进行编辑时的
不变量护栏,在符号处显示信任状态,
对治理图进行一致性检查,以及一个运行时 harness,用于衡量
融合后的图是否真正减少了读取操作并防止了错误的决策。
这些均未承诺会在发布版本中实现。
## 环境要求
- **Go 1.25+** —— 从源代码构建
- **Claude Code 或 Codex** —— 插件模式
- **Rust 工具链** —— 仅用于从源代码构建 embedding sidecar (`haft-embed`);如果没有它,FPF 语义搜索将退化为关键字检索
## 许可证
MIT标签:AI编程辅助, EVTX分析, LLM代理工具, MCP, 可视化界面, 开发治理, 数据管道, 软件工程