news 2026/9/20 1:51:32

LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透

LifeOS Cortex 本地记忆检索 CLI 深度解析:8 个命令、隐私边界与证据门控一文讲透

【免费下载链接】LifeOS⛰️ LifeOS — The universal AI Harness designed to move you from Current to Ideal state in both life and work.项目地址: https://gitcode.com/GitHub_Trending/pe/LifeOS

LifeOS 的 Cortex 是构建在文件型记忆之上的本地记忆检索 CLI:用 Bun 单文件入口提供 8 个可验证子命令,在不引入向量索引、守护进程或网络服务的前提下,为 BM25 检索、fail-closed 隐私边界与确定性重建提供证据门控。本文讲透命令契约、语义化退出码对照与运营健康检查。

为什么需要它

文件型记忆系统(Markdown + JSONL 的 MEMORY 树)用久了会遇到三个没有标准答案的问题:检索结果能不能复现、写进去的东西能不能确认不被泄露、"我记得有这条"能不能被证明。验证靠人工翻文件,隐私靠自觉,重建靠信任——这三件事都不该靠自觉。

Cortex 的定位刻意收窄,三条边界先摆出来:

  • 不是常驻服务:没有 MCP 服务器、HTTP 接口或守护进程,不被调用就不启动,不增加任何常驻进程;
  • 不是第二个记忆运行时:不引入 Chroma、CMEM、向量索引或外部遥测,读写仍落在既有文件系统上;
  • 不做跨设备同步:没有云、没有远程变更,数据只在本机流动。

3 分钟跑起来

所有命令的统一调用形式只有一种:

bun LIFEOS/TOOLS/Cortex.ts <command> [arguments] [options]

规范根(canonical root,即"记忆文件的可信主目录")按四级优先级解析,后者依次回退:

  1. 测试/运行时注入的memoryRoot
  2. --memory-root命令行选项;
  3. 环境变量CORTEX_MEMORY_ROOT
  4. 默认值~/.claude/LIFEOS/MEMORY

第一条命令永远是status,用来确认根解析成功:

bun LIFEOS/TOOLS/Cortex.ts status

它报告被钉住的规范根、规范记录数、mode:"local-read-only"indexes:[]。注意这回答的是"语料长什么样",不是"系统是否健康"——后者在证据章节单独处理。

八个命令按"三件事"分组

看状态:status / get / export

get接受 1 到 100 个显式 ID,返回选中活跃记录的完整净化内容。语义是 all-or-nothing:任一 ID 缺失、已过期或尚未生效,整条命令以退出码 3 失败,不存在"返回找到的那部分"。

bun LIFEOS/TOOLS/Cortex.ts get mem_001 mem_002 bun LIFEOS/TOOLS/Cortex.ts export mem_001 mem_002

export的输入契约与get相同,但它只把选中记录序列化为lifeos-cortex-export/v1payload 打印到 stdout,不创建任何文件。名字像写操作,实际是披露动作,不是写动词。

查与追:search / timeline

bun LIFEOS/TOOLS/Cortex.ts search "部署 回滚 策略" --type memory --from 2026-08-01 --page 1 bun LIFEOS/TOOLS/Cortex.ts timeline --anchor mem_001 --before 3 --after 5

检索是本地 BM25,词元按[a-z0-9]+切分。参数化在 Cortex.ts 中完整可查:idf 取log(1 + (n-df+0.5)/(df+0.5))平滑,tf 饱和系数 2.5,长度归一化b = 0.25 + 0.75·len/avgdl,同分按 ID 字典序稳定排序——结果可复现是基准测试的前提。

过滤规则要分清两类:

  • --type--source--session精确匹配
  • --from/--to对记录的created闭区间过滤,它与有效期窗口是另一维度,互不替代。

--recency必须是有限非负数,把updated时间折进分数(score + recency·Date.parse(updated)/1e13),但不替代词法相关性——没有词法命中的记录不会因为"新"而浮现。

结果只返回卡片,从不返回正文:卡片恰好含idtypecreatedupdatedprovenance(source、可空 session、相对 path)、数值scoreest_tokens(净化后正文字符数除以 4 向上取整),不含 content 或摘录。这是渐进披露的核心。可选的图扩展从显式--expandID 出发,沿规范relatedID 做广度优先遍历,预算默认 10 节点、2,000 估算 token,上限 100 节点、50,000 token,不构建也不查询任何持久化图数据库

timeline的锚点可以是活跃记录 ID 或合法日期,--before/--after默认各 5、取值 0–100。ID 锚点在中心记录仍落在所选过滤器内时包含中心记录本身;结果按created排序、同刻按 ID 排序。

有效期窗口单独说清:valid_from含边界、valid_until不含,缺失的边界视为开放,非法边界 fail closedDate.parse得 NaN 即判不生效,拿不准就拒绝而不是放行)。search、timeline、get、export 默认排除查询时刻不生效的记录。分页统一为精确过滤后的total、从 1 开始的pagepage_size(默认 10,上限 100)与items,分数同值按 ID 打破平局。

写与验:remember / propose / rebuild

写命令的授权模型是双重绑定,缺一条都拒绝:

bun LIFEOS/TOOLS/Cortex.ts remember '{"type":"memory","title":"...","content":"..."}' \ --adapter claude --allow-write bun LIFEOS/TOOLS/Cortex.ts rebuild --from-canonical

第一,身份与授权分离:必须同时给出受识别的--adapter(claude / hermes / codex / subagent 之一)和--allow-write,只命名适配器不授予任何写权限。随系统发布的进程内适配器工厂 CortexAdapter.ts 返回冻结对象,写方法只有在选项对象恰好为{allowWrite:true}时才追加--allow-write——出现任何多余键权限判定即返回 null 并整体拒绝。写权限是逐次授予的,不是身份级的。

第二,命令与条目判别器绑定remember只接受type为 memory、idea、knowledge;propose只接受 proposal。不匹配在委托MemorySystem.add()之前就被拒绝。每条写命令恰好接受一个 JSON payload(上限 262,144 字节)。既有的变更分层、目标钉住、提案审批、审计、快照与收缩守卫保持权威地位;治理拒绝时退出码 5,不存在部分成功

rebuild是"可重建性"的只读证明:规范化全部规范记录后,分别对规范视图与重建视图计算 SHA-256 摘要,在lifeos-cortex-canonical-rebuild/v1payload 中报告equivalent、记录数与indexes:[]。它不创建任何索引,摘要相等证明的是"Cortex 记录视图可被确定性重建",不是源文件的逐字节重写。

成功与失败怎么判断

每条命令向 stdout 写恰好一个JSON 对象,且只有五个顶层字段:schemaokcommanddataerror。发布版 lifeos-cortex-v1.schema.json 对成功与失败两种形态都声明additionalProperties:false,并用oneOf做互斥约束。

{"schema":"lifeos-cortex/v1","ok":true,"command":"status","data":{"canonical":{"root":"/Users/me/.config/LIFEOS/USER/MEMORY","records":412},"mode":"local-read-only","indexes":[]},"error":null}
{"schema":"lifeos-cortex/v1","ok":false,"command":"search","data":null,"error":{"code":"invalid_input","message":"Query exceeds length/term limits"}}

信封自校验是库内建的:每次ok()/fail()构造结果后都先过一遍validateCortexEnvelope(字段集合、schema 常量、okdata/error一致性),校验不过直接抛错。输入侧同样严格:每个命令有固定选项白名单,未知选项、重复选项、缺值都会被拒绝而非忽略,进退出码 4。

退出码对照表:

退出码含义典型错误码
0成功
1未预期的内部失败internal_error
3显式 ID 或扩展根未找到not_found
4非法命令、选项、payload、过滤器、边界值或规范完整性问题invalid_inputintegrity_error
5缺少写授权,或既有治理拒绝变更write_refusedgovernance_refused

调用方必须同时使用进程退出码和信封:能解析出 JSON 只说明 stdout 合法,不等于成功。

三道防线 🔒

Cortex 的安全设计收拢为三章合并的防线:根怎么信、私有没有、索引有没有。

根钉住与符号链接防御

顶层的规范别名是被刻意允许的:pinCanonicalRoot对根执行一次realpath、确认目标是目录,把解析后的真实目录钉住作为信任边界,并在status中报告。默认的LIFEOS/MEMORY符号链接因此能透明指向私有用户数据仓库(~/.config/LIFEOS/USER/MEMORY),调用者无需手动解析。

钉住根之下的任何符号链接一律禁止:每次遍历都做lstat判定、校验realpath不逃逸出根;符号链接、realpath 逃逸、重复记录 ID、格式错误 JSONL、不可能时间戳(updated早于createdvalid_from >= valid_until、非法日历日期)、非常规模块文件(如 socket)全部以integrity_error失败、退出码 4。

读取任何内容之前还有一层语料级 fail-closed 上限:最多 10,000 个文件、单文件 8 MiB、总量 128 MiB、记录数 50,000 条,超限同样报integrity_error。先查形状再读内容,是"拿不准就拒绝"的具体化。

隐私剥离

私有 span 用类 HTML 标签书写,public <private>never persist or export this</private> public。CaptureEnvelope.ts 的stripPrivateContent实现了完整语义:

  • 匹配不区分大小写,容忍无害空白与属性;
  • 嵌套 span 整体移除,用深度计数而非单条正则;
  • 孤儿闭合标签作为控制标记移除,两侧公开文本保留;
  • 未闭合的开头标签 fail closed:从该位置起抑制字符串剩余部分;任何"归一化后像 private 开头标签"但格式不良的构造(NUL/控制字符插入、全角 Unicode、丢失的右尖括号)一律视为不可信开头 fail closed,不做宽松的 HTML 恢复。

净化是递归的,覆盖 content 与承载持久化语义的元数据:标题、名称、rationale、session provenance、entries、related slugs;剥离后变空的必填文本直接拒绝。该边界应用于 reviewer 推断、调试/错误序列化、类型化条目路由、规范词法排序、图扩展、get、export、rebuild 之前;规范读会再次净化,防止旧的已标记内容绕过当前边界。源中立的CaptureEnvelope助手只保护显式调用它的摄取点——fixture 证明的是"能表示"这些来源,不声称所有既有 hook 已自动迁移。

一个诚实的边界:原生 harness 转录可能在其 30 天保留期内保留<private>内容,这超出 Cortex 的控制范围。Cortex 不触碰转录字节,私有标签是持久化与处理边界,不是对 harness 转录、终端滚动回显、上游提供方日志或标签到达前已发送内容的清洗承诺。

确定性重建与 no-index 承诺

Markdown 与 JSONL 保持规范地位;派生索引可丢弃,不能成为事实源。默认检索语料是既有KNOWLEDGE/树(排除下划线与点号前缀路径),根级*_MEMORY.md存在时一并纳入,按KNOWLEDGEMEMORY/KNOWLEDGE→ 根本身三级回退。缺失 ID 的记录获得稳定的路径派生 ID(path:+ 路径 SHA-256 前 16 位);provenance 使用相对规范根的路径,因此更换绝对根别名不改变记录摘要。

系统发布的 CORTEX_INDEX_POLICY.json 是一个肯定性的lifeos-cortex-index-policy/v1标记,内容policy:"no-index-v1"。标记存在且无索引清单时:BM25 直接读规范文件,status报告indexes:[]rebuild不创建任何东西,健康检查报告健康的no-index-v1——不会为了证明"未采用索引"而遍历或哈希整个语料。歧义状态的处理是:清单与标记双缺失仅告警index-evidence-missing标记格式错误才是 critical。若存在合法已采用索引清单(须给出规范 SHA-256、索引路径与 SHA-256、indexed_at),它优先于 no-index 标记,且索引实际字节被逐字节验证。

它做什么、不做什么

负空间一次说清,已实现的升级不提供

  • MCP 服务器或网络 API;
  • 跨设备或云端同步;
  • CMEM / CMEM Cloud / Chroma / SQLite FTS / 嵌入 / 向量索引;
  • 外部 Cortex 遥测;
  • Cortex 守护进程或常驻 sidecar;
  • 所有 hook / 通道 / 采集表面的自动采纳;
  • 对原生 harness 转录的清洗;
  • 从搜索结果自动注入完整记录。

证据而不是自证

检索基准

标签文件LIFEOS/MEMORY/BENCHMARKS/cortex-retrieval-v1.jsonl操作者在自己的语料上、首次基准运行之前自行编写,不随系统发布。每行除 query、期望 ID、可选期望时序与已知假阳性 ID 外,必须携带lifeos-cortex-benchmark-label-provenance/v1溯源,证明期望 ID 来自真实的live-cortex-cli执行加人工语料核验。

bun LIFEOS/TOOLS/CortexBenchmark.ts \ --labels LIFEOS/MEMORY/BENCHMARKS/cortex-retrieval-v1.jsonl \ --memory-root LIFEOS/MEMORY \ --output LIFEOS/MEMORY/BENCHMARKS/cortex-benchmark-v1-YYYYMMDD.json

CortexBenchmark.ts 导入生产代码(activeCortexRecordsrankBM25toCortexCard与规范摘要函数),不携带基准专用排序器。每条带标签查询重复 25 次;每个查询/样本只做一次生产排序,同一份排序结果在两种披露测量间共享:bm25-baseline序列化完整 top-5 记录,progressive序列化 top-5 卡片、仅抓取被选中的第一条完整记录。排序质量刻意保持完全相同,被比较的是披露与注入成本,而不是两个检索算法

每个配置报告 Recall@5、MRR、时序成对排序准确率、假阳性召回、注入 token、p95 延迟、延迟样本数、语料盘上字节、实测磁盘增长、后代进程数、峰值 RSS 与执行路径名,另附语料分词次数与排序运行次数,防止卡片优先的比较掩盖重复检索工作。报告 schema 为lifeos-cortex-benchmark/v1;stdout 始终收到报告,持久化输出经--output显式开启,必须位于解析后的MEMORY/BENCHMARKS/之下、使用版本化文件名cortex-benchmark-vN-*.json,且不覆盖已存在的报告。报告是针对操作者自己语料与标签的可复现时点本地测量,不是普适性延迟或质量声明。

向量索引的采用门槛:当前vector_confignull。采纳向量或混合索引的前提,是一份带标签报告证明了相对渐进式 BM25 的检索质量提升,且索引可规范重建、保持在单独文档化的磁盘与进程边界内。仅仅降低 token 用量不构成采纳向量索引的证据。

运营健康

status只管契约与语料形状;运营健康来自另一个工具,bun LIFEOS/TOOLS/MemoryHealthCheck.ts --json输出机器可读报告,含overall、实测证据、生效阈值、findings,以及按 ok/warn/critical 派生的健康退出码 0/1/2。核心原则:缺失的证据永远不产生绿灯

默认阈值:

证据默认阈值越界结果
Reviewer 成功新鲜度7 天陈旧时 WARN
进行中 reviewer 终行宽限10 分钟CRITICAL 超时
检索证据新鲜度24 小时缺失/陈旧时 WARN
待审提案积压大于 10WARN
可观测性字节数大于 256 MiBWARN
最老可观测性日志年龄大于 30 天WARN
已采用索引新鲜度大于 7 天WARN

判定规则(与 CortexHealth.ts 评估器一致):最新reviewer 证据优先于历史成功;最新一次运行失败、解析失败、超时、格式错误、schema 不完整或无效,均为 CRITICAL;新运行目录超过 10 分钟宽限仍无终行即判超时;格式错误的 JSONL 被暴露,而不是静默跳回上一次成功;非法或未来时间戳不能证明新鲜度;提案证据只统计状态恰为pending的行,格式错误的提案 JSONL 告警;可观测性证据递归测量MEMORY/OBSERVABILITY/下全部.jsonl.log,报告字节、文件数与最老 mtime;检索证据取最新一行有效的memory-retrievals.jsonl;已采用索引的lifeos-cortex-index/v1清单非法、路径违规、索引字节缺失、规范不匹配或索引字节不匹配均为 CRITICAL。

已验证的缺失清单是健康的no-index-v1词法基线;它不是把未测量的索引状态称为健康的借口。每次运行报告的是当前证据,不是永久健康保证。

阈值覆盖只接受有限正数值;非法值产生 critical 的cortex-threshold-invalidfinding,而不是让比较失效。环境变量分两组:运营覆盖(CORTEX_RETRIEVAL_STALE_MSCORTEX_PROPOSAL_BACKLOGCORTEX_OBSERVABILITY_MAX_BYTESCORTEX_OBSERVABILITY_MAX_AGE_MS)与测试/自动化(CORTEX_HEALTH_ROOTCORTEX_HEALTH_NOWCORTEX_INDEX_MANIFESTCORTEX_HEALTH_NO_WRITECORTEX_HEALTH_REPORT_PATH)。

硬性上限速查 🧾

表面边界
检索查询2,048 字符且 64 个词法词元
列表页大小100
timelinebefore/after各自 0–100
图扩展100 节点、50,000 估算 token
显式get/exportID 数100
CLI 写 payload262,144 字节
类型化条目自由文本字段65,536 字符
类型化元数据字符串1,024 字符
提案目标路径4,096 字符
热记忆集合48 条、每条 256 字符
Related 链接数64

这些是拒绝上限而非目标值。类型化持久化额外拒绝:未知字段、非法枚举或字段类型、非有限/越界 confidence、控制字符、frontmatter/注释注入、含糊的 session 元数据、超尺寸数组,以及隐私剥离后变空的必填文本。代表性 1,500 条记录的契约检索在测试中限定于 1.5 秒以下;独立的基准测试采用上面的重复测量方法。

延伸阅读与适用前提

  • 契约文档:LifeOS/install/LIFEOS/DOCUMENTATION/Memory/CortexContract.md
  • 记忆架构、策展分层与目录清单:LifeOS/install/LIFEOS/DOCUMENTATION/Memory/MemorySystem.md
  • 健康证据与本地可观测性管线:LifeOS/install/LIFEOS/DOCUMENTATION/Observability/ObservabilitySystem.md
  • 证据收集与 fail-closed 评估实现:LifeOS/install/LIFEOS/TOOLS/MemoryHealthCheck.ts

适用前提:运行环境需要 Bun 运行时与已部署的~/.claude/LIFEOS/MEMORY(或CORTEX_MEMORY_ROOT指定的)规范根。私有 MEMORY 树中的基准标签、检索日志与索引清单均为操作者本地资产,不随开源仓库分发。

【免费下载链接】LifeOS⛰️ LifeOS — The universal AI Harness designed to move you from Current to Ideal state in both life and work.项目地址: https://gitcode.com/GitHub_Trending/pe/LifeOS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/20 1:49:03

读透组合树,TaoToken 换 DSH 的 Key

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 1:48:59

ISO/IEC 29500-4-2016实用指南:OOXML Part 4与docx解析

简介&#xff1a;ISO/IEC 29500-4:2016 是 ISO 与 IEC 联合发布的 Office Open XML 文件格式系列标准第四部分&#xff0c;主题为“过渡迁移特性”&#xff08;Transitional Migration Features&#xff09;。这份国际标准面向办公软件开发者、文档格式兼容性测试人员及标准研究…

作者头像 李华
网站建设 2026/9/20 1:45:15

深入浅出LLVM:架构、IR与自定义Pass开发实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/20 1:43:59

npx add-skill 实战指南:agent skill 安装与避坑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华