Files
mnote/design/10-review/done/20-post-lightrag-runtime-hardening-checklist-v1.md
T
Agent Board b798f628ee chore: land tree view-state, vault, Pi module split, and repo hygiene
Persist PageTree expand state via control-plane view-state and align
chevron/DOM with restored expansion; keep Sidex-style shallow page-tree
scan and drop the unused recursive scanner that only added cargo noise.

Add password vault workbench routes/runtime/skill/CLI, split page_ai_pi
into a module package, and retire Hermes/ACP/OpenHub recycle + root
harness evidence from the index while gitignoring recycle and local
diag dumps.

Archive superseded design/bugs docs under old/, point architecture at
ARCHITECTURE.md, and refresh smokes for Pi S1–S7, vault, and editor
regressions so the working tree can stay clean.
2026-07-21 05:13:05 +08:00

336 lines
25 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 20 Post-LightRAG / Agent Edit / Runtime hardening checklist v1
> 创建时间:2026-06-07
>
> 状态:`done`
>
> Owner10-review / 07-ai / 03-rust-web / 05-editor-mainline
>
> 上位依据:
> - `design/07-ai/done/7-50-lightrag-knowledge-rag-provider-v1.md`
> - `design/07-ai/done/7-51-lightrag-post-commit-hardening-v1.md`
> - `design/07-ai/done/7-18-agent-edit-clean-dirty-smoke-checklist-v1.md`
> - `design/07-ai/process/7-18-local-first-agent-file-editing-control-plane-v1.md`
> - `design/old/07-ai/process/7-47-mnote-public-capability-plugin-registry-v1.md`(历史能力注册表)
> - `design/old/10-review/done/19-non-lightrag-design-cleanup-followup-checklist-v1.md`(历史清理记录)
>
> 口径更新:LightRAG 7-50 已成为资料库问答主线,旧 LiteParse / evidence / local OCR 默认路径已退役。后续不再按“扩 RAG”理解,而是按“post-commit audit、边界硬化、减少 runtime 竞态和能力注册漂移”推进。
## 1. 当前工作树边界
当前执行本 checklist 前,需要先确认工作树中已有未提交改动的归属,避免覆盖他人或历史提交后的本地调整:
- `rust/crates/mnote-web/src/routes/search.rs`
- `scripts/task452-local-search-index-browser-smoke.js`
- `scripts/task531-lightrag-dashboard-ui-smoke.js`
本 checklist 默认不修改上述文件,除非本轮任务明确转入 local search / dashboard smoke 收口。
## 2. 执行原则
- 不回滚 7-50 的主线口径:资料库问答、PDF / Office / 图片 OCR、跨资料 citation 默认走 LightRAG。
- 不恢复 `mnote.evidence.*``mnote.index.*`、旧 local OCR API 或 LiteParse provider 作为 agent fallback。
- 不把 LightRAG storage、input wrapper、sidecar、chunk、vector、graph 当成用户正文真相;MNote local-folder source 仍是真相。
- 不在普通页面搜索、文件树、编辑器打开路径中引入对 LightRAG 可用性的硬依赖。
- 发现需要更细粒度实施时,先在对应 `design/*/process/` 下拆子 checklist,再实施代码。
- 可以使用 subagent,但 subagent 只能做受控叶子任务:限定读写范围、验证命令、交付文件、禁止再派生 runner / subagent / worktree;主控必须复核 diff 和验证结果。
## 3. P0LightRAG 7-50 post-commit audit
目标:确认 7-50 作为 `done` 主线是稳定的,找出需要补的硬边界,不重复建设第二套 RAG。
Checklist
- [x] 只读 review 7-50 相关改动面:
- `rust/crates/mnote-web/src/routes/knowledge_rag.rs`
- `rust/crates/mnote-web/src/hermes_tools/knowledge_rag.rs`
- `rust/crates/mnote-web/src/hermes_tools/manifest.rs`
- `rust/crates/mnote-web/src/hermes_tools/skill.rs`
- `scripts/reasonix-acp-wrapper.mjs`
- `skills/mnote-knowledge-rag/SKILL.md`
- 资料库设置 UI、FileTree 状态灯、Page AI final answer smoke。
- [x] 核对 source truthregistry 必须以 MNote source path 为真相;symlink / input wrapper / parsed cache 只作为派生物。
- [x] 核对 delete / prune 语义:`delete-source`、watcher stale sync、prune registry 不得删除用户原始 source。
- [x] 核对 stale / deleted sourcesource 删除、hash 变化、rename / move 后,旧 LightRAG reference 不得继续作为有效 citation 暴露。
- [x] 核对 status bridgeingest / reindex 后的状态同步必须是有界 backoff;不得形成长期无界前台 polling。
- [x] 核对 image wrapper:图片 source 生成 Markdown wrapper 后,registry 和 citation 仍映射回原始图片 source,而不是把 wrapper 当用户资料真相。
- [x] 核对 query scope`sourcePaths` 当前是否只是 query 后过滤 MNote mapped references;若 provider 层未能预过滤,UI / agent 文档必须明确这是“provider 检索后 MNote scope 过滤”。
- [x] 核对 locator 降级:无 page / bbox / sidecar 命中时必须返回并展示 `locatorDegraded=true`,不得伪造页码、bbox 或 block id。
- [x] 核对 LightRAG dashboardMNote 只打开或嵌入 dashboard,不接管 LightRAG 内部图谱 / 文档任务真相。
审计结论:
- source truth、image wrapper、delete 不删用户 source、status bridge 有界 backoff、旧 evidence/index tool retired 口径均有代码和测试证据。
- 发现的缺口已拆到并完成 `design/07-ai/done/7-51-lightrag-post-commit-hardening-v1.md`
- watcher stale sync 删除失败时可能丢失 `lightRagDocId`,后续难以重试 provider orphan doc 删除;Phase A 已补保留 doc id、retry 状态、delete confirmed 后清 doc id 和 unmapped reference 过滤。
- `sourcePaths` 是 provider 检索后过滤 mapped referencesHTTP API 仍返回未过滤 `raw`;已显式返回 `sourceScopeMode=post_filter_mapped_references``rawScopeFiltered=false`
- sidecar locator 的 `first_positioned_block` fallback 可能在 quote 不匹配时生成错误 page/bbox;已移除 fallback,未匹配时降级到 resourceTab citation。
- degraded citation 的 skill / wrapper / UI 文案已统一,并由 Page AI final answer smoke 覆盖。
- Reasonix wrapper 仍是手写工具表;已补短期 drift guard,长期按 7-47 动态注册。
验证:
- [x] `cargo test -p mnote-web knowledge_rag -- --nocapture`
- [x] `MNOTE_REASONIX_ACP_SELFTEST=1 node scripts/reasonix-acp-wrapper.mjs`
- [x] `node --check scripts/task529-knowledge-rag-citation-resource-tab-smoke.js`
- [x] `node --check scripts/task530-knowledge-rag-page-ai-final-answer-smoke.js`
- [x] `node --check scripts/task531-lightrag-dashboard-ui-smoke.js`
- [x] `node --check scripts/task532-knowledge-rag-docx-ingestion-smoke.js`
- [x] `node --check scripts/task533-knowledge-rag-source-watcher-sync-smoke.js`
- [x] `node --check scripts/task534-knowledge-rag-source-management-scope-smoke.js`
- [x] `node --check scripts/task538-knowledge-rag-source-scope-api-smoke.js`
- [x] `node scripts/task529-knowledge-rag-citation-resource-tab-smoke.js`
- [x] `node scripts/task530-knowledge-rag-page-ai-final-answer-smoke.js`
- [x] `node scripts/task531-lightrag-dashboard-ui-smoke.js`
- [x] `node scripts/task532-knowledge-rag-docx-ingestion-smoke.js`
- [x] `node scripts/task533-knowledge-rag-source-watcher-sync-smoke.js`
- [x] `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3300 node scripts/task534-knowledge-rag-source-management-scope-smoke.js`
- [x] `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3300 node scripts/task538-knowledge-rag-source-scope-api-smoke.js`
运行态验证结果:
- `cargo test -p mnote-web knowledge_rag -- --nocapture` 通过 27 项。
- Reasonix ACP selftest 通过。
- `task529` 已改为当前可重复的 image source 降级 citation 正例;2026-06-07 在当前 3000 通过,验证 query/open_reference citationUrl 能打开 image resource tab,且不伪造 page/bbox。
- `task531` 已改为读取当前 status documents summary,不再硬编码 `Completed (5)` / `Fail (4)` / 固定扫描 PDF doc id2026-06-07 在当前 3000 通过,验证 Documents / Graph / Retrieval 入口。
- `task530` 已改为当前可重复的 image source degraded citation 场景;2026-06-07 在当前 3000 通过,验证 Page AI Reasonix 最终回答可引用降级 citation,且不编造 p.N / bbox、不泄漏 raw JSON / tool 名。
- `task538` 新增 API-only source scope smoke2026-06-07 在 3300 新构建通过,验证 `sourceScopeMode=post_filter_mapped_references``rawScopeFiltered=false`、references 过滤和 `delete-source` 不删除原始 source。
- `task534` 已修复默认过滤导致 source row 不可见的问题;2026-06-07 在 3300 最新构建通过,覆盖 UI source management、删除索引不删原始 source、删除后 scoped query 不再返回该 source。
- `task532` 当前 3000 通过:DOCX ingestion、degraded citation、Office resource tab 打开均验证成功。
- `task533` 当前 3000 通过:watcher Remove(File) batch、registry stale/delete 标记、query 不继续暴露 deleted source 已验证。
- `7-51` Phase A/B/C/D/E 已完成主要代码硬化和单测/selftest;已移动到 `design/07-ai/done/`
产出:
- [x] 若只发现小问题,直接在本 checklist 记录 audit 结果和 follow-up。
- [x] 若发现需要代码硬化,新建 `design/07-ai/process/7-51-lightrag-post-commit-hardening-v1.md`,拆 Phase A/B/C 后再实施;完成后已归档到 `design/07-ai/done/7-51-lightrag-post-commit-hardening-v1.md`
## 4. P17-18 agent file edit 归档收尾
目标:把 local-first 普通 Markdown agent 原生文件编辑从 `process` 收到可归档状态。
Checklist
- [x] 补 clean smoke 的真实后端 audit 证据:不要只依赖 mocked SSE receipt;要证明后端 `local_agent_audit``auditScope` 使用 `allowed_files`
- [x]`task535` 或新 `task539` 中断言 `auditScope.fileCount=1` 或等价目标文件范围证据。
- [x] smoke 继续断言不调用 `/api/documents/save``mnote.doc.markdown_edit``mnote.page.save`
- [x] 补 allowed roots 外写入拒绝验证:run payload 或 agent result 涉及 root 外路径时,后端 / wrapper / 审计层必须拒绝,不得返回成功 receipt。
- [x] 补发送后 frozen target 摘要:消息或 run 记录里能看到当次冻结 target;用户切换 tab 不影响已启动 run 的目标可解释性。
- [x] 多 tab / 跨 workspace / dirty write 确认先拆设计,不强行塞进当前 7-18 归档。
- [x] 更新 `design/07-ai/process/7-18-agent-edit-clean-dirty-smoke-checklist-v1.md` 状态。
- [x] 满足归档条件后移动到 `design/07-ai/done/`
验证:
- [x] `cargo test -p mnote-web local_agent_audit -- --test-threads=1`
- [x] `node scripts/task535-page-ai-local-agent-clean-edit-smoke.js`
- [x] `node scripts/task536-page-ai-local-agent-dirty-guard-smoke.js`
- [x] `node scripts/task537-page-ai-local-agent-readonly-write-guard-smoke.js`
- [x] `node scripts/task539-local-agent-audit-scope-contract.js`
- [x] 新增 allowed-root 外写入 smoke 或 targeted test。
运行态验证结果:
- `task535` 当前 3000 通过:clean buffer 下 agent 原生文件 patch 后,receipt refresh 触发当前文档和 filetree 刷新,tiptap 可见更新,且未调用旧保存/写入工具。
- `task536` 当前 3000 通过:dirty buffer 在 `/runs` 前阻塞,磁盘未变,编辑器 dirty 文本仍可见。
- `task537` 当前 3000 通过:readonly 写入在 `/runs` 前阻塞,磁盘未变。
- `task539` 当前 3000 通过:复跑 `task535`,断言 frozen target / allowedFiles;同时跑 `cargo test -p mnote-web local_agent_audit -- --test-threads=1`,证明后端 auditScope 使用 `allowed_files` / `fileCount=1`,并覆盖 client 注入 root 外 `allowedRoots` 会被 SQLite grant 改写。
## 5. P2Local-folder browser event bus
目标:减少 sidebar、document session、resource tab、Page AI receipt 对 local-folder watcher / realtime / refresh 的重复连接和竞态。
先拆设计:
- [x] 新建并完成归档 `design/03-rust-web/done/3-24-local-folder-browser-event-bus-v1.md`
- [x] 盘点现有入口:
- `rust/crates/mnote-web/browser/tree-live-controller.js`
- `rust/crates/mnote-web/browser/sidebar-tree-live-apply-runtime.js`
- `rust/crates/mnote-web/browser/document-session-runtime.js`
- `rust/crates/mnote-web/browser/document-resource-tab-runtime.js`
- `rust/crates/mnote-web/browser/sidebar-page-ai-runtime.js`
- [x] 明确 event bus 的输入源:`/api/realtime/ws` 主链、`/api/tree/events` SSE fallback、Page AI receipt synthesized batch。
- [x] 明确 event bus 的输出事件:
- `watch_batch`
- `document_changed`
- `resource_changed`
- `filetree_parent_changed`
- `knowledge_rag_source_updated`
- `resync_required`
- [x] 明确订阅方职责:sidebar 只刷新 projection / filetree parentdocument session 只刷新当前文档;resource tab 只刷新当前资源;Page AI 只派发 receipt refresh。
设计产出:
- `design/03-rust-web/done/3-24-local-folder-browser-event-bus-v1.md` 已记录当前重复连接来源、bus 输入/输出事件、订阅方职责、分 Phase 实施和 smoke 验收。
实施 Checklist
- [x] 新增浏览器 singleton:同一 `workspaceId/rootUri` 只允许一个 realtime 连接。
- Phase A 已新增 `local-folder-event-bus-runtime.js`,并让 `tree-live-controller.js` 的 local-folder 分支优先通过 `window.__mnoteLocalFolderEventBus.startLocalFolderWatcher(...)` 创建 watcher`document-session-runtime.js` / `document-resource-tab-runtime.js` 仍待 Phase C 切换后才能勾选总体验收。
- Phase C-1 已让 document session 与 passive resource tab 在 bus 可用时复用 root 级 watcher`task540` 已验证 sidebar/tree live + document session 同页只创建 1 个 `/api/local-folder/events` EventSource。resource tab + Page AI 全组合仍待 smoke 扩展后勾选总项。
- 扩展 `task540` 覆盖 resource tab 后发现 tree live / resource tab 的 workspaceId 解析可能不一致,已把 bus 连接 key 收口为页面内 `rootUri`,避免同一 root 重复建 watcher。
- `task540` 当前在 3300 通过,已覆盖 document page + passive resource tab + `synthetic_page_ai_receipt` 同页只创建 1 个 `/api/local-folder/events`;真实 Page AI 面板点击到 receipt 的完整 UI 链路仍待扩展。
- [x] 保留 WS 主链和 SSE fallback,但连接创建由 event bus 统一管理。
- 非 local-folder tree live 仍保留 `tree-live-ws` / `tree-live-sse`local-folder watcher 正常路径由 event bus 统一管理,bus 不可用时保留旧 EventSource fallback。
- [x] `refreshLocalFolderSidebarSnapshot` 增加 orchestrator:同一 tick 合并请求、记录 reason、避免重复 sidebar projection 和 filetree parent refresh。
- [x] sidebar live apply 改为订阅 event bus,不直接拥有全部连接与刷新策略。
- [x] document session 改为订阅当前文档变更事件,不直接假设所有 watch batch 都要刷新。
- [x] resource tab 改为订阅资源路径变更事件,不与 document session 重复处理。
- [x] Page AI receipt 转为 event bus synthetic event,避免 receipt + watcher echo 双刷新。
- 当前仍保留 bus 不可用时的旧 `tree:local-folder-watch-batch` fallback。
验证:
- [x] 新增 smoke:同一页面只存在一个 WS 或 EventSource local-folder realtime 连接。
- `scripts/task540-local-folder-event-bus-single-connection-smoke.js` 已新增并在 3300 通过;当前覆盖 sidebar/tree live + document session + passive resource tab + Page AI synthetic receipt,尚未覆盖真实 Page AI 面板点击完整链路。
- [x] 外部修改当前 `.md` 后,tiptap 可见刷新。
- [x] 外部新增 / 删除文件后,filetree 只做局部 parent refresh。
- [x] Page AI agent file edit receipt 后,不重复请求 sidebar projection。
- [x] 复跑 tree realtime 基线:`task446``task447``task448` 或相邻 smoke。
- `task446` / `task447` / `task448` 当前仍请求无 workspace 的 `/api/tree/commands` cloud/Convex 旧入口,结果为 `convex_retired`,不作为 local-folder event bus 证据。
- 相邻 local-folder runtime smoke 已通过:`task435``task436``task535``task540`
运行态验证结果:
- `task540` 在 3300 最新 mnote-web 通过:document page + passive resource tab + `synthetic_page_ai_receipt` 同页只创建 1 个 `/api/local-folder/events`;连续两个同 tick receipt 只触发 1 次 filetree parent projectionsidebar projection 为 0。
- `task535` 在 3300 最新 mnote-web 通过:真实 Page AI clean agent receipt 后当前文档和 filetree 均刷新,且未调用 `/api/documents/save``mnote.doc.markdown_edit``mnote.page.save`
- `task436` 在 3300 最新 mnote-web 通过:当前打开 local `.md` 外部修改后 tiptap 可见刷新,dirty 文档进入冲突保护。
- `task435` 在 3300 最新 mnote-web 通过:外部创建/重命名/删除 Markdown 与非 Markdown 资源后 page tree / filetree 原地更新且无 reload。
## 6. P3Page Aggregate local-first hard guard
目标:防止 local-first 文档页回落到 legacy block / compat content 影子路径。
Checklist
- [x] 新建或更新 `design/05-editor-mainline/process/*page-aggregate-local-first-hard-guard*.md`;完成后已归档为 `design/05-editor-mainline/done/5-36-page-aggregate-local-first-hard-guard-v1.md`
- [x] 复核 `document-tiptap-conversion-runtime.js` 的 source 判定:local-first 正常路径必须优先 `page_aggregate.block_document`
- [x]`compat.legacy_content` fallback 增加 telemetry 或 DOM diagnostic,便于 smoke 断言。
- [x] local-first `.md` 文档页 smoke 断言不得出现 `compat.legacy_content`
- [x] cloud / legacy / explicit compat 场景继续允许 fallback,并保留独立 contract test。
- [x] 保存链路继续向 `EditorBlockDocument` / `tiptapDocument` 单一主 payload 收口,不扩大 legacyBlocks 使用面。
验证:
- [x] `node scripts/task522-page-aggregate-compat-fallback-contract.js`
- [x] `node scripts/task167-local-markdown-title-body-options-no-convex-smoke.js`
- [x] 新增并通过 `node scripts/task541-page-aggregate-local-first-hard-guard-smoke.js`
- [x] 涉及保存链路时补跑 Page Aggregate body / options smoke;本轮未改保存链路,已用 `task167` 覆盖 local-first title/body/options 写入与回读。
运行态验证结果:
- `task522` 通过:`blockDocument` 优先于 legacy contentexplicit compat legacy-only 仍允许 `compat.legacy_content`
- `task167` 通过:local-first Page Aggregate 保持 `projectionSource=local_markdown.content` 且输出 `blockDocument`,标题、正文、页面设置写入后不退回 legacy。
- `task541` 通过:真实浏览器打开 local `.md`editor root 诊断为 `data-mnote-page-body-source=page_aggregate.block_document``data-mnote-page-body-local-compat-fallback=false``data-mnote-page-body-hard-guard=local_ok`
- `cargo test -p mnote-web document_editor_adapter_runtime_contains_host_contracts -- --test-threads=1` 通过,覆盖 runtime source 诊断合同。
## 7. P47-47 capability registry 口径重写与实施
目标:减少 Hermes manifest、Reasonix wrapper、Page AI UI、tool disabled policy 的手写漂移。
先修订设计:
- [x] 更新历史 capability registry,将试点从 `mnote-local-index` 改为 `mnote-knowledge-rag`;该注册表现已归档到 `design/old/07-ai/`
- [x] 删除或改写 `mnote.evidence.*``mnote.index.*` 作为 active capability 示例的内容。
- [x] 明确旧 alias`mnote-document-evidence` / `mnote-local-index` 只映射到 `mnote-knowledge-rag`,不恢复旧工具。
Phase A:只加 registry,不改 UI 行为。
- [x] 新增或整理 capability pack 单一注册表。
- [x] Rust manifest tools 自动带 `capabilityId`
- [x] `/api/hermes/tools/mnote/manifest` 输出 `capabilities[]`
- [x]`/client/skills``/client/tools` 响应兼容。
Phase BUI 消费 capability pack。
- [x] `/api/hermes/client/capabilities` 成为 Page AI “能力”页数据源。
- [x] 能力行展示 tools 数、read/write、contextRefs、enabled 状态。
- [x] Runtime 高级页 tools 按 capability 分组。
Phase C:能力包开关驱动工具硬策略。
- [x] `/api/hermes/client/capabilities/toggle` 同步 skill preference 与 profile tool disabled policy。
- [x] `page_ai_capability_policy()` 过滤 disabled capability。
- [x] `execute_mnote_tool_call()` 对 disabled capability 下的 tool 继续硬拒绝。
Phase D:减少 Reasonix / Hermes adapter 手写漂移。
- [x] Reasonix wrapper 启动时优先读取 Rust manifest 动态注册工具。
- [x] 手写工具表降为 mnote-web 未启动时的 fallback。
- [x] Hermes plugin 若仍需要本机 Python plugin,则从 Rust manifest 生成或同步;当前 repo 主链不直接写 `/home/lix/.hermes/plugins/mnote`,7-47 已记录为后续独立生成条件。
验证:
- [x] 新增 Rust tool 后,只改 manifest / capability packPage AI 能力页与 Reasonix 工具可见性同步变化。
- [x] 关闭 `mnote-knowledge-rag` 后,agent 不看到该能力摘要。
- [x] 关闭后直接调用 `mnote.knowledge_rag.query` 返回 disabled / capability disabled。
- [x] `MNOTE_REASONIX_ACP_SELFTEST=1 node scripts/reasonix-acp-wrapper.mjs` 通过。
运行态验证结果:
- `cargo test -p mnote-web page_ai_capabilities_expose_knowledge_rag_and_toggle_tools -- --test-threads=1` 通过:能力页不暴露 `mnote-local-index`,暴露 `mnote-knowledge-rag`toggle 后 `mnote.knowledge_rag.query` 在 tools 响应中为 disabled。
- `cargo test -p mnote-web hermes_tools_manifest_exposes_mnote_capability_packs -- --test-threads=1` 通过:manifest 输出 `capabilities[]`knowledge-rag tools 带 `capabilityIds`,旧 `mnote.index.status` 不注册。
- `MNOTE_REASONIX_ACP_SELFTEST=1 node scripts/reasonix-acp-wrapper.mjs` 通过。
- `timeout 3s env MNOTE_REASONIX_ACP_DEBUG=1 MNOTE_WEB_URL=http://127.0.0.1:3000 node scripts/reasonix-acp-wrapper.mjs </dev/null` 启动探针显示 `registered 7 mnote tools from runtime_manifest`
## 8. P5Local search residual boundary
目标:LightRAG 退役旧 evidence 后,保留 MNote 普通搜索,但不让它重新变成资料库问答或 OCR fallback。
Checklist
- [x] 先审当前未提交的 `search.rs` / `task452` 改动归属:`search.rs` 原有 diff 主要是格式化;`task452` 原有 diff 是本地索引 settings API / backlink / tag API smoke 扩展,本轮继续按 P5 收口。
- [x] 明确 `/api/search/documents` 只服务 Markdown 页面、资源标题、tag、backlink、普通 local search。
- [x] 明确 `/api/search/documents` 不读旧 OCR sidecar,也不调用 LiteParse / evidence.sqlite 作为资料库问答 fallback。
- [x] `task452` 继续验证本地搜索 settings API / tag / backlink API,但不恢复旧 local-index UI 入口,也不暗示它是资料库问答入口。
- [x] 更新 `scripts/TESTING_REFERENCE.md` 中 local search 与 LightRAG 的边界。
验证:
- [x] `MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3300 node scripts/task452-local-search-index-browser-smoke.js`
- [x] `cargo test -p mnote-web search_documents_local_folder -- --test-threads=1`
- [x] `cargo test -p mnote-web local_search_ocr_sidecar_is_hidden_after_lightrag_retirement -- --test-threads=1`
运行态验证结果:
- `/api/search/documents` local-folder 响应 meta 新增 boundary`knowledgeRag=false``evidenceSqliteFallback=false``liteParseFallback=false``ocrSidecarFallback=false`,并返回空 `evidence` 数组。
- 新增/更新 targeted test 证明:普通本地搜索不再把 stale `evidence.sqlite` 命中提升为搜索结果,也不把旧 OCR sidecar 当搜索结果。
- `task452` 在 3300 最新构建通过:搜索、settings API、backlinks/tags API 仍可用;旧 `mnote-local-index-settings-toggle` 不复活,页面保留 `mnote-knowledge-rag-settings-toggle` 作为资料库入口。
- 宽泛 `cargo test -p mnote-web search -- --test-threads=1` 未作为 P5 通过证据:其中仍包含退役 evidence / LiteParse 旧测试和当前 local-index settings 历史失败,后续 P6 设计治理会处理旧 process / retired 测试口径。
## 9. P6Design 状态治理
目标:减少后续 worker 从旧 process / old process 中误派活。
Checklist
- [x] 更新并归档 `design/10-review/done/19-non-lightrag-design-cleanup-followup-checklist-v1.md`P1/P2/P3/P4/P5 均已回填完成证据。
- [x] 处理 `design/07-ai/process/7-46-document-evidence-retrieval-kernel-v1.md`:因 7-50 已覆盖默认资料库主线,已移到 `design/07-ai/reference/7-46-document-evidence-retrieval-kernel-v1.md` 并标注仅作历史 / migration 说明。
- [x] 处理 `design/07-ai/process/7-48-paperless-ngx-reference-resource-ingestion-job-index-v1.md`:已移到 `design/07-ai/reference/7-48-paperless-ngx-reference-resource-ingestion-job-index-v1.md` 并标注仅作为 LightRAG / job ledger 参考,不再作为 active evidence.sqlite 主线。
- [x]`design/old/README.md` 下增加说明:old 下的 `process` 不作为 active 任务源,除非用户显式要求历史审计。
- [x] 每次新建 checklist 必须写明 owner、非目标、验收命令和归档条件;本轮新增 `3-24` / `5-36` / `7-51` / `20` 均按该格式回填。
运行态验证结果:
- `find design/07-ai/process` 当前不再包含 `7-46` / `7-48`
- `design/old/README.md` 已明确 old/process 非 active 任务源。
- `design/10-review/process/19...` 已移动到 `design/10-review/done/19...`
## 10. 推荐执行顺序
1. P0LightRAG 7-50 post-commit audit。
2. P17-18 agent file edit 归档收尾。
3. P2Local-folder browser event bus。
4. P47-47 capability registry 口径重写与实施。
5. P3Page Aggregate local-first hard guard。
6. P5 / P6:按当前脏改和设计误读风险穿插推进。
## 11. 总体验收
- LightRAG 作为资料库问答主线稳定,source truth / stale / delete / locatorDegraded / query scope 都有证据。
- 7-18 local-first 普通 Markdown agent 文件编辑 checklist 可归档。
- local-folder browser runtime 不再因为多个模块各自连接和刷新导致重复请求或竞态。
- local-first Page Aggregate 不再静默回落到 legacy content 主链。
- MNote AI capability 注册表能减少 manifest / wrapper / UI 漂移。
- 旧 evidence / LiteParse / local OCR 不再被 worker 误当作 active fallback。