# Batch B2 Worker F：Local Search Index Page Settings Panel

项目根目录：`/mnt/Data1T/mnote`

你不是单独在代码库里工作，可能有其他 worker 并行执行。不要回滚、覆盖或格式化与你任务无关的文件；不要提交 git。

## 背景

Batch B Worker C 运行 `scripts/task452-local-search-index-browser-smoke.js`：

- `/api/search/documents` 返回 200，结果包含 `LOCAL-SEARCH-*` token。
- 失败点在 page-settings 索引页签：`wolai-page-settings-local-index-backlinks` / `wolai-page-settings-local-index-tags` 30 秒内没有渲染出 `"Search Smoke"` 和 `"#alpha"`。
- 结果文件：`tmp/task452-local-search-index-browser-smoke/result.json`。

初步入口：

- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
  - `pageSettingsLocalIndexScopeKey`
  - `pageSettingsLocalIndexIsAvailable`
  - `renderPageSettingsLocalIndex`
  - `loadPageSettingsLocalIndex`
  - `setActivePageSettingsTab`
- Rust API 单测在 `rust/crates/mnote-web/src/routes/search.rs` 已覆盖 `/api/search/local-index/backlinks` 和 `/api/search/local-index/tags` 授权读取。

## 目标

系统化排查并最小修复 `task452`：

1. 先复现或读取 `tmp/task452.../result.json`，确认不是搜索 API 问题。
2. 明确 root cause：例如 `currentRootUri()`、`currentDocumentId()`、`resolveWorkspaceId(document.body)`、tab 激活、fetch 失败、payload shape、或 UI render 条件。
3. 用最小补丁修复 page-settings 本地索引 panel 的渲染。
4. 保持 local-first 口径：本地索引 panel 只在 `sourceKind=local_folder` + `rootUri` + 当前文档可识别时工作。

## 允许修改范围

- `rust/crates/mnote-web/src/ssr/pages/layout.rs`
- `scripts/task452-local-search-index-browser-smoke.js`（仅允许增加诊断或同步当前真实 UI 语义；不要弱化核心断言）
- 可新增 `.codex/reasonix-tasks/results/batch-b2-worker-f-local-index-panel.md`

不要修改搜索后端、Convex、OnlyOffice、AI 工具链。

## 验收命令

至少运行：

```bash
node --check scripts/task452-local-search-index-browser-smoke.js
```

如果本地 `http://127.0.0.1:3000` 可用，请实跑：

```bash
PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH=/usr/bin/google-chrome-stable node scripts/task452-local-search-index-browser-smoke.js
```

如改动 `layout.rs` 影响 Rust 编译，请运行相关 targeted test 或至少：

```bash
cargo test -p mnote-web search_local_index_backlinks_and_tags_read_authorized_root -- --test-threads=1
```

## 输出要求

最终说明：

- 根因判断，必须指向具体函数或数据流。
- 修改了哪些文件。
- 验证命令和结果。
- `task452` 仍失败时，说明新的失败点，不要把失败写成完成。
