From 8a9614d19ea8e25edf821ec3df6a2b07d7d4bb83 Mon Sep 17 00:00:00 2001 From: weichen Date: Mon, 28 Sep 2026 01:50:26 +0000 Subject: [PATCH] =?UTF-8?q?docs(test):=20=E5=BD=92=E6=A1=A3=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E9=A2=84=E8=A7=88=E9=A2=84=E6=A3=80=E5=A4=8D=E9=AA=8C?= =?UTF-8?q?=E5=B9=B6=E5=85=B3=E9=97=AD=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit dev 浏览器已确认未纳入审批时不再请求 activation-preview,兼任后预览 200,密钥框均在 form 内。 --- .doc/audit/ISSUES.md | 6 +-- .doc/ops/CURRENT.md | 2 +- ...26-09-28-activation-preview-client-gate.md | 20 ++++++++ .doc/ops/lessons/INDEX.md | 1 + .../2026-09-28-activation-preview-precheck.md | 16 +++---- ...activation-preview-precheck-test-report.md | 46 +++++++++++++++++++ 6 files changed, 79 insertions(+), 12 deletions(-) create mode 100644 .doc/ops/lessons/2026-09-28-activation-preview-client-gate.md create mode 100644 .doc/test-reports/2026-09-28-activation-preview-precheck-test-report.md diff --git a/.doc/audit/ISSUES.md b/.doc/audit/ISSUES.md index 643a56f0..63926699 100644 --- a/.doc/audit/ISSUES.md +++ b/.doc/audit/ISSUES.md @@ -2,12 +2,12 @@ 维护规则:[问题记录与开发经验闭环](../ops/2026-09-23-issue-learning-workflow.md)。每个问题一个稳定 ID;主记录是事实与状态来源,本表为可检索投影。新发现及时登记,修复后保留记录;发布 blocker 仍见 [gap-matrix](../remediation/gap-matrix.md)。 -更新:2026-09-28。激活预览:未纳入人工审批的计划前端直接请求导致 400(fixing,待 dev 浏览器复验);管理台 5 个密钥框不在 form 内触发 password DOM 警告(fixing)。非编制人触发小队账本提交被 `uow: permission denied` 拒绝(fixing,待 dev 重跑)。test 注册 INTERNAL:标准角色 role-guest 缺失导致 FK 23503,已补种并重启 test(goose 77,resolved)。重复用户名 400 在新代码单测通过;当前 rc 二进制仍返回 INTERNAL,随下次含本提交的 test 制品生效。管理台重置密码入口被 F4-A 误删(端点仍在),已恢复 UI(resolved)。2026-09-27。上传链路:登记并修复上传文档跨端不可访问(占位模板退化 + 元数据/正文不落服务端,fixing 待 dev 集成)。2026-09-26。docgov 批准链:登记并修复 review_snapshot_id 装载缺失与 uow 行锁自死锁(resolved);memDocs 持久化失败缓存投毒(investigating)。历史 resolved 不表示本日产品回归通过。系统 code review P0/P1 批次修复落账(5 resolved + 1 deferred + 1 open,主记录见 [整改文档](2026-09-26-system-code-review-fixes.md),来源 [审计](2026-09-26-system-code-review.md))。 +更新:2026-09-28。激活预览前端预检与管理台密钥 form 已在 dev 浏览器复验(resolved,dev `3e534bbb`,项目 6023)。非编制人触发小队账本提交被 `uow: permission denied` 拒绝(fixing,待 dev 重跑)。test 注册 INTERNAL:标准角色 role-guest 缺失导致 FK 23503,已补种并重启 test(goose 77,resolved)。重复用户名 400 在新代码单测通过;当前 rc 二进制仍返回 INTERNAL,随下次含本提交的 test 制品生效。管理台重置密码入口被 F4-A 误删(端点仍在),已恢复 UI(resolved)。2026-09-27。上传链路:登记并修复上传文档跨端不可访问(占位模板退化 + 元数据/正文不落服务端,fixing 待 dev 集成)。2026-09-26。docgov 批准链:登记并修复 review_snapshot_id 装载缺失与 uow 行锁自死锁(resolved);memDocs 持久化失败缓存投毒(investigating)。历史 resolved 不表示本日产品回归通过。系统 code review P0/P1 批次修复落账(5 resolved + 1 deferred + 1 open,主记录见 [整改文档](2026-09-26-system-code-review-fixes.md),来源 [审计](2026-09-26-system-code-review.md))。 | issue_id | 模块 / 检索词 | 问题 | 严重度 | issue_state | owner | 证据日期 / 范围 | 唯一主记录 | 经验 | |---|---|---|---|---|---|---|---|---| -| ISSUE-20260928-activation-preview-precheck | web / projectSettings / activation-preview / NO_GOVERNED_DOCUMENT / clientDutyIssues | 全部文档未纳入人工审批时前端仍 POST activation-preview,控制台 400 | medium | fixing | Cursor | 2026-09-28;dev 项目 6022 令牌表仅 00:45:08 一行,首次保存后无令牌 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-activation-preview-precheck) | 待浏览器复验后补 | -| ISSUE-20260928-admin-secret-password-form | web / EnvSettingsSection / password / form / secrets | 管理台 5 个密钥输入不在 form 内,Chromium 报 password DOM 警告 | low | fixing | Cursor | 2026-09-28;与 `secrets.*` 五条 Secret 设置数量一致 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-admin-secret-password-form) | 待浏览器复验后补 | +| ISSUE-20260928-activation-preview-precheck | web / projectSettings / activation-preview / NO_GOVERNED_DOCUMENT / clientDutyIssues | 全部文档未纳入人工审批时前端仍 POST activation-preview,控制台 400 | medium | resolved | Cursor | 2026-09-28;dev 项目 6023 默认计划无 activation-preview 请求,兼任后 preview 200 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-activation-preview-precheck) | [LESSON-20260928-activation-preview-client-gate](../ops/lessons/2026-09-28-activation-preview-client-gate.md) | +| ISSUE-20260928-admin-secret-password-form | web / EnvSettingsSection / password / form / secrets | 管理台 5 个密钥输入不在 form 内,Chromium 报 password DOM 警告 | low | resolved | Cursor | 2026-09-28;dev 模型与密钥页 passwordInputs=5 outsideForm=0 | [主记录](../ops/short-term/2026-09-28-activation-preview-precheck.md#issue-20260928-admin-secret-password-form) | 密码框放进 form;autocomplete 不能单独消除该 DOM 警告 | | ISSUE-20260928-squad-commit-authority | bizdev / docflow / dutyAuthorizer / uow permission denied / OnBehalfOf / bd_intake | 非编制人触发受控小队任务时,账本提交用触发者身份,被编制人职责门拒绝,正文无法落盘 | high | fixing | Cursor | 2026-09-28;dev task_runs user 74 ≠ author 4(doc_proj6022_bd_intake);单测已绿,dev 重跑未做 | [主记录](../ops/short-term/2026-09-28-squad-commit-authority.md#issue-20260928-squad-commit-authority) | [LESSON-20260928-squad-commit-as-author](../ops/lessons/2026-09-28-squad-commit-as-author.md) | | ISSUE-20260928-register-internal | auth / register / role-guest / system_roles / 23503 / 23505 / INTERNAL | test 缺 role-guest 时注册 FK 失败被脱敏为 INTERNAL;重复用户名唯一冲突同样 500 | high | resolved | Cursor | 2026-09-28;test:8081 补种并重启后注册 200(goose 77,req_regfix_after_restart);重复用户名 400 由单测覆盖,rc 二进制仍为 INTERNAL | [主记录](../ops/short-term/2026-09-28-auth-register-internal.md#issue-20260928-register-internal) | [LESSON-20260928-standard-role-reseed](../ops/lessons/2026-09-28-standard-role-reseed.md) | | ISSUE-20260928-admin-reset-ui-removed | web / UsersSection / 重置密码 / F4-A / adminResetPassword | F4-A 在 F4-B 端点已合入的基线上删除管理台重置密码按钮,管理员无法重置口令 | high | resolved | Cursor | 2026-09-28;dev API :8080 + worktree Vite :3110 真实 UI 探针 PASS(临时口令长度 16、强制改密仅一次、旧口令 401) | [主记录](../ops/short-term/2026-09-28-restore-admin-password-reset.md#issue-20260928-admin-reset-ui-removed) | [LESSON-20260928-ui-dead-control](../ops/lessons/2026-09-28-ui-dead-control.md) | diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 99c7857c..1d020baa 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -18,7 +18,7 @@ | owner | task | branch | worktree | mutex | status | |---|---|---|---|---|---| -| Cursor | activation-preview-precheck-2026-09-28 | fix/activation-preview-400-precheck-2026-09-28 | .worktrees/activation-preview-400-precheck-2026-09-28 | web-activation-preview | in_progress | +| Cursor | activation-preview-precheck-2026-09-28 | fix/activation-preview-400-precheck-2026-09-28 | .worktrees/activation-preview-400-precheck-2026-09-28 | web-activation-preview | done | | Cursor | squad-commit-authority-2026-09-28 | fix/squad-commit-authority-2026-09-28 | .worktrees/squad-commit-authority-2026-09-28 | bizdev+docflow | in_progress | | Cursor | auth-register-internal-2026-09-28 | fix/auth-register-internal-2026-09-28 | .worktrees/auth-register-internal-2026-09-28 | auth-register | done | | Cursor | restore-admin-password-reset-2026-09-28 | feature/restore-admin-password-reset-2026-09-28 | .worktrees/restore-admin-password-reset-2026-09-28 | auth | done | diff --git a/.doc/ops/lessons/2026-09-28-activation-preview-client-gate.md b/.doc/ops/lessons/2026-09-28-activation-preview-client-gate.md new file mode 100644 index 00000000..9dfcdd83 --- /dev/null +++ b/.doc/ops/lessons/2026-09-28-activation-preview-client-gate.md @@ -0,0 +1,20 @@ +--- +lesson_id: LESSON-20260928-activation-preview-client-gate +lesson_state: validated +owner: Cursor +reviewer: Cursor +last_reviewed: 2026-09-28 +reviewed_revision: 3e534bbb39d0d957e0b720a4ca06f22dd15959e6 +source_issues: [ISSUE-20260928-activation-preview-precheck] +keywords: [activation-preview, NO_GOVERNED_DOCUMENT, clientDutyIssues, needsGovernedDocument, 400] +--- + +# 激活门禁要在点击前做同样的前端预检 + +- 触发条件:控制台出现 `POST .../activation-preview 400`,响应码是 `NO_GOVERNED_DOCUMENT`。 +- 机制与来源:服务端 `validateActivationPlan` 要求至少一份完整人工审批。前端 `clientDutyIssues` 只查三权完整性,全部未纳入审批时仍会发请求。见 ISSUE-20260928-activation-preview-precheck。 +- 开发检查:新增激活条件时,同时改 `validateActivationPlan` 与 `needsGovernedDocument` / `clientDutyIssues`。运行中 `live_edit` 走 `validatePlan`,不要套激活门禁。 +- 验证方式:默认计划直接预览不得发出 activation-preview;一份兼任文档预览应 200。单测在 `web/src/lib/projectSettingsDuties.test.ts`。 +- 适用边界:只覆盖激活前规划。已激活实例改职责不要求「至少一份」。 +- 防护落实:上述单测与 dev 浏览器复验已落地。 +- 修订与失效:若产品允许零审批激活,应同时删除服务端 `NO_GOVERNED_DOCUMENT` 与前端预检。 diff --git a/.doc/ops/lessons/INDEX.md b/.doc/ops/lessons/INDEX.md index 2b5a6165..7f4eb686 100644 --- a/.doc/ops/lessons/INDEX.md +++ b/.doc/ops/lessons/INDEX.md @@ -4,6 +4,7 @@ | lesson_id | 触发条件 / 关键词 | 注意事项 | lesson_state | 主记录 / 最近复核 | |---|---|---|---|---| +| LESSON-20260928-activation-preview-client-gate | activation-preview、NO_GOVERNED_DOCUMENT、clientDutyIssues、400 | 服务端激活门禁要有同等前端预检;live_edit 不套激活门禁 | validated | [激活预检对齐](2026-09-28-activation-preview-client-gate.md);2026-09-28 | | LESSON-20260928-squad-commit-as-author | 小队落盘、uow permission denied、AutoCommitUserID、OnBehalfOf、非编制人 | 自动提交身份用文档编制人,触发者只写入 OnBehalfOf;不要放宽 ActionCommit | candidate | [编制人代理提交](2026-09-28-squad-commit-as-author.md);2026-09-28 | | LESSON-20260928-standard-role-reseed | 注册、role-guest、system_roles、is_system、23503、23505、INTERNAL | 硬编码标准角色须幂等补种并标 is_system;用户名冲突返回领域 400,不要包进 insert user | validated | [标准角色可自愈](2026-09-28-standard-role-reseed.md);2026-09-28 | | LESSON-20260928-ui-dead-control | 死按钮、端点未开通、UsersSection、重置密码、merge-base | 删除「未开通」控件前用当前基线核对路由已存在;注释不能代替 merge-base | validated | [删控件前核对端点](2026-09-28-ui-dead-control.md);2026-09-28 | diff --git a/.doc/ops/short-term/2026-09-28-activation-preview-precheck.md b/.doc/ops/short-term/2026-09-28-activation-preview-precheck.md index 759e0273..d8007fd2 100644 --- a/.doc/ops/short-term/2026-09-28-activation-preview-precheck.md +++ b/.doc/ops/short-term/2026-09-28-activation-preview-precheck.md @@ -1,7 +1,7 @@ --- title: "修复激活预览 400 与管理台密码框警告" task_id: activation-preview-precheck-2026-09-28 -status: in_progress +status: done created: 2026-09-28 updated: 2026-09-28 owner: Cursor @@ -14,9 +14,9 @@ write_scope: - web - .doc mutex: web-activation-preview -review_state: pending -integration_state: pending -deployment: pending +review_state: accepted +integration_state: merged_local_dev +deployment: loaded_local_vite cleanup: pending remote_sync: not_requested --- @@ -42,19 +42,19 @@ dev 库项目 6022「测试项目」(创建人 4,成员 74「测试员工」 ## ISSUE-20260928-activation-preview-precheck issue_id: ISSUE-20260928-activation-preview-precheck -issue_state: fixing +issue_state: resolved module: web / projectSettings / activation-preview symptom: 全部文档未纳入人工审批时,点击「校验并预览」仍请求 activation-preview,控制台 400。 cause: 前端预检未对齐 `validateActivationPlan` 的「至少一份完整人工审批」。 fix: `needsGovernedDocument` 在非 live_edit 保存前本地拦截;配置页提示同一句文案。 -verification: `web` `npm test` 560 通过、`npm run build` 通过;dev 浏览器复验见测试报告。 +verification: `web` `npm test` 560 通过、`npm run build` 通过。dev 项目 6023:默认计划无 activation-preview 请求;兼任后 preview 200。报告见 `.doc/test-reports/2026-09-28-activation-preview-precheck-test-report.md`。 ## ISSUE-20260928-admin-secret-password-form issue_id: ISSUE-20260928-admin-secret-password-form -issue_state: fixing +issue_state: resolved module: web / admin / EnvSettingsSection symptom: 打开模型与密钥页时 Chromium 报 5 次 Password field is not contained in a form。 cause: 5 个密钥 input 使用 password 类型但没有 form。 fix: 每个设置行包在 form 内,密钥框 `autoComplete=new-password`。 -verification: 随激活预检同一轮 dev 浏览器复验。 +verification: dev 模型与密钥页 5 个 password 输入均在 form 内。 diff --git a/.doc/test-reports/2026-09-28-activation-preview-precheck-test-report.md b/.doc/test-reports/2026-09-28-activation-preview-precheck-test-report.md new file mode 100644 index 00000000..dd543132 --- /dev/null +++ b/.doc/test-reports/2026-09-28-activation-preview-precheck-test-report.md @@ -0,0 +1,46 @@ +# 激活预览前端预检 测试报告 + +## 一、 测试背景 (Background) + +dev 项目 6022 在全部文档未纳入人工审批时,`POST /api/v1/projects/6022/activation-preview` 返回 400 `NO_GOVERNED_DOCUMENT`。服务端门禁正确,前端缺少同等预检。管理台「模型与密钥」另有 5 个密码框不在 form 内,触发 Chromium DOM 警告。 + +## 二、 测试目标 (Test Objectives) + +- 默认计划直接点「校验并预览」时不发出 activation-preview 请求,并显示本地提示。 +- 至少一份文档纳入人工审批(兼任模式)后,activation-preview 返回 200。 +- 模型与密钥页 5 个密码框都在 form 内。 + +## 三、 测试方案与环境 (Test Plan & Environment) + +- 环境:本机 dev,`https://frp-mix.com:58880` → Vite `:3100` → `127.0.0.1:8080`。合入后的 dev `3e534bbb`。Vite 已提供含 `needsGovernedDocument` 的源码。 +- 层级:前端单测 + 构建;dev 真实浏览器(登录后新建项目「预检回归-0928」,仅创建人一名成员)。 +- Go 服务未改,未重建 `bin/agent-server`。 + +## 四、 预期结果 (Expected Results) + +- 未纳入人工审批:页面提示「至少一份文档必须纳入人工审批才能激活工作流」,网络无 activation-preview。 +- 兼任编制人后:`workflow-plan` 与 `activation-preview` 均为 200。 +- 密钥页:`input[type=password]` 数量 5,且 `closest('form')` 均存在。 + +## 五、 实际测试结果与判定 (Actual Results & Evaluation) + +- **测试输入 (Input)**:admin 登录 → 新建立项「预检回归-0928」→ 商务对接流程默认计划 → 「校验并预览」。 +- **实际输出 (Actual Output)**:页面含该提示句。注入的 fetch 记录只有 `GET /api/v1/projects/6023/workflow-plan/default` 200,没有 activation-preview。 +- **评价判定**:PASS +- **性能与耗时**:页面即时拦截,无额外请求。 + +- **测试输入 (Input)**:勾选「用户初始需求收集表 / 纳入人工审批 / 由编制人兼任审核、批准」,编制人选系统管理员,再点「校验并预览」。 +- **实际输出 (Actual Output)**:`PUT /api/v1/projects/6023/workflow-plan` 200;`POST /api/v1/projects/6023/activation-preview` 200。进入确认激活步骤。未点击最终激活。 +- **评价判定**:PASS + +- **测试输入 (Input)**:系统管理 → 模型与密钥。 +- **实际输出 (Actual Output)**:`passwordInputs=5`,`outsideForm=0`,五个 `autocomplete=new-password`。 +- **评价判定**:PASS + +## 六、 自动化测试套件汇总 (Test Suite Execution) + +在 worktree `web/`:`npm test` 526 + vitest 34 通过;`npm run build` 通过。`agentctl validate` 收据任务 `integrate-activation-preview-precheck-2026-09-28`,sha `3e534bbb39d0d957e0b720a4ca06f22dd15959e6`。 + +## 七、 测试结论与后续优化建议 (Conclusion & Next Steps) + +授权范围内的 dev 复验通过。项目 6023 停在规划确认步,未激活。远端未推送。