diff --git a/.task/archive/feature-rdm-settings-phase1a.md b/.task/archive/feature-rdm-settings-phase1a.md new file mode 100644 index 00000000..ca8a2161 --- /dev/null +++ b/.task/archive/feature-rdm-settings-phase1a.md @@ -0,0 +1,280 @@ +# feature/rdm-settings-phase1a 任务卡 + +任务主记录:PR #617 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/617;状态:已完成(合入前闭合);owner:weichen + +## 基线与授权 + +- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ba81d638a6c845d0acde6896f4001bed096ba26c +- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-rdm-settings-phase1a(worktree);分支:feature/rdm-settings-phase1a +- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false +- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=085614ee5a2a7fe92cf18f577c0a1c0d33acc11682870331edd6f173309e8e14;triage_receipt=/tmp/cleanup-20261018/rdm1a-triage.json;receipt_sha256=7de7c2c70184d1e54bb00df5e808dfaffa0e78451d1166557e7ce18cf2079424 + +- 授权与交付终点:用户 2026-10-18 确认 RDM settings 收尾按分期推进(scope=phase、profile=user_only、order=split);本卡为一期 1a,终点为 UI/RDM/Frontend/Dev 合入、组合改钉及用户阶段 7 验收。扩围授权 land_fe_pw:Frontend 密码管理提交经 Frontend #107 合入 Frontend 主干(已合入 `0459567`)。未授权:一期 1b(R4/R5,等 IAM U4)、二期(R1 与扩展 API 2.16 发版,发版由用户执行)。 +- 关联仓工作区:UI/Frontend `/home/weichen/projects/Agent-System-RDM1a-Frontend-Combo/{ui,frontend}`;RDM `/home/weichen/projects/Agent-System-RDM-wt-feature-rdm-settings-phase1a`(分支均为 feature/rdm-settings-phase1a)。 +- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进) +- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md) +- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入) +- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收 +- 当前阶段:合入;当前增量:I1(一期 1a) +- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位) + +## 目标与非目标 + +- 目标:R2 成员检索(账号/姓名精确与模糊检索、专业角色筛选、服务端先筛选后分页、同名以账号区分、已加入不可重复添加)在 RDM、UI Picker 与 Frontend 成员页端到端可用;Dev 验收脚本不再对未执行场景输出 PASS。 +- 受影响:UI `Picker`;RDM `rdm.account.list`、`rdm.project.member.list`(向后兼容增量)与新读命令 `rdm.role.options`;Frontend `RdmMembersSection`;Dev `tests/integration/rdm-increment/acceptance_scenarios.sh` 与 `modules/{frontend,ui}` 指针。 +- 非目标:R1 项目共享设置、R3 旧职责模型(已被职责矩阵取代,放弃)、R4 权限矩阵剩余项与 R5 成员移除影响(一期 1b)、`AccountValidFor` 语义变更、RDM `perms/*` 与 IAM U4 冲突区。 +- 计划:`docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md`。 + +## Agent 实施收据 + +路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。 + +| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 | +|---|---|---|---|---|---|---|---|---|---|---| +| ui-rdm1a-picker-hardening | UI src/Picker.tsx、src/ui.css、test/picker.test.tsx | UI AGENT-EXECUTION.md | implementation | cursor→antigravity→pi | 1 | cursor/auto(fresh) | success | 5c2b103 | 无 | /tmp/cleanup-20261018/rdm1a/ui-picker-run.json | +| rdm-rdm1a-r2-member-search | RDM accountdir/member_search/plugin | RDM AGENT-EXECUTION.md | implementation | cursor→antigravity→pi | 1 | cursor/auto(fresh) | scope-expansion(fail-stop:需改 plugin_test 命令集) | — | 无 | /tmp/cleanup-20261018/rdm1a/rdm-r2-run.json | +| rdm-rdm1a-r2-member-search-r2 | 同上 + plugin_test.go 一项 | 同上 | implementation | 同上 | 1 | cursor/auto(fresh) | scope-expansion(fail-stop:host 追加的行类型规则与既有测试冲突) | — | 无 | /tmp/cleanup-20261018/rdm1a/rdm-r2-run2.json | +| rdm-rdm1a-r2-member-search-r3 | 同上(去掉行类型规则) | 同上 | implementation | 同上 | 1 | cursor/auto(fresh) | success | f1cd92c | 无 | /tmp/cleanup-20261018/rdm1a/rdm-r2-run3.json | +| frontend-rdm1a-members-search | Frontend adminRdmSections(RdmMembersSection)、rdmManagement.ts、新测试 | Frontend AGENT-EXECUTION.md | implementation | 同上 | 1 | cursor/auto(fresh) | success | 96ab2eb | 无 | /tmp/cleanup-20261018/rdm1a/fe-members-run.json | +| dev-rdm1a-acceptance-not-run | tests/integration/rdm-increment/acceptance_scenarios.sh | AGENT-EXECUTION.md | implementation | 同上 | 1 | cursor/auto(fresh) | success | 327c897 | 无 | /tmp/cleanup-20261018/rdm1a/dev-acceptance-run.json | +| rdm-rdm1a-repin-frontend-ui | RDM pins/agent-system-{frontend,ui} | RDM AGENT-EXECUTION.md | implementation | 同上 | 1 | cursor/auto(fresh) | success | 9bd62cd | 无 | /tmp/cleanup-20261018/rdm1a/rdm-pins-run.json | +| dev-rdm1a-repin-frontend-ui | modules/{frontend,ui} | AGENT-EXECUTION.md | implementation | 同上 | 1 | cursor/auto(fresh) | success | f90bc0f | 无 | /tmp/cleanup-20261018/rdm1a/dev-pins-run.json | + +## 关联方向与规划 + +- 适用状态:待核对(无适用规划时说明原因) +- 主记录路径/版本:待核对(路径按仓库根目录定位,归档后不变;只引用唯一正文) +- 对应里程碑:待核对 + +## 需求分析 + +| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 | +|---|---|---|---|---|---|---| +| R2 | 账号/姓名检索、分页、专业角色过滤同源,稳定 ID 选择 | 部分符合:主干已有 Picker 与姓名子串检索;缺角色筛选、精确匹配、先筛后分页、成员表检索分页、姓名+账号显示 | P0 | 见计划「验收条件」前三条 | UI U1、RDM U2 | 纳入 1a | +| R5-a | 验收声明来自实际执行 | 不符合:场景 9 无条件输出 PASS | P0 | 未执行项报告 NOT_RUN 并计入汇总 | 无 | 纳入 1a | +| R1/R4/R5-b | 共享设置、权限矩阵剩余、移除影响 | 依赖 IAM U4 或发版 | — | — | IAM U4、扩展 API 2.16 | 1b/二期 | + +## 方案与计划 + +- 方案引用:旧任务 `.task/feature-rdm-settings-completion.md`(旧分支,需求表 R1–R5)与本次差距分析;参考 diff 存于仓外 `/tmp/cleanup-20261018/rdm1a/` +- 实施计划引用:`docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md`(单元 U1–U5,R2、R5-a) +- 测试计划引用:同计划「验收条件」;各单元 verification 见仓外单元 JSON + +## 阶段记录 + +| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 | +|---|---|---|---|---|---| +| 需求拆解 | 858d566 | 完成 | host | 2026-10-18 | 需求分析表 | +| 需求评估 | 858d566 | 完成 | host | 2026-10-18 | 差距分析(R3 放弃、R1/R4/R5-b 后移) | +| 需求表确认 | 858d566 | 完成 | 用户 | 2026-10-18 | scope=phase、profile=user_only、order=split | +| 方案设计 | 858d566 | 完成 | host | 2026-10-18 | 计划「R2 合同」 | +| 实施计划 | 858d566 | 完成 | host | 2026-10-18 | docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md | +| 实施与自检 | f90bc0f | 完成 | cursor worker(见收据) | 2026-10-18 | 各单元 verification + host 本地重跑 | +| 正式测试与验收 | 72280f4 | 用户决定先合入后在部署上自行验收 | 用户 | 2026-10-18 | AskQuestion stage7=merge_then_accept;问题另开修复任务 | +| 代码 Review | 各组件 PR head;Dev 72280f4 | 完成 | host(主模型,独立于实施 worker) | 2026-10-18 | 见合入与清理 | +| 合入 | 待定 | 待执行 | — | — | — | +| 合入核验与收口 | 待定 | 待执行 | — | — | — | + +## 探索试验与迭代 + +| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 | +|---|---|---|---|---|---|---|---| +| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 | + +## 同步记录 + +| 节点 | sync_base_sha | tested_head_sha | checked_at | +|---|---|---|---| +| 启动 | ba81d638a6c845d0acde6896f4001bed096ba26c | ba81d638a6c845d0acde6896f4001bed096ba26c | 2026-10-18T10:36:45Z | + +## 证据(Evidence) + + +| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) | +|---|---|---|---|---|---| + +## 交付调度 + +- 调度状态:未入队;调度记录:无 +- entry_id:无;attempt_id:无;窗口执行者:无 +- 固定候选:无(base/head、组件与相关配置引用实际尝试) +- 调度依据:policy/delivery.md#合入调度 +- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合 + +## 结果与验证 + +- 结果:R2 成员检索端到端落地——UI #59(5c2b103)Picker 加固;RDM #435(0b75756)服务端检索/筛选/分页与 rdm.role.options;Frontend #108(426d104)成员页接入;RDM #436(2b1fee7)产品改钉 Frontend/UI;本 PR:验收脚本场景 9 改报 NOT_RUN,Dev 改钉 modules/frontend→426d104、modules/ui→5c2b103。扩围:Frontend #107(0459567)落地 Dev 已上线的密码前端。 +- 验证:GATE——Dev #617 CI(test、test-pg、svc-realcombo)@72280f4;UI #59 CI(test、governance)@5c2b103;RDM #435 CI(build-and-test、governance)@e3c813e;Frontend #107 @7df77c1、#108 @8260bf5(governance);RDM #436 @ce27e23。SELF——Frontend 426d104+UI 5c2b103 组合 tsc/vitest/vite build、test-pins、脚本语法(证据表);RDM make product(RDM 卡)。NOT_RUN——验收脚本对真实部署的执行、浏览器多身份验收(用户阶段 7)、部署。 +- 影响与剩余项:Dev tests/integration/lifecycle/rdm.pin 未升级(生命周期测试制品钉扎,非本期必需)。非阻塞记录:Frontend 成员页第二个 import 位于文件中部(避开 IAM U4 冲突区);成员列沿用 ad-mono。一期 1b(R4/R5)等 IAM U4;二期 R1。 + +## 规划进展与下一步 + +- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划) +- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务) +- 推荐依据:待填写 +- 前置条件/待确认:待核对 +- 预期产物/验收条件:待定义 +- 重复任务核对:待核对(已有/在途任务、PR 与规划记录) +- 启动授权:未授权(建议不自动启动新任务,仍须明确授权) + +## 合入与清理 + +- Review 记录:host 主模型逐个审阅组件 diff(UI 5c2b103、RDM f1cd92c、Frontend 96ab2eb、Dev 327c897/f90bc0f),实施由独立 cursor worker 新进程完成,审阅未复用实施会话;结论通过,仅非阻塞记录;本地重放各单元 verification 一致。 +- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测) +- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果) +- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验) +- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置) + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-18T10:35:55.125612+00:00", + "command": "make precheck", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev", + "before_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "after_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "branch": "main", + "target_branch": "main", + "target_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_tail": [ + "make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev'", + "[repo] branch=main head=ba81d638a6", + "[remote] origin/main=ba81d638a6 ahead=0 behind=0", + "[tree] clean submodules_drift=0 uninit=5", + "[warn] 5 个子模块未初始化——构建/测试前需物化(不阻断写入)", + "[worktrees] linked=10", + "[recycle] merged un-recycled branches: feature/layered-python-env", + "[initiatives] local cards (not authoritative): none", + "[hooks] core.hooksPath=scripts/hooks(pre-commit/post-merge 实际接线)", + "[facts] policy/facts.md 6 条事实均在有效期内", + "[required-reading] core/baseline.md, workflows/delivery.md §1, policy/delivery.md", + "[R0] ba81d638a6(完整:ba81d638a6c845d0acde6896f4001bed096ba26c)", + "[worktree] before-sync: recursive component checks passed", + "[verdict] READY — 保留本次 precheck receipt 后建任务工作区:PRECHECK_RECEIPT=/tmp/task-precheck.json make task-start NAME=feature/your-branch", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev'" + ], + "output_sha256": "2f0013d9d7dd472fc1308102365d2e2db04b7b2bb132a19880804609cd78e08e", + "receipt_sha256": "d3ff2433b1b5bfb4df2806794c102d06fd462a0ccf7ad3ad37929b26496faf19", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/d3ff2433b1b5bfb4df2806794c102d06fd462a0ccf7ad3ad37929b26496faf19.json" +} +``` + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-18T11:12:36.203204+00:00", + "command": "make test-pins", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-rdm-settings-phase1a", + "before_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "after_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "branch": "feature/rdm-settings-phase1a", + "target_branch": "main", + "target_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_tail": [ + "ok modules/backend logging-system", + "ok deps/agent-native agent-intent", + "warn: deps/agent-native deps/development-guidelines is 26b562d2e34f, Dev is 2688fd2be6a5", + "ok deps/agent-native error-code-system", + "ok deps/agent-native logging-system", + "ok deps/agent-squad agent-intent", + "ok deps/agent-squad agent-native", + "warn: deps/agent-squad deps/development-guidelines is 26b562d2e34f, Dev is 2688fd2be6a5", + "ok deps/agent-squad error-code-system", + "ok deps/agent-squad logging-system", + "warn: deps/agent-intent deps/development-guidelines is 26b562d2e34f, Dev is 2688fd2be6a5", + "ok deps/agent-intent error-code-system", + "ok deps/agent-intent logging-system", + "pins ok", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-rdm-settings-phase1a'" + ], + "output_sha256": "322ec1f3a1eb346fe5a89b84b30502eca7141aa489689646a3a2faace7856924", + "receipt_sha256": "54c15d0bc22618c5c7c6bfe502df532f9c8f777ef85f7bbc56a52238fec9562b", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/54c15d0bc22618c5c7c6bfe502df532f9c8f777ef85f7bbc56a52238fec9562b.json" +} +``` + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-18T11:12:42.270681+00:00", + "command": "bash -n tests/integration/rdm-increment/acceptance_scenarios.sh", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-rdm-settings-phase1a", + "before_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "after_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "branch": "feature/rdm-settings-phase1a", + "target_branch": "main", + "target_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "ae1ee7ba92fa38c5961408605c01d3f32cd5037ae206924c41db1803b2d0b471", + "after_tracked_diff_sha256": "ae1ee7ba92fa38c5961408605c01d3f32cd5037ae206924c41db1803b2d0b471", + "output_tail": [], + "output_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "receipt_sha256": "3f1e6796eb2637e8a8d51cee997c8f80a1aedf31e92bc989057c7ab7e12a82e8", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/3f1e6796eb2637e8a8d51cee997c8f80a1aedf31e92bc989057c7ab7e12a82e8.json" +} +``` + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-18T11:12:46.273806+00:00", + "command": "bash -c 'cd /home/weichen/projects/Agent-System-RDM1a-Frontend-Combo/frontend && git fetch -q origin && git checkout -q --detach 426d1044ac99507edfeae3b5bf6b1f6de358f0d6 && git -C ../ui checkout -q --detach 5c2b1036dd1aff89ec4eeae0c96493694e33ad4c && npx tsc -b && npx vitest run && npx vite build'", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-rdm-settings-phase1a", + "before_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "after_head": "f90bc0ffb3750d27b7f4e4ebadbb0ebdf1f1d68c", + "branch": "feature/rdm-settings-phase1a", + "target_branch": "main", + "target_head": "ba81d638a6c845d0acde6896f4001bed096ba26c", + "root_target": "main", + "immediate_target": "main", + "before_tracked_diff_sha256": "4c1eae8910d3c1e1c0960eb1dbb32bd26db36915627ae183a4ccae2ef39818d8", + "after_tracked_diff_sha256": "4c1eae8910d3c1e1c0960eb1dbb32bd26db36915627ae183a4ccae2ef39818d8", + "output_tail": [ + "dist/index.html 0.40 kB │ gzip: 0.27 kB", + "dist/assets/index-LeIKZxBo.css 114.65 kB │ gzip: 19.25 kB", + "dist/assets/jszip.min-XgtLb15L.js 0.12 kB │ gzip: 0.12 kB", + "dist/assets/docx-preview-BX-E56Uz.js 77.41 kB │ gzip: 21.29 kB", + "dist/assets/jszip.min-DpFGSQHe.js 97.26 kB │ gzip: 30.16 kB", + "dist/assets/index-CTwq5Yiv.js 213.14 kB │ gzip: 70.03 kB", + "dist/assets/xlsx-CkFp8p6R.js 429.53 kB │ gzip: 143.07 kB", + "dist/assets/index-B4krzkTJ.js 639.68 kB │ gzip: 199.10 kB", + "dist/assets/pptx-preview.es-Dygvqd4B.js 1,255.23 kB │ gzip: 401.45 kB", + "", + "(!) Some chunks are larger than 500 kB after minification. Consider:", + "- Using dynamic import() to code-split the application", + "- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks", + "- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.", + "✓ built in 7.63s" + ], + "output_sha256": "2eb8a43a3b22a0fb54468e635c661d1ba57bc0733ac534d546721a5abd6eb072", + "receipt_sha256": "6003570995fbcdb45627954a5a0fe1ab7d331a37175a042c457635cb6e875c97", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/6003570995fbcdb45627954a5a0fe1ab7d331a37175a042c457635cb6e875c97.json" +} +``` + +## 闭合记录(合入前折叠) + +- 本卡在 PR #617(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/617)合入前闭合并归档,随该 PR 一同合入。 +- 该 PR 的合并提交即本任务的落地记录。 +- 合入后无需回填,也无需单独的闭合 PR。 diff --git a/docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md b/docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md new file mode 100644 index 00000000..8f4002f1 --- /dev/null +++ b/docs/superpowers/plans/2026-10-18-rdm-settings-phase1a-plan.md @@ -0,0 +1,40 @@ +# RDM 设置收尾 · 一期 1a 实施计划(2026-10-18) + +任务卡:`.task/feature-rdm-settings-phase1a.md`。取代旧任务 `feature/rdm-settings-completion` 中与主干不冲突、且不依赖 IAM U4 的部分。 + +## 已确认的决策 + +- 分期:一期 1a(本计划)= UI Picker 加固、R2 成员检索、验收脚本误报修复;一期 1b = R4 权限矩阵剩余项、R5 成员移除影响与原子移除,等 IAM U4 合入后在新主干上做;二期 = R1 项目共享设置(扩展 API 2.16,发版由用户本人执行)。 +- R3 文档职责:主干已用职责矩阵取代,旧分支的 `rdm.duty.tree`、章节职责版本、旧职责界面不再移植。 +- Profile 语义(二期):只禁止用户自建 profile 指定模型,内置 profile 的路由保留。 +- 集成欠账:Frontend 密码管理提交(`92864db`,Dev 已钉住并上线)已经由 Frontend #107 合入 Frontend 主干(`0459567`),本期 Dev 改钉 Frontend 不会回退密码功能。 + +## 单元与边界 + +| 单元 | 仓库 | 允许路径 | 依赖 | +|---|---|---|---| +| U1 Picker 加固 | UI | `src/Picker.tsx`、`src/ui.css`、`test/picker.test.tsx` | 无 | +| U2 R2 成员检索 | RDM | `internal/rdmapp/accountdir.go`、新 `internal/rdmapp/member_search.go`、`plugins/rdm/plugin.go`(仅 account.list / member.list / role.options)、新 `plugins/rdm/member_search_test.go` | 无 | +| U3 成员页接入 | Frontend | `src/components/adminRdmSections.tsx` 中 `RdmMembersSection`(不动 import 区与 `RdmRolesPanel`)、`src/rdmManagement.ts`、新测试 | U1、U2 合同 | +| U4 验收脚本 | Dev | `tests/integration/rdm-increment/acceptance_scenarios.sh` | 无 | +| U5 组合改钉 | RDM、Dev | RDM `pins/agent-system-{frontend,ui}`;Dev `modules/{frontend,ui}` | U1–U4 合入 | + +IAM U4 同时改动 RDM `perms/*`、`projects_api.go`、`perms_api.go` 与 Frontend `adminRdmSections.tsx` 的 import 区和 `RdmRolesPanel`,上表边界即为避免与其冲突。U2 只使用 U4 保留的 `perms.Store` 读取接口。 + +## R2 合同(RDM,向后兼容的增量) + +- `rdm.account.list`:新增可选 `roleId`、`match`(`fuzzy` 默认 / `exact`);先全量筛选再按账号分页(`cursor` 为上一页最后账号,`limit` 默认 50、上限 200);每行新增 `joined`、`projectRole`、`profRole`。授权不变(member.manage)。 +- `rdm.project.member.list`:新增可选 `query`、`match`、`roleId`、`projectRole`、`cursor`、`limit`;返回新增 `next`、`total`、`accountDirectoryAvailable`,成员行新增 `name`;不带 `limit` 时返回全部(权限矩阵页依赖)。授权不变(doc.read)。 +- 新读命令 `rdm.role.options`(`purpose` = members | duties | permissions):返回启用的专业角色 `{roleId, name}`。 + +## 验收条件 + +- 同名人员以账号区分,选择提交稳定账号;精确/模糊匹配、专业角色筛选均由服务端在分页前完成,全部匹配可经游标逐页到达且不重复。 +- 已加入人员在候选中可见但不可再次添加;失去管理资格时选择器禁用;迟到响应不展示。 +- 成员表显示姓名与账号,支持检索、角色筛选和分页。 +- 验收脚本中不再有未执行检查却输出 PASS 的场景;未执行项报告 NOT_RUN 并计入汇总。 +- 组件 CI(UI/RDM/Frontend 治理检查,RDM 测试)与 Dev 组合 CI(`make test`、`make build`)在最终 HEAD 上通过;Frontend 与 UI 的类型检查、测试和构建在组合目录本地执行(Frontend CI 不跑这些)。 + +## 合入顺序 + +UI(U1)与 RDM(U2)并行 → Frontend(U3,基于含 U1 的 UI)→ RDM 改钉 Frontend/UI → Dev(U4 + 改钉 Frontend/UI;RDM 制品钉扎按需另行升级)。阶段 7 业务验收由用户判定。 diff --git a/modules/frontend b/modules/frontend index 92864db8..426d1044 160000 --- a/modules/frontend +++ b/modules/frontend @@ -1 +1 @@ -Subproject commit 92864db8d33bc0601f06e25d9ae2af4a404b9b6a +Subproject commit 426d1044ac99507edfeae3b5bf6b1f6de358f0d6 diff --git a/tests/integration/rdm-increment/acceptance_scenarios.sh b/tests/integration/rdm-increment/acceptance_scenarios.sh index 3684265f..1f066365 100755 --- a/tests/integration/rdm-increment/acceptance_scenarios.sh +++ b/tests/integration/rdm-increment/acceptance_scenarios.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash # P8 第八节十场景验收(提案 rdm-settings-members-duties-perms-increment §8)。 -# 走真实服务 HTTP(--auth 会话),多账号多角色;输出逐场景 PASS/FAIL。 +# 走真实服务 HTTP(--auth 会话),多账号多角色;输出逐场景 PASS/FAIL/NOT_RUN(未执行检查的场景不计 PASS)。 # v0.4.0 版:RDM 命令面用 rdm.project.create 的 RID(不再直用基座项目); # 场景 2 姓名过滤全量断言(基座 v0.4.0+ AccountSearcher);setRole→set-role(#350)。 # 前置:ADMIN 账号须为基座管理员(改密门已过)且已登记 RDM 域管理员 @@ -10,11 +10,13 @@ set -u BASE="${BASE:-http://127.0.0.1:8788}" ADMIN_USER="${ADMIN_USER:?需要管理员账号}" ADMIN_PASS="${ADMIN_PASS:?需要管理员密码}" -PASS=0; FAIL=0; FAILED=() +PASS=0; FAIL=0; FAILED=(); NOT_RUN=0; NOT_RUN_IDS=() say() { printf '%s\n' "$*"; } -ok() { PASS=$((PASS+1)); say "PASS $1"; } +ok() { PASS=$((PASS+1)); printf 'PASS %s\n' "$1"; } bad() { FAIL=$((FAIL+1)); FAILED+=("$1"); say "FAIL $1 :: ${2:-}"; } +# 未执行检查的场景:如实计入 NOT_RUN,不计 PASS +notrun() { NOT_RUN=$((NOT_RUN+1)); NOT_RUN_IDS+=("$1"); say "NOT_RUN $1 :: ${2:-}"; } # 会话登录(cookie jar)与 API 助手 login() { # user pass jar @@ -166,7 +168,7 @@ out=$(RDM "$JO" rdm.perm.unset "{\"projectId\":\"$RID\",\"member\":\"a1\",\"acti echo "$out" | grep -q '"restored":true' && ok "8c 恢复默认(实际撤销)" || bad "8c" "$out" say "== 场景 9:迟到响应/断网(UI 行为)==" -say "PASS 9 (UI 层:Picker 迟到响应代次丢弃/空态/重试由 UI #53 单测覆盖;浏览器目视复验归用户验收)" +notrun 9 "UI 层行为本脚本不执行:Picker 迟到响应代次丢弃/空态/重试由 UI #53 单测覆盖;浏览器目视复验归用户验收" say "== 场景 10:共享配置一致 + 私域边界 ==" # 同项目不同成员读项目设置一致(当前 user/project 均无受管项显示) @@ -180,6 +182,7 @@ r=$(api "$JO" GET "/api/projects/$PID1/conversations" | body | grep -c "$con" || [ "$r" = "0" ] && ok "10b 他人会话私域不可见" || bad "10b" "leak=$r" say "" -say "== 汇总:PASS=$PASS FAIL=$FAIL ==" +say "== 汇总:PASS=$PASS FAIL=$FAIL NOT_RUN=$NOT_RUN ==" [ ${#FAILED[@]} -gt 0 ] && printf '失败场景:%s\n' "${FAILED[*]}" +[ ${#NOT_RUN_IDS[@]} -gt 0 ] && printf '未执行场景(NOT_RUN,未计入 PASS):%s\n' "${NOT_RUN_IDS[*]}" [ "$FAIL" = "0" ]