写入记忆的唯一一扇门
你的记忆是整个系统里最需要保护的东西。如果任何外部工具都能直接往 ~/Documents/Previously 里写文件,那个文件夹迟早会变成一堆谁也不敢信的草稿。所以 Previously 只开了一扇写门:外部 agent 和工具想往记忆里放东西,只能走 previously ingest——这是一道边防检查站,不是一扇敞开的门。
ingest 是本机(npm)形态的命令——它是本机其他 agent 写入本地记忆仓库的通道。
门的另一侧是只读的
先把边界说清楚。对被桥接的 agent,记忆的绝大部分接口是只读的:readslice、timeline、strands、card、slicesummary、agentlog 这组命令是它们的"看"——行范围截取、--search、输出上限、slice id 校验、路径穿越防御,一样不少。而"写"只有 ingest 这一条路:调用方从不直接碰 memory 目录,校验全部通过之后,由 client 自己落盘。
三种过门方式
--source <claude-code|codex|kimi-code|gemini>—— 原始日志模式。把会话日志(整目录或单个导出文件)交给 scribe 的同一条转录管线解析、切片、落盘。纯本地,零 token;--root/--path可以指向默认位置之外的地方。--submit <file|->—— 成稿模式。调用方(通常是已经自己处理完对话的 agent)提交一份完整渲染好的 slice 文档,接受严格验收。--mark—— 给"干"切片补线索。对每个缺 focus/summary/tags 的切片花一次桥接大脑调用把它们填上——永远先报账,没有--yes一分钱不花。
验收,不是信任
--submit 的哲学是边境检查:材料不全、规矩不合,整单拒绝。验收清单包括必填的 frontmatter(slice_id、status: closed、ISO 格式的 start 与 end、source、session_id)、## Turn 正文、单调不减的时间戳。任何一项违反,ingest 打印完整的 issue 清单,然后什么都不写;全部通过,则由 client 按内核的标准字节形状重新渲染再落盘——不管文档是谁起草的,memory 目录里永远是我们的形状。
两条保护让重复提交变得安全:按 (source, session_id) 去重——同样的字节重交是幂等跳过,同一会话交出不同内容是硬冲突,绝不覆盖;同一分钟已被别的会话占用时,slice id 自动逐分钟向后步进,并如实告知这次 remap。
历史不改写现在
通过 ingest 进来的切片是历史记录:它们不触发用户卡片演化,也不携带 per-slice 的卡片快照。这是刻意的——历史的作用是告诉你过去发生了什么,而不是回头改写卡片认为的"你是谁"。两年前的你,没有权力重塑今天的你。
先报价,再花钱
--mark 是这扇门里唯一要花 token 的步骤,它的规矩和边防一样硬:先打印"N 片 → N 次调用"的估算,你确认(--yes)之后才真的调用桥接大脑。估账永远发生在花钱之前——在这条门里,不存在"先斩后奏"。
一句话:写入记忆要过验收,花 token 要先报价——ingest 把这两条规矩做成了命令的形状。