@a9i5k4/dsh-auto-memory 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -7
- package/README.zh-CN.md +19 -7
- package/docs/FRONTEND-CO-CREATION.md +191 -0
- package/docs/GM53-HOMEPAGE-PROMPT.md +323 -0
- package/docs/HOMEPAGE-CONTENT-FOR-GM53.md +299 -0
- package/docs/PROMO-PROMPT-3.0.md +100 -0
- package/docs/USER-GUIDE.en.md +2 -2
- package/docs/USER-GUIDE.zh-CN.md +2 -2
- package/docs/WHITEPAPER.md +207 -0
- package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +397 -0
- package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +351 -0
- package/docs/internal/ART-DIRECTION-WIREFRAME.md +191 -181
- package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +181 -0
- package/docs/internal/BATTLE-PLAN-20260917.md +871 -0
- package/docs/internal/FEATURE-INVENTORY.md +531 -0
- package/docs/internal/G-SERIES-EXECUTION-20260917.md +248 -0
- package/docs/internal/G3-DESIGN-20260918.md +82 -0
- package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +92 -0
- package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +309 -0
- package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +120 -0
- package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +74 -0
- package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +175 -0
- package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +389 -0
- package/docs/internal/ISSUE10-PLAN-20260919.md +254 -0
- package/docs/internal/ISSUE10B-FORENSICS-20260919.md +468 -0
- package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +150 -0
- package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +114 -0
- package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +79 -0
- package/docs/internal/MEMORY-GOVERNANCE-20260917.md +309 -0
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +705 -0
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +649 -0
- package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +225 -0
- package/docs/internal/PROGRESS-20260917.md +93 -0
- package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +128 -0
- package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +163 -0
- package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +127 -0
- package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +140 -0
- package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +138 -0
- package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +218 -0
- package/docs/internal/RESUME-20260918.md +171 -0
- package/docs/internal/RESUME-20260919.md +104 -0
- package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +198 -0
- package/docs/internal/ROADMAP-20260917-WEEK.md +134 -0
- package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +13 -3
- package/docs/internal/S10-GAP-INVENTORY-20260917.md +239 -0
- package/docs/internal/T6-EXECUTION-20260920.md +130 -0
- package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +146 -0
- package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +89 -0
- package/docs/internal/THESIS-OUTLINE-20260918.md +147 -0
- package/docs/internal/THREE-LAYER-CONTRACT.md +10 -1
- package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +297 -0
- package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +104 -0
- package/docs/screenshots/promo/promo-0-banner-v3.png +0 -0
- package/lib/activation-host.js +63 -9
- package/lib/board-mode.js +1 -1
- package/lib/client.js +892 -27
- package/lib/config-io.js +156 -0
- package/lib/context-bridge.js +3 -0
- package/lib/context-host.js +16 -9
- package/lib/degrade.js +385 -0
- package/lib/dsh-home.js +143 -0
- package/lib/episodic-store.js +52 -2
- package/lib/evidence-store.js +8 -1
- package/lib/fact-store.js +21 -2
- package/lib/index-sync.js +13 -1
- package/lib/index.js +1507 -158
- package/lib/intent-clean-safe.js +258 -40
- package/lib/l0-extract.js +231 -16
- package/lib/m4-corpus.js +8 -2
- package/lib/m7-index-sync-host.js +8 -1
- package/lib/memory-envelope.js +6 -1
- package/lib/memory-hub.js +127 -12
- package/lib/memory-index.js +4 -2
- package/lib/note-status-apply.js +118 -0
- package/lib/note-status.js +196 -0
- package/lib/procedure-store.js +84 -3
- package/lib/python-sidecar-client.js +29 -3
- package/lib/recall-fusion.js +83 -12
- package/lib/rules-edit.js +159 -0
- package/lib/semantic-decide.js +41 -8
- package/lib/semantic-js.js +51 -6
- package/lib/shadow-host.js +3 -5
- package/lib/skill-export-host.js +153 -0
- package/lib/skill-export.js +239 -0
- package/lib/storage-manage.js +6 -0
- package/lib/temporal-parse.js +191 -159
- package/lib/tier0-catalog.js +45 -3
- package/lib/wb-contract.js +198 -2
- package/lib/wb-sidecar.js +54 -3
- package/package.json +1 -1
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# 毕业论文总纲 · 资料 / 实验设计 / 论文大纲
|
|
2
|
+
|
|
3
|
+
> 2026-09-18 | 主线:思维链语域指纹(三波段)的构念效度、因果操纵与预测力
|
|
4
|
+
> 数据底座:`E:\dsh_dynamic_adjust\anchored-monitor\demo-data\experiment.jsonl`(35.1 MB,另有 50.0 MB 备份)
|
|
5
|
+
> 编制依据:本地已有学术资产(M7 两篇论文稿)+ 锚定线实验平台 + 外部文献检索
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 第一部分 · 资料清单(Related Work 骨架)
|
|
10
|
+
|
|
11
|
+
### 簇 A|记忆系统与记忆评测基准(提供 baseline 与任务集)
|
|
12
|
+
| 文献/资产 | 位置 | 用法 |
|
|
13
|
+
| --- | --- | --- |
|
|
14
|
+
| LongMemEval(ICLR 2025,xiaowu0162/LongMemEval) | 外部 | 长时交互记忆基准,可直接借用其任务类型与评分协议,作为外部任务集 |
|
|
15
|
+
| MIRIX(arXiv 2507.07957;本地 `.research-mirix/MIRIX-main`) | 本地已克隆 | 多智能体记忆架构,含 `evals/` 目录,可作为对照系统 |
|
|
16
|
+
| cognee / Memori / supermemory | 本地 `.research/`(仅 .git,需完整检出) | 三个开源记忆实现,候选 baseline |
|
|
17
|
+
| MemGPT / Mem0 / SimpleMem / AriadneMem | 外部 | 主流记忆架构谱系,Related Work 的骨架与数字对照来源 |
|
|
18
|
+
| What Do Memory Benchmarks Actually Measure? | 外部(HF blog) | **方法论批判**:直接支撑本论文「基准测的不是存储」这一立论,务必精读 |
|
|
19
|
+
| Long-Term Memory Security Survey(ar5iv 2604.16548) | 外部 | 记忆生命周期治理视角,可用于 Discussion |
|
|
20
|
+
|
|
21
|
+
### 簇 B|提示措辞与语用效应(本论文的干预实验理论来源)
|
|
22
|
+
| 文献 | 位置 | 用法 |
|
|
23
|
+
| --- | --- | --- |
|
|
24
|
+
| The language of prompting(arXiv 2311.01967) | 外部 | 系统研究提示的语言学属性,是「措辞 → 效果」这一路的直接先例 |
|
|
25
|
+
| Carrot or Stick? Reconciling Contradictory Findings on Prompt Tone Effects | 外部 | **矛盾发现综述**:说明语气效应不稳定,正是本论文做严格操纵实验的理由 |
|
|
26
|
+
| 礼貌/粗鲁提示效应(宾大相关报道) | 外部 | 提供「措辞影响准确率」的公众叙事与反例,需找到原始论文核验 |
|
|
27
|
+
| 本地锚定措辞实验(E1/E1.5/E2,见 feasibility report §1.5) | 本地 | 命令式 vs 中性/建议式 → we/let me 翻转的**一手预实验证据** |
|
|
28
|
+
|
|
29
|
+
### 簇 C|思维链的语言学分析(本论文的测量工具理论来源)
|
|
30
|
+
| 文献 | 位置 | 用法 |
|
|
31
|
+
| --- | --- | --- |
|
|
32
|
+
| Robust Pronoun Fidelity with English LLMs(ar5iv 2404.03134) | 外部 | 代词使用与忠实性的关系,是「人称标记作为测量对象」的方法学先例 |
|
|
33
|
+
| Understanding Aha Moments(ar5iv 2504.02956) | 外部 | 从语言模式识别推理转折点,方法上同类(用语词特征定位认知状态切换) |
|
|
34
|
+
| CoT faithfulness 相关综述 | 待补 | 论证「思维链文本本身是可研究对象」,回应「只是装饰」的质疑 |
|
|
35
|
+
|
|
36
|
+
### 簇 D|本地已有学术资产(可直接复用,勿重复造)
|
|
37
|
+
| 资产 | 规模 | 复用方式 |
|
|
38
|
+
| --- | --- | --- |
|
|
39
|
+
| `docs/M7-RESEARCH-PAPER.md` | 43.5 KB | 嵌入检索选型研究,含 RQ1–4、L1/L2 语料构建、效度威胁章节——**章节结构与写法可直接借鉴** |
|
|
40
|
+
| `docs/M7-ACTIVATION-V2-PAPER.md` | 26.3 KB | 激活策略研究,含回声陷阱发现、金标演进、消融与证伪、跨语言迁移 |
|
|
41
|
+
| `docs/M7-BENCHMARK-PLAN.md`、`M7-TASK-DISPATCH.md`、`M7-LABEL-REVIEW-REPORT.md` | 4–12 KB | 基准方案、任务派发、标注复核流程——标注信度的现成流程模板 |
|
|
42
|
+
| `E:\dsh_dynamic_adjust\project_feasibility_report.md` | 620 行 | 锚定线完整技术叙事(含三波段、相变、路径承诺、措辞实验) |
|
|
43
|
+
|
|
44
|
+
> ⚠️ 待核验项:以上外部条目的作者名、年份、卷期需在正式引用前逐条核(本清单只保证「存在且相关」,不保证书目字段准确)。
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## 第二部分 · 实验设计(三个实验,观测 → 操纵 → 预测)
|
|
49
|
+
|
|
50
|
+
### 共同测量口径(先冻结,全篇不再改)
|
|
51
|
+
- 测量量:`persona_ratio = count("let me") / (count(positive) + count("let me"))`,滑动窗口 20 块。
|
|
52
|
+
- 词典:正向 we / let's / we'll / we need / our;负向仅 let me;i will / i'll / i need 归中性(2026-08-17 校正,锚定线已落地)。
|
|
53
|
+
- 波段:ratio < 0.2 → spec;0.2 ≤ ratio < 0.5 → mixed;ratio ≥ 0.5 → react。
|
|
54
|
+
- 数据源:`E:\dsh_dynamic_adjust\anchored-monitor\demo-data\experiment.jsonl`(35.1 MB)+ `events.jsonl`,以及 `~/.dsh/sessions/{sessionId}/events.jsonl` 的真实会话流。
|
|
55
|
+
|
|
56
|
+
> ⚠️ **开工前必须验证的前提**:`experiment.jsonl` 首行为 `{"type":"block_received",...}`,仅含 `textLength` 无正文。需先确认文件内是否存在携带 reasoning 正文的行类型(`events.jsonl` 的 `reasoning_block` 行确有 `text` 字段)。**若 35 MB 实验数据不含正文,E1 语料必须改从会话原始 JSONL 重建**——这是全部实验的前置阻塞项,第一天就要查清。
|
|
57
|
+
|
|
58
|
+
### E1|观测研究:语域指纹的构念效度(回答 RQ1)
|
|
59
|
+
- **问题**:三波段是否对应可被人类标注者识别的、稳定的语域差异?还是正则词频的人为切分?
|
|
60
|
+
- **材料**:从语料随机抽 300 个 reasoning 块(分层抽样:三波段各 100)。
|
|
61
|
+
- **标注**:两位标注者独立判断「该段是集体规划式 / 行动者式 / 无法判断」,双盲于 ratio 值;先标 30 条试点校准标注手册,再标剩余。
|
|
62
|
+
- **信度**:Cohen κ(二分)或 Krippendorff α(三分等级);判据 **κ ≥ 0.61**。
|
|
63
|
+
- **稳健性**:词表扰动(增删 ±1 个词、改权重 ±20%)后波段归属变化率;目标 **< 10%** 翻转。
|
|
64
|
+
- **效度证据**:波段 × 标注类别的混淆矩阵、与 ratio 值的 ROC。
|
|
65
|
+
- **产出**:一张构念效度证据图 + 一份标注手册(附录)。
|
|
66
|
+
|
|
67
|
+
### E2|操纵实验:措辞的因果效应(回答 RQ2)
|
|
68
|
+
- **设计**:3(措辞)× 2(注入时机)被试内设计,任务是重复测量单位。
|
|
69
|
+
- 措辞:命令式("read first and follow them")/ 建议式("reading the index is recommended")/ 中性陈述("an index exists")。
|
|
70
|
+
- 时机:首轮 system prompt / 会话中途注入。
|
|
71
|
+
- **因变量**:主=措辞注入后 5 个块的 persona_ratio 变化 Δ;次=任务正确率、工具调用数、返工次数、token 成本。
|
|
72
|
+
- **刺激材料**:≥20 个等难度任务(可取自 Project2),每条件 × 任务 × 3 次重复。
|
|
73
|
+
- **分析**:线性混合效应模型(固定效应=措辞、时机、交互;随机截距=任务、会话),Holm 校正,报效应量与 95% CI。
|
|
74
|
+
- **先验依据**:feasibility report §1.5 的 E1/E1.5/E2 三轮预实验(命令式 → we 消失出现 3 个 let me;中性/建议式 → we 保持)。
|
|
75
|
+
- **止损线**:若三水平无显著差异 → 保留 E1 作为主结果,E2 降级为探索性分析写入附录。
|
|
76
|
+
|
|
77
|
+
### E3|预测研究:波段是否领先于结果(回答 RQ3)
|
|
78
|
+
- **问题**:波段先于任务结果(预测性),还是结果反过来改变波段(反向因果)?
|
|
79
|
+
- **设计**:对每个任务单元取结果**之前**的窗口特征(ratio 均值 / 斜率 / mixed 停留时长),预测该任务单元的结果。
|
|
80
|
+
- **分析**:时间滞后互相关(lag 从 -10 到 +10)、Granger 因果检验、以及仅用「前置窗口」特征的交叉验证分类(session 分组,防泄漏)。
|
|
81
|
+
- **判据**:前置于结果的 lag 相关显著,且反向 lag 弱于正向 → 支持方向性。
|
|
82
|
+
- **对照**:与零模型(仅用任务类型、块长度、会话位置预测)比较增量 AUC。
|
|
83
|
+
|
|
84
|
+
### 伦理与合规(开工即办)
|
|
85
|
+
- 数据为本人自用日志 → 写明来源、脱敏(去除绝对路径、会话 ID 哈希化)、LLM 使用声明。
|
|
86
|
+
- 人工标注者若含他人 → 需知情同意说明;若仅本人 → 需报告单标注者的信度局限。
|
|
87
|
+
- API 成本:E2 的 3×2×20×3 = 360 次运行,需先估 token 预算并设上限。
|
|
88
|
+
- 第三方 baseline 的 license 需逐个核对后方可分发或复现。
|
|
89
|
+
|
|
90
|
+
- **止损线**:三项主要判据任一未达 → 收缩论文范围(见第四部分风险表)。
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## 第三部分 · 论文大纲(章节级)
|
|
95
|
+
|
|
96
|
+
**题名(工作稿)**:思维链语域的三波段模型——大模型推理轨迹中的人称标记、构念效度与结果预测
|
|
97
|
+
|
|
98
|
+
1. **引言**(1.5 页)
|
|
99
|
+
1.1 现象:同一模型同一任务,分数差异可达 8 分
|
|
100
|
+
1.2 从工程预设到科学问题:措辞是否是可操纵的自变量
|
|
101
|
+
1.3 贡献三条:① 人格语域的构念效度证据 ② 措辞的因果操纵结果 ③ 波段的时序预测力
|
|
102
|
+
1.4 论文结构
|
|
103
|
+
2. **相关工作**(2.5 页)
|
|
104
|
+
2.1 记忆系统与记忆评测(LongMemEval / MemGPT / Mem0 / MIRIX)——说明本文不评记忆质量,而评**思维轨迹的语域**
|
|
105
|
+
2.2 提示措辞与语用效应(language of prompting;语气效应的矛盾发现)
|
|
106
|
+
2.3 思维链的语言学分析(代词忠实性、aha moment 检测)
|
|
107
|
+
2.4 研究空白:三波段模型从未被构念效度检验,也从未被因果操纵验证
|
|
108
|
+
3. **数据与方法**(3 页)
|
|
109
|
+
3.1 语料:来源、规模、抽取与脱敏
|
|
110
|
+
3.2 测量:词典、窗口、ratio 与波段定义(冻结版本号 + 哈希)
|
|
111
|
+
3.3 标注方案与信度估计
|
|
112
|
+
3.4 统计模型:混合效应模型、bootstrap、多重比较校正
|
|
113
|
+
3.5 可复现:脚本、种子、环境
|
|
114
|
+
4. **实验一:构念效度**(2.5 页)——结果表 + 混淆矩阵 + 词表扰动稳健性
|
|
115
|
+
5. **实验二:措辞的因果效应**(3 页)——主效应与交互、森林图、失败案例分析
|
|
116
|
+
6. **实验三:时序预测与方向性**(2 页)——滞后相关、Granger、增量 AUC
|
|
117
|
+
7. **讨论**(2 页)
|
|
118
|
+
7.1 三波段是语域,不是一个分数
|
|
119
|
+
7.2 对提示工程的实践含义(建议式优于命令式)
|
|
120
|
+
7.3 对记忆系统设计的含义(注入措辞也是接口设计)
|
|
121
|
+
7.4 与"语气效应矛盾发现"的对账
|
|
122
|
+
8. **效度威胁与局限**(1 页)——单模型家族、单语言(英语为主)、正则测量的上限、自用数据的样本偏倚
|
|
123
|
+
9. **结论与未来工作**(0.5 页)
|
|
124
|
+
10. **附录**——标注手册、全部提示词模板、完整结果表、复现脚本清单
|
|
125
|
+
|
|
126
|
+
**字数目标**:正文 6000–8000 词 + 附录。
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## 第四部分 · 风险表与收缩路径
|
|
131
|
+
|
|
132
|
+
| 风险 | 概率 | 影响 | 应对 |
|
|
133
|
+
| --- | --- | --- | --- |
|
|
134
|
+
| experiment.jsonl 无正文(前置阻塞) | 中 | 高 | 改从会话原始 JSONL 重建语料;第一天验证 |
|
|
135
|
+
| 标注信度 κ < 0.61 | 中 | 高 | 改标注手册、合并为二分标注、或把 E1 降为描述性 |
|
|
136
|
+
| E2 无显著差异 | 中 | 中 | E1 升为主结果,E2 转探索性附录 |
|
|
137
|
+
| 波段是连续量而非相变 | 中 | 中 | 改为连续测量论文(更保守但仍成立) |
|
|
138
|
+
| 样本量不足(会话数少) | 中 | 中 | 先跑 power analysis;不足则做被试内重复测量 |
|
|
139
|
+
| 伦理/导师不认可用自用数据 | 低 | 高 | 提前与导师确认;备选是公开任务集上的受控实验 |
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## 第五部分 · 立即执行的三步(本周)
|
|
144
|
+
|
|
145
|
+
1. **验数据**:跑一次解析脚本,确认 `experiment.jsonl` 与真实会话 JSONL 中 reasoning 正文的可得性与块数量,产出「语料可得性报告」。
|
|
146
|
+
2. **验信度**:抽 30 条 reasoning 块,定标注手册,标一遍,算第一版 κ。
|
|
147
|
+
3. **定题**:把本大纲压缩成 1 页预注册(假设、判据、止损线、样本量),交导师确认。
|
|
@@ -180,7 +180,16 @@ OpenViking 是 L0(~100 token) → L1(~2k) → L2(原文)。我们的实测是:
|
|
|
180
180
|
|
|
181
181
|
- **I1** Tier-0 常驻且 ≤ `B0`;**I2** Tier-1 每条 ≤ `L1`、条数 ≤ `K`;**I3** Tier-2 按块且 ≤ `B2`;
|
|
182
182
|
- **I4** 每层条目必须带 `layer` + `status`;
|
|
183
|
-
- **I5
|
|
183
|
+
- **I5**【**2026-09-19 R4-A 修正**】非 `current` 的条目在**检索侧「返回但标记」**、**注入侧「继续过滤」**;
|
|
184
|
+
> **修正依据(用户两次裁定)**:
|
|
185
|
+
> ① 「**返回但标记是正确的**」——作废条目对该 AI 是**有用信息**(「别用这条,看新的」比「查不到」更有价值);
|
|
186
|
+
> ② **`retracted` 也不过滤**:「**并不是挡,我感觉是备注**。因为比如说你之前踩过 3 次的那个坑,
|
|
187
|
+
> 如果你不记住这个教训的话,你还会再踩。」
|
|
188
|
+
> ⇒ 原措辞「**两处都被过滤**」已作废:**检索侧改为三态一律返回 + 标记**(`isRetrievablePre`,
|
|
189
|
+
> 只对未知值 fail-closed);**注入侧维持过滤**(`isCurrentPre`,常驻 800 token 不装过时条目)。
|
|
190
|
+
> **两处判据不同是有意为之**,不是漏改。
|
|
191
|
+
> 呈现:`superseded` ⇒ `⚠已作废(已被 mem_<32hex> 取代)`;`retracted` ⇒ `⚠已撤回(原因:<reason>;更正见 mem_<32hex>)`。
|
|
192
|
+
> **`retracted` 不是垃圾,它是教训**——这是本修正的核心。
|
|
184
193
|
- **I6** 三层来自同一份快照(同一 `miv`),混版视为错误;
|
|
185
194
|
- **I7** 索引未就绪 / 语义臂不可用**必须显式降级标注**(例:`[语义索引未就绪 · 已降级为词法]`),禁止静默丢弃注入。
|
|
186
195
|
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# 上游 issue / PR 批次 · 逐条判断与落地台账(2026-09-19)
|
|
2
|
+
|
|
3
|
+
> **背景**:合作方 `Minervaowl7` 于 2026-09-18 提交 issue **#75/#76** 与 PR **#77/#78/#79/#80**(来源:Qoder 审查报告 → 独立对抗复核)。
|
|
4
|
+
> **用户指示(2026-09-19 03:0x)**:「逐个判断修复,记得**不要只看局部,要看总体**,不要造成修复的错误问题。**修好以后,都要回复**,然后所有的 pull request 都要**礼节性地 merge**。」
|
|
5
|
+
|
|
6
|
+
## ★ 0. 两条线的关系(决定处置顺序,务必先读)
|
|
7
|
+
|
|
8
|
+
| | pre 开发线(本地 `D:\dsh-auto-memory`) | REL / main(远端正式版) |
|
|
9
|
+
|---|---|---|
|
|
10
|
+
| 文件名 | `lib/*-pre.js`(带 `-pre` 后缀) | `lib/*.js`(裸名,由 `tools/release.mjs` 转换) |
|
|
11
|
+
| 状态 | **活宿主代码**(profile `link:` 挂载) | **已发布 npm 3.0.0**,有真实用户 |
|
|
12
|
+
| 本批 PR 的 base | — | ✅ **PR 全部 base = `main`** |
|
|
13
|
+
|
|
14
|
+
**⇒ 关键结论(易错点)**:PR 是打在 **main** 上的,merge 它们**不影响本地 pre**(用户已确认此点)。
|
|
15
|
+
**但**用户后续「发大版本时用 pre 统一覆盖正式版」——**若 pre 线没有对应修复,覆盖时这些修复会丢**。
|
|
16
|
+
**⇒ 因此每一批修复必须做两件事:① merge PR(礼仪)② 在 pre 线落地同等修复(保数据)。**
|
|
17
|
+
|
|
18
|
+
**命名转换**:PR 里的 `lib/episodic-store.js` ↔ pre 线 `lib/episodic-store-pre.js`;`lib/memory-hub.js` ↔ `lib/memory-hub-pre.js`;以此类推。
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## 1. 逐条判断
|
|
23
|
+
|
|
24
|
+
### PR #77 — episodic_candidate 改增量导入(**P0 数据丢失**)
|
|
25
|
+
- **base/head**:`main` ← `fix/episodic-import-no-overwrite`;+113 −5;3 文件;mergeable ✅
|
|
26
|
+
- **Fixes**:#63、#57
|
|
27
|
+
- **判断**:✅ **内容正确,质量高**。与我方独立复核同源:
|
|
28
|
+
`ingestJudgement` 对每行 `episodic_candidate` 调 `stores.episodic.restore({schemaVersion:1, episodes:[row]})`,
|
|
29
|
+
而 `restore()` 是**快照整体替换**(先 `episodes=[]`);候选行缺 `validateEpisodePre` 必填字段 ⇒ 校验拒(`restored:0`)
|
|
30
|
+
但 **episodes 已清空、current 已置 null**,且返回 `{ok:true}` ⇒ hub 记 `consumedEpisodic++`/`outcome:'restored'`
|
|
31
|
+
⇒ 下次 consolidate/flush 把清空态落盘 ⇒ **一次 ingest 抹掉全部已巩固 episode,不可逆**。
|
|
32
|
+
- **修法**:新增 `importEpisodes(rows)`(逐条校验、合法才追加、**绝不清空既有状态**、按 episodeId 幂等);
|
|
33
|
+
`restore()` 保留给启动全量恢复;hub 的 episodic 分支改走 `importEpisodes([row])`,outcome 如实区分 `restored`/`rejected:N`。
|
|
34
|
+
- **pre 线现状**:**部分已修** —— #57(`restore` 形状校验)我方已修(`restoreCurrentPre`);
|
|
35
|
+
**#63(episodic_candidate 清空)尚未修** ⇒ **待落地**。
|
|
36
|
+
|
|
37
|
+
### PR #78 — index-sync 页字节预算留信封余量(**P0 死锁**)
|
|
38
|
+
- **base/head**:`main` ← `fix/index-sync-page-headroom`;+98 −2;2 文件;mergeable ✅
|
|
39
|
+
- **Fixes**:#64
|
|
40
|
+
- **判断**:✅ **内容正确**。`INDEX_SYNC_PAGE_BUDGET_V1.maxPageBytes` 与 `m7-wire` 的 `MAX_LINE_BYTES` **同为 256KiB**,
|
|
41
|
+
而分页闸只量 payload ⇒ 加上帧信封(实测约 **230B**)+ 换行后**必超限** ⇒ `worker_v1.py` 判 `line-oversize` fail-closed 退出;
|
|
42
|
+
终局错误帧 `requestId:''` 被当 unknownRequest 丢弃。死锁核心:熔断阈值 3,但每段 `index_sync_begin` 成功帧清零计数
|
|
43
|
+
⇒ 峰值 2 永不熔断;`syncId` 由 recordCount 确定性派生 ⇒ 重试恒重建同一坏页。
|
|
44
|
+
- **修法**:`maxPageBytes` 取 **252KiB**(4KiB 余量 ≈ 信封的 18 倍),常量与文件头注明原因。
|
|
45
|
+
- **pre 线现状**:**待落地**(需找到 pre 线对应常量)。
|
|
46
|
+
|
|
47
|
+
### PR #79 — 下载器每次镜像尝试前清空 tmp(**P1 静默损坏**)
|
|
48
|
+
- **base/head**:`main` ← `fix/downloader-fresh-attempt`;+63 −0;2 文件;mergeable ✅
|
|
49
|
+
- **Fixes**:#65
|
|
50
|
+
- **判断**:✅ **内容正确**。`fetchToFile` 对同一 `tmp/<basename>` 反复 `flag:'a'` 追加,
|
|
51
|
+
但只在 `run()` 开始清一次 tmp ⇒ 单文件双镜像重试时,源 A 的半截文件被续上源 B 的完整流;
|
|
52
|
+
**sha256 只对网络流累积、不回读文件** ⇒ 拼接体校验通过并 rename 落位,加载期才失败(118MB onnx)。
|
|
53
|
+
- **修法**:每次尝试开始 `rmSync(dst, {force:true})`。
|
|
54
|
+
- **pre 线现状**:**待落地**(需找到 pre 线 semantic-js 对应处)。
|
|
55
|
+
|
|
56
|
+
### PR #80 — 三处 store 数据完整性小修
|
|
57
|
+
- **base/head**:`main` ← `fix/store-hardening-20260918`;+97 −2;5 文件;mergeable ✅
|
|
58
|
+
- **Fixes**:#55、#56、#67
|
|
59
|
+
- **判断**:✅ **内容正确**;其中 **#55/#56 我方 pre 线已修**(本批 ① 已完工),**#67 尚未修**。
|
|
60
|
+
1. **#55** `storage-manage`:`readSidecarPrev` 引用未定义 `docStore` ⇒ ReferenceError 被吞 ⇒ 恒返 null
|
|
61
|
+
⇒ `repair()` 永远 `rebuildSidecar(file, undefined)` ⇒ 每次修复产生新 epoch + sourceVersion 回退(**自愈反向制造 stale**)。
|
|
62
|
+
**pre 线**:✅ 已修(补 `const docStore = docStoreOf()`)。
|
|
63
|
+
2. **#56** `evidence-store`:`_appended.add(id)` 在链式写入**执行前**,写失败无回滚 ⇒ 同 id 重试恒 `duplicate-evidence`(证据静默丢失)。
|
|
64
|
+
**pre 线**:✅ 已修(`written===false` 时 `_appended.delete(id)`;`BoundedIdSet` 补 `delete()`)。
|
|
65
|
+
3. **#67** `fact-store`:`conflicts.push({left: existing,...})` 持**活引用** ⇒ 后续 merge 原地改写 `confidence` 并对 `provenance`
|
|
66
|
+
**数组原地 push** ⇒ 已落盘(facts.json)的冲突左侧 ≠ 检测时值,**审计面失真**。
|
|
67
|
+
**pre 线**:⬜ **待落地**(登记时取检测时快照,含 provenance 数组副本)。
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 2. issue(跟踪项,非 PR)
|
|
72
|
+
|
|
73
|
+
### Issue #75 — `[P3]` 低危时序打包(CC-9 / CC-11)
|
|
74
|
+
1. **CC-9 延后写绑定错 child**(`lib/python-sidecar-client.js:211-213`):`writeChain.then` 回调解引用**当时的** child 变量;
|
|
75
|
+
writeChain 慢回调窗内 respawn ⇒ 旧 epoch 帧写入新 worker ⇒ 被判 staleEpoch 丢弃 ⇒ 请求挂满自身超时。
|
|
76
|
+
**修**:建帧时捕获 child 引用,flush 时校验身份。
|
|
77
|
+
2. **CC-11 stepFor 双自增压缩 TTL 窗**(`lib/activation-host.js:351` 定义,`:217/:237/:286` offer/pump 各调一次):
|
|
78
|
+
自增器被**两次调用**而零时间流逝 ⇒ `expiresAtStep` 按第一次烘焙、判定用第二次 ⇒ ttl=3 的自然窗 2 次机会缩为 1。
|
|
79
|
+
**修**:提供**只读** `currentStep` 给其中一处(「同步 offer+pump」不该消耗 2 步 TTL)。
|
|
80
|
+
|
|
81
|
+
### Issue #76 — `[P3]` 诊断盲区与卫生打包(6 项)
|
|
82
|
+
| 代号 | 位置 | 问题 | 修 |
|
|
83
|
+
|---|---|---|---|
|
|
84
|
+
| CB-2 | `memory-index.js:58,61` | 读 `prev.version`,但缓存写 `{fileDigest, sourceVersion}` ⇒ 恒 undefined ⇒ 版本振荡(edit1→v2、edit2→v2 卡死、unchanged→v1 回退) | 对齐键名 |
|
|
85
|
+
| CB-10 | `m7-index-sync-host.js:36` | `enabledKeys` 声明后**全仓无 `.add`** ⇒ `capturedPathKeys` 恒 `[]`;7 处 `drop` 第二参数全为字面量 `0` ⇒ `contextVersion` 恒 0 ⇒ 死锁在 `/state` 不可见 | drop 传真实 contextVersion;明确语义(注释与字段名矛盾) |
|
|
86
|
+
| CC-4 | `semantic-decide.js:173-177` vs `python/m7_activation_features_v2.py:292-294` | 硬门 reason 取名顺序**互为反序** ⇒ 多门共触时归因名不同(决策同为 suppress,仅诊断失真) | 统一顺序 |
|
|
87
|
+
| CC-6 | `semantic-js.js:428-479` | `bytesTotal` 用逐文件滚动基(每文件边界从 100% 回退);`verifying` 态无复位(黏滞);`opts.mirrors` 注入点被硬编码废掉 | 三处分别修 |
|
|
88
|
+
| CC-12 | `memory-hub.js:81-84` | 检查 `stores.facts.factCandidateFromJudgementRow`,但 `createFactStorePre` 返回对象**不含该方法**(模块级导出才有) ⇒ 委托分支恒走本地副本(**丢 ttl**),两适配器从此各自演化 | 对齐委托来源 |
|
|
89
|
+
| CC-13 | 三处零散 | a) `python-sidecar-client.js:280-287` `restart()` 注释称"全部 rejected"但函数体无结算;b) `memory-writer.js:297,483,486-498` `dirty` 标志**全仓无读者**;c) `fact-store.js:384` `clear()` 漏重置统计、`:256` `supersede()` 走 upsert 恒返回 `'created'` | 逐条修 |
|
|
90
|
+
|
|
91
|
+
**判断**:✅ 全部**为诊断级/潜伏态**(作者自述"不影响主链路数据"),与 `TODO-BACKLOG §B` 的"跨会话跨 Agent 检索"同属大排期,**不阻塞前端重构**。
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## 3. pre 线同步落地(✅ 全部完成 2026-09-19 04:0x)
|
|
96
|
+
|
|
97
|
+
| 序 | 项 | pre 线文件 | 状态 |
|
|
98
|
+
|---|---|---|---|
|
|
99
|
+
| 1 | **#63 episodic_candidate 清空**(PR #77,**P0 数据丢失**) | `episodic-store-pre.js` + `memory-hub-pre.js` | ✅ **已落地** |
|
|
100
|
+
| 2 | **#64 index-sync 页预算**(PR #78,**P0 死锁**) | `index-sync-pre.js`(252KiB + 注释说明原因) | ✅ **已落地** |
|
|
101
|
+
| 3 | **#65 下载器 tmp 拼接**(PR #79,**P1 静默损坏**) | `semantic-js-pre.js`(每次尝试前 `rmSync(dst)`) | ✅ **已落地** |
|
|
102
|
+
| 4 | **#67 fact-store 冲突左侧活引用**(PR #80 第 3 条) | `fact-store-pre.js`(登记时取快照 + provenance 副本) | ✅ **已落地** |
|
|
103
|
+
| 5 | #55/#56/#57 | — | ✅ 已修(本批 ①) |
|
|
104
|
+
| 6 | issue #75/#76(12 项 P3 诊断) | 多处 | ⬜ 未做(**不阻塞前端**,归大排期) |
|
|
105
|
+
| 7 | issue #73(17 个 smoke 腐坏 + python import 失效 + 无 CI) | `tests/smoke/` | ⬜ 未做(**独立跟踪**) |
|
|
106
|
+
|
|
107
|
+
### pre 线落地的四条实现要点(供压缩后恢复)
|
|
108
|
+
|
|
109
|
+
1. **#63**:`episodic-store-pre.js` 新增 **`importEpisodes(rows)`** —— 逐条校验、只追加合法项、按 `episodeId` 幂等、**绝不清空既有状态**;`restore()` 仍保留给启动全量恢复。
|
|
110
|
+
hub 的 episodic 分支改走它,**outcome 如实区分**(`imported` / `rejected:N` / `duplicate-episode`)。
|
|
111
|
+
⚠️ 加了 **fallback**:老 store 无 `importEpisodes` 时 fail-soft 返回 `no-import-episodes`,**绝不回退到 `restore`**。
|
|
112
|
+
2. **#64**:`INDEX_SYNC_PAGE_BUDGET_PRE_V1.maxPageBytes` 由 `256*1024` → **`252*1024`**,并写明原因(信封 202–230B + 换行,4KiB ≈ 18 倍余量)。
|
|
113
|
+
3. **#65**:`fetchToFile` 在建 hash **之前**加 `try { rmSync(dst, { force: true }) } catch (_) {}`。
|
|
114
|
+
4. **#67**:`conflicts.push` 的 `left` 由活引用 `existing` 改为 **`{ ...existing, provenance: [...existing.provenance] }`**(检测时快照);`right` 同样取副本。
|
|
115
|
+
|
|
116
|
+
**验收**:`tests/smoke/smoke-test-prsync-20260919-pre.mjs` **30/30**(含 #67 的行为验证:merge 反复改写后冲突左侧仍等于检测时值);
|
|
117
|
+
`artifacts/_mutate-prsync.mjs` **5/5 真红 + SHA256 逐字节还原**;**全量回归 PASS 128 / FAIL 0**(基线 127 → 128)。
|
|
118
|
+
|
|
119
|
+
**备份**:`lib/*.bak-20260919-PRsync`(5 个文件)。
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## 3.5 merge 与回复执行结果(✅ 全部完成 · 以 GitHub API 实测为准)
|
|
124
|
+
|
|
125
|
+
### PR(4/4 已合并 + 已回复)
|
|
126
|
+
| PR | 状态 | merge commit | 评论 |
|
|
127
|
+
|---|---|---|---|
|
|
128
|
+
| #77 | `closed` / **merged=true** | `25c1e8da` | ✅ 1 条 |
|
|
129
|
+
| #78 | `closed` / **merged=true** | `cb7e0c67` | ✅ 1 条 |
|
|
130
|
+
| #79 | `closed` / **merged=true** | `3e0218da` | ✅ 1 条 |
|
|
131
|
+
| #80 | `closed` / **merged=true** | `cc708392` | ✅ 1 条 |
|
|
132
|
+
|
|
133
|
+
- **merge 方式**:GitHub API `PUT /pulls/{n}/merge`,`merge_method=squash`,带 sha 校验(防并发漂移)。
|
|
134
|
+
- **凭据来源**:`git credential fill` 从 Windows Credential Manager 取(**不是** `~/.dsh/.credentials.yaml`,那里只有各家 API key)。
|
|
135
|
+
`gh` CLI **未安装**;`git config credential.helper = manager`。
|
|
136
|
+
- **★ 关键认知(用户已澄清)**:PR base = **main(正式版)** ⇒ **merge 不影响本地 pre**;用户发大版本时用 pre 统一覆盖。
|
|
137
|
+
⇒ 因此「merge 礼仪」与「pre 线落地」是**两件独立且都必须做**的事(见 §0 与 §3)。
|
|
138
|
+
|
|
139
|
+
### issue
|
|
140
|
+
| issue | 状态 | 说明 |
|
|
141
|
+
|---|---|---|
|
|
142
|
+
| #55 / #56 / #57 / #67 | `closed` / reason=**completed** / 各 1 条评论 | 我方已修 ⇒ **回复 + 关闭** |
|
|
143
|
+
| #63 / #64 / #65 | `closed` / reason=completed / **0 评论** | 由 PR body 的 `Fixes #N` **自动关闭**(本仓惯例,不额外补评论) |
|
|
144
|
+
| #73 | **open** | 17 个 smoke 腐坏 + python import 失效 + 仓库无 CI —— **独立跟踪项,未做** |
|
|
145
|
+
| #75 / #76 | **open** | 12 项 P3 诊断/卫生 —— **未做**,不阻塞前端 |
|
|
146
|
+
|
|
147
|
+
**main 最新 4 条提交**(均已落入正式版):
|
|
148
|
+
```
|
|
149
|
+
cc708392 fix(stores): repair 继承失效 / evidence 幂等缓存吞重试 / 冲突左侧活引用 (#80)
|
|
150
|
+
3e0218da fix(semantic-js): 下载器每次镜像尝试前清空 tmp 残留 (#79)
|
|
151
|
+
cb7e0c67 fix(index-sync): 页字节预算为线帧信封留余量 (#78)
|
|
152
|
+
25c1e8da fix(episodic): episodic_candidate 改增量导入 (#77)
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### 回复正文落盘位置
|
|
156
|
+
4 条 PR 评论 + 4 条 issue 评论的**完整正文**写在 `artifacts/_gh-reply-and-close.mjs`(`PR_COMMENTS` / `CLOSE` 两个对象),
|
|
157
|
+
已通过 API 发出;如需重发或改措辞,直接改该文件再跑即可。
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
## 3.6 第二批(2026-09-19 05:0x · 用户重启宿主后)
|
|
164
|
+
|
|
165
|
+
**用户指示**:「还有 11 个 issue 和 PR,把他们全修。首先判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**。如果问题还存在,就进行修复。修复以后:1) 如果是 issue,就回复关闭;2) 如果是 request,那就礼节性 merge。」
|
|
166
|
+
|
|
167
|
+
### 3.6.1 实测清单(11 issue + 4 PR = 15 条 open)
|
|
168
|
+
|
|
169
|
+
| 类型 | 编号 |
|
|
170
|
+
|---|---|
|
|
171
|
+
| issue | **#58**, #66, #68, #69, #70, #71, #72, #73, #74, #75, #76 |
|
|
172
|
+
| PR | **#59, #60, #61, #62** |
|
|
173
|
+
|
|
174
|
+
### 3.6.2 PR 处置结果(4/4 已处理)
|
|
175
|
+
|
|
176
|
+
| PR | 对应 issue | 状态 | 处置 |
|
|
177
|
+
|---|---|---|---|
|
|
178
|
+
| **#62** | #58 | `clean` | ✅ **squash-merge** `06154146ea232ce9a7ee6d881c7811bc0dc97943` + 回复 |
|
|
179
|
+
| **#59** | #55 | `dirty` | ⚠️ **内容已被 #80 等价覆盖** ⇒ 回复说明 + 关闭 |
|
|
180
|
+
| **#60** | #56 | `dirty` | ⚠️ **内容已被 #80 等价覆盖** ⇒ 回复说明 + 关闭 |
|
|
181
|
+
| **#61** | #57 | `dirty` | ⚠️ **内容已被 #77 等价覆盖** ⇒ 回复说明 + 关闭 |
|
|
182
|
+
|
|
183
|
+
**★ 为什么 #59/#60/#61 是 dirty(关键事实,已实测)**:
|
|
184
|
+
- 这三条 PR 与 #77/#80 在**同一文件的同一处**做了等价修复 ⇒ Git 判冲突。
|
|
185
|
+
对照证据:`#59` 改 `lib/storage-manage.js` 补 `const docStore = docStoreOf()` ↔ `#80` 同文件 +3−0;
|
|
186
|
+
`#60` 改 `lib/evidence-store.js` + `lib/context-bridge.js` ↔ `#80` 同两文件;
|
|
187
|
+
`#61` 新增 `validateEpisodeCurrentPre()` ↔ `#77` 的 `restoreCurrentPre()`(**函数名不同、语义相同**)。
|
|
188
|
+
- **无法先同步 base 再合并**:`PUT /pulls/{n}/update-branch` 返回 **403** `user doesn't have permission to update head repository`
|
|
189
|
+
—— PR 来自对方 **fork**,我方无权更新其分支。
|
|
190
|
+
- 因此按「内容已生效」处理:**回复说明 + 关闭**(回复里明确说明此事,并承诺「若希望保留 PR 形式可重开一条基于当前 main 的分支」)。
|
|
191
|
+
- **一个遗憾(已登记)**:`#59` 附带的 `tests/smoke/smoke-test-issue55-sidecar-prev-pre.mjs`(141 行)**未随 #80 进 main**,
|
|
192
|
+
#80 带的是合并版 `smoke-test-store-hardening-pre.mjs`;前者更聚焦。
|
|
193
|
+
|
|
194
|
+
### 3.6.3 issue 存活核验(进行中)
|
|
195
|
+
|
|
196
|
+
**核验口径(用户明确要求)**:「判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**」——报告基于 `main@d816497`(v3.0.0) 写,
|
|
197
|
+
而 pre 线已经过 **L/M/R 多轮优化**,部分问题可能已被顺手修掉。
|
|
198
|
+
|
|
199
|
+
**★ 先例**:**#58 在 ① 批次就已修好** —— `activation-host-pre.js:531` 已按登记的 `st.stepKey` 精确回收(不再重新拼键),
|
|
200
|
+
`index.js:1088` 已接线 `this._activationHost.disposeRuntime(runtime.key)`。报告里的「根因 1 零调用方 + 根因 2 键错配」**两条都已在 pre 线解决**。
|
|
201
|
+
|
|
202
|
+
**已实测确认仍存在的 3 条**:
|
|
203
|
+
- **#66**(BOM 偏移 3 字节,P1):`memory-anchor-pre.js:125-126` 剥 BOM 后给偏移;`memory-writer-pre.js:106/109` 直接用于含 BOM buffer,**无 bomLen 对齐**。
|
|
204
|
+
- **#69**(currentEpoch 采样在 spawn 前,P2):`m7-index-sync-host-pre.js:90` 的 `currentEpoch()` 仍在 `sendIndexSyncPlanPre` **之前**;`:101` 失效条件仍带 `epoch &&` 前置。
|
|
205
|
+
- **#71**(growToMin 压空白,P2):`l0-extract-pre.js:461` 先 `.replace(/\s+/g,' ')`、`:463` 再用**含 `\n` 的** `SENTENCE_SPLIT_RE(:41)` split ⇒ 换行分支死代码成立。
|
|
206
|
+
|
|
207
|
+
**其余 8 条**(#68/#70/#72/#73/#74/#75/#76)由两个只读子代理并行核验中。
|
|
208
|
+
|
|
209
|
+
### 3.6.4 纪律警示(本批次新增)
|
|
210
|
+
|
|
211
|
+
- **★ PR 来自 fork 时无权 update-branch**(403)⇒ 若 PR 与已合并的等价修复冲突,**只能回复 + 关闭**,不能"先同步再合并"。
|
|
212
|
+
- **★ 同一修复可能以不同函数名出现在两个 PR 里**(`validateEpisodeCurrentPre` vs `restoreCurrentPre`)⇒ 判 dirty 时必须**比对语义**而非只看名字。
|
|
213
|
+
- **★ `git credential fill` 从 Windows Credential Manager 取 token 可用**(`gh` CLI 未安装)—— 本轮全部 GitHub 操作均走此路径。
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## 4. 后续(未做,登记防遗忘)
|
|
218
|
+
|
|
219
|
+
| 项 | 内容 | 阻塞前端? |
|
|
220
|
+
|---|---|---|
|
|
221
|
+
| **#73** | 17 个 smoke 腐坏 + `python/` 测试 import 失效 + 仓库无 CI | ❌ 不阻塞(但会让"回归全绿"的可信度打折,建议前端前处理) |
|
|
222
|
+
| **#75** | CC-9 延后写绑定错 child / CC-11 stepFor 双自增压缩 TTL 窗 | ❌ 不阻塞(低危时序) |
|
|
223
|
+
| **#76** | CB-2 / CB-10 / CC-4 / CC-6 / CC-12 / CC-13 六项诊断盲区与卫生 | ❌ 不阻塞 |
|
|
224
|
+
| **#77 遗留一问** | 「熔断计数被成功帧清零」不只影响 page-oversize —— 任何"成功一次就重置"的熔断都会退化 ⇒ 建议单开跟踪 | ❌ 不阻塞 |
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
## 4. 回复与 merge(礼仪)
|
|
230
|
+
|
|
231
|
+
- **回复要点**(每个 PR/issue):① 确认复核结论(我们独立验证过)② 说明落点(pre 线已同步 / 已随版本发布)③ 致谢。
|
|
232
|
+
- **merge 政策**(用户 2026-09-19 明确):「我本地是 pre,远端是正式版 ⇒ **礼节性 merge 不会对本地造成影响**,等我发大版本时统一覆盖」⇒ **全部 merge**。
|
|
233
|
+
- **凭据实测**:本机 `gh` CLI **未安装**;`git config credential.helper = manager`;2026-09-13 已验证「fine-grained PAT 可合并自己仓库的 PR」。
|
|
234
|
+
⇒ merge 走 GitHub API(`PUT /repos/Aik358/dsh-auto-memory/pulls/{n}/merge`),token 从本机凭据取。
|
|
235
|
+
- **issue 关闭**:#63/#64/#65 由 PR merge 自动关闭(body 含 `Fixes #N`);**已修复但未关闭**的(#55/#56/#57/#67)需手动回复 + 关闭。
|
|
236
|
+
|
|
237
|
+
---
|
|
238
|
+
|
|
239
|
+
## 3.7 第二批 issue 最终处置结果(2026-09-19 17:5x)
|
|
240
|
+
|
|
241
|
+
**全量回归基线**:128 → 131(①②③)→ 132(#72)→ 133(#76)→ 134(#74)→ **135**(#75)。
|
|
242
|
+
**判据**:用户指令「先判断这个 bug 报告**是否适用于进行过一轮底层优化的版本**,如果问题还存在就修复」。
|
|
243
|
+
|
|
244
|
+
### 逐条结果
|
|
245
|
+
|
|
246
|
+
| issue | 优先级 | 核验结论 | 处置 |
|
|
247
|
+
|---|---|---|---|
|
|
248
|
+
| **#58** | P1 | STILL_EXISTS | ✅ 由 PR **#62** squash-merge 关闭(`06154146`) |
|
|
249
|
+
| **#66** | P2 | STILL_EXISTS | ✅ **已修**(BOM 剥离 · 消费侧)· batch3 21/21 · 变异 3/3 |
|
|
250
|
+
| **#68** | P1 | STILL_EXISTS | ✅ **已修**(JS/Python 分叉 · `isAlnumPythonish`)· batch4 14/14 · 变异 3/3 |
|
|
251
|
+
| **#69** | P2 | STILL_EXISTS | ✅ **已修**(index-sync epoch 判据)· batch2 · 变异真红 |
|
|
252
|
+
| **#70** | P2 | STILL_EXISTS | ✅ **已修**(degraded 有界重试 + probe 暴露)· batch2 · 变异真红 |
|
|
253
|
+
| **#71** | P2 | STILL_EXISTS | ✅ **已修**(`growToMin` 保留行界)· batch2 · 变异真红 |
|
|
254
|
+
| **#72** | P2 | STILL_EXISTS | ✅ **已修**(epoch 门 fail-closed + 三条路径清 buffer)· batch5 12/12 · 变异 **3/3** |
|
|
255
|
+
| **#73** | P1 | **部分不成立** | ✅ **已修可修部分**(新增 `.github/workflows/tests.yml` + `--exclude`);17 红 + import 失效在 pre 线**不存在** |
|
|
256
|
+
| **#74** | P3 | STILL_EXISTS | ✅ **已修**(月末钳制 + 模糊量词 + 正则锚定 + 分量校验)· batch7 24/24 · 变异 **4/4** |
|
|
257
|
+
| **#75** | P3 | STILL_EXISTS | ✅ **已修**(writeFrame 身份绑定 + currentStepOf 只读步)· batch8 15/15 · 变异 **3/3** |
|
|
258
|
+
| **#76** | P3 | **部分成立** | ✅ **已修 2 项**(hub 死委托 + clear 统计)· batch6 12/12 · 变异 **2/2** |
|
|
259
|
+
|
|
260
|
+
### 关键核验发现(#73):**上游 issue 的根因清单可能整体过时**
|
|
261
|
+
|
|
262
|
+
#73 声称「17 个 smoke 套件腐坏 + `tests/test_m7_features_v2.py` import 失效 + 仓库无 test CI」。
|
|
263
|
+
逐条在当前 pre 线实跑后:
|
|
264
|
+
|
|
265
|
+
| #73 主张 | pre 线实况 |
|
|
266
|
+
|---|---|
|
|
267
|
+
| 17 个 smoke 红 | ❌ **不成立** — 17 个套件**全部存在且全绿**(PASS 134 / FAIL 0) |
|
|
268
|
+
| `test_m7_features_v2.py` import 失效 | ❌ **不成立** — `python/m7_activation_features_pre_v2.py` **存在**,import 有效 |
|
|
269
|
+
| python/bench/.venv 缺失 | ❌ **不成立** — 本机存在(但确在 `.gitignore:9`,CI 需排除) |
|
|
270
|
+
| artifacts/release-c2-asset-pack 缺失 | ❌ **不成立** — 本机存在(确在 `.gitignore:25`) |
|
|
271
|
+
| fixture 冻结值 `m7_chunk_pre_v1` vs 运行时 `m7_chunk_v1` | ⚠️ 差异**存在但属设计**(烟测 `:28` 正向断言该冻结值) |
|
|
272
|
+
| **仓库无 test CI** | ✅ **成立**(两条线都有) ⇒ 这是 issue 自己列的第一条修复建议,**已落地** |
|
|
273
|
+
|
|
274
|
+
**⇒ 纪律**:核验上游 issue 时,必须**逐条在当前线实跑**,只修仍然成立的部分。v3.0.0(main@d816497) 的事实经 L/M/R 多轮优化后可能整体失效。
|
|
275
|
+
|
|
276
|
+
### 本批新增的两条可复用纪律
|
|
277
|
+
|
|
278
|
+
1. **「上游 issue 的根因清单可能整体过时」** — 见上表。
|
|
279
|
+
2. **「`edit` 工具会改变文件行尾」** — 用 `edit` 写入 `lib/temporal-parse-pre.js` 后该文件从 CRLF 变**全 LF**(191 行),而本仓 `lib/*.js` 全是 CRLF。后果:① 基于 `\r\n` 的变异脚本锚点**全部不命中**(表现为「变异未命中源码」SKIP)② 污染 git diff。修法:`[System.IO.File]::WriteAllText` + `UTF8Encoding($false)` 转回;验收:`(s.match(/\r\n/g)||[]).length` 应等于总行数。**排查信号**:变异脚本报「未命中源码」而人工确认文本存在 ⇒ 先查行尾。
|
|
280
|
+
|
|
281
|
+
### 新增测试资产(本批 5 个套件 + 4 个变异脚本)
|
|
282
|
+
|
|
283
|
+
| 文件 | 覆盖 | 结果 |
|
|
284
|
+
|---|---|---|
|
|
285
|
+
| `tests/smoke/smoke-test-batch5-20260919-pre.mjs` | #72 | 12/12 |
|
|
286
|
+
| `tests/smoke/smoke-test-batch6-20260919-pre.mjs` | #76-5 / #76-6c | 12/12 |
|
|
287
|
+
| `tests/smoke/smoke-test-batch7-20260919-pre.mjs` | #74 四项 | 24/24 |
|
|
288
|
+
| `artifacts/_mutate-batch5.mjs` | #72 三处 | **3/3 真红** |
|
|
289
|
+
| `artifacts/_mutate-batch6.mjs` | #76 两处 | **2/2 真红** |
|
|
290
|
+
| `artifacts/_mutate-batch7.mjs` | #74 四处 | **4/4 真红** |
|
|
291
|
+
|
|
292
|
+
(batch2/3/4 见 §3.6;全部变异演示均 SHA256 逐字节还原。)
|
|
293
|
+
|
|
294
|
+
### 未做(登记待办,不阻塞前端)
|
|
295
|
+
|
|
296
|
+
- ~~**#75**~~(P3)✅ **已修**(2026-09-19):CC-9 `writeFrame` 建帧时捕获 `child` 引用 + flush 校验身份;CC-11 新增只读 `currentStepOf` 供 `pumpClaimed` 使用(同一步不再消耗 2 步 TTL)。
|
|
297
|
+
- **#76 剩余 4 项**(P3 诊断级):CB-2 memory-index 版本振荡 · CB-10 index-sync `enabledKeys` 恒空 · CC-4 硬门归因序反序 · CC-6 下载进度显示 · CC-12 已修 · CC-13a/b 卫生。
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
# 上游 issue 第三批核验(2026-09-20)· pre 线适用性判定
|
|
2
|
+
|
|
3
|
+
> 来源:https://github.com/Aik358/dsh-auto-memory/issues
|
|
4
|
+
> 背景:用户问「能不能合并一起改」+「逐步改完逐步回归时间太长就明天再说」
|
|
5
|
+
> **纪律**:先实跑核验是否适用于当前 pre 线版本,**不照单全修**(仓库既有铁律)
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、分类结论
|
|
10
|
+
|
|
11
|
+
### A 类 · pre 线已重构掉,**不适用**(4 条,零动作)
|
|
12
|
+
|
|
13
|
+
| issue | 上游说法 | pre 线实测 |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| **#83** | `lib/ledger-criteria.js` 与 `wb-contract.js` 同名异体重复实现 | **`lib/ledger-criteria.js` 根本不存在** ⇒ 已重构掉 |
|
|
16
|
+
| **#86-1** | `rerank-host.js` 的 `sha256Hex` 实为 FNV-1a 同名异义 | **`lib/rerank-host.js` 不存在** ⇒ 已移除 |
|
|
17
|
+
| **#86-2** | `canonicalJson` 双份(`m7-wire.js` + `state-commit.js`) | **`lib/state-commit.js` 不存在** ⇒ 双份已消解 |
|
|
18
|
+
| **#100-⑦** | 倒计时小数秒 `Math.ceil(msDiff)/1000` | **`Math.ceil(msDiff)` 零命中** ⇒ 已重构 |
|
|
19
|
+
|
|
20
|
+
### B 类 · **确实适用**,但风险分级不同(5 条)
|
|
21
|
+
|
|
22
|
+
| issue | pre 线实测 | 风险 | 今晚做? |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| **#82** | 写侧 `:10528` 仍裸 `readFileSync→writeFileSync` 非原子、无队列;加载侧 `:1861/:1878` 仍 `_mergeConfigPre(null)` 静默回落 | **中**(配置写路径,触及启动) | ⏸ 明天 |
|
|
25
|
+
| **#86-4** | 水位 `0.75` **7 处内联**(`:2989 :3318 :3504 :4111 :4117 :4136 :5489`),真源 `:366` | **低**(纯常量化) | ✅ 可做 |
|
|
26
|
+
| **#86-3** | `DSH_HOME` 解析 **20 处**(跨 6+ 文件) | **中**(跨文件重构) | ⏸ 明天 |
|
|
27
|
+
| **#84** | `volatileEvents ≤16`(`:48`);`unhandledRejection` 守卫 `:8896` 无计数 | **中低**(新增诊断文件) | ⏸ 明天 |
|
|
28
|
+
| **#99-③** | **已有** `removeArm` 两步武装(`:3559-3561`) | 待核 | ⏸ 明天 |
|
|
29
|
+
|
|
30
|
+
### C 类 · 已在早前批次处理过(历史)
|
|
31
|
+
|
|
32
|
+
`#73`(17 个 smoke 红)— pre 线全量回归 **PASS 134 / FAIL 0**,该 issue 基于 `main@d816497(v3.0.0)`,结论**整体过时**。
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 二、今晚执行:**#86-4 水位常量化**(唯一低危项)
|
|
37
|
+
|
|
38
|
+
### 为什么单独做这一条
|
|
39
|
+
|
|
40
|
+
1. **零行为变更**:`|| 0.75` 与常量 `DEFAULT_WATER_LEVEL_THRESHOLD = 0.75` **取值完全相同**,只是把散落的魔法数字收敛到一处;
|
|
41
|
+
2. **价值成立**:该默认值历史上**全局调过一次**(0.8 → 0.75),下次再调极易漏站点——7 处任何一处漏改就是静默不一致;
|
|
42
|
+
3. **可验证**:改后全量回归必须仍然 **134/0**,且新增断言锁住「内联 0.75 归零」。
|
|
43
|
+
|
|
44
|
+
### 改动方式(最小改法)
|
|
45
|
+
|
|
46
|
+
- 在 `DEFAULT_CONFIG` 附近新增 `export const DEFAULT_WATER_LEVEL_THRESHOLD = 0.75`;
|
|
47
|
+
- 7 处 `|| 0.75` 全部替换为 `|| DEFAULT_WATER_LEVEL_THRESHOLD`;
|
|
48
|
+
- `DEFAULT_CONFIG.waterLevelThreshold` 引用该常量(消除「真源也没引用常量」的漏洞);
|
|
49
|
+
- **不动** `Math.max(..., 0.1)` 的下限逻辑(那是另一件事)。
|
|
50
|
+
|
|
51
|
+
### 验收(已实跑完成)
|
|
52
|
+
|
|
53
|
+
| 项 | 结果 |
|
|
54
|
+
|---|---|
|
|
55
|
+
| `node --check` | ✅ |
|
|
56
|
+
| 新增套件 `smoke-test-t7a-defaults-pre.mjs` | ✅ **5 / 5** |
|
|
57
|
+
| 变异验证 `artifacts/_mutate-t7a.mjs` | ✅ **4 / 4 真红**(含「耦合」靶点) |
|
|
58
|
+
| 字节一致还原 | ✅ SHA256 `E3271975…2B45` |
|
|
59
|
+
| **全量回归** | ✅ **PASS 135 / FAIL 0 / TIMEOUT 0(136.5s)**(134→135,新增 T7-a 套件) |
|
|
60
|
+
|
|
61
|
+
### ★ 执行中的两个重要发现(都已处置)
|
|
62
|
+
|
|
63
|
+
**① 差点把两个独立开关耦合成一个(初版错误,当场修正)**
|
|
64
|
+
|
|
65
|
+
首版脚本用一条正则 `\|\| 0\.75(?=[,)])` 全量替换,把 `autoContinueThreshold` 的两处兜底
|
|
66
|
+
**也**换成了 `DEFAULT_WATER_LEVEL_THRESHOLD`。但 `autoContinueThreshold` 是**独立配置项**
|
|
67
|
+
(注释只说它俩历史上被同时下调过一次)——共用常量会让「只调水位、不动自动接续」变成不可能,
|
|
68
|
+
**违反本仓「功能开关必须解耦」纪律**。
|
|
69
|
+
|
|
70
|
+
处置:建**第二个**常量 `DEFAULT_AUTO_CONTINUE_THRESHOLD = 0.75`(附注释说明为何故意不复用),
|
|
71
|
+
并新增断言 **T7-4** 专门锁「两个开关不得共用同一常量」——变异验证确认该断言真红。
|
|
72
|
+
|
|
73
|
+
**② 新增模块级常量会打破所有「源码抽取式」测试(连锁 3 个套件)**
|
|
74
|
+
|
|
75
|
+
`lib/index.js` 里有若干套件用 `new Function` 把方法体从源码里抽出来执行(`extractFn` + `new Function(...names, ...)`),
|
|
76
|
+
作用域里**没有模块级绑定**。常量一抽,这些套件立刻 `ReferenceError: DEFAULT_..._THRESHOLD is not defined`:
|
|
77
|
+
|
|
78
|
+
| 套件 | 表现 | 处置 |
|
|
79
|
+
|---|---|---|
|
|
80
|
+
| `smoke-test-switch-decouple-pre.mjs` | 组件常量未注入,直接崩 | 注入 2 个常量(同值 0.75) |
|
|
81
|
+
| `smoke-test-handoff-pre.mjs` | `renderMemoryDynamic` 抽取体引用崩 | `helperCode` 拼上常量声明 |
|
|
82
|
+
| `smoke-test-autocont-host-pre.mjs` | **最隐蔽**:`ReferenceError` 被 `armAutoContinue` 自身 catch 吞掉 ⇒ 表现为「水位达标却不 arm」,报 `Cannot read properties of undefined (reading 'armed')` | 注入 2 个常量 |
|
|
83
|
+
|
|
84
|
+
⇒ **纪律**:此后凡被抽出的函数新增外部依赖(模块级绑定/全局),都必须同步加进该套件的注入表,
|
|
85
|
+
否则以「静默不生效」形式失败。已写入技能库。
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## 三、明天待办(登记防遗忘)
|
|
90
|
+
|
|
91
|
+
1. **#82 配置读写链**(中):写侧原子化 + 队列串行;加载侧损坏文件改名 `.corrupt-<ts>` 保留 + 面板可见
|
|
92
|
+
2. **#86-3 `resolveDshHome()` 统一**(中):20 处、三种口径(trim 与否 / 回退次序)
|
|
93
|
+
3. **#84 诊断留痕**(中低):有界 NDJSON + diag 行补 ID + rejection 计数入 debugView
|
|
94
|
+
4. **#86-5 `scanZstdFrames` 双解析器**(低)
|
|
95
|
+
5. **#99-③ 核实**:三联动删除的二次确认现状
|
|
96
|
+
6. **上游 PR #96–#100 的评阅**:它们是同一审计员的提交,**基线都是 `upstream/main@11f0d98`**,需逐条核验是否已在我的 pre 线修复(本次已核 4 条不适用)
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 四、给用户的判断
|
|
101
|
+
|
|
102
|
+
**「合并一起改」不建议**——理由:这 5 条 B 类触及**三个不同子系统**(配置读写 / 诊断通道 / 水位),合并成一个 PR 会让「回归红了定位不到是哪条引起」的成本远高于收益。
|
|
103
|
+
|
|
104
|
+
**建议按子系统分三批**:① 水位(今晚,已完成)② 配置读写(明天)③ 诊断通道(明天)。每批独立回归,基线清晰。
|
|
Binary file
|