生产启动行仍是 timeout=20s —— M15 把 memory 包的 defaultReviewTimeout 抬到 90s 的修复**从未生效**:config 层的 env tag 自己带着 default:"20", env 层永远产出非零值,于是 memory 侧「≤0 才回落默认」的归一化成了死代码。 修法(二选一中的「① 让 memory 侧成为唯一真源」):去掉 config 侧 MEMORY_REVIEW_TIMEOUT_SEC 的字面默认值,未配置时读出 0 = 「没配」, 由 normalizeReviewConfig 单点落地 90s。 生效值: .env / env 没写这个键 ⇒ 90s(唯一真源) 写了正数 ⇒ 原样生效(不做任何「保底抬到 90」的加码) 写了 0 / 负数 ⇒ 90s(与项目其它旋钮同一口径:≤0 = 用默认) 新增测试(走真实组装路径,不绕过任何一层): config.LoadMemoryReviewConfig → ReviewConfig.Timeout → NewPreInsertReviewer → normalizeReviewConfig → 生效值(= 启动行打印的 timeout=) 断言生效值严格大于「实测最坏召回链 57s + T1 子超时 8s」,并断言启动行打印它。 变异自证(修前红):把 tag 的 default:"20" 加回去 ⇒ 报出 「组装后 timeout = 20s」+「生效值 20s != 唯一真源 1m30s」 原有 TestEmbeddingTimeoutFitsReviewBudget 拦不住这条,因为它比的是**本包常量**, 看不见 env 层;注释里已写明「比常量」与「比组装后生效值」的区别(防后人重蹈)。
【MT-A:护栏 + 诚实截断 + 试算异步】 - maxTidyCompareItems 400(写死)→2000 并开放为 MEMORY_TIDY_COMPARE_LIMIT; MEMORY_TIDY_CANDIDATE_LIMIT 默认 20→200(语义不变,仍每分区) - 依据是首跑实测:459 条的分区被 400 截断 ⇒ compared(705) < scanned(784), 候选数(77)由上限而不是规则决定;三处上限的 WARN 都补齐了总数/上限/分区名 - 新增「上限 + 时间预算」双闸(实测 2000 条/分区 ≈234s > 3 分钟墙钟): 整分区跳过 / 两两比对中途收手,一律如实记 (budget) + WARN - ?async=1 ⇒ 202 {runId,status};GET …/{runId} 轮询(writeAuth 同档); done 的 result 与同步 data 逐字节同形;并发=复用既有 runId、TTL 30min 自完成起算、 重启即如实 404 tidy_run_not_found;不带 async 时同步路径逐字不变 【MT-B:D3 入库前审查(design/23 §15.1)】 - 新记忆经 Store.Add(仓库里唯一 INSERT INTO memory_items)落库后,由独立记忆管理 会话(sess-memorytidy)在有界后台队列异步判定 skip/merge/modify/create - 软合并回写(status + merged_into/merged_from/merge_count,可 revert、绝不改 content) - 隔离来源(群聊/陌生人)**概不审查**、召回/超时失败**零改写**(fail-safe 结构性成立) - 写入侧仅 +62.7µs/条(非阻塞入队);默认 ENABLED=true(主人裁定:入库前先审查) 【耦合说明(重要)】两片同包且互相依赖:MT-B 的 preinsert_recall.go 用 MT-A 的 collectTidyPairs 新签名 + tidyBudget ⇒ **各自单独都 build 不过**,故一并落地。 MT-A 为让整包编译,最小幅度适配了 MT-B 的 preinsert_recall.go / preinsert_test.go (零值预算=行为不变;符号重名改名)。 【我的验收】隔离 worktree(37 文件)build/vet/linux/darwin 全过,切片包全绿; 我亲手打红两个变异:① 去掉 (compare) 截断标记 ⇒ TestTidyCompareLimit_HitIsLoud 红; ② 中和隔离来源守卫 ⇒ TestReviewRestrictedSourceIsNeverTouched 红。 唯一红是 internal/runtime/tool 的两条超时用例(该包无人改)⇒ 主仓库 -count=8 全绿, 判定为负载敏感 flake(当时两个整树验收 + 子代理并发),已记入开发习惯与约定 §7。 .env.example 补 MEMORY_REVIEW_* 四键(MT-B 无该文件权限,由我按其代码语义补写)。