第 20 篇
工程技术
如何返回可信证据:权限、新鲜度与覆盖范围
结合实际开发项目,讨论如何返回可信证据:权限、新鲜度与覆盖范围,说明设计理由、关键源码、验证方法及适用边界。
本文目录 · 7 节
本文属于 Memory Center:AI 编程上下文与记忆系统工程实践,第 20 篇,位于“检索与证据组合”模块。案例背景统一采用实际开发项目;复现步骤使用脱敏教学样例,不代表特定生产事故。
从实际问题出发
一次查询返回的引用,可能在后续读取前已经失效:源码修改、知识被替代、项目权限撤销。引用应当是受控读取入口,而不是永久绕过权限的地址。
证据在读取时再次检查
查询阶段确定可见候选,展开引用时还要核对主体、项目和来源修订。否则权限变化或源文更新会让旧引用继续泄漏正文。正确返回可以是失效诊断,而非勉强提供旧内容。

图中展示的是本篇关注的职责和顺序。正常流程之外,还要结合下面的源码与实验检查失败分支;它不是对某次线上调用的运行时追踪。
新鲜度不是一个装饰字段
CURRENT、STALE 和覆盖信息应影响结论使用方式。过期证据可以帮助定位,但不应支撑确定的修改建议。来源引用解决可追溯性,不能独立证明内容真实;验证还要检查测试与运行结果。
关键源码与阅读方法
源码基线为 Memory Center 6e90553(文档标注 5.0.0b24)。定位:memory_center/platform/application.py,函数 resolve_reference,起始行 176。
以下为当前基线中的函数代码;依赖项目模块,不能作为独立脚本执行。
def resolve_reference(self, actor, ref_id):
record = self.access.owned(actor, 'ref', ref_id)
workspace, index = self.indexed(actor, record['workspace_id'])
evidence = record['evidence']
if evidence.get('generation') != index['generation']:
raise CatalogError('REF_STALE', '引用所属索引已更新,请重新查询')
for symbol in [*evidence.get('symbols', []), *[e['symbol'] for e in evidence.get('chain', [])]]:
if symbol.get('hash') and not symbol_fresh(workspace['root'], symbol):
raise CatalogError('REF_STALE', '代码符号来源已变化,请重新索引后查询')
active = {item['id']: item for _, item in self.knowledge.active(record['workspace_id'])}
replaced = {item.get('replaces') for item in active.values() if item.get('replaces')}
for item in evidence.get('items', []):
source = item['source']
if source['kind'] == 'code':
path = Path(workspace['root']) / source['path']
try:
if path.is_symlink() or not path.resolve().is_relative_to(Path(workspace['root'])) or path.stat().st_size > 1024 * 1024:
raise OSError()
text = path.read_text(encoding='utf-8', errors='replace')
if hashlib.sha256(text.encode()).hexdigest() != source['hash']:
raise OSError()
except OSError:
raise CatalogError('REF_STALE', '引用源码已变化或失效,请重新查询') from None
elif source['source_id'] in replaced or source['source_id'] not in active or active[source['source_id']]['revision'] != source['source_revision']:
raise CatalogError('REF_STALE', '引用来源已删除或修订,请重新查询')
elif source.get('wiki_source_id') and not self.wiki_sources.fresh(source):
raise CatalogError('REF_STALE', '引用 Wiki 文件已变化或目录失效,请同步后重新查询')
elif active[source['source_id']].get('expires_at') and datetime.fromisoformat(active[source['source_id']]['expires_at']) < datetime.now(timezone.utc):
raise CatalogError('REF_STALE', '引用记忆已过期,请重新查询')
return record
阅读时先找输入由谁提供,再区分纯计算、读取和写入;遇到异常或提前返回,追问调用方会得到什么,以及已有状态是否仍然有效。上面的代码只证明展示范围内的实现,跨模块行为应继续查看调用处和相应测试。
用一个小实验核对设计
建议在独立临时目录和隔离数据中操作,使用虚构的接口、文档与项目名称。
- 查询后保存引用。
- 修改原文件再展开。
- 分别测试撤回知识和撤销项目权限。
**要核对的结果:**每种变化都应有可解释结果,不得把其他修订或其他主体的数据套给旧引用。
可把观察记录为下表;没有执行的项写“未执行”,不能用设计预期冒充实测结果。
| 核对项 | 应保留的证据 |
|---|---|
| 使用条件 | 源码版本、配置、输入与项目范围 |
| 正常行为 | 实际返回、来源位置或状态变化 |
| 关键失败分支 | 错误码、可见结果与原状态是否保留 |
| 结论范围 | 已覆盖、未覆盖和需要进一步验证的条件 |
适用边界与继续阅读
本篇以静态源码与项目设计为依据,给出可执行的核对方法,未据此宣称已经完成新的性能或生产环境测试。不同版本的入口、默认值和底层实现可能变化,应先核对当前合同,再把方法用于自己的实际开发项目。
理解这一节后,可以回到专题总导航,沿同一模块继续阅读;顺序学习时使用专栏内的上一篇和下一篇。涉及具体技术选择,应连同本篇的代价与限制一起采用。