// 增量 2 验收(2026-10-12 诊断报告):普通基座(无 rdm.inspect.* 命令面)不展示 // 「追溯审计」入口,且不发出任何 rdm.* 命令请求——消除「入口可达、进入即 400」。 // 驱动:scripts/e2e.sh 第 4 阶段——RDM 组合验收跑完后,同一数据目录换基座 CLI //(agent-system serve,同源同 pin)服务,同一 preview 指向它,只跑本文件。 // 环境契约与 rdm-audit.playwright.ts 一致(e2e.sh 注入)。 import { test, expect, type Page } from '@playwright/test' const OWNER = process.env.E2E_OWNER || 'e2e-auditor' const PASSWORD = process.env.E2E_PASSWORD || 'E2eAudit#2026' const PASSWORD2 = process.env.E2E_PASSWORD2 || 'E2eAudit#2026b' // 仅第 4 阶段(普通基座)启用:RDM 组合主跑(第 3 阶段)扫全目录时本文件自跳过, // 否则「入口隐藏」断言会跑在入口本就可见的 RDM 组合上。 test.skip(!(process.env.PLAYWRIGHT_BASE_URL && process.env.E2E_PLAIN_BASE), 'set PLAYWRIGHT_BASE_URL + E2E_PLAIN_BASE (scripts/e2e.sh phase 4 drives this suite)') // 与 rdm-audit spec 同一账号:若数据库仍是初始密码则先过强制改密门。 async function login(page: Page) { await page.goto('/') await page.getByPlaceholder('由管理员分配').fill(OWNER) await page.getByPlaceholder('初始密码或常用密码').fill(PASSWORD) await page.getByRole('button', { name: '登录', exact: true }).click() const gate = page.getByText('修改密码') const gated = await gate.waitFor({ state: 'visible', timeout: 5_000 }).then(() => true).catch(() => false) if (gated) { const pwInputs = page.locator('.lg-card input[type="password"]') await pwInputs.nth(0).fill(PASSWORD) await pwInputs.nth(1).fill(PASSWORD2) await pwInputs.nth(2).fill(PASSWORD2) await page.getByRole('button', { name: '设置新密码并进入' }).click() } else { // 已改密(RDM 阶段完成):改用新密码重登。 await page.getByPlaceholder('初始密码或常用密码').fill(PASSWORD2) await page.getByRole('button', { name: '登录', exact: true }).click() } } test('普通基座:命令面无 rdm.inspect.* → 审计入口隐藏、无 rdm 请求', async ({ page }) => { const rdmRequests: string[] = [] page.on('request', r => { if (r.url().includes('/api/commands/rdm.')) rdmRequests.push(r.url()) }) await login(page) // 登录成功标志:侧栏常驻「代理」与「文件」体系工具(均为无条件内置)。 await expect(page.locator('.tsb-tool', { hasText: '代理' })).toBeVisible({ timeout: 15_000 }) await expect(page.locator('.tsb-tool', { hasText: '文件' })).toBeVisible() // 能力探测(GET /api/commands)返回普通基座清单后,审计入口保持隐藏。 await expect(page.locator('.tsb-tool', { hasText: '追溯审计' })).toHaveCount(0) await page.waitForTimeout(500) await expect(page.locator('.tsb-tool', { hasText: '追溯审计' })).toHaveCount(0) // 入口不存在则不应有任何 rdm.* 命令请求(原缺陷路径是进入即 400)。 expect(rdmRequests).toEqual([]) })