Previously 文档
用户卡片
Slice 记录发生了什么,用户卡片记录你是谁。它是一个单独的 Markdown 文件——memory/episodic/current-previously.md——把整条时间线蒸馏成一份紧凑的简报:你的身份、一段滚动更新的画像、此刻正在发生的事,以及你承诺过的事。
但卡片只是产物。真正在学习的是围绕它的进化回路——卡片是回路输出变得可见的地方,memory/evolution/ 才是回路本身所在的地方。回路的机制单独成篇,见进化回路。
卡片会被注入每一轮对话的系统提示词,紧随身份宪法之后。由于它只在演化时改变——在 slice 存续期间绝不变化——提示词前缀保持字节级稳定,供应商的 prompt cache 得以持续命中。存储的卡片保留原始 ISO 日期;注入的副本会按你的本地时钟标注相对时间(「3 天前」),模型无需自己做日期换算。
卡片格式
卡片由四个部分组成,把你的时间轴显式化——Past、Now 与 Horizon:
# Previously On
_Active slice: 2026-08-10-2130 | Format: user card v2 | Updated: 2026-08-10T21:47:12Z_
## Identity
- Address them as: you
## Past
You are a knowledge worker in your late twenties who spent early 2024
coasting, then started building: a CSV-merge side tool that grew into a
weekly-review product, and a running habit that went from winded on the
stairs to a finished half-marathon in July 2026. Alex — met at Priya's
dinner back in October 2024 — is your partner and the closest
relationship in your life.
- Finished a first half-marathon 2026-07-16; Alex was at the finish line — refs: [2026/07/16/0915]
- Since Mom's health scare (2025-07), weekly calls are non-negotiable — refs: [2025/07/30/2040]
## Now
- Final pass on the best-man speech for Marcus — reading it aloud to Alex tonight — refs: [2026/08/10/2110] | since: 2026-08-09
## Horizon
- Deliver the speech at Marcus's wedding — by: 2026-08-12 — refs: [2026/08/09/2000]
Identity —— 结构化的、可被机器解析的头部:Name、Address them as、Pronouns、Alias(最多 8 行)。这让 Previously 能在到达简报(arrival briefing)中问候你,也知道该如何称呼你。
Past —— 持久记忆,分两部分:
- 一段滚动画像段落——第三人称,随着对你的认识加深而就地重写,硬上限 2,400 字符(约 600 token)。
- Anchor facts(锚点事实)——逐条列出的日期、决定与红线,每条都带证据 refs。准入标准是:「三年后几乎可以肯定仍然成立吗?」上限:8 条。
Now —— 当前状态的语义压缩池:是钩子,不是叙事。每条都带指向证据 slice 的 refs 和一个 since 日期。上限:5 条。超过 7 天的条目会被标记给演化 agent,由它逐条决定:把持久的内容提升到 Past,或丢弃这个钩子。代码不会静默删除任何内容。
Horizon —— 面向未来的悬而未决之事:承诺、截止日期、等待中的回复。每条都带显式的 by: 日期。Horizon 条目永不因过期而移除——它们只能通过被解决离开卡片。逾期的条目会被保留并标记:下一轮的简报会告诉 agent 主动问你事情的结果如何。
注意卡片不承载什么:没有规则,没有分析,没有协作经验。关于「你是谁」的模式——「聊致辞草稿时,要先给诚实的批评,再给安慰」——住在进化方向文档的画像(Portrait)里,不在卡片上(见进化回路)。卡片是一个纯粹的记忆池:你做过的、正在做的、将要做的事。
卡片回答的是「你是谁」,而不是「说过什么」。 每个条目都带 refs——形如 2026/08/10/2110 的指针,指回 slice;slice 才是无损的事实来源。引用过去事件的具体细节之前,agent 会问 recall 同事,由它从 slice 原文里引述。
卡片自身如何变化
卡片从不被整体重写。Previously Agent 持有卡片的内存副本,并通过细粒度、受验证的 mutation 工具来编辑它:
| 工具 | 作用 |
|---|---|
setIdentity | 就地设置或更新一个 Identity 字段 |
updatePastProfile | 重写 Past 画像段落 |
addPastAnchor / removePastAnchor | 添加或移除一条锚点事实 |
addNow / removeNow | 添加或移除一条 Now 钩子 |
promoteNowToPast | 把一条 Now 钩子毕业为 Past 锚点,保留其 refs |
addHorizon / resolveHorizon | 开启或解决一个 Horizon 事项 |
验证逻辑在工具内部,而不是事后的一道检查。超限或格式错误的写入会被拒绝,并附带具体的反馈——「2630 chars,limit 2400——压缩后重试」——由 agent 自己决定在上限内保留什么。Refs 是必需的:没有证据,就没有写入。卡片未被触及的部分在构造上就被保留;mutation 会话不可能静默丢弃一条它没看过的内容。
只有当卡片的实质内容真正改变时,结果才会被写回(头部时间戳每次都会刷新,比较时会被忽略)。实时卡片与按 slice 的快照(memory/episodic/slices/YYYY/MM/DD/HHMM/previously.md)一起写入——因此时间线上的每个 slice 都携带着那段对话结束时卡片的样子,UI 中的 "Previously On" 对话框可以展示它。
卡片何时演化
卡片在每一轮都接受进化检查,但大多数时候什么都不会发生——没有触发就没有进化。触发条件(fitness 信号、你的显式请求、旧格式卡片的强制升级)和那次合并的进化运行,都在进化回路一篇里。
进展会实时流式推送给客户端;当卡片发生变化时,演化指示器会展示一句话的变化说明和逐行 diff。被跳过的运行也会连同原因一起上报——静默的跳过读起来就像「它从没运行过」。
你有点好奇:最近的这些对话,会让它把「你」改成什么样?
23:47
有——画像一直在进化。最新一条加在「特质与认知风格」维度下:你系统性地低估自己的进步。半马完赛后你习惯性地把成绩说成运气,婚礼演讲还没讲就先贬低了一轮。这条画像挂着两个切片作证:完赛当晚的,和你赛后反思的那次。
不是。每个回合,五个 fitness bucket——卡片、回忆、搜索、深思、交互——都在累积带证据的打分;没挂你原话当证据的分会被强制归零。只有某个 bucket 的净分跌到 −5,进化才会真正触发;成功跑完一次,这一代就结算清零,重新累积。
实验阶段: 进化自上而下都是模型判断——记录什么、提升什么、playbook 改成什么。护栏(上限、refs、结构性证据锚定、确定性触发)保证它格式良好,而非保证它正确。因为一切都是 git 中的纯 Markdown,你随时可以查看 diff、手工编辑卡片,或回滚它们。