N1Mem 里每条记忆都有一个"可见范围",从最私密到最开放共四级; 另外每个记忆都贴着一个"项目"标签。规则只有两句:
一条 org 级的记忆可以属于"prod"项目,另一条属于"dev" —— 召回时只带出当前项目的记忆 (dev 的数据库地址绝不会出现在 prod 的上下文里)。项目的使用规则:
| 规则 | 说明 |
|---|---|
| 首用即登记 | 第一次用到新项目名,自动进本组织的项目台账,无需预先申请。 |
| Skill 项目绑定 | 技能(Skill)可绑定项目;绑定后其他项目的会话拿不到它 —— 错配可能导致故障,所以这是硬边界不是降噪。 |
| global 保留字 | 跨项目的通用记忆(如"团队用什么代码规范")落 global,所有项目可见。 |
| # | 防线 | 做什么 |
|---|---|---|
| 1 | 显式声明 | 写入方可以明确说"这条要 org / agent / private"—— 声明优先级最高。 |
| 2 | 路径默认 | 没声明时按组织配置走(默认 org = 充分共享;合规客户可整组织改为 private)。 |
| 3 | 敏感扫描 | 检出密钥 / 敏感级别 ⇒ 强制收窄为 private,且只收紧、永不放宽。扫描在服务端,客户端绕不过。 |
| 机制 | 实现 |
|---|---|
| 可见性合成 | final = narrower(期望, 扫描上限);排序 private < agent < team < org(单一定义点 c2_api/visibility.py) |
| 列默认兜底 | 数据库列默认 'private'(fail-closed);应用层显式写值 ≠ 条件分支默认 |
| 强制执行 | PostgreSQL RLS 策略 + CHECK 结构约束("私有但无主"/"Agent 私有但无岗"不可表示) |
| 主体归属 | 请求显式声明 > Key 级默认主体(发钥时定人)> 服务端钉定(内部通道)—— 主体即账目与可见性的锚点 |
| 无主体写入 | 结构性拒绝(CHECK),409 文案指向重装自动预填 —— 不存在静默丢失 |
| Agent 供值 | app.agent_id 与策略同一常量组供值(供值方/消费方不共享常量 = 差异原理上测不出来) |
相关文档:WorkBuddy 接入指南 · OpenClaw 接入指南 · 记忆时间线