fix(memory,loop,capacity): 打通记忆链三条空壳(P0-3 / P0-4 / P0-17,审计 §4.3)
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled

- P0-3 持久向量索引**不再空壳**:Store.Add 落库后真做 Embed+Add(失败只记日志、绝不让记忆写入失败);
  NewRetriever 拿到 WithVectorIndex 时**自动接上写入路径**(无需改组合根);索引无命中 → WARN + **回退内存余弦**;
  新增每进程一次的**回填**(索引确实为空时把已落库条目向量化,分批 64、上限 512)
- P0-4 工作记忆**按会话接线**:回合落定时写入(owner 会话 + 带会话 id 的窗口,LRU 上限 64),
  组装上下文时按会话读取 ⇒ 前导块真的出现;原单窗口 API 语义不变
- P0-17 L4 学习回环**真回写**:新增 capacity.Judge(只跑判定、不施人格覆盖/不发事件/不改状态);
  loop 在回合落定"只写 owner 会话 + 跳过子代理分支",写 ScopeUser(L4 的读域)+ 结构化溯源
- 顺带红线加固:意图记录是主人**原话**的机器可读形态 ⇒ **绝不注入群聊/陌生人块**(design/03 §5)
- 复核:三条各自的包 build/vet/test 绿;「真生效」断言含生产构造路径(vector.New + 真实 SQLite 后端 +
  n-gram embedder)、跑完一轮窗口非空、L4 回写后能唤醒一个自身无强信号的表达;
  **5 条变异反证**(其中两条专门打「受限会话零写入」与「群聊不泄露主人原话」)均已还原
- 未做(登记):Index.Search 无 ID 过滤(客户端按候选集过滤,极端情况走回退);每条记忆一次 Embed
This commit is contained in:
AskaEth committed 2026-10-04 14:20:22 +08:00
1 parent 983bc49218
commit fbad02899a
10 files changed
+1020 -81

No files matched your search

+26
View File
@@ -1,6 +1,7 @@
package capacity
import (
"context"
"math"
"strconv"
"strings"
@@ -56,6 +57,31 @@ const (
intentRecordPrefix = "intent:"
)
// Judge 只跑意图分层(L1 → L2 → L3 → L4),返回该轮的原始判定
// (design §2.4 闭环学习的写回对象):它不施加人格覆盖、不产出事件、
// 不改动任何状态,也不写任何东西。
//
// 它是 Decide 的「只看判定」视图:回合落定时调它一次即可拿到该轮判定
// 用于回写记忆(RecordIntent),既不必重跑整次决策,也不会重复触发
// capacity_awaken 广播。判定层被禁用或没有可判文本时返回零值
// (IsTask=false),调用方据此跳过写入。
func (d *Decider) Judge(ctx context.Context, in Input) Judgment {
if !d.cfg.Enabled || len(in.Messages) == 0 {
return Judgment{}
}
state, conf, tool := d.intent(ctx, in)
return judgmentFor(in, state, conf, tool)
}
// IsIntentRecord 报告 content 是否为 RecordIntent 写回的规范意图记录
// (design §2.4)。群聊/陌生人的记忆注入据此把主人原话的机器可读形态
// 挡在只读共享块之外:那是 L4 的学习素材与「主人敏感信息」,
// 不是给群聊消费的非敏感共享记忆。
func IsIntentRecord(content string) bool {
_, ok := parseIntentRecord(content)
return ok
}
// RecordIntent formats a judgment into the canonical intent-record string written
// back to memory (design §2.4). Only task judgments are worth learning — a quiet /
// non-task judgment returns "" so callers can skip persisting noise. The format is