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.
25 KiB
20 Post-LightRAG / Agent Edit / Runtime hardening checklist v1
创建时间:2026-06-07
状态:
doneOwner:10-review / 07-ai / 03-rust-web / 05-editor-mainline
上位依据:
design/07-ai/done/7-50-lightrag-knowledge-rag-provider-v1.mddesign/07-ai/done/7-51-lightrag-post-commit-hardening-v1.mddesign/07-ai/done/7-18-agent-edit-clean-dirty-smoke-checklist-v1.mddesign/07-ai/process/7-18-local-first-agent-file-editing-control-plane-v1.mddesign/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.rsscripts/task452-local-search-index-browser-smoke.jsscripts/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. P0:LightRAG 7-50 post-commit audit
目标:确认 7-50 作为 done 主线是稳定的,找出需要补的硬边界,不重复建设第二套 RAG。
Checklist:
- 只读 review 7-50 相关改动面:
rust/crates/mnote-web/src/routes/knowledge_rag.rsrust/crates/mnote-web/src/hermes_tools/knowledge_rag.rsrust/crates/mnote-web/src/hermes_tools/manifest.rsrust/crates/mnote-web/src/hermes_tools/skill.rsscripts/reasonix-acp-wrapper.mjsskills/mnote-knowledge-rag/SKILL.md- 资料库设置 UI、FileTree 状态灯、Page AI final answer smoke。
- 核对 source truth:registry 必须以 MNote source path 为真相;symlink / input wrapper / parsed cache 只作为派生物。
- 核对 delete / prune 语义:
delete-source、watcher stale sync、prune registry 不得删除用户原始 source。 - 核对 stale / deleted source:source 删除、hash 变化、rename / move 后,旧 LightRAG reference 不得继续作为有效 citation 暴露。
- 核对 status bridge:ingest / reindex 后的状态同步必须是有界 backoff;不得形成长期无界前台 polling。
- 核对 image wrapper:图片 source 生成 Markdown wrapper 后,registry 和 citation 仍映射回原始图片 source,而不是把 wrapper 当用户资料真相。
- 核对 query scope:
sourcePaths当前是否只是 query 后过滤 MNote mapped references;若 provider 层未能预过滤,UI / agent 文档必须明确这是“provider 检索后 MNote scope 过滤”。 - 核对 locator 降级:无 page / bbox / sidecar 命中时必须返回并展示
locatorDegraded=true,不得伪造页码、bbox 或 block id。 - 核对 LightRAG dashboard:MNote 只打开或嵌入 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 references,HTTP API 仍返回未过滤raw;已显式返回sourceScopeMode=post_filter_mapped_references与rawScopeFiltered=false。- sidecar locator 的
first_positioned_blockfallback 可能在 quote 不匹配时生成错误 page/bbox;已移除 fallback,未匹配时降级到 resourceTab citation。 - degraded citation 的 skill / wrapper / UI 文案已统一,并由 Page AI final answer smoke 覆盖。
- Reasonix wrapper 仍是手写工具表;已补短期 drift guard,长期按 7-47 动态注册。
- watcher stale sync 删除失败时可能丢失
验证:
cargo test -p mnote-web knowledge_rag -- --nocaptureMNOTE_REASONIX_ACP_SELFTEST=1 node scripts/reasonix-acp-wrapper.mjsnode --check scripts/task529-knowledge-rag-citation-resource-tab-smoke.jsnode --check scripts/task530-knowledge-rag-page-ai-final-answer-smoke.jsnode --check scripts/task531-lightrag-dashboard-ui-smoke.jsnode --check scripts/task532-knowledge-rag-docx-ingestion-smoke.jsnode --check scripts/task533-knowledge-rag-source-watcher-sync-smoke.jsnode --check scripts/task534-knowledge-rag-source-management-scope-smoke.jsnode --check scripts/task538-knowledge-rag-source-scope-api-smoke.jsnode scripts/task529-knowledge-rag-citation-resource-tab-smoke.jsnode scripts/task530-knowledge-rag-page-ai-final-answer-smoke.jsnode scripts/task531-lightrag-dashboard-ui-smoke.jsnode scripts/task532-knowledge-rag-docx-ingestion-smoke.jsnode scripts/task533-knowledge-rag-source-watcher-sync-smoke.jsMNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3300 node scripts/task534-knowledge-rag-source-management-scope-smoke.jsMNOTE_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 id;2026-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 smoke;2026-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-51Phase A/B/C/D/E 已完成主要代码硬化和单测/selftest;已移动到design/07-ai/done/。
产出:
- 若只发现小问题,直接在本 checklist 记录 audit 结果和 follow-up。
- 若发现需要代码硬化,新建
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. P1:7-18 agent file edit 归档收尾
目标:把 local-first 普通 Markdown agent 原生文件编辑从 process 收到可归档状态。
Checklist:
- 补 clean smoke 的真实后端 audit 证据:不要只依赖 mocked SSE receipt;要证明后端
local_agent_audit的auditScope使用allowed_files。 - 在
task535或新task539中断言auditScope.fileCount=1或等价目标文件范围证据。 - smoke 继续断言不调用
/api/documents/save、mnote.doc.markdown_edit、mnote.page.save。 - 补 allowed roots 外写入拒绝验证:run payload 或 agent result 涉及 root 外路径时,后端 / wrapper / 审计层必须拒绝,不得返回成功 receipt。
- 补发送后 frozen target 摘要:消息或 run 记录里能看到当次冻结 target;用户切换 tab 不影响已启动 run 的目标可解释性。
- 多 tab / 跨 workspace / dirty write 确认先拆设计,不强行塞进当前 7-18 归档。
- 更新
design/07-ai/process/7-18-agent-edit-clean-dirty-smoke-checklist-v1.md状态。 - 满足归档条件后移动到
design/07-ai/done/。
验证:
cargo test -p mnote-web local_agent_audit -- --test-threads=1node scripts/task535-page-ai-local-agent-clean-edit-smoke.jsnode scripts/task536-page-ai-local-agent-dirty-guard-smoke.jsnode scripts/task537-page-ai-local-agent-readonly-write-guard-smoke.jsnode scripts/task539-local-agent-audit-scope-contract.js- 新增 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. P2:Local-folder browser event bus
目标:减少 sidebar、document session、resource tab、Page AI receipt 对 local-folder watcher / realtime / refresh 的重复连接和竞态。
先拆设计:
- 新建并完成归档
design/03-rust-web/done/3-24-local-folder-browser-event-bus-v1.md。 - 盘点现有入口:
rust/crates/mnote-web/browser/tree-live-controller.jsrust/crates/mnote-web/browser/sidebar-tree-live-apply-runtime.jsrust/crates/mnote-web/browser/document-session-runtime.jsrust/crates/mnote-web/browser/document-resource-tab-runtime.jsrust/crates/mnote-web/browser/sidebar-page-ai-runtime.js
- 明确 event bus 的输入源:
/api/realtime/ws主链、/api/tree/eventsSSE fallback、Page AI receipt synthesized batch。 - 明确 event bus 的输出事件:
watch_batchdocument_changedresource_changedfiletree_parent_changedknowledge_rag_source_updatedresync_required
- 明确订阅方职责:sidebar 只刷新 projection / filetree parent;document 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:
- 新增浏览器 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/eventsEventSource。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 链路仍待扩展。
- Phase A 已新增
- 保留 WS 主链和 SSE fallback,但连接创建由 event bus 统一管理。
- 非 local-folder tree live 仍保留
tree-live-ws/tree-live-sse;local-folder watcher 正常路径由 event bus 统一管理,bus 不可用时保留旧 EventSource fallback。
- 非 local-folder tree live 仍保留
refreshLocalFolderSidebarSnapshot增加 orchestrator:同一 tick 合并请求、记录 reason、避免重复 sidebar projection 和 filetree parent refresh。- sidebar live apply 改为订阅 event bus,不直接拥有全部连接与刷新策略。
- document session 改为订阅当前文档变更事件,不直接假设所有 watch batch 都要刷新。
- resource tab 改为订阅资源路径变更事件,不与 document session 重复处理。
- Page AI receipt 转为 event bus synthetic event,避免 receipt + watcher echo 双刷新。
- 当前仍保留 bus 不可用时的旧
tree:local-folder-watch-batchfallback。
- 当前仍保留 bus 不可用时的旧
验证:
- 新增 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 面板点击完整链路。
- 外部修改当前
.md后,tiptap 可见刷新。 - 外部新增 / 删除文件后,filetree 只做局部 parent refresh。
- Page AI agent file edit receipt 后,不重复请求 sidebar projection。
- 复跑 tree realtime 基线:
task446、task447、task448或相邻 smoke。task446/task447/task448当前仍请求无 workspace 的/api/tree/commandscloud/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 projection,sidebar 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. P3:Page Aggregate local-first hard guard
目标:防止 local-first 文档页回落到 legacy block / compat content 影子路径。
Checklist:
- 新建或更新
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。 - 复核
document-tiptap-conversion-runtime.js的 source 判定:local-first 正常路径必须优先page_aggregate.block_document。 - 对
compat.legacy_contentfallback 增加 telemetry 或 DOM diagnostic,便于 smoke 断言。 - local-first
.md文档页 smoke 断言不得出现compat.legacy_content。 - cloud / legacy / explicit compat 场景继续允许 fallback,并保留独立 contract test。
- 保存链路继续向
EditorBlockDocument/tiptapDocument单一主 payload 收口,不扩大 legacyBlocks 使用面。
验证:
node scripts/task522-page-aggregate-compat-fallback-contract.jsnode scripts/task167-local-markdown-title-body-options-no-convex-smoke.js- 新增并通过
node scripts/task541-page-aggregate-local-first-hard-guard-smoke.js - 涉及保存链路时补跑 Page Aggregate body / options smoke;本轮未改保存链路,已用
task167覆盖 local-first title/body/options 写入与回读。
运行态验证结果:
task522通过:blockDocument优先于 legacy content,explicit 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. P4:7-47 capability registry 口径重写与实施
目标:减少 Hermes manifest、Reasonix wrapper、Page AI UI、tool disabled policy 的手写漂移。
先修订设计:
- 更新历史 capability registry,将试点从
mnote-local-index改为mnote-knowledge-rag;该注册表现已归档到design/old/07-ai/。 - 删除或改写
mnote.evidence.*、mnote.index.*作为 active capability 示例的内容。 - 明确旧 alias:
mnote-document-evidence/mnote-local-index只映射到mnote-knowledge-rag,不恢复旧工具。
Phase A:只加 registry,不改 UI 行为。
- 新增或整理 capability pack 单一注册表。
- Rust manifest tools 自动带
capabilityId。 /api/hermes/tools/mnote/manifest输出capabilities[]。- 旧
/client/skills、/client/tools响应兼容。
Phase B:UI 消费 capability pack。
/api/hermes/client/capabilities成为 Page AI “能力”页数据源。- 能力行展示 tools 数、read/write、contextRefs、enabled 状态。
- Runtime 高级页 tools 按 capability 分组。
Phase C:能力包开关驱动工具硬策略。
/api/hermes/client/capabilities/toggle同步 skill preference 与 profile tool disabled policy。page_ai_capability_policy()过滤 disabled capability。execute_mnote_tool_call()对 disabled capability 下的 tool 继续硬拒绝。
Phase D:减少 Reasonix / Hermes adapter 手写漂移。
- Reasonix wrapper 启动时优先读取 Rust manifest 动态注册工具。
- 手写工具表降为 mnote-web 未启动时的 fallback。
- Hermes plugin 若仍需要本机 Python plugin,则从 Rust manifest 生成或同步;当前 repo 主链不直接写
/home/lix/.hermes/plugins/mnote,7-47 已记录为后续独立生成条件。
验证:
- 新增 Rust tool 后,只改 manifest / capability pack,Page AI 能力页与 Reasonix 工具可见性同步变化。
- 关闭
mnote-knowledge-rag后,agent 不看到该能力摘要。 - 关闭后直接调用
mnote.knowledge_rag.query返回 disabled / capability disabled。 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. P5:Local search residual boundary
目标:LightRAG 退役旧 evidence 后,保留 MNote 普通搜索,但不让它重新变成资料库问答或 OCR fallback。
Checklist:
- 先审当前未提交的
search.rs/task452改动归属:search.rs原有 diff 主要是格式化;task452原有 diff 是本地索引 settings API / backlink / tag API smoke 扩展,本轮继续按 P5 收口。 - 明确
/api/search/documents只服务 Markdown 页面、资源标题、tag、backlink、普通 local search。 - 明确
/api/search/documents不读旧 OCR sidecar,也不调用 LiteParse / evidence.sqlite 作为资料库问答 fallback。 task452继续验证本地搜索 settings API / tag / backlink API,但不恢复旧 local-index UI 入口,也不暗示它是资料库问答入口。- 更新
scripts/TESTING_REFERENCE.md中 local search 与 LightRAG 的边界。
验证:
MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3300 node scripts/task452-local-search-index-browser-smoke.jscargo test -p mnote-web search_documents_local_folder -- --test-threads=1cargo test -p mnote-web local_search_ocr_sidecar_is_hidden_after_lightrag_retirement -- --test-threads=1
运行态验证结果:
/api/search/documentslocal-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. P6:Design 状态治理
目标:减少后续 worker 从旧 process / old process 中误派活。
Checklist:
- 更新并归档
design/10-review/done/19-non-lightrag-design-cleanup-followup-checklist-v1.md:P1/P2/P3/P4/P5 均已回填完成证据。 - 处理
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 说明。 - 处理
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 主线。 - 在
design/old/README.md下增加说明:old 下的process不作为 active 任务源,除非用户显式要求历史审计。 - 每次新建 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. 推荐执行顺序
- P0:LightRAG 7-50 post-commit audit。
- P1:7-18 agent file edit 归档收尾。
- P2:Local-folder browser event bus。
- P4:7-47 capability registry 口径重写与实施。
- P3:Page Aggregate local-first hard guard。
- 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。