知返 AhaDiff 使用指南 · v1.4.0

知返 AhaDiff 使用指南

自己的修复、同事的修改、AI 生成的代码或单份 Markdown,都可以用来学习。选择来源并预览后,对照证据阅读课程,再通过测验和复习巩固理解。学习记录保存在工作目录的 .ahadiff/ 中;文件、补丁、快照和文档学习无需 Git。

教程视频: 英文演示(YouTube) · 中文演示(B 站)。视频与截图来自早期界面,当前操作请以本指南为准。
上手

1. 快速开始

安装 AhaDiff,在工作目录打开本地 WebUI,再添加提供商。两份文件、本地快照或单份 Markdown 都能开始学习,无需 Git 仓库或 AI 工具集成。

安装

用 pipx 或 uv tool 安装 CLI 和配套 WebUI,无需下载源码。在虚拟环境或 conda 环境中,也可用 python -m pip install ahadiff。如果 pip 提示 externally-managed-environment,请改用隔离安装工具。

pipx install ahadiff # 或:uv tool install ahadiff ahadiff --version # ahadiff 1.4.0

升级已有安装

先停止 AhaDiff 服务,备份工作目录的 .ahadiff/,再用原来的安装工具升级。完成后重新运行 ahadiff serve。备份可能包含源码片段和密钥,请私下保存。

pipx upgrade ahadiff # 或:uv tool upgrade ahadiff ahadiff --version

虚拟环境中的 pip 用户可用:python -m pip install --upgrade ahadiff。

打开你的工作目录

在准备存放学习记录的文件夹打开终端。普通文件夹就可以;文件、patch、快照和文档输入无需 Git 仓库。下面的命令在 macOS/Linux 终端和 Windows PowerShell 中都可使用:

ahadiff serve

AhaDiff 会打开 http://127.0.0.1:8765,并按需创建本地状态。到设置添加本地或远端 provider;使用远端模型前需明确选择远端隐私模式。配置 provider 时可能发送小探测请求,文件变化预览不会调用 LLM。

选择你要学习的材料

Git 改动

学习已有仓库中的 bug 修复、同事的 commit 或 AI 修改。选择工作区变化或提交范围。

两份文件

分别点选或拖放修改前、修改后的文件。可使用代码、SQL、配置、Markdown 或两份 .ipynb,文件同名也可以。

粘贴改动

粘贴从 review 或其他工具复制的统一 diff。这里需要带 diff 头和变化行的补丁文本,不是单份资料或 review 评论。

本地快照

修改前选择一个文件、填写名称并显式保存。以后打开列表、选基准,再选择修改后文件比较。它是已过滤的学习参考,不是完整备份。

单份 Markdown

选择一份 .md 或 .markdown,预览原文并从章节、段落引用学习,不伪造前后版本 diff。

在欢迎、快速上手或使用指南选择来源。
需要主动练习时先勾选此来源的更多选项 → 主动迁移练习,否则保持混合测验,再点击预览变化。
点击开始学习,等待运行完成。
到课程读解释、差异查证据、测验作答,再到复习处理到期卡片。

同一次运行会把这些页面连接起来。修改前可显式保存快照;单份 Markdown 可直接生成文档课程。快照需要手动保存。暂不支持 PDF 或网页抓取。AI 工具集成是可选项。

已有 Git 仓库中的可选 CLI 初始化

以下命令只在 Git 仓库内使用。普通目录从 ahadiff serve 开始;CLI 的 init、doctor 仍要求 Git 仓库元数据。

ahadiff init ahadiff doctor ahadiff config show --resolved

运行产物和复习状态留在所选工作区。Provider 配置可以放在工作区内,也可以放在全局级。

存储门禁接受这些 SQLite 版本

3.51.3+ 3.50.4+(backport) 3.44.6+(backport)

需要 Python 3.11+ 和达标的 SQLite 运行时。SQLite 版本取决于 AhaDiff 实际使用的 Python 构建,不能仅凭安装器名称判断。

第一次生成课程前,先查看快速上手里的诊断。在 Git 仓库内也可以运行 ahadiff doctor 确认 SQLite 版本达标;它会报告检测到的版本和所需门槛,版本过低时 fail-closed 报错。版本号更高不代表自动被接受。门禁要求 SQLite 3.51.3 及以上,或回填补丁的 3.50.4+ / 3.44.6+ 版本,所以 3.51.0-3.51.2 低于门槛、不会被接受。如果诊断提示版本不达标,请改用包含兼容 SQLite 的 Python 构建并重新检查。安装器名称或 Windows 上的 Python 版本本身都不能证明 SQLite 兼容。

欢迎页:主标语、简介段落和首次运行的快速上手。
较早版本的欢迎页示例;当前源码请按上方的五个来源入口操作。
  1. 衬线主标题 Ship with AI. Learn it back.
  2. 首字下沉的简介段落介绍 AhaDiff。
  3. 查看最新课程与首次学习入口。
  4. 右侧卡片预览最新已完成运行的课程大纲。
设置

2. 配置模型提供商

打开 设置,添加本地或远程提供商。填写接口协议、基础 URL,以及你的账号或本地服务可用的模型。选择生成提供商和模型;可选的评判可以使用另一组配置。保存成功不代表连接成功,开始学习前请查看测试结果。

模型限制预览只读取本地配置和注册表,不联系提供商。测试提供商会发送小型真实请求,可能产生费用。远程生成需要 redacted_remote 或 explicit_remote;默认为 strict_local。

通过终端配置

下方示例会测试提供商,并在成功后保存配置。请将基础 URL 和模型占位符替换为你的服务提供的值。--api-key-env 接受环境变量名。后续 CLI 调用仍需该变量中的密钥,也可以通过设置页保存密钥。

用于 OpenAI Chat Completions。macOS/Linux 终端示例:

export AHADIFF_PROVIDER_API_KEY="<your-provider-api-key>" export AHADIFF_PROVIDER_BASE_URL="<provider-base-url>" ahadiff provider test \ --name remote \ --provider-class openai \ --base-url "$AHADIFF_PROVIDER_BASE_URL" \ --model "<model-id>" \ --api-key-env AHADIFF_PROVIDER_API_KEY \ --privacy-mode explicit_remote

OpenAI 兼容网关通常使用 --provider-class openai_compat;若服务明确支持其他对应协议,请按其说明选择。

用于 Responses 接口。下面的 macOS/Linux 命令会以隐藏输入方式读取密钥:

export AHADIFF_PROVIDER_BASE_URL="<provider-base-url>" export AHADIFF_PROVIDER_API_KEY="$(python3 -c 'import getpass; print(getpass.getpass("Provider API key: "))')" ahadiff provider test \ --name remote \ --provider-class openai_responses \ --base-url "$AHADIFF_PROVIDER_BASE_URL" \ --model "<model-id>" \ --api-key-env AHADIFF_PROVIDER_API_KEY \ --privacy-mode explicit_remote

Windows PowerShell:

$env:AHADIFF_PROVIDER_BASE_URL="<provider-base-url>" $secure = Read-Host "Provider API key" -AsSecureString $env:AHADIFF_PROVIDER_API_KEY = [System.Net.NetworkCredential]::new("", $secure).Password ahadiff provider test ` --name remote ` --provider-class openai_responses ` --base-url $env:AHADIFF_PROVIDER_BASE_URL ` --model "<model-id>" ` --api-key-env AHADIFF_PROVIDER_API_KEY ` --privacy-mode explicit_remote

官方 DeepSeek API 使用 openai_compat。该示例采用 JSON object 输出模式。

export DEEPSEEK_API_KEY="<your-deepseek-api-key>" ahadiff provider test \ --name deepseek \ --provider-class openai_compat \ --base-url https://api.deepseek.com \ --model deepseek-v4-flash \ --api-key-env DEEPSEEK_API_KEY \ --privacy-mode explicit_remote

先启动 LM Studio 本地服务并加载模型。替换下方模型 ID;若使用其他端口,请修改 URL。不要求认证的本地服务无需密钥。

ahadiff provider test \ --name local \ --provider-class lmstudio \ --base-url http://127.0.0.1:1234/v1 \ --model "<loaded-model-id>"

Ollama 使用 --provider-class ollama --base-url http://127.0.0.1:11434,并指定已经下载的模型。

模型限制与思考设置

  • 模型默认 由提供商决定思考行为。只有受支持的模型和接口才提供 关闭。其他模型可能提供思考等级、开关,或不提供思考控件。
  • 输出上限留空即为自动。超过已知上限时,知返会下调数值并提示。未知或部署专属的限制仍是估计;云端限制不能代表本地服务的容量。
  • 生成与评判的限制分别计算。只有与所用接口匹配时才选择对应限制配置。切换模型后,保存前请重新检查已指定的思考设置。
  • 多个工作目录可以共用全局提供商配置。同名时,工作目录提供商优先。模型列表只能确认名称,不能确认账号调用权限。

密钥保存在哪里

在设置页的 API Key 字段中填写密钥本身。知返将其写入所选范围的 .env,在 config.toml 中只保存引用。工作目录提供商使用 .ahadiff/.env;全局提供商使用下表目录。全局配置需要与学习记录分开备份。工作目录的忽略规则会让普通 git add 排除密钥文件;分享压缩包时也请排除它。同名系统环境变量优先。

平台全局密钥文件
macOS~/Library/Application Support/ahadiff/.env
Linux${XDG_CONFIG_HOME:-~/.config}/ahadiff/.env
Windows%APPDATA%/ahadiff/.env

编辑已有提供商时,密钥字段留空会保留原密钥。保存新密钥时可以测试连接,但测试失败不会撤销保存,请查看结果。移除提供商时,会清理使用保留前缀 AHADIFF_ 且不再被引用的密钥;不要在本地密钥文件中为无关变量使用该前缀。

macOS/Linux 上的密钥文件仅限所有者访问。Windows 上请用 NTFS 权限保护目录。需要由操作系统管理凭证时,可用 api_key_env 指定环境变量,无需粘贴密钥。

进阶:网关的 JSON 能力与默认设置不一致

确认接口实际接受的格式后,再设置布尔能力覆盖项。例如 NewAPI 默认使用 JSON object 模式;若你的网关支持原生 JSON schema,可在对应提供商别名下启用:

[providers.my_gateway.capability_overrides] supports_native_json_schema = true
工作流

3. 生成课程

选择学习来源

在 WebUI 选择五种共用来源之一。对比时把前后版本放在对应位置;单份 Markdown 直接选择文档。

先预览,再开始学习

预览安全处理后的真实 diff 或文档原文。修改来源后原预览会失效,需要重新预览。生成时使用已配置的 provider 和隐私模式,产出 claim、课程、测验和分数。

打开 WebUI 学习

读 Lesson 看解释,跳到 Diff 看证据,做 Quiz 检验理解,用 Review 做间隔重复。

习惯终端时,可使用以下已有 CLI 模式,它们共用同一条学习链路。文件和 patch 路径必须在工作区内,Git 模式需要仓库。想学习很小的练习改动时可加 --force-learn。

快速(工作树)
Last commit最近一次 commit。ahadiff learn --last
Staged已暂存、准备下次提交的内容。先用 git add 暂存。ahadiff learn --staged
Unstaged尚未暂存的改动;可加未跟踪文件。ahadiff learn --unstaged --include-untracked
Git 进阶
时间窗口某个时间点以来的 commit。ahadiff learn --since "2 hours ago"
修订范围明确的 commit 范围。ahadiff learn HEAD~1..HEAD
Patch
Patch 文件磁盘上的 unified diff。ahadiff learn --patch change.diff
Patch stdin从其他工具管道传入的 diff。ahadiff learn --patch -
Patch URL远程的 unified diff。ahadiff learn --patch-url URL
文件对比
对比文件两个文件版本,无需 Git 仓库。ahadiff learn --compare old.py new.py
对比目录两个目录树;仅 macOS/Linux。ahadiff learn --compare-dir old/ new/
10 种既有 diff 捕获模式 文件与粘贴 patch 可在无仓库目录开始 路径范围:仅工作树模式 · 仓库相对路径
给上面任意一种加 --against-spec SPEC.md 即可把 diff 与 spec 对照;加 --spec-semantic-review 走语义检查。

--since 单用 vs --since --author

--since

一个多 commit 的时间窗口。窗口内每个 commit 都会被捕获。
vs

--since --author

恰好一个匹配的 commit。它会跳过窗口内其他作者的 commit。

Patch 和 URL 捕获带有注意事项:

无符号索引 → claim 可能偏弱(课程仍会生成) 远程 URL:同样的安全检查 · 拒绝环回 / 内网 compare-dir:仅 POSIX · 其他平台 fail closed

文件输入、预览与证据边界

浏览器接受 UTF-8 文本文件,每份最多 256 KiB,两份合计最多 512 KiB。快照文件和单篇 Markdown 在 CLI 与 WebUI 中都保持 256 KiB 上限。点选文件时,草稿只留在页面内存中,不会改写原文件。两份 .ipynb 保留按单元格比较的来源信息,AhaDiff 不会执行单元格。Markdown 和结构化格式在成功解析时增加专用锚点,SQL 和不支持的结构保留明确的行级证据;支持不足时仍标为 weak 或未证明。

预览变化只把输入发给本机服务,不调用 LLM。预览最多显示 64 KiB,部分展示会明确标注;这与捕获限额提示不同,后者才代表输入本身未完整捕获。点击开始学习后,生成遵循你选定的本地或远端隐私模式,并把常规运行产物保存在 .ahadiff/。

粘贴的统一 diff 上限为 64 KiB。浏览器请求序列化后上限为 1 MiB,转义字符很多时可能先达到请求上限;较大的比较输入可用 CLI,快照和文档上限仍然固定。CLI 的 patch 和对比文件在工作区根目录内解析;外部生成的 patch 可传 --patch -。

文件、粘贴 patch、快照或文档的小练习默认勾选变化较小时仍生成课程,也可取消。它只跳过 learnability 筛选,证据校验、安全门禁和评分仍然生效。能够跳到来源行或课程分数很高,都不代表已证明运行正确或你已掌握这次改动。

保存并复用本地基准

  1. 打开本地快照,选择修改前文件,填写最多 80 字符的可移植名称。
  2. 点击保存本地基准。列表展示时间、大小与就绪状态;过滤可能改变保存内容。
  3. 下次打开时点击使用此基准,再选择修改后文件。预览比较结果,随后开始学习。
  4. 删除时点击删除快照并确认具体名称。已有课程和源文件会保留。
ahadiff snapshot save before.md --name before-edit --repo-root . ahadiff snapshot list --repo-root . ahadiff snapshot show SNAPSHOT_ID --expected-hash CONTENT_HASH --repo-root . ahadiff learn --snapshot SNAPSHOT_ID --snapshot-hash CONTENT_HASH --after after.md --force-learn

从列表复制 SNAPSHOT_ID 和 content_hash;learn 的可选 hash 绑定精确比较内容。删除使用另一字段 record_hash,并会交互确认:

ahadiff snapshot delete SNAPSHOT_ID --expected-hash RECORD_HASH --repo-root .

--yes 只跳过该具体 ID/hash 的交互提示。WebUI 始终确认具体一份再删除。损坏或不支持版本的记录不能用于比较;无法安全读取的记录没有可用删除哈希。

.ahadiff/snapshots/ 最多保存 100 份快照,记录总大小最多 16 MiB,单个输入文件最多 256 KiB。只保存过滤并经 UTF-8/NFC/LF 规范化的学习文本,不是原文件完整备份。不会自动监视、抓取聊天或覆盖源文件。

学习单份 Markdown 文档

选择单份 Markdown,点选一份最多 256 KiB 的 UTF-8 .md 或 .markdown 文件,预览过滤后的原文,然后开始学习。

ahadiff learn --document reading.md

独立 document 来源保存 document.md 及章节/段落锚点。证据页展示原文行,不添加增删标记;课程、测验、复习仍连接同一 run。该模式不支持 diff 的 spec alignment。Diff Coverage 与改动新颖度 Learnability 显示 N/A / 0/0,不计入总分;文档课程按正文中的证据检查覆盖;只有文档没有正文、全是标题时才使用标题。含正文的文档不能只靠引用标题通过检查。此模式接受单份本地 Markdown,不接受 PDF、URL 或多文档集合。

引文已验证,表示文档确实在此位置包含该文本。解释它的含义属于语义判断;有关外部事实或运行效果的断言,需要文档之外的证据。

补充人工 review 说明

选择改动来源后可填写人工 review 说明,CLI 用户可选择本地文本文件:

ahadiff learn --compare before.py after.py --review-context-file review-notes.md --force-learn

说明最多为 8 KiB UTF-8 文本,按不可信输入过滤,并独立标成辅助上下文。它不能产生证据位置或替代代码反证。运行记录是否使用与内容哈希;草稿不进入任务重试摘要,编辑说明会使旧预览失效。请勿包含凭证。

阅读格式专用证据

输入定位检查内容
Markdown章节路径与段落引文、行范围和内容哈希
Notebook单元源内容与单元标识仅源内容;输出不能替代执行证据
JSON / TOML / YAML键路径源值及修改前后侧,预期效果仍属语义判断
不支持或有歧义的结构明确行级回退较弱证据,不伪造结构层面的确定性

格式专用索引上限为 4,096 个锚点。较大 diff 可能显示部分索引提示,但既有 hunk 证据仍可使用;超过此结构限额的单份文档会被拒绝,不会把部分文档冒充完整证据分母。

展开 claim 的源锚点,可查看前后侧、位置、引文和哈希。不同内容在移动或重命名后不会获得相同的证据身份。只有 hunk 证据的旧运行继续可读;声明了新来源产物却缺失、损坏或不一致时,会拒绝读取,不冒充已验证文本。

长时间运行的 CLI 命令会在运行中显示 Rich 状态。把它当作终端反馈,而不是机器可读的输出契约。

界面

4. 使用 WebUI

运行下面任意一条打开本地 React SPA。serve 默认会打开浏览器;加 --no-browser 保持无头,或加 --watch 在 Git 工作区文件改动时自动 learn。

ahadiff serve ahadiff serve --port 8765 --no-browser ahadiff serve --watch

工作流一览

Diff捕获修改前后的变化
Claims绑定 file:line 证据
Lesson生成解释
Quiz/Review用 SRS 检验记忆
Ratchet分数历史、improve 预览与导出

页面地图

页面用途
/welcome选择 Git 改动、两份文件、粘贴改动、本地快照或单份 Markdown,打开最新课程。
/onboarding打开工作目录、配置 provider、检查诊断并开始第一次学习。Agent 配置是可选项。
/仪表盘:最新运行、KPI、棘轮趋势和复习活动。
/run/:runId运行详情:Overview、Score、Judge、Artifacts。可选的 LLM judge 失败时,Judge 标签显示脱敏的失败面板,而非原始 provider 输出。
/run/:runId/lesson课程正文、claim 摘要、证据和知识笔记。
/run/:runId/diffUnified/Split diff、claim 圆点和 ClaimInspector。
/run/:runId/quizGuided / Recall / Transfer 题目。模式徽章标明当前题目是一次性的苏格拉底测验还是 SRS 复习卡。
/reviewFSRS 复习队列,含 Again / Hard / Good / Easy 评分。
/concepts概念账本、概念图谱和 Graphify 源。
/ratchet结果历史、benchmark 摘要、improve 预览和导出入口。
/settingsprovider、capture、隐私、审计、偏好和项目级 AI 工具指引。AI Tool Guidance 把目标分为 CLI / IDE / CI,显示使用提示,并内置一个无需 provider 的演示。
/guide共用的五个学习来源、日常命令,以及 16 个当前 AI 工具目标的共享目录。工具指引是可选项,写入、更新与移除仍在设置 → AI 工具指引中完成。
可选的 AI 工具集成会写入工具原生文件。Guide 与 Settings 共用当前目录及生命周期说明;已退休的 Roo 和被替代的 Windsurf 条目仅用于清理。Settings → AI Tool Guidance 列出全部目标并在写入前预览每个文件;除非你提交,否则它们都留在本地。例如:
  • .claude/skills/ahadiff/SKILL.md
  • .agents/skills/ahadiff/SKILL.md
  • .gemini/skills/ahadiff/SKILL.md
  • .agents/skills/ahadiff-antigravity/SKILL.md
  • .agents/skills/ahadiff-antigravity-cli/SKILL.md
  • .agents/rules/ahadiff.md
  • .github/instructions/ahadiff.instructions.md
  • .opencode/agents/ahadiff.md
  • .clinerules/ahadiff.md
  • .continue/rules/ahadiff.md
  • .cursor/rules/ahadiff.mdc
仓库级指引段落仍写在用户自管的文件里,例如 CLAUDE.md、AGENTS.md、GEMINI.md 和 .github/copilot-instructions.md。hooks 目标与 MCP 注册见常用命令一节。
仪表盘:最近运行、分数、通过率、棘轮趋势和复习活动。
仪表盘:一览运行、棘轮与学习信号。
  1. 顶部统计卡:总运行数、平均分、通过率、概念数、LLM 调用。
  2. Spec alignment 区块含分数、趋势、评估次数。
  3. 棘轮轨迹折线图,区分 kept 与 discarded 分数。
  4. 右侧复习活动热力日历。

Claim 与 diff

打开声明可查看来源位置和证据状态。下面五种状态说明知返从已捕获材料中确认了什么。

✓ verified verified file:line 处有证据支撑该 claim
◆ weak weak 部分或间接证据
○ not_proven not_proven 两边都没找到证据
✕ contradicted contradicted 证据与 claim 冲突
⊘ rejected rejected claim 被丢弃
课程:claim 状态、claim 摘要、知识笔记和证据侧栏。
课程:由 diff 生成的带证据学习笔记。
  1. 顶栏含 PASS 分数、查看评分详情、标记为已学习。
  2. 右上 Compact / Hint / Full 详细程度切换。
  3. 左侧大纲栏:TL;DR、改了什么、Claims、概念。
  4. 右侧 Claims 摘要:verified / weak / not proven 计数。
Diff:diff 内容、ClaimInspector 和对应的证据行。
Diff:代码改动与行内 claim 证据联动。
  1. 中部代码 diff,红/绿标记新增与删除行。
  2. diff 上方文件标签与 Unified / Split 视图切换。
  3. 右侧 Claim Inspector 面板逐条列出 claim 卡片。
  4. claim 状态徽章把解释链回到代码行。

先尝试主动迁移练习

在新建学习对话框中,明确勾选此来源的更多选项 → 主动迁移练习。默认关闭,普通运行仍按 guided/recall/transfer 混合分配。开启后只生成开放式 transfer 题,题数至少为 3 时覆盖全部三种形式。修改开关会使预览失效;切换来源或关闭对话框会重置开关。

ahadiff learn --document reading.md --active-practice ahadiff learn --compare before.py after.py --active-practice --force-learn ahadiff regenerate RUN_ID --only quiz --active-practice

regenerate 会替换本次运行的测验和卡片,重新评分,并清除旧的评判结果,不会重新调用评判模型。不传练习开关时沿用原模式;--mixed-practice 可生成混合测验。请选择打算修改的运行。生成过程使用已配置的提供商和隐私模式。

Transfer 复用现有 Quiz 与 SRS:预测下一步、补全相似例子、解释错误原因。先写尝试,再揭示参考答案;作答前不下发参考答案、解释和证据,也不会执行代码。

对照参考含义后选择独立完成、需要帮助或尚未完成。必要时标明困难属于概念回忆、应用、推理还是证据边界。等价表述也可能正确。选择题核对是机械判断,开放练习反馈是语义自评。

WebUI 作答正文保留在页面内存,仅保存受限自评、错误类别和时间信息。复习会带回同一卡片;距上次记录尝试至少 24 小时才计入延迟回忆,只有明确标记新场景的首次尝试才计为未见变式。

Dashboard 分别展示首次练习、延迟回忆、未见变式的自报完成情况、样本数与错误类别。分母为空时显示未测量,不当成零成功率。既有 SRS 评分改善占比与这些练习指标分开呈现。

Challenge 先展示原解,再让你复现。补丁文本匹配与证据覆盖,不能证明未见变式的独立完成或运行正确。Score/Judge 衡量学习产物质量;缺少真实参与者样本与分母时,请通过自己的作答和后续回忆评估学习情况。

测验与复习

复习给每张卡片评分;评分驱动下一次到期日。

Again忘了;很快再见
Hard费力才想起
Good顺利想起
Easy很简单;往后推
测验:回忆与迁移题、证据揭示和常见误区。
测验:基于 claim 状态的主动回忆题。
  1. 单道选择题,含 A/B/C/D 选项。
  2. Guided / Recall / Transfer 模式标签与进度计数。
  3. 右侧证据面板,答题后才解锁。
  4. 右侧 Progress 列出每题状态(pending)。
复习:FSRS 队列,含 Again / Hard / Good / Easy 评分。
复习:按遗忘曲线排序的间隔重复队列。
  1. 顶部计数:到期卡片、FSRS、高风险概念。
  2. 复习概览活动热力图与概念掌握度列表。
  3. Needs Practice 列表含各概念 stability 值。
  4. 右侧 New Concepts 列表标记为 New。

概念

概念账本:可排序表格中的全部已学概念。
概念账本:可排序表格中的全部已学概念。
  1. Ledger / Graph 标签与健康状态过滤计数。
  2. 表格列:概念、运行、文件、claims。
  3. 每行健康标签,如 Orphan 与 Contradicted。
  4. 每个概念行的运行与文件链接。
概念图谱:Graphify 源、概念节点和图控件。
概念图谱:导入的知识图谱视图。
  1. Ledger / Graph 标签与 Refresh Graph 按钮。
  2. Graphify 源卡:节点/边数、FRESH 徽章、sha256。
  3. 社区过滤 chip 与 All / code / rationale 过滤器。
  4. 下方图节点画布,含 Export JSON、Fit to view。
参考

5. 常用命令

日常工作走 learn、quiz、review。下面的分组覆盖其余一切:启动 UI、管理本地数据。

日常循环

学习与验证

生成一次运行,然后检查、评分、改进。

ahadiff learn --last ahadiff quiz RUN_ID ahadiff review ahadiff claims RUN_ID ahadiff verify RUN_ID ahadiff score RUN_ID ahadiff improve-run RUN_ID

Serve

打开本地 WebUI。--watch 会附带工作区改动自动 learn。

ahadiff serve ahadiff serve --port 8765 --no-browser ahadiff serve --watch

Watch

工作区变更自动 learn。ahadiff serve --watch 用的是同一个监听,只是多带一个 WebUI。

ahadiff watch ahadiff watch --debounce 2.0 --cooldown 30.0 ahadiff watch --dry-run

improve-run RUN_ID 会重新生成一篇课程,只有确定性评分确实更高时才保留新副本,并作为独立的运行写入、原来那次保持不变。用 --candidates N(默认 3,范围 1-10)控制尝试多少个重生候选;值越大越可能拿到更高分,但更费 token 和时间。任何安装方式都能用,包括 pip。另一个 improve 命令调整的是 AhaDiff 自身的生成 prompt,只能在 AhaDiff 源码 checkout 里运行。

维护分组

Database

对 review.sqlite 跑 SQLite 完整性门禁。

ahadiff db check

Graph

查看并重新导入 Graphify 产物。

ahadiff graph status ahadiff graph import ahadiff graph refresh

Concepts

列出、验证并 lint 概念账本。

ahadiff concepts list ahadiff concepts verify ahadiff concepts lint

Export

把结果写到磁盘以便分享(见导出和分享)。

ahadiff export-results ahadiff export preview RUN_ID --out ./preview

Challenge

需要 opt-in。从一次运行构建 challenge,再查看状态。

ahadiff challenge build RUN_ID ahadiff challenge status

MCP

AhaDiff 自带只读 MCP server,提供 7 个工具:runs、run 摘要、到期卡片、搜索、概念、统计、lesson 问答。每个仓库注册一次:

# Claude Code claude mcp add ahadiff -- ahadiff mcp-server --repo-root <path> # Codex CLI codex mcp add ahadiff -- ahadiff mcp-server --repo-root <path>

Git hooks

ahadiff install hooks 会在提交后和推送前提醒。加上 --auto-learn 后,每次提交会在后台运行 ahadiff learn --last。若运行被跳过或失败,请查看 .ahadiff/hooks.log。Hooks 不阻塞提交;自动运行仍执行正常的隐私、预算和可学习性检查。重新安装时添加或去掉该开关即可切换模式。Git hooks 需要 macOS/Linux。

ahadiff install hooks ahadiff install hooks --auto-learn

Refresh vs learn:谁会动 Graphify

graph refresh / WebUI refresh

只导入已有产物。它不运行 graphify update。
vs

learn run

存在 Graphify CLI 时先运行 graphify update,再导入。
Refresh 超时 600s
输出

6. 导出和分享

WebUI 提供静态预览、TSV/JSON 结果和 Anki 卡片。CLI 可用 export-results 导出 TSV,用 export preview 导出本地预览:

ahadiff export-results ahadiff export preview RUN_ID --out .ahadiff/export-preview

静态预览

本地 HTML 预览与 ZIP 文件,由你决定是否分享。

TSV

结果以制表符分隔,供表格软件使用。

JSON

结果以 JSON 输出,供脚本和工具使用。

Anki .apkg

把活跃复习卡导出为 Anki 牌组。

默认

无需额外安装。

静态预览保留 document/diff 来源、结构锚点与单独标识的 review 说明;只读 MCP 暴露来源/锚点 provenance 与受限辅助摘录。分享或处理这些输出时应保留相应区分。扁平化引文或 review 评论不能变成运行证明。静态预览与 APKG 含答案,分享前应先检查内容。

APKG 导出在标准安装下默认即可用,因为已内置 genanki。
可选设置

7. 可选功能与评分

选择每次运行的内容

题量与练习模式

默认测验有 3 题。可在设置中固定为 1–30 题,或使用自适应模式(默认范围 3–12)。主动迁移练习会生成开放题;题量至少为 3 时,包含预测、补全和解释错误三种形式。

捕获限制

自动模式会结合提供商信息、模型限制和输出预留空间计算大小;手动模式使用你设定的限制。生成课程前,请检查捕获不完整的提示。预览显示上限与捕获上限是两回事。

规范对齐

对 diff 运行添加 --against-spec SPEC.md,可把改动与本地规范比较。加上 --spec-semantic-review 可获取可选的模型反馈。单文档学习不使用 diff 规范对齐。

挑战练习

挑战练习默认关闭。在配置的 [challenge] 下设置 enabled = true 后,可用 ahadiff challenge build RUN_ID 创建练习,再到 WebUI 继续。你可以先学习原解,因此这属于对已知示例的复现练习。

可选工具与自动化

  • 标准安装包含 Anki 导出与文件监听。自动学习可能反复调用提供商;在 Git 工作目录启用 ahadiff watch 或 ahadiff serve --watch 前,请检查隐私和预算设置。
  • FSRS 参数优化需要可选的 optimizer 扩展,并会安装 torch。基础卡片复习和排程无需此扩展。
  • 仓库图谱叠加需要 Graphify 图文件。ahadiff graph refresh 导入已有图谱,不运行 Graphify。
  • AI 工具指引是可选项。设置页在写入、更新或移除前预览具体项目文件;使用指南展示相同工具并说明用法。

理解一次运行的评分

确定性评分检查课程和证据。排除不适用的维度前,各维度满分如下:

维度满分查看什么
准确性20得到支持与被反驳的声明
证据18与已捕获来源的引用对应
Diff 覆盖度14可见改动中有证据声明覆盖的部分
可学习性14改动中的学习内容
测验迁移10应用课程内容的问题
规范对齐10提供的规范
简洁性8课程长度与信息密度
安全与隐私6未解决的安全问题

未提供规范时,规范对齐显示 N/A。文档运行的 Diff 覆盖度和变更新颖度可学习性也显示 N/A。这些维度不会拉低总分;文档证据使用独立的覆盖检查。

80 分起为 PASS,60 分至不足 80 分为 CAUTION,低于 60 分为 FAIL。即使分数高,必需检查失败仍会让运行判为 FAIL。打开 运行详情 → 评分 可查看失败项和原因。

可选的 LLM 评判补充反馈,不覆盖该结论。评判失败时,运行详情会显示失败信息,并保留确定性分数。两种分数都不衡量你能否独立完成类似修改;请通过自己的作答和后续回忆来评估。

帮助

8. 常见问题

为什么没有 Lesson / Diff / Quiz?

这些页面需要一个具体的 run_id。先至少运行一次 ahadiff learn,再从仪表盘或命令输出里打开对应的运行。

provider 失败了怎么办?

到快速上手查看诊断,再在设置中重测 provider。下方 CLI 诊断命令要求 Git 仓库。在 Windows PowerShell 上,用 $env: 形式设置变量并传 --base-url $env:AHADIFF_PROVIDER_BASE_URL,如配置模型提供商所示。

ahadiff doctor ahadiff config show --resolved

然后重新运行配置模型提供商里的对应 provider 命令。

课程被跳过了怎么办?

文件或 patch 小练习可以勾选变化较小时仍生成课程,或在 CLI 加 --force-learn。它只跳过 learnability 筛选。空变化、不可用的证据和安全失败仍需处理,不会因为勾选而变为通过。

怎么改测验题量?

用 Settings → Preferences。固定模式总是问配置好的题数,从 1 到 30。自适应模式用捕获到的 diff 统计;它的默认范围是 3-12,没有这些统计的旧运行会回退到固定题数。

捕获限额是怎么选的?

新仓库走 Auto 捕获,按一条优先级阶梯确定限额:

实时 provider 探测数据。
内置的 model registry。
保守默认值。
生成与评判限额分别解析。输出预留只从输入预算里扣减一次。只有像 Gemini 这样显式 split-envelope 的行,才会把输入加输出当成总上下文。

Manual 模式保留你在 config 或 Settings 里设的数值。Settings 的 provider 表单按未保存的草稿预览这些限额,不做远程探测。

LLM judge 决定最终判定吗?

不。最终判定来自确定性的 score.json 和硬门禁。judge.json 仅供参考;它帮助解释模型反馈,但不会覆盖确定性判定。当某个维度不适用,例如无 spec 运行上的 spec_alignment,Score 和 Judge 会把它渲染为 N/A / 0/0。

Accuracy / Evidence 门禁为什么会变?

基线阈值不变:

Accuracy 14/20 Evidence 12/18

大 diff 可以用一个由可见文件、hunk 和改动行得出的自适应阈值,ratio、regime 和 basis 会写入 hard_gates.*.policy。这绝不会放过坏证据。出现以下情况时运行仍会失败:

rejected claim 占比过高 存在 contradicted claim 安全问题 证据确实缺失
Diff Coverage 怎么判定?

对于 diff 运行,Diff Coverage 只用持久化的 line_map.json 里可见的文件和 hunk:

仅可见文件作分母 按改动行加权 hunk 数下限 自适应锚定阈值

被省略的文件不进入分母。hunk 数下限让微小 hunk 仍被计入。硬门禁把它的 ratio、regime 和可见 basis 写进门禁详情。

哪些安全发现会让运行失败?

一个未缓解的 Critical 安全发现会让运行失败。只有当本地捕获记录显示完整的脱敏形态(含 rule、hash、source、line 和 column),一个 Critical 密钥发现才会被视为已缓解。

能保证没有 bug 吗?

不能。AhaDiff 通过保持数据本地、把课程 claim 链到 diff 证据、暴露确定性分数和硬门禁详情来降低风险。你仍应在依赖某个改动前审阅生成的课程并跑你常规的测试套件。发布状态请看当前的 GitHub Actions 和 release notes,而非这份静态指南。

补充说明

9. 平台与发布信息

核心 CLI 与 WebUI 面向 macOS、Linux 和 Windows。Python 的 SQLite 运行时需满足“快速开始”中的要求。以下功能有明确的平台限制。

功能macOS / LinuxWindows
--compare-dir可用不可用;请改用文件对比
hooksPOSIX shell hooks不可用;请手动运行 learn
本地密钥文件保护仅限所有者的文件权限NTFS 目录权限

已测试平台、已知问题和下载见 v1.4.0 发布说明。PyPI 安装包包含 WebUI。

从源码安装

源码安装还需要 uv 和 pnpm。在终端运行:

git clone https://github.com/AGI-is-going-to-arrive/ahadiff.git cd ahadiff uv sync --locked --dev pnpm --dir viewer install --frozen-lockfile pnpm --dir viewer build uv tool install --editable .

截图和视频用于展示流程,部分细节来自早期界面。1.4.0 的操作与标签请以本指南正文为准。