Skip to content

feat(convo,web): 记忆接口按登录身份限定归属 - #30

Merged
liut merged 1 commit into
mainfrom
feat/memory-ownership
Oct 11, 2026
Merged

liut merged 1 commit into
mainfrom
feat/memory-ownership

Conversation

@liut

@liut liut commented Oct 10, 2026 •

Copy link
Copy Markdown
Owner

概述

记忆的归属规则收敛到存储层:列表经 ConvoMemorySpec.SiftX 扩展点按请求者身份收窄,单条操作经契约钩子在越权时拒绝,接口层只负责把越权错误映射成 403、把未找到映射成 404。创建一律归属登录者,keeper 不受归属限制。同时交付 agent 召回越权与删除后向量残留。

  • 契约(docs/convo.yaml)新增 beforeCreating / afterLoad / beforeUpdating / beforeDeleting 钩子,make codegen 重新生成 convo_gen.go
  • 存储层新增可复用的归属原语:哨兵错误 stores.ErrForbidden、restrictedToOwner / ownerIDFromContext / ownerAllowed,以及列表收窄入口 ConvoMemorySpec.applyOwnerScope
  • 新增 /api/convo/memories 五个接口,详情/更新/删除错误经 failStoreErr 映射 403/404/503,并同步 docs/swagger.{json,yaml}
  • 删除记忆在同一事务内清理向量,agent 的 memory_forget 复用该路径

Key decisions

  • 归属判定落在存储层,HTTP 与 agent 工具共用一条规则;无登录上下文的内部调用(向量同步、CLI)保持全量遍历
  • 列表分页默认值只对带登录身份的请求生效(20 条),避免截断后台遍历
  • 召回路径的回查走同一个 SiftX,不额外实现第二份归属过滤
  • 归属原语用通用命名(ErrForbidden、restrictedToOwner、ownerIDFromContext、ownerAllowed),不绑定具体模型,后续接口可直接复用

测试

  • 单测:memory_owner_test.go 覆盖收窄判定、归属编号解析、放行判定、列表归属矩阵、四个钩子;handle_convo_memory_test.go 覆盖 403/404/成功三类响应
  • 集成测试(-tags=integration,本地 PostgreSQL + Redis):越权读写被拒、keeper 可代查代改、删除后向量消失、召回只返回本人记忆
  • make vet、make lint 通过(0 issue);go test ./... 全部通过

注:stores.TestIntegration_SkillFrontmatterFields 在干净数据库上同样失败,属既有问题,与本次改动无关。

Post-Deploy Monitoring & Validation

  • 日志检索:request fail 且 code=403 且 URI 前缀 /api/convo/memories;delete memory vector fail
  • 指标/看板:/api/convo/memories* 的 200/403/404/503 分布,memory_recall 调用量与返回条数
  • 健康信号:403 只出现在跨用户访问尝试上;本人读写全部 200;503 无抬升;memory_recall 对已有记忆的用户仍返回结果
  • 失败信号:本人访问自己的记忆出现 403,或 delete memory vector fail 持续出现——前者说明身份解析异常,后者说明向量清理受阻
  • 处理:出现上述失败信号即回滚本次发布
  • 验证窗口与负责人:发布后 24 小时内由后端值班确认

@liut
liut force-pushed the feat/memory-ownership branch 2 times, most recently from 0c6ea21 to fab00e2 Compare October 10, 2026 11:31
- 契约新增创建前/加载后/更新前/删除前钩子,创建归属登录者,越权返回 forbidden
- 新增 /api/convo/memories 五个接口,越权映射 403、未找到映射 404,其余 503
- 列表按请求者收窄并补齐分页默认值,keeper 支持 ownerID 与 own 代查
- 归属原语 ErrForbidden / restrictedToOwner / ownerIDFromContext / ownerAllowed 不绑定具体模型
- 删除记忆在同一事务内清理向量,agent 召回沿用同一归属规则
@liut
liut force-pushed the feat/memory-ownership branch from fab00e2 to d0732f2 Compare October 11, 2026 09:04
@liut
liut merged commit e272f73 into main Oct 11, 2026
2 checks passed
@liut
liut deleted the feat/memory-ownership branch October 11, 2026 09:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant