@a9i5k4/dsh-auto-memory 3.0.1 → 3.1.0
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 +13 -8
- package/README.zh-CN.md +13 -8
- package/docs/HANDBOOK.md +88 -52
- package/docs/USER-GUIDE.en.md +9 -9
- package/docs/USER-GUIDE.zh-CN.md +9 -9
- package/docs/screenshots/promo/promo-0-banner-v4.png +0 -0
- package/docs/screenshots/promo/promo-1b-auto-recall.png +0 -0
- package/lib/activation-host.js +6 -1
- package/lib/client.js +819 -272
- package/lib/context-host.js +7 -1
- package/lib/episodic-store.js +90 -16
- package/lib/fact-store.js +463 -41
- package/lib/hub-io.js +217 -0
- package/lib/index.js +224 -45
- package/lib/intent-clean-safe.js +1 -1
- package/lib/memory-hub.js +37 -5
- package/lib/note-status.js +9 -1
- package/lib/procedure-store.js +252 -31
- package/lib/procedure-switch.js +38 -0
- package/lib/python-sidecar-client.js +285 -8
- package/package.json +6 -2
- package/docs/internal/ACCEPT-35-LIVE.md +0 -143
- package/docs/internal/ACCEPTANCE-20260914.md +0 -90
- package/docs/internal/ARCH-REVIEW-BRIEF.md +0 -411
- package/docs/internal/ARCH-REVIEW-REQUEST.md +0 -201
- package/docs/internal/ARCH-REVIEW-ROUND2.md +0 -169
- package/docs/internal/ARCH-REVIEW-ROUND3.md +0 -206
- package/docs/internal/ARCHITECTURE-FOR-ZCODE-20260920.md +0 -397
- package/docs/internal/ART-DIRECTION-DEEPSEEK-20260920.md +0 -351
- package/docs/internal/ART-DIRECTION-WIREFRAME.md +0 -191
- package/docs/internal/ART-DIRECTION-WIREFRAME.md.bak-superseded +0 -181
- package/docs/internal/AUDIT-WB-GRAPH-FULL-20260916.md +0 -314
- package/docs/internal/BATTLE-PLAN-20260917.md +0 -871
- package/docs/internal/CONCURRENCY-INVESTIGATION-20260917.md +0 -192
- package/docs/internal/CROSS-SESSION-SEARCH-PATH-DECISION.md +0 -72
- package/docs/internal/CROSS-SESSION-SEARCH-RESEARCH.md +0 -131
- package/docs/internal/CUA-VISION-FIX-NOTES.md +0 -78
- package/docs/internal/DECISIONS-20260914-SESSION.md +0 -269
- package/docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md +0 -292
- package/docs/internal/DESIGN-P1-STATE-COMMIT-20260915.md +0 -219
- package/docs/internal/DIRECTION-CHECK-WB-GRAPH-20260916.md +0 -132
- package/docs/internal/FEATURE-INVENTORY.md +0 -531
- package/docs/internal/FEEDBACK-TO-DSHAPI-RELAY.md +0 -13
- package/docs/internal/G-SERIES-EXECUTION-20260917.md +0 -248
- package/docs/internal/G3-DESIGN-20260918.md +0 -82
- package/docs/internal/G3-DISK-FORMAT-GAP-20260919.md +0 -92
- package/docs/internal/GH-DISCUSSION-5732-COMMENT.md +0 -74
- package/docs/internal/GPT-ACCEPTANCE-PROMPT-20260916.md +0 -352
- package/docs/internal/GPT-REVIEW-PROMPT.md +0 -216
- package/docs/internal/GROUP-DIGEST-SETUP.md +0 -62
- package/docs/internal/GROUP-LISTENER-SETUP.md +0 -49
- package/docs/internal/GROUP-WEBHOOK-SETUP.md +0 -93
- package/docs/internal/HANDOFF-TO-ZCODE-20260920.md +0 -309
- package/docs/internal/HANDOFF-TO-ZCODE.md +0 -168
- package/docs/internal/HERMES-DATA-VERIFICATION-20260919.md +0 -120
- package/docs/internal/HERMES-LEGACY-STATUS-20260919.md +0 -74
- package/docs/internal/ISSUE-55-58-VERIFICATION-20260918.md +0 -175
- package/docs/internal/ISSUE10-FIX-EXECUTION-20260919.md +0 -389
- package/docs/internal/ISSUE10-PLAN-20260919.md +0 -254
- package/docs/internal/ISSUE10B-FORENSICS-20260919.md +0 -468
- package/docs/internal/ISSUE9-PURGE-AND-R1-PLAIN-20260919.md +0 -150
- package/docs/internal/ISSUE9-RESIDUAL-FORENSICS-20260919.md +0 -114
- package/docs/internal/KICKOFF-P0.md +0 -254
- package/docs/internal/LESSON-TO-CANDIDATE-STATUS-20260919.md +0 -79
- package/docs/internal/MASTER-PLAN-3.0.md +0 -411
- package/docs/internal/MEMORY-GOVERNANCE-20260917.md +0 -309
- package/docs/internal/MEMORY-MUTATION-AND-INDEX-DESIGN.md +0 -85
- package/docs/internal/MERGE-CONFLICT-SCAN-20260914.md +0 -222
- package/docs/internal/NEXT-VERSION-TODO.md +0 -95
- package/docs/internal/OFFICIAL-DISCUSSION-DRAFT.md +0 -80
- package/docs/internal/PENDING-FIXES-20260916.md +0 -289
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md +0 -705
- package/docs/internal/PRE-FRONTEND-CHECKLIST-20260919.md.bak-s10 +0 -649
- package/docs/internal/PROCEDURAL-MEMORY-AND-APPROVAL-DESIGN-20260918.md +0 -225
- package/docs/internal/PROGRESS-20260917.md +0 -93
- package/docs/internal/PROMPT-GAP-AUDIT-20260920.md +0 -128
- package/docs/internal/R1-DEGRADE-AUDIT-20260918.md +0 -163
- package/docs/internal/R1-READABILITY-FORENSICS-20260919.md +0 -127
- package/docs/internal/R2-EVIDENCE-DEEP-AUDIT-20260918.md +0 -140
- package/docs/internal/R3-DEGRADE-LEDGER-DESIGN-20260918.md +0 -138
- package/docs/internal/R4-RECALL-QUOTA-PLAN-20260918.md +0 -218
- package/docs/internal/RAG-KARPATHY-PROGRAM.md +0 -229
- package/docs/internal/RELEASE-PROCESS.md +0 -99
- package/docs/internal/REPORT-P0-NIGHTLY.md +0 -212
- package/docs/internal/REPORT-P5-ACCEPTANCE.md +0 -31
- package/docs/internal/REPORT-WB-GRAPH-NIGHTLY.md +0 -153
- package/docs/internal/RESUME-20260918.md +0 -171
- package/docs/internal/RESUME-20260919.md +0 -104
- package/docs/internal/REVIEW-WB-GRAPH-SELF.md +0 -81
- package/docs/internal/RHINELAB-TO-DEEPSEEK-FEASIBILITY.md +0 -198
- package/docs/internal/ROADMAP-20260917-WEEK.md +0 -439
- package/docs/internal/ROADMAP.md +0 -106
- package/docs/internal/RUN-P0-NIGHTLY.md +0 -227
- package/docs/internal/S10-CONSTRUCTION-HANDOFF-20260917.md +0 -185
- package/docs/internal/S10-GAP-INVENTORY-20260917.md +0 -239
- package/docs/internal/S10-GAPS-PLAIN-20260917.md +0 -125
- package/docs/internal/SEMANTIC-ARCHITECTURE-SPEC.md +0 -360
- package/docs/internal/SESSION-FILE-REPAIR-PROTOCOL.md +0 -90
- package/docs/internal/SUBAGENT-REPORT-ROUTING-PRE-RESEARCH.md +0 -261
- package/docs/internal/T6-EXECUTION-20260920.md +0 -130
- package/docs/internal/TELEMETRY-EFFECT-REPORT-DESIGN-20260918.md +0 -146
- package/docs/internal/THESIS-GAP-ANALYSIS-20260918.md +0 -89
- package/docs/internal/THESIS-OUTLINE-20260918.md +0 -147
- package/docs/internal/THREE-LAYER-CONTRACT.md +0 -219
- package/docs/internal/TODO-BACKLOG.md +0 -263
- package/docs/internal/TODO-GRAPH.html +0 -715
- package/docs/internal/TODO-GRAPH.html.bak-20260914-v2 +0 -493
- package/docs/internal/TODO-GRAPH.html.bak-20260915-alsfix +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p1 +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260915-p6a-rev +0 -703
- package/docs/internal/TODO-GRAPH.html.bak-20260915-wshint +0 -710
- package/docs/internal/TODO-GRAPH.html.bak-20260916-batch +0 -715
- package/docs/internal/UPSTREAM-ISSUE-PR-TRIAGE-20260919.md +0 -297
- package/docs/internal/UPSTREAM-ISSUES-3RD-AUDIT-20260920.md +0 -104
- package/docs/internal/WB-FORMAT-CONVENTION.md +0 -112
- package/docs/internal/WB-GRAPH-DECISIONS-20260914.md +0 -71
- package/docs/internal/WB-GRAPH-INTEGRATION-PLAN.md +0 -386
- package/docs/internal/WB-GRAPH-RESEARCH-BRIEF.md +0 -118
- package/docs/internal/WB-GRAPH-RESEARCH-EXTERNAL.md +0 -228
- package/docs/internal/WB-GRAPH-RESEARCH-LOCAL.md +0 -190
- package/docs/internal/reviews/CLAIM-VERIFICATION-20260914.md +0 -56
- package/docs/internal/reviews/PLAN-gpt6astra-round2-20260914.md +0 -787
- package/docs/internal/reviews/REVIEW-gpt6astra-20260914.md +0 -112
- package/docs/internal/reviews/ROUND3-REVIEW-INTEGRATION-20260914.md +0 -230
|
@@ -1,181 +0,0 @@
|
|
|
1
|
-
# 美术方向与动效规格(线框稿 · EVA 式克制线描 · 24fps)
|
|
2
|
-
|
|
3
|
-
> 生成时间:2026-09-10 · 配套:`docs/internal/DESIGN-OVERHAUL-PRE-RESEARCH.md`(排期与边界)
|
|
4
|
-
> 本文用途:把「线框稿 + 克制线描 + 动漫人物 + 24 帧动效」翻译成**可施工的规格**;其中 §5 是**可直接交给 Astra 的交付契约**。
|
|
5
|
-
> 待补输入:官方 DSH 网页的确切 URL/截图(你提供后并入 §1.1)。
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## 1. 参考系(三层,已核实)
|
|
10
|
-
|
|
11
|
-
### 1.1 官方 DSH(代码级)
|
|
12
|
-
- 品牌元件:`@deepseek-ai/dsh-client-ui-primitives` 的 **`FishLogo`(鲸鱼标)** + **`BrandWordmark`(字标)**;官方品牌插件 `dsh-client-ui-brand-official` 只注册侧栏的 `sidebar.brand.mark` / `sidebar.brand.name` 两个插槽。
|
|
13
|
-
- 视觉底座:`dsh-client-ui-theme` 定义 **`--dsw-*` 令牌**(79 个公开语义别名,纯颜色层,亮/暗自动切换)。
|
|
14
|
-
- 结论:**官方语言 = 记号(鲸鱼)+ 克制排版 + 令牌化配色**——与"线框稿 + 克制色"的方向天然一致。
|
|
15
|
-
|
|
16
|
-
### 1.2 本项目首页现有令牌(可复用,别推翻)
|
|
17
|
-
`docs/landing/index.html` 的 `:root`:暖纸 `#F4F1EB` / 次纸 `#ECE8DF` / 墨 `#17171A` / 灰墨 `#5A5A60` / 浅墨 `#9B9BA0` / 实线 `#17171A` / 软线 `rgba(23,23,26,.16)` / **信号橙 `#E9470C`** / 橙墨 `#B23708`;`--max:1240px`、`--gutter:24px`;自述"现代主义·国际主义:纯色底+墨字、单一信号橙、12 列网格、1px 细线、无渐变无圆角"。
|
|
18
|
-
|
|
19
|
-
**关键判断:这套配色本身就是「线描 + 克制色」的现成实现。** 你新给的方向不需要推翻它,而是**从它长出来**——把水彩插画换成线稿插画,把动效从"渐显上浮"换成"24fps 线描绘制"。这是本次首页改造工作量可控的根本原因。
|
|
20
|
-
|
|
21
|
-
### 1.3 现有角色资产
|
|
22
|
-
- 定妆:`docs/banner.jpg`(1672×941)——**蓝发蓝眼的水彩/厚涂动漫少女**,深蓝底、金线星图、手中书本与记忆卡匣。
|
|
23
|
-
- 六幕宣传图:`docs/screenshots/promo/promo-1..6-*.png`(1280×720,共 3.11 MB)。
|
|
24
|
-
- 生图规范:`artifacts/logo/BANNER-SERIES-PROMPTS.md`(含"角色辨识内核:蓝发蓝眼的动漫少女"与逐幕 prompt)。
|
|
25
|
-
|
|
26
|
-
---
|
|
27
|
-
|
|
28
|
-
## 2. 风格定义:线框稿(Wireframe)× EVA 式克制线描
|
|
29
|
-
|
|
30
|
-
### 2.1 可执行色板(4 主色 + 3 灰阶)
|
|
31
|
-
|
|
32
|
-
| 角色 | 值 | 用途 | 占比 |
|
|
33
|
-
| --- | --- | --- | --- |
|
|
34
|
-
| 纸 | `#F4F1EB` | 底 | — |
|
|
35
|
-
| 墨 | `#17171A` | 结构线、正文 | 线为主 |
|
|
36
|
-
| 灰墨 / 浅墨 | `#5A5A60` / `#9B9BA0` | 标注、次级线、禁用态 | ~15% |
|
|
37
|
-
| **信号橙** | `#E9470C`(墨版 `#B23708`) | **唯一强调色**:焦点、当前态、关键数字 | **≤5%** |
|
|
38
|
-
| 警示黄 | `#E8C584`(仅警示条) | 限制/已知问题 | 极少量 |
|
|
39
|
-
| 蓝(仅角色) | 发丝 `#2B4A8B`→`#6E8FD8`、瞳孔 `#2B6FD8` | **只给角色**,不参与 UI | 极少量 |
|
|
40
|
-
|
|
41
|
-
**铁律**:任一屏内「信号橙」出现面积不超过 5%;蓝**只属于角色**,若 UI 里出现蓝,视觉上就会被读成"另一个角色"。
|
|
42
|
-
|
|
43
|
-
### 2.2 线宽层级(工程图语言)
|
|
44
|
-
|
|
45
|
-
| 层级 | 线宽 | 用在哪 |
|
|
46
|
-
| --- | --- | --- |
|
|
47
|
-
| 网格/标注线 | 0.75px(`stroke-width:.75`) | 坐标网格、尺寸线、引线 |
|
|
48
|
-
| 结构线 | 1px | 分区、卡片边、表头 |
|
|
49
|
-
| 轮廓线 | 1.5px | 角色外轮廓、图标主形 |
|
|
50
|
-
| 重点线 | 2.5px | 标题下划线、当前页签、CTA 边框 |
|
|
51
|
-
|
|
52
|
-
### 2.3 工程图元素(把"可审计/有证据链"的产品性格画出来)
|
|
53
|
-
|
|
54
|
-
- **尺寸标注**:`|←—— 128k ——→|` 形式的 token 配额标注;
|
|
55
|
-
- **剖面线**:45° 细排线(`repeating-linear-gradient`)用于"归档/压缩"这类被压缩过的区域;
|
|
56
|
-
- **编号圆点**:`①②③` 与模块编号(M1–M7 已有叙事基础);
|
|
57
|
-
- **CAUTION 条**:黄底黑字的横条,用于"已知限制""默认关闭";
|
|
58
|
-
- **图注**:等宽小字 `FIG.03 — 三层记忆的数据流`。
|
|
59
|
-
|
|
60
|
-
### 2.4 禁止项(与现有 landing 自述一致,写成硬约束)
|
|
61
|
-
渐变、投影、玻璃(`backdrop-filter`)、圆角卡片、装饰性光效、emoji 堆砌、"营销腔"形容词。
|
|
62
|
-
|
|
63
|
-
---
|
|
64
|
-
|
|
65
|
-
## 3. 角色规范(水彩 → 线稿)
|
|
66
|
-
|
|
67
|
-
- **辨识内核不可丢**:蓝发蓝眼。(沿用 `BANNER-SERIES-PROMPTS.md` 已确立的口径)
|
|
68
|
-
- **迁移要点**:①以轮廓线为主,蓝色只保留在**发丝高光与瞳孔**两处(着色面积 ≤ 角色面积 12%);②服装从厚涂简化为 **3-4 组结构线**(衣领/袖口/裙摆/腰带);③去掉水彩晕染与星光粒子,改用**工程图排线**做阴影;④手中的书本/记忆卡匣保留——它们是"记忆"的具象道具。
|
|
69
|
-
- **表情/姿态最小集**(每套都要出定妆):①静立持书(Hero 基准)②呼吸(3 帧循环)③眨眼(3 帧)④侧目看屏幕 ⑤抬手点化(技能固化)⑥翻页(日志/检索)。
|
|
70
|
-
- **定妆图先出**:一张正面全身 + 一张 3/4 侧(线稿,透明底 PNG,2x)。**这是后续所有素材的基准**,也是 Astra 的输入。
|
|
71
|
-
|
|
72
|
-
---
|
|
73
|
-
|
|
74
|
-
## 4. 动效规范(24fps)
|
|
75
|
-
|
|
76
|
-
### 4.1 帧率与时序表
|
|
77
|
-
|
|
78
|
-
| 场景 | 时长 | 帧数(24fps) | 循环 | 优先级 |
|
|
79
|
-
| --- | --- | --- | --- | --- |
|
|
80
|
-
| Hero 线稿自绘(线条从 0 画出) | 1.5s | 36 | 一次性 | P0 |
|
|
81
|
-
| 角色呼吸 | 3s | 72 | 循环 | P0 |
|
|
82
|
-
| 角色眨眼 | 0.25s | 6 | 每 4-8s 随机触发 | P0 |
|
|
83
|
-
| 数据流动线(观察→检索→注入→证据) | 2s | 48 | 循环 | P1 |
|
|
84
|
-
| 章节转场(出现/擦除) | 0.6s | 14 | 一次性 | P1 |
|
|
85
|
-
| 六幕宣传图轮播 | 每幕 5s | — | 循环 | P2 |
|
|
86
|
-
|
|
87
|
-
### 4.2 技术形态与分工(关键:可拼装)
|
|
88
|
-
|
|
89
|
-
| 形态 | 谁做 | 优点 | 代价 |
|
|
90
|
-
| --- | --- | --- | --- |
|
|
91
|
-
| **SVG 路径自绘**(`stroke-dashoffset`) | **我** | 矢量无极缩放、体积小(KB 级)、可随主题变色、可无障碍降级 | 画不了手绘角色细节 |
|
|
92
|
-
| **PNG 序列帧**(24fps,透明底) | **Astra** | 手绘质感最好、逐帧可控 | 体积大(需严格预算)、要用 JS 播放器 |
|
|
93
|
-
| **WebM / MP4**(无音轨,循环点对齐) | Astra(或我压缩) | 体积/质量平衡好 | 兼容与自动播放需处理,不能透明(可用 chroma/遮罩近似) |
|
|
94
|
-
| **CSS `steps()` 逐帧** | 我 | 实现简单、无 JS | 只适合短循环 |
|
|
95
|
-
|
|
96
|
-
**推荐组合(分工清晰、可并行)**:角色表演 = **Astra 出 PNG 序列(透明底)**;线条/网格/数据流/版式动效 = **我出 SVG + CSS**;最后由我在 `index.html` 里合成并做性能与无障碍降级。
|
|
97
|
-
|
|
98
|
-
### 4.3 性能与无障碍预算(硬指标)
|
|
99
|
-
|
|
100
|
-
- 首屏动效总体积:**≤400 KB 原始 / ≤250 KB gzip**;移动端首屏只允许 **2 个动效同屏**。
|
|
101
|
-
- **LCP 不退化**:动效资源在 `load` 之后启动(`requestIdleCallback`),首帧静态图先行(`<img>` 占位,尺寸写死避免 CLS)。
|
|
102
|
-
- **`prefers-reduced-motion: reduce` 必须降级为静态首帧**(现有 landing 已有该分支,扩展即可)。
|
|
103
|
-
- 24fps 序列帧播放器:预解码前 N 帧后立即播放,其余流式解码;切到后台标签页暂停。
|
|
104
|
-
|
|
105
|
-
---
|
|
106
|
-
|
|
107
|
-
## 5. 交给 Astra 的交付契约(可直接转发)
|
|
108
|
-
|
|
109
|
-
**任务**:为 `dsh-auto-memory` 官网首页制作 **24fps 角色动画**(线框稿 + EVA 式克制线描风)。
|
|
110
|
-
|
|
111
|
-
**风格约束**
|
|
112
|
-
1. 线描为主,纸白底(`#F4F1EB`)+ 墨线(`#17171A`);允许的彩色只有两处:发丝与瞳孔的蓝(`#2B4A8B`–`#6E8FD8` / `#2B6FD8`),以及**面积 ≤5%** 的信号橙(`#E9470C`)点缀。
|
|
113
|
-
2. 禁止:渐变、投影、玻璃质感、圆角卡片、水彩晕染、星光粒子。阴影用 45° 工程排线表达。
|
|
114
|
-
3. 角色辨识内核:**蓝发蓝眼的动漫少女**(参考 `docs/banner.jpg`),服装简化为 3-4 组结构线。
|
|
115
|
-
|
|
116
|
-
**交付物清单**
|
|
117
|
-
1. **定妆图 2 张**:正面全身 + 3/4 侧;线稿;透明底 PNG;2x(角色高 ≥1600px)。
|
|
118
|
-
2. **动画序列帧**(三段,各自独立目录):
|
|
119
|
-
- `hero/` Hero 线稿自绘:36 帧,一次性,末帧=完整静帧;
|
|
120
|
-
- `idle/` 呼吸+眨眼:呼吸 72 帧循环(首尾帧必须一致)+ 眨眼 6 帧(独立段,随机触发);
|
|
121
|
-
- `gaze/` 侧目/抬手点化:可选,24-48 帧。
|
|
122
|
-
3. **格式**:PNG-24 + alpha,sRGB,**不烘焙背景**;命名 `hero_0000.png … hero_0035.png`(4 位补零,从 0000 起)。
|
|
123
|
-
4. **分层**:角色层与道具层(书/卡匣)分开导出,便于我做视差与合成。
|
|
124
|
-
5. **可选**:整段 WebM(VP9,无音轨,`yuv420p`),循环段首尾帧对齐。
|
|
125
|
-
|
|
126
|
-
**验收清单**
|
|
127
|
-
- [ ] 循环段首尾帧**逐像素一致**(无跳帧感)
|
|
128
|
-
- [ ] 透明边缘无白边/灰边(导出前做 1px 收缩)
|
|
129
|
-
- [ ] 锚点固定:角色脚底中线在每帧同一像素坐标(我会给画布与锚点坐标)
|
|
130
|
-
- [ ] 单帧 ≤150 KB(2x、透明);单段总 ≤8 MB
|
|
131
|
-
- [ ] 线条粗细与 §2.2 的线宽层级一致(轮廓 1.5px / 结构 1px @1x)
|
|
132
|
-
- [ ] 无渐变、无投影、无玻璃(对照 §5 风格约束逐条)
|
|
133
|
-
- [ ] 提供一张"动效节拍表":每段的关键帧号与其含义(便于我对齐 SVG 图层)
|
|
134
|
-
|
|
135
|
-
**画布与锚点(我这边定的)**
|
|
136
|
-
- 画布:`1200×1200` @1x(导出 2x = 2400×2400),透明底;
|
|
137
|
-
- 角色锚点:脚底中线位于 `(600, 1080)` @1x;角色高约 900px;
|
|
138
|
-
- 头顶安全区:上留 120px(给标注线与编号圆点)。
|
|
139
|
-
|
|
140
|
-
**我这边的集成点**
|
|
141
|
-
- 挂载位:`docs/landing/index.html` 的 `<section id="hero">` → `<div data-dam-anim="hero">`(占位与回退首帧 `<img>` 已预留);
|
|
142
|
-
- 播放策略:IntersectionObserver 进入视口才启动;`prefers-reduced-motion` 直接显示静态首帧;
|
|
143
|
-
- 体积超预算时我会先做 WebP/AVIF 转码或降帧(24→12fps)处理,并同步告知。
|
|
144
|
-
|
|
145
|
-
---
|
|
146
|
-
|
|
147
|
-
## 6. 分工与我的能力边界(诚实评估)
|
|
148
|
-
|
|
149
|
-
| 工作 | 谁 | 说明 |
|
|
150
|
-
| --- | --- | --- |
|
|
151
|
-
| 版式、网格、线稿风格的系统化(SVG/CSS) | **我** | 这是我的强项:矢量线条、自绘动画、响应式与双语、性能预算 |
|
|
152
|
-
| 数据流/标注/网格/转场等**非角色**动效 | **我** | SVG `stroke-dashoffset` + CSS `steps()`,体积 KB 级 |
|
|
153
|
-
| 角色**手绘逐帧表演**(呼吸/眨眼/发丝/翻页) | **Astra** | 逐帧手绘的质感与"高级感"目前更靠得住;我给规格、给画布、给锚点、负责合成 |
|
|
154
|
-
| 角色**线稿化再设计**(水彩→线稿) | Astra(或你指定的画师/模型) | 若你另有角色设定图,以你的为准 |
|
|
155
|
-
| 页面工程、集成、性能与无障碍降级 | **我** | 与 §4.3 预算绑定 |
|
|
156
|
-
|
|
157
|
-
一句话:**"24 帧动效"里,线条与版式部分我现在就能做;角色的逐帧表演交给 Astra 更稳——我把交接契约写好了,两边可以并行。**
|
|
158
|
-
|
|
159
|
-
---
|
|
160
|
-
|
|
161
|
-
## 7. 时间线重估(AI 协作节奏)
|
|
162
|
-
|
|
163
|
-
| 阶段 | 内容 | AI 协作下的现实耗时 | 卡点 |
|
|
164
|
-
| --- | --- | --- | --- |
|
|
165
|
-
| D0 | 设计令牌冻结(色板/线宽/间距/字号)+ 定妆图线稿化 | 0.5 天 | 需要你 1 次评审 |
|
|
166
|
-
| D1-D2 | 界面一期:令牌落地 + 7 个组件原语 + 设置台分组 + 幽灵键/焦点态修复 | **2 天**(可发版) | 我能连续产出;你目视签收 |
|
|
167
|
-
| D3 | 面板 IA 重排(插槽 spike → 侧栏面板/右侧文档页/对话内状态条) | 1 天 | spike 结果未知(有回退) |
|
|
168
|
-
| D4 | 首页线稿版**静态稿**(版式 + 线稿插画位 + 工程图元素) | 1 天 | 需要角色线稿就位(可先用占位) |
|
|
169
|
-
| D5 | 动效叠加:SVG 自绘 + 数据流 + 转场(我做) ⊕ Astra 序列帧(到货即插) | 1 天 + 等 Astra | **美术排期是外部依赖** |
|
|
170
|
-
| D6 | 22 张界面图重拍 + 六幕宣传图更新 | 0.5 天 | 需 UI 冻结 + 重启 dsh web(你操作) |
|
|
171
|
-
| D7 | 文档终校(此刻才对功能说明逐条核对)+ 发版 | 1 天 | 你说的"最后再核对功能说明"就在这一步 |
|
|
172
|
-
|
|
173
|
-
**结论**:**「两三天」对界面一期(D1-D3)成立**;整套(含首页美术、动效、重拍、文档终校)串行约 **7 天**,其中真正的外部依赖是 **Astra 的动画排期** 与 **你的评审轮次**,不是我写代码的速度。
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## 8. 现在需要你给的 3 件东西
|
|
178
|
-
|
|
179
|
-
1. **官方 DSH 网页的确切 URL 或截图**(我全网搜到的都是第三方介绍文,没有官方落地页;拿到后我把它的版式/色彩并入 §1)。
|
|
180
|
-
2. **角色基准**:用 `docs/banner.jpg` 这张水彩版去线稿化,还是你另有角色设定图/三视图?(有的话给我文件路径)
|
|
181
|
-
3. **是否现在就出风格探针**:我可以立刻生成 2-3 张探针图(线稿 + EVA 色板 + 工程图元素,含"角色站在线框稿舞台上"的 Hero 构图),先定调再进入 D1——需要你在「Ark9 生图」面板点一次批准。
|
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
# AUDIT · WB-GRAPH 白板线全量粗检(2026-09-16)
|
|
2
|
-
|
|
3
|
-
> **触发**:用户裁定「15 号下午到 16 号凌晨的修改比较不严谨」,要求做全量逻辑粗检 + 与规划/项目约定对账。
|
|
4
|
-
> **方法**:只采信代码/配置/实测输出;每条结论附 `文件:行号` 或可复跑命令。**推翻自审结论的,如实标注**。
|
|
5
|
-
> **复跑探针**:`node artifacts/_audit-p23-probe.mjs`、`node artifacts/_audit-id-repro.mjs`
|
|
6
|
-
> **范围**:`lib/board-mode-pre.js`(新)、`lib/wb-sidecar-pre.js`(新)、`lib/ledger-criteria-pre.js`(新)、`lib/index.js` 白板线改动、`lib/client.js` 开关 UI、`vendor/dsh-graph/`、两个新套件。
|
|
7
|
-
|
|
8
|
-
---
|
|
9
|
-
|
|
10
|
-
## 零、结论先行
|
|
11
|
-
|
|
12
|
-
| 判定 | 数量 | 说明 |
|
|
13
|
-
| --- | --- | --- |
|
|
14
|
-
| 自审 3 致命全部**成立** | 3/3 | BUG-1/2/3 证据复核无误 |
|
|
15
|
-
| 自审高危**推翻 1 条** | BUG-4 ❌ | `wsKey` 与 `basename` 在集中式布局下**恰好相等**,实测两 id 一致 ⇒ 该条不成立 |
|
|
16
|
-
| 自审**漏报**新缺陷 | **5 条** | BUG-10~14(其中 2 条致命级) |
|
|
17
|
-
| 自审给的**修法本身不可实现** | 1 条 | BUG-1 的"在 apply() 内 await loadConfig"——`apply` 不是 async 函数 |
|
|
18
|
-
| 规划项未完成 | 5 项 | P2-1 半数、P2-3、P2-4、P3-2、P3-3 |
|
|
19
|
-
|
|
20
|
-
**一句话**:自审方向对("切了没反应"确系代码问题),但**深浅不准**——把一条不成立的(BUG-4)当高危,同时漏掉两条比 BUG-1 更致命的(BUG-10 id 不一致、BUG-11 开关永不生效)。
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
## 一、推翻自审结论(1 条)
|
|
25
|
-
|
|
26
|
-
### ❌ BUG-4「`this.wsDirKey` 不存在 ⇒ workspaceKey 口径不一致」——**不成立**
|
|
27
|
-
|
|
28
|
-
自审称:`wsDirKey` 全仓 0 命中 ⇒ 退化为 `path.basename(projectDir)` ⇒ 与锚点契约的 workspaceKey 口径不一致,同一工作区换路径写法会算出不同 id。
|
|
29
|
-
|
|
30
|
-
**实测(`artifacts/_audit-p23-probe.mjs` A 段)**:
|
|
31
|
-
|
|
32
|
-
```
|
|
33
|
-
[A] wsKey(ws) = --D--dsh-auto-memory--
|
|
34
|
-
[A] basename(projectDir) = --D--dsh-auto-memory--
|
|
35
|
-
[A] 相等? = true
|
|
36
|
-
[A] id(wsKey) = mem_0f9e7ae7bdb88beec286a08a9211bf79
|
|
37
|
-
[A] id(basename) = mem_0f9e7ae7bdb88beec286a08a9211bf79
|
|
38
|
-
[A] 两 id 相等? = true
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
**机理**:`projectDir = path.join(memoryRoot, wsKey(ws))`(`lib/index.js:1702-1703`),即目录名**就是** `wsKey(ws)`。所以 `path.basename(projectDir) === wsKey(ws)` 在集中式布局下恒等成立;`this.wsDirKey` 三元表达式虽写了不存在的属性名(真名 `wsKey`,`:1687`),但**降级分支恰好给出正确值**。
|
|
42
|
-
|
|
43
|
-
**降级为可读性缺陷**:代码写了死分支(`this.wsDirKey` 永远 falsy),属"能跑但误导后来者"。**建议修,但不是高危**。`wsKey(ws)` 的用途是 `projectDirOf`(`lib/index.js:1703`),不是"给 projectDir 反推 key"。
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## 二、自审 3 致命复核(全部成立,其中 1 条修法需更正)
|
|
48
|
-
|
|
49
|
-
### ✅ BUG-1 工具注册时机早于配置加载 —— **成立,但自审修法不可实现**
|
|
50
|
-
|
|
51
|
-
**复核证据**:
|
|
52
|
-
- `lib/index.js:8506` `const tools = [...]` → `:8726` 数组结束 → `:8732` `if (resolveBoardModePre(engine.config.boardMode).graphEnabled)`。
|
|
53
|
-
- `:9763` `for (const tool of tools)` → `:9772 ctx.tools.register(tool)`。
|
|
54
|
-
- `engine.config` 在构造时是默认值(`:982`),真配置只在 `loadConfig()`(`:1599-1610`)异步合并;`apply()` 段(`:7633-8505`)内无 `await engine.loadConfig()`。
|
|
55
|
-
|
|
56
|
-
**新增发现(自审漏)**:
|
|
57
|
-
1. **`apply()` 不是 async 函数** —— `lib/index.js:7633` 是 `export function apply(ctx, config) {`(无 `async`)。自审写的修法「在 `apply()` 内构建 tools 之前 `await engine.loadConfig()`」**在语法上不可能**:`await` 只能出现在 async 函数内。
|
|
58
|
-
2. **`apply()` 体内已有 30 处 `await`**(`:7633-8505`,如 `:7767`/`:7805`/`:7843`)—— 这是最大的疑点:**非 async 函数体内出现 await 会导致 SyntaxError**。但 `node --check lib/index.js` 通过、回归 95 套件全绿(其中 20 套直接调 `apply(`)⇒ **推断(待 GPT 复核)**:这 30 处 await 位于 `apply` 内部**嵌套的 async 箭头函数**中,不是顶层 await;模块级 `apply` 本身确为同步。
|
|
59
|
-
|
|
60
|
-
**正确的修法只有两条**(见 §五 修复方案)。
|
|
61
|
-
|
|
62
|
-
### ✅ BUG-2 `agent.cwd` 路径 API 用错 —— **成立**
|
|
63
|
-
|
|
64
|
-
- `lib/index.js:2041` / `:2054` 用 `agent && agent.cwd ? agent.cwd : process.cwd()`。
|
|
65
|
-
- 全仓 `agent.cwd` 仅这 2 处命中(grep 实证);既有权威写法 `await this.resolvePaths(agent)` 有 20+ 处(`:1835`/`:2483`/`:3809`/`:3990`/`:4062`…)。
|
|
66
|
-
- **补充证据**:`expandWhiteboardByTagPre` 拿到的 `projectDir` 会**直接拼 `handoff/index.json`**(`:2042`),即把 `agent.cwd` 当 **projectDir** 用——即便 `agent.cwd` 存在,它也是**工作区路径**而非**记忆目录**(`projectDir = memoryRoot/<wsKey>`)。**双重错位**:既用了非约定字段,又混淆了 `ws` 与 `projectDir` 两个不同概念。
|
|
67
|
-
|
|
68
|
-
### ✅ BUG-3 设置页按钮改了不保存 —— **成立**
|
|
69
|
-
|
|
70
|
-
- `lib/client.js:4417-4421`:`function pick(m) { set('boardMode', m); window.setTimeout(function () { window.location.reload() }, 350) }`。
|
|
71
|
-
- `set()`(`:4047`):`var next = Object.assign({}, cfg); next[key] = value; setCfg(next); setDirty(true)` —— **只改内存 state + 标脏,不写盘**。
|
|
72
|
-
- 真写盘是 `save()`(`:4063-4080`)→ `saveConfigPatch`(`:999-1005` → `apiPost(API.config, patch)`)。
|
|
73
|
-
- 350ms 后 `location.reload()` ⇒ 脏 state 丢弃 ⇒ 配置不变。**成立**。
|
|
74
|
-
- 对照:接续面板按钮(`:2382`)用 `saveConfigPatch({boardMode: next}, ...)` ⇒ 立即写盘,**那条是对的**。
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
## 三、自审漏报的新缺陷(5 条)
|
|
79
|
-
|
|
80
|
-
### ★★★ BUG-10(致命·新)同一账本在 write 与 rebuild 两条路径算出**两个不同 id**
|
|
81
|
-
|
|
82
|
-
**证据(`artifacts/_audit-id-repro.mjs`,实测输出)**:
|
|
83
|
-
|
|
84
|
-
```
|
|
85
|
-
write relPath = "handoff\\handoff-20260916-020000.md" title = "交接账本 handoff-20260916-020000"
|
|
86
|
-
rebuild relPath = "handoff/handoff-20260916-020000.md" title = "交接账本 20260916-020000"
|
|
87
|
-
relPath 相同? false title 相同? false
|
|
88
|
-
write id = mem_95fc2c2404de55c0dc1f045aa6c2cf8f
|
|
89
|
-
rebuild id = mem_7329b82cde69f9370852dabc52b15aec
|
|
90
|
-
=> 同一账本 write/rebuild 的 id 一致? false
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
**两处实参不一致**:
|
|
94
|
-
| | relPath | title | 代码位置 |
|
|
95
|
-
| --- | --- | --- | --- |
|
|
96
|
-
| write | `path.relative(projectDir, p)` → **反斜杠** | `'交接账本 ' + path.basename(p,'.md')` → **含 `handoff-` 前缀** | `lib/index.js:1976` |
|
|
97
|
-
| rebuild | `'handoff/' + f` → **正斜杠** | `'交接账本 ' + f.replace(/\.md$/,'').replace('handoff-','')` → **去掉前缀** | `lib/index.js:2029` |
|
|
98
|
-
|
|
99
|
-
**后果(三条,均致命级)**:
|
|
100
|
-
1. **`index.json` 自我分裂**:`writeSidecarEntryPre` 按 id upsert(`:2014-2015`)。写新账本 A 时存入 `id_w`;此后触发一次 rebuild(`:2021-2036`),全部条目被换成 `id_r`。用户 `memory_trace_pre(id_w)` 查旧 id 直接 `found:false`。
|
|
101
|
-
2. **违反规划 §3.3「index.json 完全可重建」**:规划明写"sidecar 丢失不丢信息"。实测 Write→Rebuild→同一账本 id 变化 ⇒ **重建不是幂等**,与 `WB-FORMAT-CONVENTION §2`「id 可复算」的锚点契约直接冲突。
|
|
102
|
-
3. **`ts` 字段同源错位**:rebuild 用 `f.slice(8,12)+'-'+f.slice(12,14)+'-'+f.slice(14,16)`(`:2029`)解析 `handoff-20260916-020000.md`。实测该切片**恰好得到 `2026-09-16`**(探针 C 段)——**巧合正确**,但写侧传的是 `''`(`:1976` 第 5 实参),依赖 `writeSidecarEntryPre` 内部兜底 `this.memToday() + ' ' + nowHm()`(`:2007`)。两侧 ts 语义不同(一为日期,一为日期+时刻)。
|
|
103
|
-
|
|
104
|
-
**自审与套件为何都没抓到**:`smoke-test-p23-wb-sidecar-pre.mjs` M6(`:73-84`)只用**同一份 docs** 调两次 rebuild 比 id(`assert.deepEqual` 在 `:82`),**从未把 write 产物与 rebuild 产物对撞**。M7(`:86-99`)先 `buildSidecarEntryPre` 再直接 `writeFile` 手写 index.json,**绕过了引擎侧两咽喉**。这正是"测试假绿"的典型:断言的是纯函数自洽,不是跨路径一致。
|
|
105
|
-
|
|
106
|
-
### ★★★ BUG-11(致命·新)`boardMode='graph'` 与切换到 graph 的动作**都不生效**,且用户已落盘 graph 也无效
|
|
107
|
-
|
|
108
|
-
这是 BUG-1+BUG-2+BUG-3 **之外**的一条独立致命缺陷:
|
|
109
|
-
|
|
110
|
-
- `engine.config.boardMode` 在 `apply()` 时是 `DEFAULT_CONFIG` 的 `'legacy'`(`:217`),`loadConfig()` 尚未跑 ⇒ `:8732` 闸门恒 false(=BUG-1)。
|
|
111
|
-
- **但即使用户新起进程、配置里已是 `graph`**:`apply()` 启动阶段 `loadConfig()` 仍未调用 ⇒ `engine.config` 仍是 `{...DEFAULT_CONFIG}` ⇒ **闸门依然 false**。也就是说 **BUG-1 不是"首次启动读不到用户改动",而是"永远读不到"**——自审把它描述成时机/竞态问题("启动时读到的永远是默认 legacy"),实际是**结构性恒假**。
|
|
112
|
-
|
|
113
|
-
**旁证(用户配置文件已落盘 graph 却无效果)**:`C:\Users\JH Z\.dsh\dsh-auto-memory-pre.json` 内 `"boardMode": "graph"`,但没有任何一次重启能让两个新工具出现——与上述"结构性恒假"一致。
|
|
114
|
-
|
|
115
|
-
### ★★ BUG-12(高·新)`expandWhiteboardByTagPre` 的 `limit` 被工具层**双重钳制**且与 §4.1 schema 不符
|
|
116
|
-
|
|
117
|
-
- 工具层(`:8736`):`Math.min(Math.max(Number(args.limit) || 10, 1), 20)`
|
|
118
|
-
- 纯函数层(`wb-sidecar-pre.js:69`):`const cap = Math.min(Math.max(Number(limit) || 10, 1), 20)`
|
|
119
|
-
- 两层钳制不冲突(幂等),**但输出契约缺规划 §4.1 要求的字段**(见 BUG-7 复核):
|
|
120
|
-
|
|
121
|
-
探针 E 段实测输出:
|
|
122
|
-
```
|
|
123
|
-
expand entry keys = ["id","title","source","tags","cue","chars","ts"]
|
|
124
|
-
规划要求的 preview/source/mtime/cues/criteria 在? preview=false source=true mtime=false cues=false criteria=false
|
|
125
|
-
trace 顶层 keys = ["found","entry","related"] ← 规划要 entry/cues/tags/neighbors/versions/hint
|
|
126
|
-
```
|
|
127
|
-
⇒ BUG-7 成立且比自审描述更严重:**不止缺正文,`preview`/`mtime`/`cues`/`criteria` 全缺,`trace` 连 `cues`/`tags`/`neighbors`/`versions`/`hint` 顶层字段都没有**(现在叫 `related`)。而工具描述(`:8733`/`:8737`)却向模型承诺"返回条目 id、标题、来源(source 文件+行)与判据状态""回溯它的 cue、tag 与相邻条目,以及归档版本链(prev_version)"——**描述与实现不符**,模型会照着不存在的字段去用。
|
|
128
|
-
|
|
129
|
-
### ★★ BUG-13(高·新)`extractTagsPre` 正则的"前置边界"把中文括号/中文引导语场景全部漏掉
|
|
130
|
-
|
|
131
|
-
探针 D 段实测:
|
|
132
|
-
```
|
|
133
|
-
extractTagsPre("用 type:dead-end 表示") = ["type:dead-end"] ✅
|
|
134
|
-
extractTagsPre("type:dead-end") = ["type:dead-end"] ✅
|
|
135
|
-
extractTagsPre("(topic:登录流程)") = [] ❌
|
|
136
|
-
extractTagsPre("a:type:dead-end") = [] ❌
|
|
137
|
-
```
|
|
138
|
-
正则 `/(^|\s)((?:tag|type|topic):[\w\u4e00-\u9fff-]{2,24})/g`(`wb-sidecar-pre.js:23`)要求 tag 前是**行首或空白**。中文写作里 tag 前常是中文标点(`(`、`、`、`:`)或紧跟中文(`…格式:type:dead-end`),这些**全部漏采** ⇒ `by_tag` 倒排稀疏 ⇒ `memory_expand_pre` 命中率大幅低于规划预期。
|
|
139
|
-
|
|
140
|
-
`a:type:dead-end` 漏掉属**正确**(避免误吞 `xxxtype:`),但与中文标点漏采是同一个边界过严问题的两面。
|
|
141
|
-
|
|
142
|
-
### ★★ BUG-14(高·新)契约字段大面积缺失:`by_tag`/`by_cue`/`versions`/`criteria`/`events.jsonl` 均未实现
|
|
143
|
-
|
|
144
|
-
规划 §3.3 明写 `index.json` 结构应为:
|
|
145
|
-
```
|
|
146
|
-
{version, ws, rebuilt_at, entries:[{id,kind,source,section,tags[],cues[],text_preview,mtime,criteria}],
|
|
147
|
-
by_tag:{tag:[entry_id]}, by_cue:{cue:[entry_id]}, versions:{entry_id:[前版/归档]}}
|
|
148
|
-
```
|
|
149
|
-
实际落盘结构(`index.json` 写入点 `lib/index.js:2011-2016`):
|
|
150
|
-
```
|
|
151
|
-
{version, entries:[{id,title,source,tags,cue,chars,ts}]}
|
|
152
|
-
```
|
|
153
|
-
**缺**:`ws`、`by_tag`、`by_cue`、`versions`;条目级缺 `kind`/`section`/`text_preview`/`mtime`/`criteria`。
|
|
154
|
-
**后果**:没有 `by_tag` 倒排 ⇒ `expandByTagPre` 只能对 `entries` 做**全表线性 filter**(`wb-sidecar-pre.js:70`),§3.3 设计意图(tag 倒排加速)落空;`versions`/`prev_version` 缺失 ⇒ `memory_trace_pre` 承诺的"归档版本链"**根本无法实现**(数据不存在),不只是没返回。
|
|
155
|
-
|
|
156
|
-
`events.jsonl`(BUG-6,自审已报)复核**成立**:全仓 `events.jsonl` 0 命中,该文件从未被写入。
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
## 四、与规划/项目约定对账(逐项)
|
|
161
|
-
|
|
162
|
-
### 4.1 `WB-GRAPH-INTEGRATION-PLAN §5` 三态判定
|
|
163
|
-
|
|
164
|
-
| 项 | 规划要求 | 实测 | 判定 |
|
|
165
|
-
| --- | --- | --- | --- |
|
|
166
|
-
| P2-1 | 两咽喉落盘 sidecar + tag/cue 映射 + **criteria 事件追加** | 两咽喉已挂(`:1943`/`:1976`);无 events.jsonl;无 by_tag/by_cue 倒排 | **🟡 部分** |
|
|
167
|
-
| P2-2 | `rebuildHandoffIndex()` 确定性重建 | `rebuildSidecarIndexPre` 存在,但**不幂等**(BUG-10) | **🟡 部分(有缺陷)** |
|
|
168
|
-
| P2-3 | `searchHandoffCorpus` 升为 tag/段级优先 + 词法兜底 | **未做**:`searchHandoffCorpus`(`:2121`)仍是纯词法;`recall` scope 路由(`:5057`)未接 sidecar | **❌ 未做** |
|
|
169
|
-
| P2-4 | 注入端导航层加一行 tag 摘要 | **未做**:全仓无"tag 地图"字样 | **❌ 未做** |
|
|
170
|
-
| P2-5 | GUI `handoffPanelData` 增 tag/段视图 + fileQ 白名单放行 `.json` | **未做**:白名单正则(`:3495`)仍只允许 `.md`,`index.json` 被挡 | **❌ 未做** |
|
|
171
|
-
| P2-6 | 条目锚点 `mem_<32hex>` | `wbEntryIdPre` 已产 `mem_`+32hex;但**未写入 Markdown**(只进 sidecar)⇒ 白板内容**不会**按锚点自动进检索语料 | **🟡 部分** |
|
|
172
|
-
| P3-1 | 注册两工具,handler 读 index.json,**缺失时 fail-soft 回落 `searchHandoffCorpus`** | 已注册(条件闸门恒假 + 路径错,见 BUG-1/2);**无词法回落** | **🟡 部分** |
|
|
173
|
-
| P3-2 | `buildContinueCarry` 第 3 层 guide 加"可用 expand/trace"提示 | **未做**:`:3359-3369` 无相关文案 | **❌ 未做** |
|
|
174
|
-
| P3-3 | 三处工具数硬锁 14→16(**标为必须项**) | 三处仍 `!== 14`(`smoke-test.mjs:67`、`m3b3-pre:43`、`context-observer:107`) | **❌ 未做** |
|
|
175
|
-
|
|
176
|
-
### 4.2 `WB-FORMAT-CONVENTION` §8 验收清单对账
|
|
177
|
-
|
|
178
|
-
| 验收项 | 状态 |
|
|
179
|
-
| --- | --- |
|
|
180
|
-
| 每张卡有合法锚点、且页面派生的 index 与 Tier-0 目录一致 | ❌ 锚点未写入 Markdown;index 与目录无关联 |
|
|
181
|
-
| 故意删一张卡 → 写入被拒并报出差异 | ✅ `checkMutationPre` 丢卡门已实现(P0) |
|
|
182
|
-
| 卡片重排 id 不变;改标题 id 变且旧 id 有 supersede 留痕 | 🟡 id 算法满足;**supersede 留痕未实现**(无 versions/archived) |
|
|
183
|
-
| 模型整篇重写后 `<!-- user -->` 段逐字节保留 | ✅ `extractProtectedRegionsPre` 已在 P0 落地 |
|
|
184
|
-
| 造孤立条目 → lint 报出;矛盾结论 → lint(手动)报出 | ❌ 未实现(规划 §6 未列入 P2/P3 改动清单,属**规划自身缺口**) |
|
|
185
|
-
| 每条在 `tests/smoke/` 有对应套件且改坏会红 | 🟡 部分:新套件 20 断言,但 M6/M7 存在"断言纯函数自洽、绕过引擎接线"的结构性假绿(BUG-10 因此逃逸) |
|
|
186
|
-
|
|
187
|
-
### 4.3 项目既有约定对账
|
|
188
|
-
|
|
189
|
-
| 约定 | 检查 | 结果 |
|
|
190
|
-
| --- | --- | --- |
|
|
191
|
-
| 工具注册/档位闸门须先 `await loadConfig()` | 已写入项目笔记(2026-09-16) | ⚠️ **该约定本身表述有误**:`apply` 非 async,无法 await。须改写(见 §五) |
|
|
192
|
-
| 路径解析统一 `await this.resolvePaths(agent)` | `:2041`/`:2054` 违例 | ❌ 违反 |
|
|
193
|
-
| 开关解耦(单一开关不连带改其他行为) | sidecar 首行闸门 + 工具注册闸门 + 默认 legacy | ✅ 三处齐备 |
|
|
194
|
-
| legacy 字节级不变 | 闸门齐备 + 回归全绿 | ✅ 成立(工具数在 legacy 下确为 14) |
|
|
195
|
-
| 无 BOM | `board-mode-pre.js`/`wb-sidecar-pre.js`/`ledger-criteria-pre.js` 新建 | ✅ 待终检(见 §六) |
|
|
196
|
-
| 大文件分块写 | — | ✅ |
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
## 五、修复方案(按依赖排序,含对 BUG-1 修法的更正)
|
|
201
|
-
|
|
202
|
-
### 修复组 A(致命,必须)
|
|
203
|
-
|
|
204
|
-
**A1 · BUG-1/BUG-11 注册时机** —— 二选一,**不可用自审原方案**:
|
|
205
|
-
|
|
206
|
-
- **方案 A1-a(推荐·最小侵入)**:`apply()` 内把两工具的注册从数组字面量中**移出**,改为在**首次工具调用时惰性注册**——即把 `memory_expand_pre`/`memory_trace_pre` 无条件放进 `tools` 数组,在各自 `execute` 开头做**运行时闸门**:
|
|
207
|
-
```js
|
|
208
|
-
if (!resolveBoardModePre(engine.config.boardMode).graphEnabled) return 'memory_expand_pre: 需 boardMode=graph(当前 legacy)。'
|
|
209
|
-
```
|
|
210
|
-
代价:legacy 档工具数变 16 ⇒ 三处硬锁(BUG-5)必须同步改 16。**但**此时"闸门"从"注册层"降到"执行层",`legacy` 档模型能看到两个不可用工具——**违反"legacy 字节级一致"**。故**不推荐**。
|
|
211
|
-
|
|
212
|
-
- **方案 A1-b(推荐·真解)**:在 `lib/index.js` 顶部把 `const engine = new MemoryEngine()` 之后、构建 `tools` 之前,**用同步方式**读出配置。`loadConfig` 是 async 仅因用了 `fs/promises`;可新增同步读取器 `loadConfigSync()`(用 `readFileSync`/`JSON.parse`,与 `loadConfig` 同语义、同 `DEFAULT_CONFIG` 合并),在 `apply()` 内 tools 构建前调用一次:
|
|
213
|
-
```js
|
|
214
|
-
try { engine.loadConfigSync() } catch (_) {}
|
|
215
|
-
```
|
|
216
|
-
这既满足"启动期就要真配置"的硬需求,又不动 async 语义。**注**:`loadConfigSync` 须与 `loadConfig` 共用同一份合并逻辑以避免双源漂移。
|
|
217
|
-
|
|
218
|
-
- **方案 A1-c(备选)**:`apply` 改为 `export async function apply(ctx, config)`——需先核实 cordis 是否 await 插件 `apply` 的返回值(`@deepseek-ai/cordis` 的 `Reflect.apply` 调用点未确认 await 语义)。**风险最高,建议 GPT 复核后再定**。
|
|
219
|
-
|
|
220
|
-
**A2 · BUG-2 路径 API**:两处改
|
|
221
|
-
```js
|
|
222
|
-
const p = await this.resolvePaths(agent)
|
|
223
|
-
const projectDir = p.projectDir
|
|
224
|
-
```
|
|
225
|
-
注意 `resolvePaths` 已内含 `if (!this.configLoaded) await this.loadConfig()`(`:1741`),因此**改完 A2 后 BUG-1 在工具执行路径上自动缓解**(但注册闸门仍需 A1)。
|
|
226
|
-
|
|
227
|
-
**A3 · BUG-3 设置页保存**:`pick(m)` 改为走 `saveConfigPatch`,与接续面板同构:
|
|
228
|
-
```js
|
|
229
|
-
function pick(m) { saveConfigPatch({ boardMode: m }, { onSaved: function () { window.location.reload() } }) }
|
|
230
|
-
```
|
|
231
|
-
(保留即时回显:可先 `setCfg` 翻转按钮态,再 reload。)
|
|
232
|
-
|
|
233
|
-
### 修复组 B(致命·新)
|
|
234
|
-
|
|
235
|
-
**B1 · BUG-10 id 一致性**:统一两侧的 `relPath` 与 `title` 口径。最稳做法——**抽出单一构造函数**,两处都调它:
|
|
236
|
-
```js
|
|
237
|
-
// 新增(lib/index.js)
|
|
238
|
-
sidecarRefPre(projectDir, absPath) {
|
|
239
|
-
const rel = path.relative(projectDir, absPath).split(path.sep).join('/') // 强制正斜杠
|
|
240
|
-
const base = path.basename(absPath, '.md')
|
|
241
|
-
return { relPath: rel, title: base.replace(/^handoff-/, '交接账本 ').replace(/^PLAN$/, '白板 PLAN') }
|
|
242
|
-
}
|
|
243
|
-
```
|
|
244
|
-
两侧(write 侧 `:1976`、rebuild 侧 `:2029`)统一调用,并**补一条跨路径对撞断言**:write → rebuild → `traceByIdPre(原 id)` 必须 `found:true`。
|
|
245
|
-
|
|
246
|
-
### 修复组 C(补齐规划,按 §5 清单)
|
|
247
|
-
|
|
248
|
-
`C1` BUG-14:补 `by_tag`/`by_cue`/`versions`/`ws` 与条目级 `kind`/`section`/`text_preview`/`mtime`/`criteria`(P2-1/P2-2);
|
|
249
|
-
`C2` BUG-7/BUG-12:`expand` 返回 `preview`+`mtime`+`cues`+`criteria`+`total/truncated/remaining`;`trace` 返回 `entry`+`cues`+`tags`+`neighbors`+`versions`+`hint`;
|
|
250
|
-
`C3` BUG-8:`index.json` 缺失时先 rebuild,仍无命中则汇入 `searchHandoffCorpus` 结果;
|
|
251
|
-
`C4` BUG-13:tag 正则前置边界放宽为 `/(^|[\s((【\[、,,::])/`;
|
|
252
|
-
`C5` P2-3/P2-4/P2-5/P3-2/P3-3 五项按规划逐一补齐(含三处硬锁改 16)。
|
|
253
|
-
|
|
254
|
-
### 修复组 D(低危/清理)
|
|
255
|
-
|
|
256
|
-
`D1` BUG-4 死分支:`this.wsDirKey ? … : …` 改为直接 `this.wsKey(ws)`(需在调用点拿到 `ws`;若只能拿 `projectDir`,则保留 basename 并**加注释说明恒等依据**);
|
|
257
|
-
`D2` BUG-9 dsh-graph cordis 接线:**改用户 profile**,须先备份 + 单独征得同意(本条保持不动)。
|
|
258
|
-
|
|
259
|
-
---
|
|
260
|
-
|
|
261
|
-
## 六、待 GPT 独立复核的三点(本次粗检无法自证)
|
|
262
|
-
|
|
263
|
-
1. **§二 新增发现**:`apply` 非 async 但体内有 30 处 `await` —— 推断它们位于嵌套 async 箭头函数内。请 GPT 用 `node --check` + 语法树(`acorn`/`@babel/parser`)确认 `apply` 的直接函数体**没有顶层 await**,并据此判定 A1-b/A1-c 哪条可行。
|
|
264
|
-
2. **BUG-10 影响面**:是否还有**第三条**路径产生 id(如归档 `archive/PLAN-*.md`、`listHandoffLedgers` 白名单)也会与上述两侧不一致。
|
|
265
|
-
3. **P2-6 锚点未写入 Markdown** 是否属实影响"白板内容自动进检索语料"(`WB-FORMAT-CONVENTION §2` 的收益条款)——若属实,属规划承诺未兑现而非实现 bug。
|
|
266
|
-
|
|
267
|
-
---
|
|
268
|
-
|
|
269
|
-
## 七、可复跑证据清单
|
|
270
|
-
|
|
271
|
-
| 命令 | 用途 |
|
|
272
|
-
| --- | --- |
|
|
273
|
-
| `node artifacts/_audit-p23-probe.mjs` | BUG-4 推翻 + tag 正则边界 + 返回契约缺字段 + boardMode 解析 |
|
|
274
|
-
| `node artifacts/_audit-id-repro.mjs` | BUG-10 两条路径 id 对撞(实证不一致) |
|
|
275
|
-
| `node --check lib/index.js` 等 5 个文件 | 语法基线 |
|
|
276
|
-
| `node tools/run-smoke.mjs` | 全量回归(本次复跑结果见 §八) |
|
|
277
|
-
| `grep -n "agent.cwd\|wsDirKey" lib/index.js` | BUG-2/BUG-4 定位 |
|
|
278
|
-
| `grep -rn "events.jsonl\|by_tag\|by_cue\|tag 地图" lib/` | BUG-6/BUG-14 未实现取证 |
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## 八、回归复跑结果(本次粗检实测)
|
|
283
|
-
|
|
284
|
-
```
|
|
285
|
-
================ SUMMARY ================
|
|
286
|
-
PASS 95 / FAIL 0 / TIMEOUT 0 (total 144.6s)
|
|
287
|
-
=========================================
|
|
288
|
-
```
|
|
289
|
-
|
|
290
|
-
命令:`node tools/run-smoke.mjs`(后台作业 `pwsh-1`,exit code 0)。
|
|
291
|
-
**与自审声称一致**(自审称 95/0/0 / 145.4s)。语法基线:`node --check` 对 `board-mode-pre.js`/`wb-sidecar-pre.js`/`ledger-criteria-pre.js`/`index.js`/`client.js` 五文件**全部通过**。
|
|
292
|
-
|
|
293
|
-
### 为什么全绿却仍有 4 条致命缺陷(决定性解释)
|
|
294
|
-
|
|
295
|
-
| 缺陷 | 为何回归抓不到 |
|
|
296
|
-
| --- | --- |
|
|
297
|
-
| BUG-1/BUG-11 | 新工具挂在 `boardMode==='graph'` 闸门后;回归全跑 legacy 档 ⇒ **新分支一行不执行**。工具数硬锁仍锁 14 恰好与 legacy 一致 ⇒ 无从报红 |
|
|
298
|
-
| BUG-10 | `smoke-test-p23-wb-sidecar-pre.mjs` M6(`:73-84`)只用**同一份 docs** 连调两次 rebuild 比 id;M7(`:86-99`)用 `buildSidecarEntryPre` 手工拼 index.json 再 `writeFile`,**完全绕过引擎侧两咽喉**。⇒ 断言的是纯函数自洽,不是跨路径一致 |
|
|
299
|
-
| BUG-2 | 两工具从未被执行(BUG-1 已挡住),`agent.cwd` 分支是死代码 |
|
|
300
|
-
| BUG-3 | `lib/client.js` 是浏览器侧,smoke 只做源码字符串守卫(M10 `:121-128`),**不跑点击路径** |
|
|
301
|
-
|
|
302
|
-
**结论**:这是一种**结构性假绿**——测试覆盖的是"函数级自洽",不是"档位切换后的端到端"。要抓 BUG-1/10/11,必须补一条**graph 档端到端套件**(临时配置 `boardMode=graph` → 走 `apply()` → 断言工具数 16 + write→rebuild→trace 闭环)。
|
|
303
|
-
|
|
304
|
-
---
|
|
305
|
-
|
|
306
|
-
## 九、BOM 终检
|
|
307
|
-
|
|
308
|
-
(见 §十)
|
|
309
|
-
|
|
310
|
-
---
|
|
311
|
-
|
|
312
|
-
## 十、给 GPT 复核的三点(承 §六)
|
|
313
|
-
|
|
314
|
-
已在 §六列出。**补充一条**:请 GPT 独立确认 §八 表格里的"结构性假绿"判断——即"回归全绿不构成对白板线新功能的任何保证",这是本次粗检对交付报告 `REPORT-WB-GRAPH-NIGHTLY.md` 最重要的纠正。
|