前端
测试
改了 GlobalNav.tsx 的结构:tab 数组从组件内常量搬到 lib/tabs.ts,渲染前按 visible 过滤。 理由与影响范围:这是本轮功能的落点,除此之外每一格的样式、间距、圆角、选中态与外层容器一个字节没动; 三个 tab 全部可见时,渲染结果与画板 1a 一字不差(实测截图见「本轮实测」)。 其余页面的改动都是在 export default 的第一行加一句门禁 await,不进 JSX。
| # | 检查 | 命令 / 期望 |
|---|---|---|
| 1 | 编译与全量测试 | dev.ps1 check 通过;dev.ps1 test 16 文件 388 用例全绿 |
| 2 | 迁移种子 ↔ 登记表一致 | site/tabs.test.ts 第 1 条:库里的 key 集合 == SITE_TAB_KEYS |
| 3 | 读面缺行兜底成可见 | site/tabs.test.ts:删掉 about 那行,listTabs 仍回 about: true |
| 4 | 库里未知 key 被丢弃 | site/tabs.test.ts:插 admin 行,listTabs 仍只回三个 |
| 5 | 写面拒绝未知 key | mcp.test.ts:setSiteTab({key:'admin'}) → NotFoundError;site_tab_set 的 key 是 enum |
| 6 | 不许关掉最后一个可见 tab | mcp.test.ts:关掉两个后再关第三个 → ConflictError,且事务回滚(第三个仍可见) |
| 7 | 遗留的未知行不算「还有可见 tab」 | mcp.test.ts:库里有 admin 行时第 6 条仍然拒绝 |
| 8 | 隐藏 runtime → 导航条少一格,/ 302 | 本机实跑:GET / 307,落到 /notes,导航条只剩 Notes / About |
| 9 | 隐藏 notes → /notes 404 | 本机实跑:GET /notes 404,页面是站点布局里的 404 |
| 10 | 全部恢复可见 → 与画板 1a 一致 | 本机实跑截图:三格齐全、Runtime 选中、工作台照常 |
| 11 | 管理面工具总数闸更新 | mcp.test.ts 的 toHaveLength(34)(原 32) |
同一验收项针对性整改后连续 2 次验证仍不过 → 写 rounds/round-tabs/BLOCKED.md,停下呼人。
| 库里的开关 | GET / | GET /notes | 导航条 |
|---|---|---|---|
| 三个都 true | 200,工作台 | 200 | Runtime · Notes · About(与画板 1a 一致) |
| runtime=false | 307 → /notes | 200 | Notes · About |
| runtime=false, notes=false | 307 → /about | 404 | About |
| 恢复三个 true | 200,工作台 | 200 | 三格齐全 |
| 步骤 | 结果 |
|---|---|
| server/discover | 200,supportedVersions=2026-07-28 |
| tools/list | 200,工具总数 34,含 site_tabs_list / site_tab_set;key 的 enum 下发为 runtime, notes, about |
| site_tab_set{runtime,false} | visibleTabs: [notes, about],GET /site/tabs 同步变为 runtime:false |
| site_tab_set{key:'admin'} | isError,SDK 层就拒:expected one of "runtime"|"notes"|"about" |
| 关掉 notes 后再关 about | isError + 那句可读的拒绝理由,事务回滚,about 仍可见 |
| 三个逐个恢复 | 全部 updated,收尾态三格全可见 |