diff --git a/.task/feature-iam-role-permission-linked-capabilities-perm-ux.md b/.task/feature-iam-role-permission-linked-capabilities-perm-ux.md index b6d26ddc..33e2ef4e 100644 --- a/.task/feature-iam-role-permission-linked-capabilities-perm-ux.md +++ b/.task/feature-iam-role-permission-linked-capabilities-perm-ux.md @@ -59,6 +59,15 @@ | permux-U3 | 分类矩阵默认视图 + 三态/二态控件 + 多角色草稿统一预览与原子保存 + 窄屏聚焦 | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 4be7362(fast-forward 6db528d→4be7362,Frontend 分支 feature/iam-perm-ux-frontend) | never | /tmp/permux-u3-run.json | | permux-U4 | 用户表当前角色/多选/批量分配 + 复制角色并分配 + 角色成员子视图 | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 d965732(fast-forward 4be7362→d965732) | never | /tmp/permux-u4-run.json | | permux-U5 | me.linkedCapabilities 消费 + 职责条件/来源文案 + 创建关联说明卡(creator/共享读取留待 L1 U2/U7,未 mock) | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 a6ce695(fast-forward d965732→a6ce695) | never | /tmp/permux-u5-run.json | +| permux-U6 组合 pin | backend@6851ee6 + frontend@a6ce695 → Dev 子分支 | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 7b25169(Dev 子分支 transport) | never | /tmp/permux-u6-pins-run.json | +| permux-U6 knip repair | 去除 3 个未消费导出的 export(frontend) | 76bc59db1d0e9127 | repair | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 1d907c1(frontend a6ce695→1d907c1) | never | /tmp/permux-knip-run.json | +| permux-U6 live spec | e2e/iam-perm-ux-live.playwright.ts 新增(真实服务 8 场景) | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 7d9ac7c | never | /tmp/permux-u6-e2e-run.json | +| permux-U6 live 字段修复 | linkedActions 字段名修正 | 76bc59db1d0e9127 | repair | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 c37c33b | never | /tmp/permux-e2e-fix2-run.json | +| permux-U6 live 字段修复(首次) | 同上 | 76bc59db1d0e9127 | repair | cursor→agy→pi | 1 | cursor | failed-unknown(worker 未输出有效终态记录;fail-stop,现场保留未应用) | 未应用 | never | /tmp/permux-e2e-fix-run.json | +| permux-U6 预览 patch 模式 | PreviewRolePermissions 增加 mode=patch 与批量提交同源归并(Backend 4130ad7) | 76bc59db1d0e9127 | repair | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 4130ad7(backend 6851ee6→4130ad7) | never | /tmp/permux-preview-fix-run.json | +| permux-U6 前端预览模式×2 | 预览请求带 mode 及层级修正(c37c33b→054f134→128aafed) | 76bc59db1d0e9127 | repair | cursor→agy→pi | 各 1 | cursor | success×2 | 已应用 054f134、128aafed | never | /tmp/permux-fe-mode-run.json、/tmp/permux-mode-level-run.json | +| permux-U6 复制表单崩溃修复 | 角色投影无 permissions 时详情崩溃(真实组合发现)修复(46a63f02) | 76bc59db1d0e9127 | repair | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 46a63f02 | never | /tmp/permux-copy-fix-run.json | +| permux-U6 组合 pin×2 | 终态组合 backend@4130ad7 + frontend@46a63f02 → bdd058f | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 各 1 | cursor | success×2 | 已应用 650944a、bdd058f | never | /tmp/permux-u6-pins2-run.json、/tmp/permux-u6-pins3-run.json | ## 同步记录 @@ -74,9 +83,13 @@ ## 结果与验证(完成后填写) -- 结果: -- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表> -- 影响与剩余项: +- 结果:U1–U5 全部实现并通过独立单元验证;U6 组合交付完成(Dev 子分支 bdd058f:backend@4130ad7 + frontend@46a63f02)。真实浏览器活体验收 8/8 PASS(登录、C01+C02 多角色矩阵编辑与一次原子提交、C03 创建联动补齐与 /api/me 运行时联动、C04 断链拒绝与恢复、C07 同名辨识、C08 两人预览后一次分配、C09 409 整批不写且保留选择、C10 复制并分配原子成功)。 +- 验证: + - PASS:C01–C04、C07–C10(真实服务,evidence /tmp/permux-final-live.json);`make test-affected`(test-worktree/boundaries/pins/backend/frontend,evidence /tmp/permux-final-affected.json);后端 store/server 过滤套件含批量/复制/预览负控;前端 vitest 601 项 + design-guard + knip(50≤51)+ tsc;build 通过。 + - NOT_RUN(如实声明):C05/C11/C12 的部分负控由 HTTP/store 测试覆盖、未在浏览器层重复;C06 浏览器层关闭未来创建场景未单列(store 层 kept/migrationNote 已测);C13 成员共享读取与 creator 来源解释——依赖 L1 U7/U2,未 mock;C14 完整键盘/读屏人工走查未执行(可访问性由实现约定+design-guard+窄屏 helper 测试覆盖);C15 幂等/超额负控在 store 测试覆盖、未在浏览器重复;C16 日常实例采用未执行(未授权部署)。 + - 环境事实:本机 umask 0077 使 pkg/identity TestDSNFileMode 必然失败,umask 0022 下通过(identity 包本任务未改动)。 + - 真实组合发现的缺陷与修复:预览 replace 语义与批量 patch 语义错配(补齐 mode=patch 与前端适配);用户详情复制表单对无 permissions 投影崩溃(前端修复)。 +- 影响与剩余项:L1 合入后,C13/C16 与全量 C 项回归由 L1 U5/U7 及后续集成任务承接;#627 落地后批量路径应消费其目标保护;review/CI/合入记录见下节。 ## 合入与清理 @@ -360,3 +373,124 @@ - 组合 transport:7b25169(backend→6851ee6,frontend→a6ce695);knip 修复后 frontend 分支推进至 1d907c1(repair 收据 /tmp/permux-knip-run.json,cursor 一次成功),组合 pin 二次推进见后续记录。 - 环境事实:本机 umask 0077 使 pkg/identity TestDSNFileMode(0o644 拒绝用例)必然失败;umask 0022 下通过。该失败为环境因素,非本任务回归(identity 包本任务未触及)。 - 缺陷收据说明:/tmp/permux-u6-affected.json 因 host 在 CMD 中使用 `| tail` 吞掉管道退出码而记录 exit=0,但输出含 test-frontend knip 超基线失败——该收据不作为 PASS 证据;超额已由 knip repair 修复(50 ≤ 51),test-affected 将以无管道方式重新捕获。 + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-19T04:38:56.269044+00:00", + "command": "sh -c 'umask 0022 && make test-affected'", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux", + "before_head": "650944ae6897ca0d1ea76875fe8015c3364b5d71", + "after_head": "650944ae6897ca0d1ea76875fe8015c3364b5d71", + "branch": "feature/iam-role-permission-linked-capabilities-perm-ux", + "target_branch": "main", + "target_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed", + "root_target": "main", + "immediate_target": "feature/iam-role-permission-linked-capabilities", + "before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_tail": [ + "(node:240613) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "(node:240680) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "(node:240614) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "", + " Test Files 50 passed (50)", + " Tests 601 passed (601)", + " Start at 04:39:03", + " Duration 836ms (transform 7.74s, setup 0ms, import 11.93s, tests 941ms, environment 4ms)", + "", + "knip unused exports 50 <= 51", + "make[2]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'" + ], + "output_sha256": "48eaf015c3e561bd34008b771d984d9e267062fd2cf810d67a2aaec05793e80d", + "receipt_sha256": "59fb000313feb6ed03a2b1d2305a9372a6a991b218c95449a93a353b1d5dcc69", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/59fb000313feb6ed03a2b1d2305a9372a6a991b218c95449a93a353b1d5dcc69.json" +} +``` + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-19T05:35:26.812094+00:00", + "command": "sh -c 'umask 0022 && make test-affected'", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux", + "before_head": "bdd058f974cb1e681b253230e6acbd75674eaa84", + "after_head": "bdd058f974cb1e681b253230e6acbd75674eaa84", + "branch": "feature/iam-role-permission-linked-capabilities-perm-ux", + "target_branch": "main", + "target_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed", + "root_target": "main", + "immediate_target": "feature/iam-role-permission-linked-capabilities", + "before_tracked_diff_sha256": "97f08e41dec9f0a379f5c3010d58388160715650ce758c4d000560fdfd1d7e63", + "after_tracked_diff_sha256": "97f08e41dec9f0a379f5c3010d58388160715650ce758c4d000560fdfd1d7e63", + "output_tail": [ + "(node:1933409) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "(node:1933535) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "(node:1933410) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.", + "(Use `node --trace-warnings ...` to show where the warning was created)", + "", + " Test Files 50 passed (50)", + " Tests 602 passed (602)", + " Start at 05:36:03", + " Duration 958ms (transform 8.76s, setup 0ms, import 14.30s, tests 1.02s, environment 4ms)", + "", + "knip unused exports 51 <= 51", + "make[2]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'", + "make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'" + ], + "output_sha256": "18a8e221f7bb03ca79c568af4e3304be9bbc308a4c53230e22db9569df152ec4", + "receipt_sha256": "af3688b164357d007bf5aa7dbc06890b7e13e2842779acb3c3cd86ee77f03c55", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/af3688b164357d007bf5aa7dbc06890b7e13e2842779acb3c3cd86ee77f03c55.json" +} +``` + + +```json +{ + "summary_schema": 1, + "source": "SELF", + "timestamp": "2026-10-19T05:36:11.940198+00:00", + "command": "sh -c 'cd modules/frontend && PLAYWRIGHT_BASE_URL=http://127.0.0.1:4199 PERMUX_LIVE=1 PERMUX_OWNER=permuxadmin PERMUX_PASSWORD= npx playwright test e2e/iam-perm-ux-live.playwright.ts'", + "exit_code": 0, + "cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux", + "before_head": "bdd058f974cb1e681b253230e6acbd75674eaa84", + "after_head": "bdd058f974cb1e681b253230e6acbd75674eaa84", + "branch": "feature/iam-role-permission-linked-capabilities-perm-ux", + "target_branch": "main", + "target_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed", + "root_target": "main", + "immediate_target": "feature/iam-role-permission-linked-capabilities", + "before_tracked_diff_sha256": "33ee1abfd7b5c632cfb27c3b22c7b1c239e8320854108e926a7ada43a8dd3e37", + "after_tracked_diff_sha256": "33ee1abfd7b5c632cfb27c3b22c7b1c239e8320854108e926a7ada43a8dd3e37", + "output_tail": [ + "", + "Running 8 tests using 1 worker", + "", + " ✓ 1 e2e/iam-perm-ux-live.playwright.ts:145:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › 登录:管理员经登录表单进入工作台,/api/me 为管理员 (283ms)", + " ✓ 2 e2e/iam-perm-ux-live.playwright.ts:172:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C01+C02 多角色矩阵编辑:跨分类与搜索保留草稿,预览后一次提交 (2.8s)", + " ✓ 3 e2e/iam-perm-ux-live.playwright.ts:231:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C03 创建联动:开启创建项目自动补齐四项按项目授权,运行时 /api/me 联动生效 (573ms)", + " ✓ 4 e2e/iam-perm-ux-live.playwright.ts:267:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C04 断链拒绝:创建项目开启时联动项不允许不可保存,恢复按项目授权后保存成功 (430ms)", + " ✓ 5 e2e/iam-perm-ux-live.playwright.ts:305:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C07 同名辨识:两名同名用户按账号辨识,勾选互不串行 (1.1s)", + " ✓ 6 e2e/iam-perm-ux-live.playwright.ts:333:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C08 批量分配:两人预览 未分配 → 角色乙 后一次提交 (593ms)", + " ✓ 7 e2e/iam-perm-ux-live.playwright.ts:356:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C09 冲突整批不写:确认前他人改动一人角色,409 后整批未写入且保留选择 (730ms)", + " ✓ 8 e2e/iam-perm-ux-live.playwright.ts:389:3 › permux 活体主流程(真实 Backend + 真实 Frontend dist) › C10 复制并分配:源角色权限复制到新角色并换绑,新角色独立维护 (295ms)", + "", + " 8 passed (7.4s)" + ], + "output_sha256": "eaa754b30e6f134a8e55f19a417efc4c8cbc03c8eb72db9c56624d5700cecf44", + "receipt_sha256": "c7da99a1f2734fdfcfd2ff0373287773d731001ca689f012ce6b039d70091cfa", + "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/c7da99a1f2734fdfcfd2ff0373287773d731001ca689f012ce6b039d70091cfa.json" +} +```