feat(memcore): memory-lint 过期检测改为提交速度分档

原 Phase 5 用固定 30/90 天日历阈值判定记忆过期,与 AI 辅助开发下的实际迭代速度脱钩:高频项目 7 天内可能已发生大量架构变更却不报警,低活跃项目超 30 天仍可能内容准确却被误报。

改为按「自 last_updated 以来的全仓库提交速度」分档:7 天最低观察窗口 + 速度 ≥1.0/天 ERROR、≥0.3/天 WARN、低速豁免但 180 天绝对兜底。常量集中在 memcore-shared,Phase 8 报告模板同步更新过期条目文案。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019z1dhAgV1vqz7SiniXw96C
This commit is contained in:
SkyJourney
2026-07-10 10:57:48 +08:00
co-authored by Claude Sonnet 5
parent 8289fa6060
commit a13898b55e
2 changed files with 32 additions and 13 deletions
@@ -66,8 +66,10 @@ echo "PROJECT_DIR=$PROJECT_DIR"
| 常量 | 值 | 含义 | 使用位置 |
|------|----|------|---------|
| `SYNTHESIS_THRESHOLD` | `3` | 跨文件引用数 ≥ 此值即为 synthesis 升级候选 | `/memory-update` Phase 3C、`/memory-lint` Phase 3A & Phase 8 |
| `LINT_STALE_WARN_DAYS` | `30` | last_updated 超过此天数 → WARN | `/memory-lint` Phase 5 |
| `LINT_STALE_ERROR_DAYS` | `90` | last_updated 超过此天数 → ERROR | `/memory-lint` Phase 5 |
| `LINT_STALE_MIN_DAYS` | `7` | last_updated 不足此天数 → 跳过过期检测 | `/memory-lint` Phase 5 |
| `LINT_HIGH_VELOCITY` | `1.0`(次/天) | 全仓库提交速度 ≥ 此值 → 高频迭代区 → ERROR | `/memory-lint` Phase 5 |
| `LINT_LOW_VELOCITY` | `0.3`(次/天) | 全仓库提交速度 ≥ 此值 → 中频迭代区 → WARN | `/memory-lint` Phase 5 |
| `LINT_STALE_ABSOLUTE_DAYS` | `180` | 速度低于 `LINT_LOW_VELOCITY` 时的绝对兜底天数 → WARN | `/memory-lint` Phase 5 |
| `MULTI_HOST_WARN_DAYS` | `7` | 远程 vs 本地 mtime 差 ≥ 此天数 → 多机不同步警告 | `/memory-sync` Phase 3 |
子技能引用常量时使用上述名称,调整阈值只需修改本文件单一来源。
+28 -11
View File
@@ -144,18 +144,35 @@ grep -rn "<!-- merge-conflict\|<!-- remote-diverge" "$PROJECT_DIR/.claude/memory
cat "$PROJECT_DIR/pom.xml" || cat "$PROJECT_DIR/package.json" || cat "$PROJECT_DIR/requirements.txt"
```
### Phase 5 过期检测
### Phase 5 过期检测(速度分档)
阈值由 memcore-shared 定义
- WARN ≥ `LINT_STALE_WARN_DAYS`(默认 30 天)
- ERROR ≥ `LINT_STALE_ERROR_DAYS`(默认 90 天)
可由 MEMORY.md 头部 `<!-- lint-stale-warn: N -->` 局部覆盖。
不再用固定天数二级阈值,而是用「自 last_updated 以来的全仓库提交速度」判断过期风险的严重程度:高频迭代项目下 7 天未同步就可能已经漂移,低活跃项目下 30 天未动也可能仍然准确。阈值常量由 memcore-shared 定义
```bash
git -C "$PROJECT_DIR" log --oneline --since="$last_updated" -- .
# days_since: last_updated 距今天数
days_since=$(( ($(date +%s) - $(date -d "$last_updated" +%s)) / 86400 ))
# 不足 LINT_STALE_MIN_DAYS(默认 7 天)→ 跳过本文件的过期检测
if [ "$days_since" -lt 7 ]; then
continue
fi
# commits_since: 全仓库自 last_updated 以来的提交数
commits_since=$(git -C "$PROJECT_DIR" log --oneline --since="$last_updated" -- . | wc -l)
# velocity: 提交速度(次/天)
velocity=$(echo "scale=2; $commits_since / $days_since" | bc)
```
分级(可由 MEMORY.md 头部 `<!-- lint-stale-warn: N -->` 覆盖 `LINT_STALE_MIN_DAYS`):
| 条件 | 级别 | 语义 |
|------|------|------|
| `velocity ≥ LINT_HIGH_VELOCITY`(默认 1.0) | ERROR | 高频迭代区,未同步几乎必然漂移 |
| `LINT_LOW_VELOCITY ≤ velocity < LINT_HIGH_VELOCITY`(默认 0.3~1.0) | WARN | 中频迭代,需人工确认是否漂移 |
| `velocity < LINT_LOW_VELOCITY``days_since < LINT_STALE_ABSOLUTE_DAYS`(默认 180) | — | 低活跃期,不判定过期 |
| `velocity < LINT_LOW_VELOCITY``days_since ≥ LINT_STALE_ABSOLUTE_DAYS` | WARN | 绝对兜底,防止彻底沉寂的记忆永不复查 |
### Phase 6 可推断内容污染
污染特征:大量文件路径、git 流水账、方法签名/SQL、可从依赖文件直读的版本号列表。
@@ -304,14 +321,14 @@ last_updated: YYYY-MM-DD
- **矩阵**:Q1 答案 = 当前权威;Q2 过时 → 直接更新另一方;Q2 计划 → 末尾标 `**Status:** planned, target HASH`Q3 有迁移 → 用迁移时间反推
<!-- id: e5f6a7b8 -->
### [WARN] 过期记忆 — last_updated 超阈值
### [WARN] 过期记忆 — 提交速度分级超阈值
- **文件**`project_progress.md`last_updated: 2026-01-15,过期 86 天)
- **文件**`project_progress.md`last_updated: 2026-01-15,过期 86 天,同期 62 次提交,速度 0.72/天 → 中频区 WARN
- **Checklist**
- Q1:覆盖领域近 90 天有里程碑变更?
- Q1:覆盖领域在此期间是否有里程碑变更?(速度越高,越可能有)
- Q2:现有内容是否仍可指导决策?
- Q3:是否有继任 synthesis_* 已分担其职责?
- **矩阵**Q1 是 + Q2 否 → 触发 `/memory-update`Q2 是(仅日期老)→ 仅刷新 `last_updated`;Q3 是 → 归档/删除,索引指向继任者
- **矩阵**Q1 是 + Q2 否 → 触发 `/memory-update`Q2 是(仅日期老、速度低)→ 仅刷新 `last_updated`;Q3 是 → 归档/删除,索引指向继任者
<!-- id: c9d0e1f2 -->
### [WARN] 可推断内容污染 — 疑似从代码可 grep 的明细