AI 协作
这里是“李寒的小窝”里给 AI 用的那一层。
整个站点只分两层:
- 生活档案层:随想、旅行、生活、阶段总结,按原来的节奏写,AI 不去动。
- AI 知识层:把可复用的经验做成 卡片(card),让任何项目里的 AI 都能拿来用。
下面只讲第二层。它现在以一个跨工具的 lihan-cards 入口 skill 为核心,对齐社区 Agent Skills(SKILL.md)+ AGENTS.md 开放标准。日常执行是 local-skill-first:本地 skills/lihan-cards/ 负责 consult / capture / classify 和模式路由;博客卡片主要是 display/sync/bootstrap 表面。这里讲清五件事:系统结构、有哪些卡片、怎么用、卡片长什么样、调用信号。
系统结构
| |
- 核心是那个入口 skill,不是某一张卡:它教 AI 怎么查 / 写 / 分类和选择工程/科研/通用模式,只在用到时才加载重内容(这就是消除"协议税"的渐进披露)。
- 模式是按仓库粘住的(sticky mode lock):每个仓库的工程 / 科研 / 通用模式记在
agents/user-repo-modes.yaml,AI 不在每次会话重新猜;只有我明确说"切模式"才改。科研模式折叠了原先的五个 science skill,按任务只加载science-notes/science-compute/science-claims之一;固定但会变的私有事实(工作区路径、GPU 主机、下载策略、judge API)放进非密 research profile,密钥只留在本地 env 文件。 - 卡片是被 registry 索引的数据,不逐张安装成 skill,所以发现层不会随卡数膨胀。
- 两个自研差异化(社区标准没有、我们刻意保留):每张卡的
verify(可机器复验,对抗记忆过期)+ 公网registry.json(任意机器免安装 bootstrap)。 - public registry is a bootstrap fallback:没装本地 skill、换新机器、跨设备同步或人工浏览时用;日常 consult 不把公网正文当 routine runtime。
- 格式骑社区标准,CI 接入
skills-ref+skill-validator校验,跟随上游演进而非自研维护。
卡片清单
按四类(principle 哲学·原则 / engineering 工程 / research 科研 / environment 环境事实)分组。每行点标题里的 id 就能打开那张卡片的机器友好原文(/ai/cards/<id>.md,与 registry 的 public_url 同一个地址)。这张清单直接读卡片源文件生成,不会和正文漂移。
哲学 · principle(5)
做事的标准与价值取向,精要并入用户级 AGENTS.md,近乎常驻加载。
Author cards/skills for low token cost and high trigger accuracy
写卡/skill:summary 既是触发面也是常驻成本,写清'做什么+何时用',fix 留正文,要点放首尾
low-token-high-trigger-card-authoring
Build model-decoupled projects
做项目/战略决策时:把前沿模型当会涨的外部能力,价值押在数据、流程、评测、接口上
model-decoupled-project-philosophy
Gate any candidate code change before writing code
动代码前先过五道闸:资格、冲突、现实、清晰、范围;没有新证据不重试,保守程度看影响面
change-scoping-gates
Prefer mature upstream tools over bespoke plumbing
要不要自己造工具时:优先复用成熟上游+薄适配,除非没得选且一天能出 MVP
prefer-upstream-tools-over-bespoke-plumbing
Use AGENTS.md + one-line CLAUDE.md @-import as cross-tool project memory
多个 AI 工具要共用项目规则时:AGENTS.md 作唯一真相,CLAUDE.md 只留一行 @import,不漂移
agents-md-as-cross-tool-project-memory工程 · engineering(8)
工程域可执行经验:代码 / CI / git / WSL·Docker / 工具链 / 网络调试,按任务关键词按需加载。
Agent Skills validators (skills-ref / skill-validator) fail CI on subtle SKILL.md format issues
校验 SKILL.md 时:allowed-tools 用空格串(别用 [a,b])、bundled 目录叫 references/、warning 也算失败(exit 2)
agent-skills-validator-gotchas
Docker Desktop port bind blocked by Windows excluded range
Docker Desktop 报端口禁用,先查 Windows 排除端口段,别先翻容器日志
docker-desktop-excluded-port-range
GitHub required checks for card PR auto-merge
required check 别用 paths,放 job 内 guard
github-required-check-card-automerge
Local Ollama calls hijacked by proxy env
有代理时本地 Ollama 请求要代码级绕过代理
ollama-localhost-proxy-bypass
Pre-push verification gates
push/PR 前先本地跑格式、lint、类型、测试、覆盖率、改动卫生,比等 CI 快 3 倍
pre-push-quality-gate
Refresh local source before consulting cards (this WSL host)
本机 consult 前先 git pull 刷新本地卡库(本地读会滞后),并确认 cc-switch 没把 CLAUDE.md/AGENTS.md 软链打回空文件
align-with-remote-before-consult
Sync origin/main before card work; regenerate registry on conflict
动卡片/registry/spec 前先 fetch 最新 origin/main 再开分支(card lane 常自动合并);registry.json 冲突用 build_registry.py 重生成解决,别手动 merge
sync-main-before-card-branch
Use UTC-safe dates in AI cards
写卡片日期时用 date -u +%F;本地次日日期会被 GitHub Actions 当未来日期判错
utc-safe-ai-card-dates科研 · research(4)
科研域可执行经验:论文 / 实验 / benchmark / 模型下载 / GPU / judge,按任务关键词按需加载。
hf download --local-dir + from_pretrained(hub_id) silently re-downloads the whole model
HF --local-dir 下载后 from_pretrained 看不到会整模型重下,一个项目只选一种布局
hf-download-local-dir-double-download-trap
Read papers in three passes
读论文时用 Keshav 三遍法+主动笔记+引用筛选+可复现核查,把读变成做决策
paper-reading-three-pass
Reference SafeAct-Steer before writing GPU experiment runners
科研GPU批跑先参考SafeAct-Steer
safeact-steer-gpu-runner-reference
Research metrics come from current SOTA, never self-invented
科研评测用当下SOTA论文的通用指标,别自造(指标会演进,每次重查)
research-metrics-from-current-sota环境事实 · environment(1)
跨模式的环境 / 基础设施速查事实,按领域关键词按需加载。
两个入口
- 本地 skill(首选):装过
lihan-cards的工具(Claude Code / Codex / Cursor)直接触发它,按skills/lihan-cards/的 consult / capture / classify 协议和 mode routing 走。装一次:bash scripts/install.sh。 - 公网 registry(展示/同步/兜底):任何项目、任何机器、没装 skill 也能直接看这个 URL——
| |
日常 consult 不再把公网 registry 当主运行时。正常路径是:本地入口 skill 先按仓库的粘性 mode lock 路由工程 / 科研 / 通用模式(没有 lock 才推断一次,并直接以 inferred: true 写入 lock 文件,改一行即可纠正),再按 modes.md 的 context budget(原则 essence、环境 preflight、任务最小 bundle、调试窄诊断、治理 gate 全查)选择要加载的本地 reference 或少量已验证卡片。公网 registry 和卡片正文仍是静态文件,没有数据库、没有 API、没有鉴权;它们负责展示、同步、跨设备存储和新机器 bootstrap。
三种使用模式
一、主动查经验
让 AI 在做任务前先加载本地 lihan-cards,选择模式,再按 context budget 查有没有相关经验。原则 / 环境 preflight 可以加载多个精简资产;调试保持窄加载和 verify。没命中就照常,不能脑补。
二、主动写卡片
做完一件事,觉得这个经验下次还能用,就让 AI 起草一张卡片。capture 现在分两段:草稿段免确认——过了 recurring trigger + meaningful verify 边界测试后,AI 直接把 v3 格式的草稿卡写进本地待审队列 ~/.config/lihan-cards/drafts/(平凡可逆,删文件即撤销,永不入库),consult 时顺带检索,未发布的经验立即可复用;发布段保留全部质量门——go 的语义是"允许发布"而不是"允许开始",一次 go 之后 card-only PR 在绿色 CI 后自动合并,非卡片变更仍然由你手动合并。
三、AI 自己写草稿
任务完成的瞬间,如果同时满足四件事——已验证完成、经验本身不平凡、可以推广、这个会话还没写过——AI 不再询问,直接把草稿写进本地队列并报告一行(草稿本来就平凡可逆,问一句反而比写一张草稿更贵;不会因此发 PR,发布永远要等我的 go)。想丢弃就说一声,删掉草稿文件即撤销,同一条经验该会话内不会重写。
这三种模式都由那个跨工具的 lihan-cards 入口 skill 承载,暴露给本机的 AI 工具(Claude Code、Codex、Cursor 等)。bash scripts/install.sh 装一次即可。它不只是个指针——skill 正文就是 consult / capture / classify 协议本身,重内容按需加载(渐进披露);registry URL 是没装 skill 时的免安装兜底。
卡片格式
一张卡片就是一个 markdown 文件,YAML frontmatter + 紧凑正文。frontmatter 采用社区 Agent Skills(SKILL.md)的形状:顶层只放 name 和 description,其余字段塞进字符串值的 metadata: map,这样卡片对上游工具 100% 合规。
Frontmatter(必填)
| 字段 | 说明 |
|---|---|
name | 顶层;kebab-case,等于 metadata.id,等于文件名 |
description | 顶层;一句话摘要,registry 直接复制,手写无 fallback |
metadata.id | kebab-case,等于文件名 |
metadata.type | 闭集四选一:research 科研 / engineering 工程 / environment 环境事实 / principle 哲学·原则 |
metadata.title | 人类可读的标题 |
metadata.summary_zh | 给人看的中文一句话(≤ ~40 字,不是 description 的直译),驱动上面那张卡片网格 |
metadata.tags | 逗号分隔的 kebab-case 串(registry 里拆成列表) |
metadata.created / metadata.last_verified | YYYY-MM-DD(UTC、不未来) |
metadata.status | valid / stale / retired |
metadata.context_cost | low / medium / high,告诉加载方代价 |
metadata.produces | 短标识,例如 diagnosis_and_fix、decision_rule |
metadata.verify_command / verify_expected / verify_failure_next | 三段非空字符串,扁平进 metadata.* |
verify_command 可以是 shell 命令、“按这步骤目测一下"的描述句,或一次状态烟测——三种都算,principle / environment 卡常用后两种,不强求自动可执行。
正文必填段
| |
可选段(按需):## Symptoms、## Diagnosis、## Pre-requisites、## Related 等等。
正文是写给机器看的:bullet、表格、key-value,不写多段人类散文。
完整契约:specs/006-card-type-taxonomy/contracts/card-schema.md。
卡片的状态流转
valid → stale → retired。
不按时间表去扫——只在我真的发现某张卡片对不上现实时,编辑它的 status 并 bump last_verified。被 retired 的卡片仍然留在 registry,agent 读到 retired 就跳过;历史保留,不删除。
调用信号(闭环)
每张卡在 static/ai/stats.json 里记三个数:consulted(被查过几次)、helped(确实帮上)、no_effect(没起作用)。
consulted由scripts/ai/stats_miner.py按需扫本机已存在的 Claude / Codex 会话日志、按 session 去重得到——只读、只数、不落地任何 transcript 内容,无常驻服务。helped/no_effect由 AI 只在高把握时写(客观锚点:卡的 verify 通过 / 任务确实成了),拿不准就弃权;人审 PR 时一并确认。- 用
helped − no_effect给卡排序、据证据退役低价值卡。这是 ACE「会进化的 playbook」的轻量版,但守住"无常驻基础设施"的底线。
这里没有的东西
| 不做的 | 为什么 |
|---|---|
| 常驻转录服务 / 自动 ingest | 隐私默认 = 脱敏。原始 transcript 不落地;stats 只按需读已存在日志、只数不存 |
| 多资产格式(tip / playbook / session 各一种文件) | 之前试过,最后归并成"卡片"一种 |
| MCP server | 暂缓。curl + jq 还够用 |
| 向量检索 / 语义搜索 | 同上 |
| 自动 PR、自动合并(卡片以外) | PR-only publication 是宪法硬底线;唯一例外是 card-only PR——我一次 upfront go 预授权,CI 全绿 + 卡片 allowlist 守卫通过才自动合并 |
| 后台 watcher / 守护进程 | 没有 always-on infrastructure |
这些不是"还没做”,是"故意没做"。如果未来真的需要其中一项,会先经过宪法(.specify/memory/constitution.md)的"1-day MVP"和"no-agent-sprawl"两道闸口。
给 agent 的一句话总结
想找经验:先加载本地
skills/lihan-cards/,选 mode 和 context budget;公网 registry 只做 display/sync/bootstrap fallback。 想写经验:先过 recurring trigger + meaningful verify;card-only PR 按既有校验和发布 lane 走。 自觉想提示捕获:任务收尾时 AND-of-four 全过才说话,被拒了就闭嘴。
剩下的细节都在那个跨工具的 lihan-cards skill 里——它折叠了原先的 agent-card-protocol,是这条 consult / capture / classify 协议的源代码。