Skip to content

0.11.0(会话日志完整性、卡片默认脱敏与成员级排除)

Choose a tag to compare

@DreamRift DreamRift released this 18 Oct 04:40
· 12 commits to main since this release

会话日志完整性与披露边界版:修掉两个「写坏会话日志」的 P0 与一个「命令被拒绝但面板照样翻开关」的投影不一致,完成卡片默认脱敏、压缩成员级排除、弱候选置信度统一。

修复(P0)

  • 替换节点缺 data.source(持久性损坏):session.append(type, data, opts) 的 opts 只认 surfaceOp/sourceEventSeqs,其余键静默丢弃。插件把 source 写进 opts,落盘的 user/message 就没有 source,宿主投影无保护地读 event.data.source.kind 抛 TypeError,整条历史从此打不开(SESSION_QUERY_CORRUPT_SESSION),重启无效。已复发两次。现在折叠回执与凭证的 source 一律写在 data 里并补 id/role;测试替身 FakeSession.append 同步收紧成与真实宿主同语义。
  • compaction/prune.shadowedSeqs 与活动面不符:提交点用 run.flatMap(unit => unit.shadowedSeqs) 拼名单,区间里若夹着插件自己的回执(seq 数值比区间末尾大、位置却落在区间内),它不会进名单 → prune 落盘即非法 → 下次冷加载报 SessionFormatError,紧随的 replace 也被宿主拒(sourceEventSeqs must include every shadowed surface node; missing <seq>),该区间永远归档不掉。现在提交点按活动面位置切片取名单(两端必须在面上、顺序正确、逐项相等,否则失败关闭不写 prune);shadowedTokenCount 与名单同源,对账差额归零,容差未放宽。
  • 命令被拒绝,面板却显示已生效:宿主把每次斜杠命令都记成 command/run,投影只能按命令行折叠,看不出这次调用成没成——「关闭降温」被维护窗口拒绝(返回红字、持久状态一个字节没动)时面板照样翻成已关闭。现在每条状态类命令结束后(成功或失败都写)追加一条权威状态记录 plugin:dsh-memory-context-lab/state,值取自当时的真实记录/引擎状态;投影折叠到它时直接覆盖开关位,重放(resume/fork)同样生效。宿主拿不到 appendPluginRecord 时如实降级并在回执里说明,绝不假装写过。

隐私与披露

  • L1/L2 卡片默认不复制正文:摘录、跨度摘录、结论行这类自由文本原子的值默认渲染成固定标记 (正文摘录未共享),只保留 entity、属性标签、极性/关系标签、来源 ID 与 expand 入口;结构化属性(exit 1、465 项全绿、版本号、错误签名、时间)照常保留——脱敏删的是正文副本,不是证据。
  • 新开关 shareL2Content(默认 false,失败关闭):/memory-lab2 set sharel2content on|off,设置页「全局默认」增复选项,面板在 engine === 'v2' && compressOn 时显示开关。显式开启才在卡里放正文摘录。
  • 开关覆盖全链路:程序卡渲染、L1/L2 卡、模型相位的输入行(建块时就脱敏,保证模型消息、预算计量、blocksHash 与最终卡同源)、崩溃重放的 L1 占位都受同一开关约束;两种模式各自逐字节稳定,卡里带一行恒定模式说明。

层级压缩

  • 成员级排除:此前任一成员被遗忘即整组 member-forgotten blocked,同组其余成员永远压不掉。现在只把被遗忘成员排除出参与集:不读其正文、不进 L1/L2/sourceRecordIds/leafIds,其余成员照常蒸馏;全部成员被排除时仍整组失败关闭(没有安全子集)。
  • 计划 schema 2:recordIds 语义收紧为「参与蒸馏的子集」,新增 excludedRecordIds/excludedMembers({recordId, seq, reason})/memberDigest(sha256 前 12 位);memberSeqs/memberTexts 仍是表面全集,区间身份与 voucherId 因此不变。v1 计划(无 planSchema)保持整条作废语义。
  • 披露有边界:凭证文本与 L2 卡头只在真的排除了成员时追加一行;无排除时输出与 0.10.x 逐字节一致。

检索

  • 统一 exact 后验:抽成纯函数 exactPostfilterHit + 共用驱动 applyExactPostfilter,检索通道与弱候选诊断走同一份判定(此前各写一份,口径会漂移)。
  • 弱指针带可机读置信度:weakPointer: true、isHit: false、confidence: { kind: 'weak', score, coverage, exactVerified };不通过 exact 后验的弱候选如实丢弃(「弱」不是免责条款)。回注文案改为「弱指针(不是命中),只给 ID,不计入回读计数」。

测试

  • 全量 62 套 / 717 项断言 0 失败、0 跳过(Node v24.19.0,2026-10-18)。新增 3 套:v2-surface-source(8)、v2-share-l2-content(8)、v2-weak-pointer(5);v2-forget-hierarchy 改写为成员级排除契约(6 项)。
  • npm run probe:revert:28 个场景全部 OK(还原后测试失败),未覆盖 0 个(0.11.0 新增 6 个)。
  • 真实灵枢集成 3/3 真实通过(不再 skip);npm run probe:lingshu exit 0。

安装

dsh plugin add dsh-memory-context-lab-0.11.0.tgz

从下方 Assets 下载 dsh-memory-context-lab-0.11.0.tgz。本版未改动 v1 命令面;plugin-v1(0.6.2)是冻结线,不随本版升号。