Merge origin/main into feature/docker-test-image
Why: delivery policy requires the final candidate to include the latest authoritative target before review and merge. Evidence: git merge; conflicts resolved below if any. Impact: composition update only; component pins unchanged. Refs: policy/delivery.md
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -0,0 +1,392 @@
|
||||
# feature/cursor-explicit-model-auto 任务卡
|
||||
|
||||
任务主记录:PR #644 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/644;状态:已完成(合入前闭合);owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= ac594c90e536cfb670e94680f045a6c8247a2513
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto(worktree);分支:feature/cursor-explicit-model-auto
|
||||
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
|
||||
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=26514fc286b951bcd1dc272da658bb3a80a15f4ad1a0f0f6a575b43ccd8c5bfd;triage_receipt=/tmp/cursor-model-auto-triage.json;receipt_sha256=ae6f04fa5645ecbb8a67878709f9c97f8caa77e9f41ef4b6f5f76549bcf67a6b
|
||||
|
||||
- 授权与交付终点:用户 2026-10-20 要求 cursor-agent 启动时加入 `--model auto`,并选定“只改 DM cursor 适配器 + Dev 升版本与说明”方案;授权范围内实施、验证、Review、PR 合入 Dev main 与安全收口。不部署、不发布版本、不改分支保护。
|
||||
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
|
||||
- 当前阶段:实施与自检;当前增量:I1(DM repin + AGENT-EXECUTION.md 说明)
|
||||
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
目标:Dev 的 `scripts/agent-exec` 派发 cursor 候选时,argv 显式包含 `--model auto`。DM 侧已由 [Development-Manager PR #30](https://git-home.u1680832.nyat.app:30319/weichen/Development-Manager/pulls/30) 合入(merge `1e5ee55a2881dc9ed210ced48338c4d75697aa9c`:内置 cursor 适配器 auto 时传 `--model auto`,其他适配器不变)。本仓:`deps/development-manager` 从 `6c019595` 升到 `1e5ee55a`;`AGENT-EXECUTION.md` 说明改为 cursor 在 `model: auto` 时显式传 `--model auto`,其他 CLI 仍省略。
|
||||
|
||||
验收:`scripts/agent-exec validate` 通过;DM adapters 测试在新 pin 通过;PR HEAD 完整 CI 通过。
|
||||
|
||||
非目标:不改 profile/路由/尝试上限,不改 `deps/development-guidelines` 或其内嵌 DM pin,不改其他 CLI 的 auto 语义。
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| dev-cursor-explicit-auto-model-adopt | `deps/development-manager` gitlink + `AGENT-EXECUTION.md` 说明 | config_digest=ccf5b7c03ce4…(run 时 AGENT-EXECUTION.md blob e3c0b7f) | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde / auto(事件报告 `Auto`) | completed (success) | refs/agent-exec/1b5656f9…/ccc04e511e8a → 88f446531beb8702a4a95a41ce581e2d4323604d | 否 | /tmp/dev-cursor-model-auto-receipt.json(单元包 /tmp/dev-cursor-model-auto-unit.json) |
|
||||
| DM: agent-exec-cursor-explicit-auto-model | DM `internal/agentexec/adapters/{adapters,adapters_test}.go` | DM AGENT-EXECUTION.md config_digest=adeded0e9363… | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde / auto(事件报告 `Auto`) | completed (success) | DM refs/agent-exec/36405201…/9e8e5a55c9a5 → DM 9a565d65428c8acc02cf222fee1a7998a11de960 | 否 | /tmp/dm-cursor-model-auto-receipt.json |
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 适用状态:不适用(用户直接提出的执行器参数调整,无对应规划条目)
|
||||
- 主记录路径/版本:不适用
|
||||
- 对应里程碑:不适用
|
||||
|
||||
## 需求分析
|
||||
|
||||
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| R1 | cursor-agent 启动显式带 `--model auto` | 符合:消除本机默认模型漂移;`cursor-agent-stable --list-models` 列出 `auto` | P2 | Dev pin 含 DM #30;AGENT-EXECUTION.md 说明一致;CI 通过 | DM #30(已合入) | 接受 |
|
||||
|
||||
## 方案与计划
|
||||
|
||||
- 方案引用:DM 适配器新增 `builtinSpec.autoModel`,仅 cursor 设 `"auto"`(DM #30);Dev repin + 说明
|
||||
- 实施计划引用:I1 / R1:DM 单元 → DM PR #30 → Dev 单元(repin + 说明)
|
||||
- 测试计划引用:R1:DM adapters 表驱动测试(cursor auto 传 `--model auto`,其他适配器不传);`make agent-exec-validate`;PR HEAD 完整 CI
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | bef2032 | 已完成 | host | 2026-10-20 | 用户选定“只改 cursor 适配器”方案 |
|
||||
| 需求评估 | bef2032 | 已完成 | host | 2026-10-20 | R1 接受 |
|
||||
| 需求表确认 | bef2032 | 已完成 | 用户(AskQuestion 选择) | 2026-10-20 | 本卡授权段 |
|
||||
| 方案设计 | DM 9a565d6 | 已完成 | host | 2026-10-20 | DM #30 |
|
||||
| 实施计划 | bef2032 | 已完成 | host | 2026-10-20 | 本卡方案与计划段 |
|
||||
| 实施与自检 | 88f4465 | 已完成 | cursor-agent-stable(DM 与 Dev 各一单元) | 2026-10-20 | Agent 实施收据表 |
|
||||
| 正式测试与验收 | 2430123 | 已完成(SELF;GATE 待 CI) | host | 2026-10-20 | 证据表 |
|
||||
| 代码 Review | 88f4465 | PASS | host 主模型 | 2026-10-20 | 合入与清理段 |
|
||||
| 合入 | 待定 | 待执行 | — | — | — |
|
||||
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
|
||||
|
||||
## 探索试验与迭代
|
||||
|
||||
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| I1 | cursor 显式 `--model auto` 可被 CLI 接受 | DM adapters + Dev pin/说明 | 测试与 CI 通过即停 | 用户选定方案 | `cursor-agent-stable -p --trust --model auto` 冒烟 success(SELF) | 仅 cursor argv | 否 |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | ac594c90e536cfb670e94680f045a6c8247a2513 | ac594c90e536cfb670e94680f045a6c8247a2513 | 2026-10-20T03:41:37Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## 交付调度
|
||||
|
||||
- 调度状态:窗口已领取;调度记录:#518 comment 8141(mq-dev-20261020-cursor-explicit-model-auto-01)
|
||||
- entry_id:无;attempt_id:无;窗口执行者:无
|
||||
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
|
||||
- 调度依据:policy/delivery.md#合入调度
|
||||
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
|
||||
|
||||
## 结果与验证
|
||||
|
||||
- 结果:Dev 钉住 DM `1e5ee55a`(含 DM #30),`scripts/agent-exec` 派发 cursor 时 argv 显式带 `--model auto`;`AGENT-EXECUTION.md` 说明同步。其他 CLI 与机器配置块不变。
|
||||
- 验证:`make agent-exec-validate` PASS;新 pin 下 DM adapters 测试 PASS(证据表);DM #30 CI success(GATE,DM b9627b8);Dev 完整 CI 以 PR HEAD 为准。
|
||||
- 影响与剩余项:仅影响 cursor 候选启动参数。DM 卡 `.task/feature-cursor-explicit-model-auto.md` 状态已为“已完成(合入前闭合)”,因 DM pr-check 只认 `.task/` 顶层而未归档,留待 DM 下次闭合时归档。
|
||||
|
||||
## 规划进展与下一步
|
||||
|
||||
- 本次推进/剩余:R1 完成,无剩余
|
||||
- 首选下一任务:无(独立小改动,无后续规划)
|
||||
- 推荐依据:不适用
|
||||
- 前置条件/待确认:无
|
||||
- 预期产物/验收条件:不适用
|
||||
- 重复任务核对:远端分流 NEW(唯一候选 rdm-two-trees-followup 无关)
|
||||
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:host 主模型(未撰写实施单元;平台账号 weichen)审阅 DM #30 diff(7c234e5..9a565d6,adapters 两文件)与 Dev diff(bef2032..88f4465:gitlink 6c01959→1e5ee55、AGENT-EXECUTION.md 两处说明、机器块未变),重放 `make agent-exec-validate` 与 adapters 测试;结论 PASS,无阻塞项。
|
||||
- 冲突记录:窗口内 `make task-sync` changed=0(sync_base ac594c90),无冲突;组件递归检查通过;折叠闭合遗留 IAM 卡(precheck [cards] 清零)仅 `.task/`。
|
||||
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
|
||||
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
|
||||
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:40:46.352366+00:00",
|
||||
"command": "make precheck",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev",
|
||||
"before_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"after_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"branch": "main",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"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=ac594c90e5",
|
||||
"[remote] origin/main=ac594c90e5 ahead=0 behind=0",
|
||||
"[tree] clean submodules_drift=0 uninit=0",
|
||||
"[worktrees] linked=8",
|
||||
"[cards] 已合入未闭合任务卡:feature-iam-role-permission-linked-capabilities.md——make task-close 回填归档(主检出运行)",
|
||||
"[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] ac594c90e5(完整:ac594c90e536cfb670e94680f045a6c8247a2513)",
|
||||
"[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": "a8bd643e45829cc5e5757ed82e28c385f3d5f337ad481170f0e5aaf06c4799b8",
|
||||
"receipt_sha256": "b27f90c202c8879151dbb323b7881696ef598898553f2e2f73b53759d7461426",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/b27f90c202c8879151dbb323b7881696ef598898553f2e2f73b53759d7461426.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:55:29.488261+00:00",
|
||||
"command": "make agent-exec-validate",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"after_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"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-wt-feature-cursor-explicit-model-auto'",
|
||||
"scripts/agent-exec validate --repo .",
|
||||
"validate: ok",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'"
|
||||
],
|
||||
"output_sha256": "8990e6bcf74eb84039840fc508f9c301cd4e82f0aae947c9426b5bd994df8ebb",
|
||||
"receipt_sha256": "2139d938d2fa14e6088e87cc0d8c65ee5b17eb0306fd9a0bca652fcb8e74b778",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/2139d938d2fa14e6088e87cc0d8c65ee5b17eb0306fd9a0bca652fcb8e74b778.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:55:35.879836+00:00",
|
||||
"command": "go -C deps/development-manager test -count=1 ./internal/agentexec/adapters/...",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"after_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"root_target": "main",
|
||||
"immediate_target": "main",
|
||||
"before_tracked_diff_sha256": "c88c90fec9ec2e2a666329cbf8876b9e36446bf9b37620e580e4d30fb4d39869",
|
||||
"after_tracked_diff_sha256": "c88c90fec9ec2e2a666329cbf8876b9e36446bf9b37620e580e4d30fb4d39869",
|
||||
"output_tail": [
|
||||
"ok \tdevelopment-manager/internal/agentexec/adapters\t0.006s"
|
||||
],
|
||||
"output_sha256": "a2539b823379f477727535b6ea6a4a1663a83e341b5c569d19ba3950de6065a8",
|
||||
"receipt_sha256": "8ccaa9132ffbbe8c3be1dbf2443c752e1602f3e8fe28587e869ba85ea5b4303b",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/8ccaa9132ffbbe8c3be1dbf2443c752e1602f3e8fe28587e869ba85ea5b4303b.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:56:53.133447+00:00",
|
||||
"command": "make agent-exec-validate",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"after_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"root_target": "main",
|
||||
"immediate_target": "main",
|
||||
"before_tracked_diff_sha256": "6221fca98cdc185f5a255a12a7982f29ae8332735aa8d258853872382e2fcc1a",
|
||||
"after_tracked_diff_sha256": "6221fca98cdc185f5a255a12a7982f29ae8332735aa8d258853872382e2fcc1a",
|
||||
"output_tail": [
|
||||
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'",
|
||||
"scripts/agent-exec validate --repo .",
|
||||
"validate: ok",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'"
|
||||
],
|
||||
"output_sha256": "8990e6bcf74eb84039840fc508f9c301cd4e82f0aae947c9426b5bd994df8ebb",
|
||||
"receipt_sha256": "c036b3d15acaf33ae32da7ae882429cc42e1507f68acdb6b8476f180000fb897",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/c036b3d15acaf33ae32da7ae882429cc42e1507f68acdb6b8476f180000fb897.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:56:55.499605+00:00",
|
||||
"command": "go -C deps/development-manager test -count=1 ./internal/agentexec/adapters/...",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"after_head": "88f446531beb8702a4a95a41ce581e2d4323604d",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"root_target": "main",
|
||||
"immediate_target": "main",
|
||||
"before_tracked_diff_sha256": "b9a88a2e41d0f40d725ae54b2ae633e44b9df560a0a72f7825ebbce88baa5c6e",
|
||||
"after_tracked_diff_sha256": "b9a88a2e41d0f40d725ae54b2ae633e44b9df560a0a72f7825ebbce88baa5c6e",
|
||||
"output_tail": [
|
||||
"ok \tdevelopment-manager/internal/agentexec/adapters\t0.004s"
|
||||
],
|
||||
"output_sha256": "2cffdc38850f97e030e880c45699a6a11b06c2775981af4078ef33f632420023",
|
||||
"receipt_sha256": "8cba28efa634b39f395787b9ab213398c002c0a585221d6f050c77280824a919",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/8cba28efa634b39f395787b9ab213398c002c0a585221d6f050c77280824a919.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:57:53.830073+00:00",
|
||||
"command": "make task-sync",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "e8cf50fb3f9deff94a9499921bacb6e5d2552108",
|
||||
"after_head": "e8cf50fb3f9deff94a9499921bacb6e5d2552108",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"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-wt-feature-cursor-explicit-model-auto'",
|
||||
"[worktree] before-sync: recursive component checks passed",
|
||||
"[worktree] before-update: recursive component checks passed",
|
||||
"[worktree] materialize: recursive component checks passed",
|
||||
"[worktree] after-sync: recursive component checks passed",
|
||||
"[evidence] WARN JSON receipt line 121: recorded HEAD predates non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[synced] sync_base=ac594c90e536cfb670e94680f045a6c8247a2513 tested_head=e8cf50fb3f9deff94a9499921bacb6e5d2552108 checked_at=2026-10-20T03:58:47Z changed=0 sync_target=main",
|
||||
"[next] 跑正式验收(make test 等),证据写入任务卡",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'"
|
||||
],
|
||||
"output_sha256": "87c7c6e85e7c7fbae5df8e2fc60123d345e043ab0fe2d822fb07e1a20ed7a39c",
|
||||
"receipt_sha256": "43fcec3baa078cfeeb4b10d9c4f3e0554dba0f27792e1151a225bdf7d91541b1",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/43fcec3baa078cfeeb4b10d9c4f3e0554dba0f27792e1151a225bdf7d91541b1.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:58:56.449775+00:00",
|
||||
"command": "make precheck",
|
||||
"exit_code": 2,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "e8cf50fb3f9deff94a9499921bacb6e5d2552108",
|
||||
"after_head": "e8cf50fb3f9deff94a9499921bacb6e5d2552108",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"root_target": "main",
|
||||
"immediate_target": "main",
|
||||
"before_tracked_diff_sha256": "4317988e164abd60d49c490603d566068c2fce4ab71bd785fc0cdf2c1b0ebb4f",
|
||||
"after_tracked_diff_sha256": "4317988e164abd60d49c490603d566068c2fce4ab71bd785fc0cdf2c1b0ebb4f",
|
||||
"output_tail": [
|
||||
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'",
|
||||
"[repo] branch=feature/cursor-explicit-model-auto head=e8cf50fb3f",
|
||||
"[remote] origin/main=ac594c90e5 ahead=4 behind=0",
|
||||
"[tree] dirty(1) submodules_drift=0 uninit=0",
|
||||
"[worktrees] linked=8",
|
||||
"[cards] 已合入未闭合任务卡:feature-iam-role-permission-linked-capabilities.md——make task-close 回填归档(主检出运行)",
|
||||
"[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, standards/collaboration.md(树脏=他人或未收尾现场,不得写入)",
|
||||
"[R0] ac594c90e5(完整:ac594c90e536cfb670e94680f045a6c8247a2513)",
|
||||
"[verdict] SHARED_WORKSPACE_BUSY — 工作树不干净,不得写入;先收尾或经 owner 确认",
|
||||
"make[1]: *** [Makefile:40: precheck] Error 3",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto'"
|
||||
],
|
||||
"output_sha256": "2f0b15c181f2d0683f8c7b71ea16af91ac32206a5dcdaa2723015c8db8742ca2",
|
||||
"receipt_sha256": "ab41cab72ef0a1e70cabdc5dd98152d4173659722144b49cd300d96a8b314af2",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/ab41cab72ef0a1e70cabdc5dd98152d4173659722144b49cd300d96a8b314af2.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-20T03:59:10.263393+00:00",
|
||||
"command": "make precheck",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-cursor-explicit-model-auto",
|
||||
"before_head": "2430123837f52b5a1f23d8f780ab2820662213df",
|
||||
"after_head": "2430123837f52b5a1f23d8f780ab2820662213df",
|
||||
"branch": "feature/cursor-explicit-model-auto",
|
||||
"target_branch": "main",
|
||||
"target_head": "ac594c90e536cfb670e94680f045a6c8247a2513",
|
||||
"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-wt-feature-cursor-explicit-model-auto'",
|
||||
"[repo] branch=feature/cursor-explicit-model-auto head=2430123837",
|
||||
"[remote] origin/main=ac594c90e5 ahead=5 behind=0",
|
||||
"[tree] clean submodules_drift=0 uninit=0",
|
||||
"[worktrees] linked=8",
|
||||
"[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] ac594c90e5(完整:ac594c90e536cfb670e94680f045a6c8247a2513)",
|
||||
"[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-wt-feature-cursor-explicit-model-auto'"
|
||||
],
|
||||
"output_sha256": "6e0be0bead14cab83976c54cf02bb42c7f50ca9a970c936847c7468be0a08249",
|
||||
"receipt_sha256": "74eb543778810cbc85366ba05a047687a2fb4c28758da747b5f4ea1937713e06",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/74eb543778810cbc85366ba05a047687a2fb4c28758da747b5f4ea1937713e06.json"
|
||||
}
|
||||
```
|
||||
|
||||
## 闭合记录(合入前折叠)
|
||||
|
||||
- 本卡在 PR #644(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/644)合入前闭合并归档,随该 PR 一同合入。
|
||||
- 该 PR 的合并提交即本任务的落地记录。
|
||||
- 合入后无需回填,也无需单独的闭合 PR。
|
||||
@@ -0,0 +1,612 @@
|
||||
# feature/iam-role-permission-linked-capabilities-perm-ux 任务卡
|
||||
|
||||
任务主记录:PR #629 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/629;状态:已完成(合入前闭合);owner:weichen
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux(worktree);分支:feature/iam-role-permission-linked-capabilities-perm-ux
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:90317d02a746ea3cd25021561ef40e8cd7498963;parent_pr:无;parent_source:origin
|
||||
- 需求分流:verdict=JOIN;selected_initiative=feature/iam-role-permission-linked-capabilities;requirement_sha256=6eab4bfaa1bb158cd0943427d00264a74059b77b967530dc7d7c32f2f9ada0fa;triage_receipt=/tmp/iam-perm-ux-triage.json;receipt_sha256=3dd33a2bd1a128579bd405339b682acbcd4f96c7b980ebb0941cd5c622ccebb7
|
||||
|
||||
- 授权与交付终点:按源码外方案 `/tmp/iam-permission-ux-plan-20261019-1dehpj7l/plan.md`(2026-10-19 评审稿,review.md 三项审阅 clean)实施 U1–U6:Backend 权限展示目录与关联预览合同、原子批量写入与读投影;Frontend 分类角色矩阵与单角色聚焦、用户/角色人员配置、项目有效权限说明;真实浏览器验收与组合交付。终点:子任务 PR 合入所属 L1 分支 `feature/iam-role-permission-linked-capabilities`(PR #628),组件 pin 随本任务推进;不部署、不迁移生产数据、不做日常实例采用(C16 保持 NOT_RUN 直至另行授权)。
|
||||
- 组件分支策略:Backend 工作分支 `feature/iam-perm-ux-backend`(基于 L1 U1 联动分支 `origin/feature/iam-link-u1-capability-association` @ afb65c5,消费其冻结的 `ProjectCreateLinkedActions`/`LinkedCapabilities` 合同);Frontend 工作分支基于组件 origin/main(6db528d,L1 前端单元尚未启动)。
|
||||
- 依赖协调:#628 L1 的 U1(联动 Backend)已完成并推送(afb65c5);L1 U2(单一角色权威)已登记待启动——其 `perms_api.go`/`hostcaps.go` 与本任务 `roles.go`/`role_policy.go` 不同区段,组合冲突由 L1 集成时解决;本任务不重写 L1 已实现的联动规则,只消费。
|
||||
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**(方案 R1–R17,用户验收 C01–C16):管理员无需理解技术权限字段即可看懂角色能做什么;默认业务分类矩阵可同时比较并编辑多个角色(三态控件:不允许/按项目授权/默认允许;系统动作仅允许/不允许);单角色聚焦复用同一草稿;统一预览与原子保存;用户列表显示当前角色并支持单人/多人批量角色分配(服务端目录选择器,不手输账号);复制角色并分配;系统自动处理创建项目联动并解释生效范围;项目有效权限说明。
|
||||
|
||||
**非目标**:多职位叠加、个人普通权限覆盖、通用权限引擎、审批系统、Excel 导入导出、批量系统管理授权、全库动态匹配选择;账号恢复/凭据管理(原入口);超级管理员保护(#627);成员共享读取语义(L1 U7);生产部署与日常实例采用。
|
||||
|
||||
## 实施单元(本任务)
|
||||
|
||||
| 单元 | 范围 | 依赖 |
|
||||
|---|---|---|
|
||||
| permux-U1 权限展示与关联预览 | Backend `internal/authz/catalog/`、`internal/server/roles.go`、`internal/store/role_policy.go`、`pkg/extension/role_policy.go`:中文分类目录元数据、三态归一化、变更预览(含 #628 关联差异)、缺失/显式拒绝可区分 | L1 U1 合同(已冻结并实现 @ afb65c5) |
|
||||
| permux-U2 原子批量写入与读投影 | Backend 同上 + `internal/server/account_search.go`:多角色 patch 事务、多用户角色分配事务、复制角色并分配事务;用户目录当前角色投影、角色成员目录 | permux-U1 |
|
||||
| permux-U3 分类矩阵与单角色聚焦 | Frontend `RolePermissionsPanel.tsx`、`rolePermissions.ts`、`api.ts`、样式与测试 | permux-U1/U2 |
|
||||
| permux-U4 用户与角色人员配置 | Frontend `AccountUsersPanel.tsx`、`AdminZone.tsx`、`api.ts`、人员选择器与测试 | permux-U2;与 #627 AccountUsersPanel 修改按顺序合并(#627 未动本分支时直接实施) |
|
||||
| permux-U5 项目有效权限说明 | Frontend `adminRdmSections.tsx` 权限解释区;消费 L1 合同,L1 U3/U7 未组合前显式「联动服务未就绪」,不 mock | permux-U3/U4 + L1 真实规则 |
|
||||
| permux-U6 真实浏览器验收与交付 | `e2e/iam-role-authority.playwright.ts` 扩充、组合 gitlink、Review/CI/合入(host 主导) | 全部 |
|
||||
|
||||
## 需求分析
|
||||
|
||||
| ID | 描述 | 验收 | 结论 |
|
||||
|---|---|---|---|
|
||||
| R1–R7 | 角色配置:分类矩阵、三态控件、联动预览、中文文案(方案 Requirements — Role Configuration) | C01–C06, C11, C14 | 纳入 permux-U1/U3 |
|
||||
| R8–R12 | 人员配置:目录检索、多选批量、复制分配、稳定 userId(方案 Requirements — User Configuration) | C07–C10, C14 | 纳入 permux-U2/U4 |
|
||||
| R13–R17 | 可靠性与验收:原子事务、幂等、固定选择集、可访问性、真实验收(方案 Reliability and Acceptance) | C09, C12, C14, C15 | 纳入 permux-U2/U6 |
|
||||
| C16 | 日常实例采用 | 运行版本核对 | NOT_RUN(未授权部署),单列记录 |
|
||||
|
||||
## 风险与决策记录
|
||||
|
||||
- L1 U2(单一角色权威)与本任务均在途:本任务 Backend 基于联动分支 afb65c5,L1 后续单元合入时由 L1 集成解决;两单元文件区段不重叠(其 perms_api/hostcaps,本任务 roles/role_policy/account_search)。
|
||||
- 「创建项目→自动关联」运行时联动已在 L1 U1 实现(afb65c5);本任务 U1 的预览/展示直接消费 `catalog.ProjectCreateLinkedActions()` 与 `LinkedCapabilities`,不另建第二套关联规则。
|
||||
- L1 U7(成员共享读取)未实现:permux-U5 相关展示显式标注联动服务未就绪,不伪造;验收 C13 由 L1 U7 交付时闭环。
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| permux-U1 | catalog 分类元数据 + PreviewRolePermissions + POST /api/admin/roles/permissions/preview | 76bc59db1d0e9127(AGENT-EXECUTION digest) | implementation | cursor→agy→pi | 1 | cursor(session 204c93fb…) | success(transport 未应用:host 以相对路径调用 run,收据 repo 字段与 apply 校验不兼容;保留现场) | refs/agent-exec/8ac83883…/a433eb6f(未应用) | never | /tmp/permux-u1-run.json |
|
||||
| permux-U1 | 同上(全新会话重跑,调用形式 --repo .) | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(新 session,event 未报则 not-observable) | success | 已应用 bc09721(fast-forward afb65c5→bc09721) | never | /tmp/permux-u1-run2.json |
|
||||
| permux-U2 | 批量 patch/批量分配/复制分配事务 + 目录角色投影 + 角色成员目录 | 76bc59db1d0e9127 | implementation | cursor→agy→pi | 1 | cursor(session 未在事件中报告:not-observable) | success | 已应用 6851ee6(fast-forward bc09721→6851ee6) | never | /tmp/permux-u2-run.json |
|
||||
| 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 |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed | 90317d02a746ea3cd25021561ef40e8cd7498963 | 2026-10-19T03:13:11Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## 结果与验证
|
||||
|
||||
- 结果: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/合入记录见下节。
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:PASS(0 阻塞,5 项非阻塞建议)。审阅者:全新 CLI 独立会话(pi / MiniMax-M3,未参与实现,fresh_session=true,session not-observable);对象:Dev 90317d02..234ce30 + 组件 origin/main…feature/iam-perm-ux-backend@4130ad7、feature/iam-perm-ux-frontend@46a63f02;报告全文 .task/reviews/2026-10-19-permux-independent-review.md(随本分支合入);收据 /tmp/permux-review2-run.json(首次只读会话因无文件产物记 failed-unknown,见 /tmp/permux-review-run.json)。非阻塞建议(后续增量,不随本 PR 修):批量角色行锁未按 roleID 排序(PG 高并发瞬时回滚);目录接口返回完整 profile 可裁剪;roleDraftLeaveGuard 复位间隙;catalog 失败回填的编辑闪烁;adoptRoleSnapshot 注释明示。
|
||||
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
|
||||
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
|
||||
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
|
||||
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T03:12:24.090626+00:00",
|
||||
"command": "make precheck",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev",
|
||||
"before_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"after_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"branch": "main",
|
||||
"target_branch": "main",
|
||||
"target_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"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=7716b28cff",
|
||||
"[remote] origin/main=7716b28cff ahead=0 behind=0",
|
||||
"[tree] clean submodules_drift=0 uninit=13",
|
||||
"[warn] 13 个子模块未初始化——构建/测试前需物化(不阻断写入)",
|
||||
"[worktrees] linked=5",
|
||||
"[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] 7716b28cff(完整:7716b28cfff5200e7cfe9ec75aff5bcd71b234ed)",
|
||||
"[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": "07bfa89f466fec4670149743fcc24eec9e572add7603cbc9a08b6c6268f511b3",
|
||||
"receipt_sha256": "82a56765b5b0630ed103d995875cdeb55426259336a503bb7d1a8bbf42aa9a40",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/82a56765b5b0630ed103d995875cdeb55426259336a503bb7d1a8bbf42aa9a40.json"
|
||||
}
|
||||
```
|
||||
| 同步(记录前对象) | a99dbfcd9ac48d09038c76e09dc59e074c11ab7d | 04af865e227858bbe9f0bd38ebaed2b874da4f27 | 2026-10-19T03:18:24Z |
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T03:39:09.339573+00:00",
|
||||
"command": "sh -c 'cd modules/backend && GOWORK=off go build ./... && GOWORK=off go test ./internal/authz/... ./internal/store ./internal/server -run \"Role|Policy|Binding|AccountSearch|Preview|Catalog\" -count=1 && GOWORK=off go vet ./internal/authz/catalog ./internal/store ./internal/server && git status --porcelain -- deps/ | wc -l'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "c17b0ae76ccf0d37060bed5a822d48b12b1da432",
|
||||
"after_head": "c17b0ae76ccf0d37060bed5a822d48b12b1da432",
|
||||
"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": "9d0b0e5082d3f2737db82c268a6c72f3c9826a418ce20c834042587f36f0a258",
|
||||
"after_tracked_diff_sha256": "9d0b0e5082d3f2737db82c268a6c72f3c9826a418ce20c834042587f36f0a258",
|
||||
"output_tail": [
|
||||
"? \tagent-system-backend/internal/authz\t[no test files]",
|
||||
"ok \tagent-system-backend/internal/authz/catalog\t0.008s",
|
||||
"ok \tagent-system-backend/internal/store\t0.665s",
|
||||
"ok \tagent-system-backend/internal/server\t1.834s",
|
||||
"0"
|
||||
],
|
||||
"output_sha256": "738432121e1862d4b5466f789033634bca2025c29e89c8bd444dbbdba59d6f94",
|
||||
"receipt_sha256": "db537adfa357d41e0f84f7aba19fd5fe85f3249cdbfe92887e675be4a73c966a",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/db537adfa357d41e0f84f7aba19fd5fe85f3249cdbfe92887e675be4a73c966a.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T03:53:20.691306+00:00",
|
||||
"command": "sh -c 'cd modules/backend && GOWORK=off go build ./... && GOWORK=off go test ./internal/authz/... ./internal/store ./internal/server -run \"Role|Policy|Binding|AccountSearch|Batch|CopyAssign|Members|Preview|Catalog\" -count=1 && GOWORK=off go vet ./internal/store ./internal/server && git status --porcelain -- deps/ | wc -l'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "cfe90a8742263c32d67f91614f8b5d8a6e4b3f28",
|
||||
"after_head": "cfe90a8742263c32d67f91614f8b5d8a6e4b3f28",
|
||||
"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": "01694e3df50336ad8bdf88e7519628925d66e7bed13e94745ee5d78af591fa12",
|
||||
"after_tracked_diff_sha256": "01694e3df50336ad8bdf88e7519628925d66e7bed13e94745ee5d78af591fa12",
|
||||
"output_tail": [
|
||||
"? \tagent-system-backend/internal/authz\t[no test files]",
|
||||
"ok \tagent-system-backend/internal/authz/catalog\t0.002s",
|
||||
"ok \tagent-system-backend/internal/store\t0.818s",
|
||||
"ok \tagent-system-backend/internal/server\t2.648s",
|
||||
"0"
|
||||
],
|
||||
"output_sha256": "bc4b28c38cb498d35ef2e3d2d5b296654b08779a71dafc8073670d42cda11de6",
|
||||
"receipt_sha256": "be276a366de77bd675a1dfccf23023b269633940a712195042d949138c765c55",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/be276a366de77bd675a1dfccf23023b269633940a712195042d949138c765c55.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T04:05:14.627845+00:00",
|
||||
"command": "sh -c 'cd modules/frontend && npx vitest run test/role-permissions.test.ts test/role-permissions-ui.test.ts test/design-guard.test.ts 2>&1 | tail -4 && npx tsc -b && echo TSC_OK'",
|
||||
"exit_code": 1,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "fa8b5fb1c147d7660ef219dfa53be73a9a064f79",
|
||||
"after_head": "fa8b5fb1c147d7660ef219dfa53be73a9a064f79",
|
||||
"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": "5a432adeeb888e4790fabbdc35121353f79ebf5eaed38a65520da364553468df",
|
||||
"after_tracked_diff_sha256": "5a432adeeb888e4790fabbdc35121353f79ebf5eaed38a65520da364553468df",
|
||||
"output_tail": [
|
||||
" Tests 26 passed (26)",
|
||||
" Start at 04:05:15",
|
||||
" Duration 456ms (transform 369ms, setup 0ms, import 460ms, tests 22ms, environment 0ms)",
|
||||
"",
|
||||
"../ui/src/activitySummary.ts(2,49): error TS2307: Cannot find module 'marked' or its corresponding type declarations.",
|
||||
"../ui/src/safeHtml.tsx(4,24): error TS2307: Cannot find module 'marked' or its corresponding type declarations.",
|
||||
"../ui/src/safeHtml.tsx(5,29): error TS2307: Cannot find module 'dompurify' or its corresponding type declarations.",
|
||||
"../ui/src/safeHtml.tsx(6,29): error TS2307: Cannot find module 'dompurify' or its corresponding type declarations.",
|
||||
"../ui/src/safeHtml.tsx(54,46): error TS7006: Parameter 'node' implicitly has an 'any' type.",
|
||||
"../ui/src/safeHtml.tsx(54,52): error TS7006: Parameter 'data' implicitly has an 'any' type.",
|
||||
"../ui/src/safeHtml.tsx(56,53): error TS7006: Parameter 'name' implicitly has an 'any' type.",
|
||||
"../ui/src/safeHtml.tsx(61,47): error TS7006: Parameter 'node' implicitly has an 'any' type."
|
||||
],
|
||||
"output_sha256": "62f6c2f955af2580587185359c855db2cd2c9b708ff4f214e7daf1c6af7cbca3",
|
||||
"receipt_sha256": "2b0c8fd7d7c6f4e2b2d686a99cc4de0c9ac33bf0e529dc097869bfea2b1e2698",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/2b0c8fd7d7c6f4e2b2d686a99cc4de0c9ac33bf0e529dc097869bfea2b1e2698.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T04:06:33.549745+00:00",
|
||||
"command": "sh -c 'cd modules/frontend && npx vitest run test/role-permissions.test.ts test/role-permissions-ui.test.ts test/design-guard.test.ts 2>&1 | tail -4 && npx tsc -b && echo TSC_OK'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "fa8b5fb1c147d7660ef219dfa53be73a9a064f79",
|
||||
"after_head": "fa8b5fb1c147d7660ef219dfa53be73a9a064f79",
|
||||
"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": "1a6610bf25c8514e73982e4c2ec2afa122deba4db666670b3c26e69b8b201999",
|
||||
"after_tracked_diff_sha256": "1a6610bf25c8514e73982e4c2ec2afa122deba4db666670b3c26e69b8b201999",
|
||||
"output_tail": [
|
||||
" Tests 26 passed (26)",
|
||||
" Start at 04:06:33",
|
||||
" Duration 351ms (transform 281ms, setup 0ms, import 354ms, tests 20ms, environment 0ms)",
|
||||
"",
|
||||
"TSC_OK"
|
||||
],
|
||||
"output_sha256": "9b4104496d0cfb6faa5fbb49ec4717eca4d7492de6963a767a631c73afdaf641",
|
||||
"receipt_sha256": "35f7e24a7106e9b04e96f1ad05ceecdc75062af14156135314ff45bbc4f19494",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/35f7e24a7106e9b04e96f1ad05ceecdc75062af14156135314ff45bbc4f19494.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T04:17:53.352830+00:00",
|
||||
"command": "sh -c 'cd modules/frontend && npx vitest run test/account-users-panel.test.ts test/role-members.test.ts test/role-permissions.test.ts test/role-permissions-ui.test.ts test/design-guard.test.ts 2>&1 | tail -4 && npx tsc -b && echo TSC_OK'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "b1a1ffbda55bd219c849cb69336f07e690e57342",
|
||||
"after_head": "b1a1ffbda55bd219c849cb69336f07e690e57342",
|
||||
"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": "ed490c9560a136815bf04b76235761a1104d3c5fe43754b7505a7498be12044b",
|
||||
"after_tracked_diff_sha256": "ed490c9560a136815bf04b76235761a1104d3c5fe43754b7505a7498be12044b",
|
||||
"output_tail": [
|
||||
" Tests 43 passed (43)",
|
||||
" Start at 04:17:53",
|
||||
" Duration 368ms (transform 655ms, setup 0ms, import 816ms, tests 30ms, environment 0ms)",
|
||||
"",
|
||||
"TSC_OK"
|
||||
],
|
||||
"output_sha256": "8650d93bb8fb8f383cb9cdaff1de0bd7a8cd84045863cbcda89bc97ef9a791b9",
|
||||
"receipt_sha256": "ff22fc2ac93c050ca1c1e48f9e8d02d6b70acfb91c4ec43aa7eb7bb6d676c29d",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/ff22fc2ac93c050ca1c1e48f9e8d02d6b70acfb91c4ec43aa7eb7bb6d676c29d.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T04:22:52.740525+00:00",
|
||||
"command": "sh -c 'cd modules/frontend && npx vitest run test/permission-explanations.test.ts test/role-members.test.ts test/design-guard.test.ts 2>&1 | tail -4 && npx tsc -b && echo TSC_OK'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "9a9c9699707a64fd3c42cafca43b852c0e2360ef",
|
||||
"after_head": "9a9c9699707a64fd3c42cafca43b852c0e2360ef",
|
||||
"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": "72c8f8764864ab3a21ecfa3b718b5b4f6af0558bf2a78da32cb2ecaa944f3038",
|
||||
"after_tracked_diff_sha256": "72c8f8764864ab3a21ecfa3b718b5b4f6af0558bf2a78da32cb2ecaa944f3038",
|
||||
"output_tail": [
|
||||
" Tests 28 passed (28)",
|
||||
" Start at 04:22:53",
|
||||
" Duration 129ms (transform 70ms, setup 0ms, import 98ms, tests 24ms, environment 0ms)",
|
||||
"",
|
||||
"TSC_OK"
|
||||
],
|
||||
"output_sha256": "61d36b9c51a038a5d0412bdc14ab3fecc312a6f161de6c4a56700f0a594058ef",
|
||||
"receipt_sha256": "4841be620f46292654dbd43bc0f132ca4118792756394f14b1b6892a7f866507",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/4841be620f46292654dbd43bc0f132ca4118792756394f14b1b6892a7f866507.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T04:27:22.417342+00:00",
|
||||
"command": "sh -c 'umask 0022 && make test-affected 2>&1 | tail -8'",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "7b25169fad83291ff342213afeb20ca2fa2efed8",
|
||||
"after_head": "7b25169fad83291ff342213afeb20ca2fa2efed8",
|
||||
"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": [
|
||||
" Start at 04:27:54",
|
||||
" Duration 814ms (transform 6.92s, setup 0ms, import 11.46s, tests 960ms, environment 4ms)",
|
||||
"",
|
||||
"knip unused exports 53 exceed baseline 51",
|
||||
"make[2]: *** [Makefile:188: test-frontend] Error 1",
|
||||
"make[2]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'",
|
||||
"make[1]: *** [Makefile:221: test-affected] Error 2",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'"
|
||||
],
|
||||
"output_sha256": "c5041e844c8690957d62bcc1f7eb0c14c390a0fadb3953577d3266c39a149c39",
|
||||
"receipt_sha256": "2227942e89094d6d44dca758185d4d836f83a790610d381c9d2e596f5253ac8d",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/2227942e89094d6d44dca758185d4d836f83a790610d381c9d2e596f5253ac8d.json"
|
||||
}
|
||||
```
|
||||
|
||||
## U6 组合与验证记录
|
||||
|
||||
- 组合 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 将以无管道方式重新捕获。
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```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"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```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"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```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=<redacted> 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"
|
||||
}
|
||||
```
|
||||
|
||||
## 交付阻塞记录(2026-10-19)
|
||||
|
||||
- 平台事实:Gitea `https://git-home.u1680832.nyat.app:30319` 当前 TLS 握手失败(WRONG_VERSION_NUMBER),明文 `http://…:30319/api/v1/version` 返回 501 代理错误页(非 Gitea JSON);同日早些时候(03:05 分流)HTTPS API 正常。policy/facts.md F1 判据已失效,恢复后须 `make facts-verify` 重验。
|
||||
- git/SSH 通道正常:三个分支均已推送(Dev 子分支 f97790b、Backend feature/iam-perm-ux-backend @ 4130ad7、Frontend feature/iam-perm-ux-frontend @ 46a63f02)。
|
||||
- 受阻动作:PR 创建、`make task-pr-check`、CI 等待(`make ci-wait`)、独立 Review 提交与合入——均标 NOT_RUN/阻塞,待平台恢复后在同一收据流程下继续;不得以本地证据替代平台准入。
|
||||
- 现场保护:worktree 与全部组件分支保留;无未提交的实施代码(任务卡记录除外)。
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T07:12:01.645701+00:00",
|
||||
"command": "make task-pr-check PR=629",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "e7bcc61ba6ea378a24ab43643b81fa41d2076bd3",
|
||||
"after_head": "e7bcc61ba6ea378a24ab43643b81fa41d2076bd3",
|
||||
"branch": "feature/iam-role-permission-linked-capabilities-perm-ux",
|
||||
"target_branch": "main",
|
||||
"target_head": "73bc9f208103ec1b9b83775ca65fee12f79ba99e",
|
||||
"root_target": "main",
|
||||
"immediate_target": "feature/iam-role-permission-linked-capabilities",
|
||||
"before_tracked_diff_sha256": "016330b58d3f18c8ee1ec97dafdae2bda81a4b8ca4503fc156bef1ce0a843a10",
|
||||
"after_tracked_diff_sha256": "016330b58d3f18c8ee1ec97dafdae2bda81a4b8ca4503fc156bef1ce0a843a10",
|
||||
"output_tail": [
|
||||
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'",
|
||||
"python3 scripts/task_pr_check.py local --pr 629 ",
|
||||
"[verdict] PR_CHECK_OK base=feature/iam-role-permission-linked-capabilities head=e7bcc61ba6ea378a24ab43643b81fa41d2076bd3 kind=child",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'"
|
||||
],
|
||||
"output_sha256": "6d920e3b949ce2190266128b8fab6d643b9a43fde82ee3b09a50745e8503715f",
|
||||
"receipt_sha256": "9ac80ba53e969973c510fb8344215feb365a76693b83499130b5547fbb910264",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/9ac80ba53e969973c510fb8344215feb365a76693b83499130b5547fbb910264.json"
|
||||
}
|
||||
```
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T07:32:01.073317+00:00",
|
||||
"command": "make ci-wait SHA=374ce2d3822ae6ae5514cab2d6b0701f8f88c049",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "374ce2d3822ae6ae5514cab2d6b0701f8f88c049",
|
||||
"after_head": "374ce2d3822ae6ae5514cab2d6b0701f8f88c049",
|
||||
"branch": "feature/iam-role-permission-linked-capabilities-perm-ux",
|
||||
"target_branch": "main",
|
||||
"target_head": "73bc9f208103ec1b9b83775ca65fee12f79ba99e",
|
||||
"root_target": "main",
|
||||
"immediate_target": "feature/iam-role-permission-linked-capabilities",
|
||||
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"output_tail": [
|
||||
"make[1]: Entering directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'",
|
||||
"python3 scripts/ci_wait.py --sha 374ce2d3822ae6ae5514cab2d6b0701f8f88c049 ",
|
||||
"[ci-wait] sha=374ce2d3822a ci / svc-realcombo (pull_request)=skipped ci / test (pull_request)=success ci / test-pg (pull_request)=skipped",
|
||||
"[verdict] CI_SUCCESS sha=374ce2d3822ae6ae5514cab2d6b0701f8f88c049",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'"
|
||||
],
|
||||
"output_sha256": "2909a1b5ce8c20fa15b10b1bcc1fe64c25cccfe1200350cb45420b2c410ffe2e",
|
||||
"receipt_sha256": "c62c86cfb7bdf8157ba804c7832cccc0424d0001be34f1cfec9f98f92680b6c5",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/c62c86cfb7bdf8157ba804c7832cccc0424d0001be34f1cfec9f98f92680b6c5.json"
|
||||
}
|
||||
```
|
||||
| 同步(记录前对象) | e1e0887e12501158e04477659d4567262dc44a73 | 2f88c756faaa267daf99d311415e7253fb5b4f23 | 2026-10-19T07:55:31Z |
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T07:54:30.575767+00:00",
|
||||
"command": "make task-sync",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux",
|
||||
"before_head": "e4aa6337502a5b317067f25b6b52033117cb20e3",
|
||||
"after_head": "c1cf9dd0ad6b1cd2a8f1ef668e288360e9777edc",
|
||||
"branch": "feature/iam-role-permission-linked-capabilities-perm-ux",
|
||||
"target_branch": "main",
|
||||
"target_head": "38ac2b0687514b480cc61dec425e1affb37c6295",
|
||||
"root_target": "main",
|
||||
"immediate_target": "feature/iam-role-permission-linked-capabilities",
|
||||
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
|
||||
"output_tail": [
|
||||
"[worktree] materialize: recursive component checks passed",
|
||||
"[worktree] after-sync: recursive component checks passed",
|
||||
"admit: ok",
|
||||
"[evidence] WARN JSON receipt line 103: unverified: recorded component state was not at its pinned SHA ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 145: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 176: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 207: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 245: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 276: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 307: unverified: recorded object includes uncommitted non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 338: recorded HEAD predates non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[evidence] WARN JSON receipt line 378: recorded HEAD predates non-card changes ——关键检查须重跑并以 make evidence 重新写入",
|
||||
"[synced] sync_base=e1e0887e12501158e04477659d4567262dc44a73 tested_head=c1cf9dd0ad6b1cd2a8f1ef668e288360e9777edc checked_at=2026-10-19T07:55:32Z changed=1 sync_target=feature/iam-role-permission-linked-capabilities",
|
||||
"[next] 跑正式验收(make test 等),证据写入任务卡",
|
||||
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities-perm-ux'"
|
||||
],
|
||||
"output_sha256": "0de9daceeef02d1ac6f001ee3f3e88f40f00d2256ff08ba95c7d1ce0d6d0c4cb",
|
||||
"receipt_sha256": "46d8df5f1b56492e3155f9e785621b2fd9f86a346f10c0b6642cfe4281ca7ad2",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/46d8df5f1b56492e3155f9e785621b2fd9f86a346f10c0b6642cfe4281ca7ad2.json"
|
||||
}
|
||||
```
|
||||
|
||||
## 闭合记录(合入前折叠)
|
||||
|
||||
- 本卡在 PR #629(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/629)合入前闭合并归档,随该 PR 一同合入。
|
||||
- 该 PR 的合并提交即本任务的落地记录。
|
||||
- 合入后无需回填,也无需单独的闭合 PR。
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u1-capability-association 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:90317d02a746ea3cd25021561ef40e8cd7498963;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:在 `feature/iam-role-permission-linked-capabilities` 之上按方案 U1 修改 Backend 与 RDM 公开能力文件,实现业务能力联动(R3/R6/R16, KTD1/KTD3/KTD4),交付到 L1 initiative 分支;不开 PR、不入 main。
|
||||
- 当前实际交付:Backend L1 子分支 `feature/iam-link-u1-capability-association` @ `afb65c5678d8e17544f045ef7143866ffdc703e3` 已推送(Agent-System-Backend 远端);RDM `role_provider.go` 迁移按方案依赖链留待 U2。
|
||||
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
|
||||
- 当前阶段:需求拆解;当前增量:U1 capability-association
|
||||
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位);父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:实现"创建能力开启即联动获得本人项目管理资格"的业务能力关联规则;服务端原子展开、保存校验、HTTP/command 同一服务端关联规则;显式冲突整笔拒绝;关闭创建能力不破坏已有项目。
|
||||
|
||||
**范围**:
|
||||
- Backend `internal/authz/catalog/catalog.go`:仅在必要时新增 `project.work` 等用于基础协作判定的描述项;不引入与方案 §"Capability Association Map" 不一致的描述。
|
||||
- Backend `internal/store/role_policy.go`:扩展 `ReplaceRolePermissions`、`ReplaceSystemGrants`、`ImportRoleAuthority`、`ActivateRoleAuthorityImport` 使其在同一事务内做"业务能力关联"校验;提供导出给 RDM/Backend Host 的联动投影。
|
||||
- Backend `internal/authz/service.go`:扩展 `AuthorizeSystem` 与必要新方法(`EffectiveLinkedCapabilities` 等),使 actor 在持有 `project.create` 时自动获得本人项目管理资格所需能力;不再要求 actor 通过 `RolePermissionAllowed` 逐项补齐(保留显式拒绝与平台硬禁止)。
|
||||
- Backend `pkg/extension/`:在 `RolePolicySnapshot` 等公开 DTO 暴露联动结果、关联来源与差异。
|
||||
- RDM `internal/perms/role_provider.go`:把 RDM 端的创建能力判定迁移到消费 Backend 的公开 `RolePolicyProvider`/`SystemActionProvider`,不再自构;保留旧动作名通过映射消费。
|
||||
- 测试:复用既有 `internal/store/role_policy_test.go`、`internal/server/role_authorization_test.go`、`internal/authz/catalog/catalog_test.go`,增加新表(创建能力联动:仅 create=true ⇒ 完整管理;显式冲突/平台禁止/版本冲突 ⇒ 整笔拒绝;直接系统 grant 无职位 ⇒ 同源闭环;仅关闭未来创建不影响现存)。
|
||||
|
||||
**非目标**:
|
||||
- 不触动 U2 单一角色权威的 `AccountRoleOf/RoleActionOf` 切换分支(U2)。
|
||||
- 不触动 RDM `project_resource_authz.go` 中两树一网共享语义(U7)。
|
||||
- 不引入新数据库表;只在既有 `role_permissions` / `system_grants` 上做一致性校验与联动。
|
||||
- 不引入通用权限引擎;保留既有 `allowed/capAllowed` 二元语义。
|
||||
- 不引入前端改动(U4)。
|
||||
- 不部署、不写生产数据。
|
||||
|
||||
**验收条件**:方案 C06/C08/C09/C10 全部 PASS;既有 C01-C05、C22、C24-C25 在 U2/U7/U5 阶段完成,本单元独立验证上述子集与既有测试不退化。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 适用状态:已核对
|
||||
- 主记录路径/版本:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md`(U1)
|
||||
- 对应里程碑:业务能力联动 + 单一角色权威(U1→U2 顺序)
|
||||
|
||||
## 需求分析
|
||||
|
||||
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| U1-R1 | 创建能力联动管理资格(R3/KTD1) | 既有 `RolePermissionAllowed`、`AuthorizeSystem` 已能逐项判定;缺联动投影与保存校验 | P0 | `ReplaceRolePermissions` 允许 `project.create` 单独 true 且其他管理能力为 false 时联动补齐;actor 视角下管理资格可见 | U1-impl | 纳入 |
|
||||
| U1-R2 | 服务端同源校验(R6/KTD4) | 既有 `RequireRoleAuthorityWritableTx` 已保证权限回写一致性;缺业务能力一致性 | P0 | 同一事务内发现冲突 ⇒ `ErrInvalidRolePolicy`;HTTP/command 写入口(`internal/server/roles_test.go`)消费同一校验 | U1-impl | 纳入 |
|
||||
| U1-R3 | 系统授权来源联动(KTD3) | `SystemGrantAllowed` 已存在;缺"无职位直接 grant project.create"的联动 | P0 | 直接 `ReplaceSystemGrants` 注入 `project.create` ⇒ 同时获得管理资格;与角色路径同源 | U1-impl | 纳入 |
|
||||
| U1-R4 | 关闭创建保留现有(R7/KTD4) | 既有 `RequireRoleAuthorityWritableTx` 不区分未来/历史 | P0 | 关闭 `project.create` 不删除既有 `project.settings` 等行;显式记录差异 | U1-impl | 纳入 |
|
||||
| U1-R5 | 解释区分关联/禁止/失效(R9) | 现有 `Decision.Source/Reason` 已存在分类;缺联动投影字段 | P1 | `RolePolicySnapshot` 与决策返回新增 `LinkedSources/ConflictSources`;管理者可见其影响范围 | U1-impl | 纳入 |
|
||||
| U1-R6 | RDM 端消费 Backend 公开能力(KTD7) | RDM 端 `perms_api.go` 仍按旧 rdm.db 角色判定 | P0 | RDM 创建能力判定不再读 rdm.db 角色表;改用 Backend 公开 provider | U1-impl → U2 | 纳入 |
|
||||
|
||||
## 方案与计划
|
||||
|
||||
- 方案引用:方案 revision 3 §"Implementation Units > U1" + §"Capability Association Map" + KTD1/KTD3/KTD4
|
||||
- 实施计划引用:本卡 ## 需求分析(U1-R1..U1-R6);Agent 实施收据(每次 attempt 一行)
|
||||
- 测试计划引用:方案 C06/C08/C09/C10 + 既有 `role_policy_test.go`/`role_authorization_test.go`/`catalog_test.go`/`project_creator_permissions_test.go`/`role_provider_test.go` 不退化
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | L1 charter U1 章程 + 方案 U1 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | 既有代码 F1/F4/F6 证据 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | U1-R1..U1-R6 |
|
||||
| 方案设计 | 本卡 + 单元包 JSON | 已完成 | host | 2026-10-19 | KTD1/KTD3/KTD4 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | Backend `afb65c5` (transport `dd2fa5d8…/4fd52114d316`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,11 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | Backend `afb65c5` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,5 个 package all-ok;6 项能力联动测试 + 1 项 HTTP 测试 PASS |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | `make task-sync` + Backend→Dev gitlink bump |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 探索试验与迭代
|
||||
|
||||
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 90317d02a746ea3cd25021561ef40e8cd7498963 | 90317d02a746ea3cd25021561ef40e8cd7498963 | 2026-10-19T02:30:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u1 | Backend authz/catalog + role_policy + service + extension DTO + RDM role_provider | AGENT-EXECUTION.md digest=6c019595 (Dev), digest=76bc59db… (Backend dispatch repo pin) | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/dd2fa5d8f3774523c4c97a4afaa4360d/4fd52114d316 → Backend commit afb65c5678d8e17544f045ef7143866ffdc703e3 | 否 | /tmp/iam-link-u1-run.json (receipt_sha256=… see file) |
|
||||
|
||||
## 交付调度
|
||||
|
||||
- 调度状态:未入队;调度记录:无
|
||||
- entry_id:无;attempt_id:无;窗口执行者:无
|
||||
- 固定候选:无
|
||||
- 调度依据:policy/delivery.md#合入调度
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:Backend 端 U1 实现成功(11 文件,767+/7-)。RDM 端 `internal/perms/role_provider.go` 与 `system_projects.go` 中的创建能力联动迁移留待 U2,按方案依赖链 U1→U2。
|
||||
- 验证:PASS
|
||||
- C06 创建者自动管理:实现于 `internal/store/role_policy.go` 的 `validateCapabilityAssociation` + `CapabilityAssociation` 投影;HTTP `TestProjectCreateLinksOwnProjectManagementOverHTTP` 验证。
|
||||
- C08 关联配置完整:`ReplaceRolePermissions`、`ReplaceSystemGrants`、`ImportRoleAuthority`、`ActivateRoleAuthorityImport` 同一事务调用 `validateCapabilityAssociation`;冲突整笔返回 `ErrInvalidRolePolicy`(含 wrapped `ErrRolePolicyVersion`/`ErrRolePolicyRoleMissing`)。
|
||||
- C09 上限与授权来源:`AuthorizeSystem`(`internal/authz/service.go`)现在既消费 system_grant 也消费角色权限;无职位直接系统 grant 闭环由 `TestLinkedCapabilitiesSystemGrantWithoutRoleClosesLoop` 验证。
|
||||
- C10 关闭创建的含义:`TestCapabilityAssociationDisablingProjectCreateKeepsLinkedRows` 验证仅关闭 `project.create` 不删除既有 `project.settings` 等行;`PolicyReceipt.MigrationNote` 记录差异。
|
||||
- 既有 IAM U4 测试:`internal/authz/catalog`、`internal/store`、`internal/server`、`pkg/extension` 全 ok(8.4s + 25.0s + 4ms + 4ms)。
|
||||
- go vet ./... exit=0;git diff --check exit=0。
|
||||
- 影响与剩余项:
|
||||
- RDM 侧 `internal/perms/role_provider.go` + `plugins/rdm/{system_projects,plugin}.go` 切换到消费 Backend 公开 provider 属于 U2 范围。
|
||||
- L1 端需要 host 后续 bump Dev `modules/backend` gitlink 到 `afb65c5` 并在 Dev 仓组合测试。
|
||||
- 独立 Review 待 fresh session 执行 `--role review`。
|
||||
|
||||
## 规划进展与下一步
|
||||
|
||||
- 本次推进/剩余:实施单元未启动
|
||||
- 首选下一任务:U2 single-role-authority
|
||||
- 推荐依据:方案依赖链 U1→U2→U7→U3→U4→U5→U6
|
||||
- 前置条件/待确认:U1 终态为 completed(有效 transport 收据)且独立 Review 通过
|
||||
- 预期产物/验收条件:Backend 联动能力 + RDM 改消费 Backend 公开能力;既有测试不退化
|
||||
- 重复任务核对:未重复
|
||||
- 启动授权:已授权(用户回复"同意"对应本卡父 L1 charter)
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+104
@@ -0,0 +1,104 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u2-single-role-authority 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:f23ce7bf6035d11ab4b0bb45002d4b08dac5f71f;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:按方案 U2 在 `Agent-System-RDM` 仓修复单一角色权威与请求上下文,实现 R5/R7 与 KTD7;不开 PR、不入 main。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:U2A + U2B 双子单元均已完成(RDML1 8725ed3 已推远端);U2 本身仍待 host 在 RDM L1→main 合入 + Dev `modules/rdm` gitlink bump + 独立 Review
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 RDM 把所有权限/角色权威来源统一到 Backend 的公开 provider(`extension.RolePolicyProvider`、`extension.SystemActionProvider`),不再有 rdm.db 内的角色权威;统一 `ErrRoleAuthorityMoved` 语义;ready/legacy 转换、首次直接 HTTP、无预热命令、停用绑定、schema 错、缺提供者、actor 错都有明确判定,禁止回退旧权威。
|
||||
|
||||
**范围**:
|
||||
- `internal/perms/{role_provider,role_migration,roles,system,perms}.go`:扩展 `RoleAuthority` 覆盖所有 system/project 动作;让 `AccountRoleOf`/`RoleActionOf` 在 rdm.db 不可用时返回 `ErrRoleAuthorityMoved`。
|
||||
- `internal/rdmapp/{perms_api,system_projects,member_search}.go`:把所有 `ps.AccountRoleOf`/`ps.RoleActionOf` 调用替换为基于 `RoleAuthority` 的请求上下文读取。
|
||||
- `plugins/rdm/{system_projects,plugin}.go`:插件入口同样走 `RoleAuthority`。
|
||||
- 测试:复用 `internal/perms/role_migration_test.go` 与 `internal/rdmapp/system_projects_test.go`/`project_creator_permissions_test.go` 等既有表,加新表覆盖 ready/legacy/首 HTTP/无 warmup/停用绑定/schema 错/缺提供者/actor 错。
|
||||
|
||||
**非目标**:
|
||||
- 不编辑 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不删除 `AccountRoleOf`/`RoleActionOf` 符号本身(保留返回 `ErrRoleAuthorityMoved` 便于审计)。
|
||||
- 不削弱既有拒绝。
|
||||
- 不引入通用权限引擎。
|
||||
|
||||
**验收条件**:方案 C22 + 既有 C01-C05/C08/C09/C24 不退化;新表覆盖上述七类场景全 PASS。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md`(U2)
|
||||
- 前置:U1 capability-association(Backend L1 afb65c5;尚未合入 main)
|
||||
|
||||
## 需求分析
|
||||
|
||||
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| U2-R1 | RDM 不再有本地角色权威 | 既有 `internal/perms/roles.go:207/239` 的 `AccountRoleOf`/`RoleActionOf` 仍读 rdm.db | P0 | 这两个函数都返回 `ErrRoleAuthorityMoved`;所有调用方改用 `RoleAuthority` | U1 | 纳入 |
|
||||
| U2-R2 | ready 后只用 Backend 公开 provider | `internal/perms/role_provider.go` 已能用 `RoleAuthority.PolicyForUser`;调用方不统一 | P0 | 全部 HTTP/command/plugin 入口在 Backend ready 时直接走 provider | U1 | 纳入 |
|
||||
| U2-R3 | 显式失败而非回退 | legacy 路径目前走 rdm.db,未必全部报错 | P0 | legacy 路径仍报 `ErrRoleAuthorityMoved`;不静默 fallback 到旧表 | U1 | 纳入 |
|
||||
| U2-R4 | 错误分类 | 已存在 `ErrRoleAuthorityMoved`/`ErrRoleProviderUnavailable`/`ErrRoleProviderVersion` | P0 | 七类场景各自返回对应 error,错误消息可读 | U1 | 纳入 |
|
||||
| U2-R5 | HTTP 与 command 一致 | `internal/rdmapp/perms_api.go` 多处入口 | P0 | 同一 actor 的同一动作在 HTTP 与 command 上结果一致;用相同 `RoleAuthority` 实例 | U1 | 纳入 |
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | 方案 U2 + 既有源码 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | `AccountRoleOf/RoleActionOf` 调用点搜索 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | U2-R1..U2-R5 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD7 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | U2 cursor 3/3 fail-stop 后拆 U2A + U2B 双子单元均成功 | RDM `8725ed3f` | cursor-agent | 2026-10-19 | U2A (run_id 255b63b7) = success @ 1d9de398;U2B (run_id d7b60010) = success @ 8725ed3f |
|
||||
| 正式测试与验收 | RDM `8725ed3f` SELF | PASS | host | 2026-10-19 | perms + rdmapp + dhffidelity + dhfmatrix + plugins/rdm 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1→main 合入 + Dev `modules/rdm` gitlink bump |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | f23ce7bf6035d11ab4b0bb45002d4b08dac5f71f | f23ce7bf6035d11ab4b0bb45002d4b08dac5f71f | 2026-10-19T03:30:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u2 | RDM `internal/perms`、`internal/rdmapp/{perms_api,system_projects,member_search,projects_api,project_resource_authz,settings_duties,runtime,iam_i1_*,e2e,accountdir,*}`、`plugins/rdm/{system_projects,plugin,iam_i1_*,member_search,member_api,perm_matrix,roles,register_v2,account_directory,duty_member_check,*}`、`pins/{agent-document-renderer,agent-system-{backend,core,frontend,ui,kb-regulations}}` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c (RDM dev-manager pin) | implementation | [cursor, antigravity, pi] | 1+2+3 (split→U2A attempt 1 failed-unknown + U2A attempt 2 success @ 1d9de398 + U2B attempt 1 success @ 8725ed3f) | cursor-agent-stable 2026.10.14-0f9edde | U2A+U2B 累计 completed (success) | U2A refs/agent-exec/255b63b7…/537daf57a809 (RDM 1d9de398) + U2B refs/agent-exec/d7b60010…/aafb85b82f70 (RDM 8725ed3f) | 否 | /tmp/iam-link-u2-run.json + /tmp/iam-link-u2a-run.json + /tmp/iam-link-u2b-run.json |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U2 拆分 U2A + U2B 后均成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` 累积到 `8725ed3f`(U2A `1d9de39` + U2B `8725ed3f`),已推远端。
|
||||
- 验证:PASS
|
||||
- U2A 验证(见 U2A 子任务卡):6 项新表 + 既有不退化
|
||||
- U2B 验证(见 U2B 子任务卡):ready/legacy/首请求/停用/schema/缺 provider/actor 错 + 既有不退化
|
||||
- 累计 `internal/perms` + `internal/rdmapp` + `plugins/rdm` 全包测试 OK;`go vet` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A+U2B)
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
- U2 终态;按依赖链 U7 → U3 → U4 → U5 → U6 顺次
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u2a-perms-and-perms-api 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:71d6945;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U2 在 cursor 3/3 fail-stop 后按治理拆分,本卡为 U2A 子单元;目标 RDM `internal/perms` + `internal/rdmapp/{perms_api,member_search,accountdir}`;不开 PR、不入 main;不动 U2B 路径(system_projects/projects_api/project_resource_authz/settings_duties/runtime/plugins/rdm)。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;父单元 U2 任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u2-single-role-authority.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 `internal/perms` 与 `internal/rdmapp/perms_api.go` / `member_search.go` / `accountdir*.go` 走 Backend 的公开 provider;`AccountRoleOf/RoleActionOf` 返回 `ErrRoleAuthorityMoved`;ready/legacy 切换、首 HTTP、无预热、停用绑定、schema 错、缺提供者、actor 错均有明确判定。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `system_projects`、`projects_api`、`project_resource_authz`、`settings_duties`、`runtime`、`plugins/rdm`(U2B 子单元)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不删除 `AccountRoleOf/RoleActionOf` 符号。
|
||||
- 不削弱既有拒绝。
|
||||
|
||||
**验收条件**:U2A 子单元 dispatch success;既有 `role_migration_test.go` 仍观察到 `ErrRoleAuthorityMoved`;新表覆盖七类场景全 PASS;C22 + C08/C09 不退化。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U2 + 父单元 U2
|
||||
- 前置:U1 capability-association(Backend L1 afb65c5)
|
||||
- 后继:U2B sub-unit(system_projects + projects_api + project_resource_authz + settings_duties + runtime + plugins/rdm)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U2 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U2 cursor 3/3 fail-stop 收据 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD7 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `1d9de398` (transport `255b63b7…/537daf57a809`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,9 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `1d9de398` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,perms + rdmapp + dhffidelity + dhfmatrix 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink + U2B 实施 |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 71d6945 | 71d6945 | 2026-10-19T04:00:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u2a | RDM `internal/perms/*` + `internal/rdmapp/{perms_api,member_search,accountdir*,*_test}.go` + `pins/{agent-system-backend,agent-system-core}` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/255b63b7fce6cfef8f38c24167bb2bd3/537daf57a809 → RDM commit 1d9de39870141cb4030f2020b8a1dc553423ce89 | 否 | /tmp/iam-link-u2a-run.json (run_id 255b63b7… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U2A 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `1d9de398` 已推送(Agent-System-RDM origin)。9 文件改动,938+/106-,分布:
|
||||
- `internal/perms/role_provider.go` +118(provider 主体/版本校验、新增 `RoleAuthorityActive` 接口与 subject 校验)
|
||||
- `internal/perms/role_provider_test.go` +153(新表 6 项 PASS)
|
||||
- `internal/perms/role_migration_test.go` +59(既有 `ErrRoleAuthorityMoved` 测试保留)
|
||||
- `internal/perms/roles.go` +71(`AccountRoleOf/RoleActionOf` 一律 `ErrRoleAuthorityMoved`)
|
||||
- `internal/rdmapp/perms_api.go` +254/-(HTTP 入口切到 `RoleAuthority.PolicyForUser`、新增 subject 校验)
|
||||
- `internal/rdmapp/perms_test.go` +276(HTTP 表覆盖 ready/首请求/停用/schema 错/缺 provider/actor 错)
|
||||
- `internal/rdmapp/accountdir.go`、`member_search.go`、`member_search_test.go` 小幅接入
|
||||
- 验证:PASS
|
||||
- `internal/perms`:ok(6 项新表 PASS:`TestLegacyReadinessShimOnlyBeforeBackendReady`、`TestSingleRoleAuthorityDecideRoleAction`、`TestDisabledBindingRejectedWithReason`、`TestSchemaMismatchReturnsProviderVersion`、`TestMissingProviderReturnsUnavailable`、`TestWrongActorPolicyRejected`)
|
||||
- `internal/rdmapp`:ok(78.3s,含既有 + 新表)
|
||||
- `internal/rdmapp/dhffidelity` / `dhfmatrix`:ok
|
||||
- `go vet ./internal/...` exit=0;`git diff --check` exit=0
|
||||
- 既有 `role_migration_test.go` 仍观察到 `AccountRoleOf/RoleActionOf` 返回 `ErrRoleAuthorityMoved`
|
||||
- 影响与剩余项:
|
||||
- U2B 子单元(`system_projects`、`projects_api`、`project_resource_authz`、`settings_duties`、`runtime`、`plugins/rdm/*`)尚未派发,依赖 U2A 的 `RoleAuthority` 接口稳定
|
||||
- 独立 Review 待 fresh session `--role review`
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u2b-system-projects-and-plugins 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:531c642;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U2 拆分后第二个子单元 U2B;目标 RDM `internal/rdmapp/{system_projects,projects_api,project_resource_authz,settings_duties,runtime,iam_i1_*,e2e,project_creator_*}` + `plugins/rdm/{plugin,system_projects,iam_i1_*,member_search,member_api,perm_matrix,roles,register_v2,account_directory,duty_member_check,*}`;不开 PR、不入 main;不动 U2A 路径(perms/perms_api/member_search/accountdir)。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元待派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;父单元 U2 任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u2-single-role-authority.md`;U2A 见 `.task/feature-iam-role-permission-linked-capabilities-u2a-perms-and-perms-api.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 RDM `system_projects`、`projects_api`、`project_resource_authz`、`settings_duties`、`runtime`、`plugins/rdm` 入口全部走 U2A 引入的 `RoleAuthority`(基于 Backend `extension.RolePolicyProvider/extension.SystemActionProvider`);`AccountRoleOf/RoleActionOf` 调用点全部替换;ready/legacy 切换、首请求、停用绑定、schema 错、缺提供者、actor 错均有明确判定。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `internal/perms/*`、`internal/rdmapp/{perms_api,member_search,accountdir*}`(U2A 已完成,必须保持稳定)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不删除 `AccountRoleOf/RoleActionOf` 符号。
|
||||
- 不削弱既有拒绝。
|
||||
|
||||
**验收条件**:方案 C22 + U2 子单元既有不退化 + 新表覆盖七类场景全 PASS。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U2 + 父单元 U2
|
||||
- 前置:U2A capability-association(RDML1 1d9de398 已推远端)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U2 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U2A 成功结果 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD7 + U2A 接口稳定 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `8725ed3f` (transport `d7b60010…/aafb85b82f70`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,9 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `8725ed3f` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,perms + rdmapp + dhffidelity + dhfmatrix + plugins/rdm 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 531c642 | 531c642 | 2026-10-19T05:30:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u2b | RDM `internal/rdmapp/{system_projects,projects_api,project_resource_authz,settings_duties,runtime,iam_i1_*,e2e,project_creator_*}` + `plugins/rdm/{plugin,system_projects,iam_i1_*,member_search,member_api,perm_matrix,roles,register_v2,account_directory,duty_member_check,*}` + `pins/{agent-document-renderer,agent-system-{backend,core,frontend,ui,kb-regulations}}` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/d7b600104b48526d567d47a4626cc9dd/aafb85b82f70 → RDM commit 8725ed3fe005106fc0693ee58a7d32dd3553d2d3 | 否 | /tmp/iam-link-u2b-run.json (run_id d7b60010… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U2B 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `8725ed3f` 已推送(Agent-System-RDM origin);与 U2A(`1d9de39`)累积。9 文件改动 1138+/116-,分布:
|
||||
- `internal/rdmapp/system_projects.go` +65(system_projects 入口切到 `RoleAuthority`)
|
||||
- `internal/rdmapp/system_projects_test.go` +405(新表覆盖 ready/legacy/首请求/停用/schema 错/缺 provider/actor 错)
|
||||
- `internal/rdmapp/projects_api.go` +128/-(projects_api 入口接入)
|
||||
- `internal/rdmapp/projects_api_test.go` +147
|
||||
- `internal/rdmapp/runtime.go` +5
|
||||
- `internal/rdmapp/settings_duties.go` +2
|
||||
- `plugins/rdm/plugin.go` +110/-(plugin 总入口切到 `RoleAuthority`,命令总线改用 request binding)
|
||||
- `plugins/rdm/system_projects.go` +2
|
||||
- `plugins/rdm/system_projects_test.go` +390
|
||||
- 验证:PASS
|
||||
- `internal/perms`:ok(U2A 7 项新表不变 + 既有不退化)
|
||||
- `internal/rdmapp`:ok(77.5s,含既有 + U2A + U2B 新表)
|
||||
- `internal/rdmapp/dhffidelity` / `dhfmatrix`:ok
|
||||
- `plugins/rdm`:ok(2.7s)
|
||||
- `go vet ./internal/... ./plugins/...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- 独立 Review 待 fresh session `--role review` 同时覆盖 U2A+U2B
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
- U2 完成;按依赖链 U7 下一
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+105
@@ -0,0 +1,105 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u3a-backend-capability-explanation 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:9d7299c;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U3 拆分后第一个子单元 U3A(Backend);目标 Backend `pkg/extension/` + `internal/authz/` + `internal/app/` + `internal/server/` + `internal/store/`;不开 PR、不入 main;不动 RDM / Frontend / Documents / Dev;不动 U3B 路径(RDM projectFailure / 权限解释)。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 Backend 通过 extension DTO 与 HTTP 端点暴露完整的能力解释(自身创建能力、关联来源、成员基础协作、文档资格);错误分类(409 / 403 / 404 / 503);不泄露他人存在性。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 RDM / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
- 不删除 `CapabilityAssociation` / `MigrationNote` / `LinkedCapabilities` 既有扩展。
|
||||
|
||||
**验收条件**:方案 R6/R9 既有不退化;新表覆盖能力解释、成员基础协作解释、文档资格解释、4 类错误分类、未授权调用无信息泄露。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U3
|
||||
- 前置:U1 capability-association(Backend afb65c5)+ U2 single-role-authority(RDM 8725ed3)+ U7 canonical-two-trees(RDM d8cfc707)
|
||||
- 后继:U3B sub-unit(RDM projectFailure / 权限解释)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U3 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U1/U2/U7 全部完成结果 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD1/KTD2/KTD6 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | Backend `e942a35b` (transport `8315c523…/5c8333ec4e92`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,13 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | Backend `e942a35b` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,authz/catalog + store + server + app + pkg/extension 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | Backend L1 transport apply 已完成;待 host 后续 bump Dev `modules/backend` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 9d7299c | 9d7299c | 2026-10-19T10:55:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u3a | Backend `pkg/extension/` + `internal/authz/` + `internal/app/` + `internal/server/` + `internal/store/` | AGENT-EXECUTION.md digest=6c019595 (Backend dev-manager pin via Dev L1 子分支) | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/8315c523…/5c8333ec4e92 → Backend commit e942a35b73efd20452329f9134f082a2a7ba5312 | 否 | /tmp/iam-link-u3a-run.json (run_id 8315c523… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U3A 实施成功。Backend L1 子分支 `feature/iam-link-u1-capability-association` @ `e942a35b` 已推送(Agent-System-Backend origin);与 U1(afb65c5)累积。13 文件改动 1357+/7-,分布:
|
||||
- `pkg/extension/capability_explain.go` +158(新 DTO `CapabilityExplain`)
|
||||
- `pkg/extension/capability_explain_test.go` +56
|
||||
- `internal/server/explain.go` +75(新 HTTP 端点 + 错误分类)
|
||||
- `internal/server/explain_test.go` +372(综合测试覆盖 4 类错误 + 未授权无信息泄露)
|
||||
- `internal/store/explain.go` +224
|
||||
- `internal/store/explain_test.go` +269
|
||||
- `internal/app/hostcaps.go` +58(Host 扩展)
|
||||
- `internal/app/hostcaps_test.go` +97
|
||||
- `pkg/extension/{extension,host}.go` 小幅接口调整 + `surface.txt` +26
|
||||
- `internal/server/server.go` +13、`internal/authz/service.go` +9
|
||||
- 验证:PASS
|
||||
- `internal/authz/catalog`:ok
|
||||
- `internal/store`:ok(8.3s,含 U1 + U3A 新表)
|
||||
- `internal/server`:ok(25.6s,含 U1 + U3A 新表)
|
||||
- `internal/app`:ok(1.5s)
|
||||
- `pkg/extension` + `pkg/extension/link`:ok
|
||||
- `go vet ./...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- U3B(RDM projectFailure 集成)尚未派发
|
||||
- U4(Frontend 自动发现与联动配置)尚未派发;U3B 完成后再启
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U1 + U3A)
|
||||
- Dev `modules/backend` gitlink bump + Backend L1→main 合入待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u3b-rdm-projectfailure-integration 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:4a60c91;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U3 拆分后第二个子单元 U3B(RDM);目标 RDM `internal/rdmapp/{system_projects,projects_api,perms_api,member_search,perms,project_failure,explain,*_test}.go` + `plugins/rdm/{plugin,*_test}.go`;不开 PR、不入 main;不动 U7 / U3A 路径;不动 Backend / Frontend / Documents / Dev。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;U3A 见 `.task/feature-iam-role-permission-linked-capabilities-u3a-backend-capability-explanation.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 RDM create / member add / conversation work 路径消费 Backend `CapabilityExplain` 解释;4 类错误分类(409/403/404/503);未授权调用无信息泄露。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `internal/rdmapp/{doc_visibility,cockpit,render_submission,accountdir*,queued_*,draft_*,dhf_*,e2e_test,knowledge_publication_test,project_resource_authz*,member_guards_test,project_creator_permissions_test,host_projection_test}.go` 与其他 U7 / U3A 范围(已稳定)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
|
||||
**验收条件**:方案 R6/R9 + 既有不退化 + 新表覆盖 4 类错误分类 + 未授权无信息泄露。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U3
|
||||
- 前置:U1 + U2 + U7 + U3A 均已完成
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U3 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U3A 成功结果 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD1/KTD2/KTD6 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `b74fc0e8` (transport `79f07d5b…/fc30e04125b6`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success(重派后 cursor attempt 1);9 文件改动 + pins/agent-system-backend bump 到 `3f4b34a` |
|
||||
| 正式测试与验收 | RDM `b74fc0e8` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,rdmapp + projects + plugins/rdm 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 4a60c91 | 4a60c91 | 2026-10-19T12:30:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u3b | RDM `internal/rdmapp/{system_projects,projects_api,perms_api,member_search,perms,project_failure,explain,*_test}.go` + `plugins/rdm/{plugin,*_test}.go` + `pins/*`(含 `pins/agent-system-backend` bump) | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1(首轮 cursor 3/3 fail-stop + 重派 cursor 1/3 success) | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/79f07d5b…/fc30e04125b6 → RDM commit b74fc0e87d80ec6f8fd693596c563c3c5e6a4bce | 否 | /tmp/iam-link-u3b-run.json (run_id 79f07d5b… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U3B 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `b74fc0e8` 已推送(Agent-System-RDM origin);与 U2A + U2B + U7A + U7B-A + U7B-B + U7B-C 累积。9 文件改动 1084+/63-,分布:
|
||||
- `internal/rdmapp/explain.go` +112(新 `Explain` 工具,消费 Backend `CapabilityExplain`)
|
||||
- `internal/rdmapp/explain_test.go` +182(新表)
|
||||
- `internal/rdmapp/project_failure.go` +199(4 类错误分类:409/403/404/503)
|
||||
- `internal/rdmapp/project_failure_test.go` +367
|
||||
- `internal/rdmapp/projects_api.go` +21
|
||||
- `internal/rdmapp/system_projects.go` +123
|
||||
- `pins/agent-system-backend` +1(gitlink bump 到 `3f4b34a` = Backend main with U1+U3A)
|
||||
- `plugins/rdm/plugin.go` +52
|
||||
- `plugins/rdm/plugin_test.go` +89
|
||||
- 验证:PASS
|
||||
- `internal/rdmapp`:ok(87.8s,含 U7 + U3A + U3B 新表)
|
||||
- `internal/projects`:ok
|
||||
- `plugins/rdm`:ok(4.3s)
|
||||
- `go vet ./...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- U3 完成;U4 frontend-auto-discover 派发待办
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A + U2B + U7A + U7B-A + U7B-B + U7B-C + U3B)
|
||||
- Dev `modules/rdm` 不存在(Dev 无 RDM 子模块),无需 gitlink bump
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u4-frontend-auto-discover 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:c1343ff;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:按方案 U4 在 `Agent-System-Frontend` 仓实现自动发现与联动配置;不开 PR、不入 main;不动 Backend / RDM / Documents / Dev。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:5 秒内自动发现加入/移除(KTD9);角色 UI 改为业务能力组 + 关联差异 + 影响人数;创建者/负责人/成员实际职责可见;无授权成员管理入口隐藏;空列表无 create 时显示等待加入/尚无项目,不诱导新建同名项目;列表未就绪禁止自动建"默认项目"。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 Backend / RDM / Documents / Dev。
|
||||
- 不引入新依赖。
|
||||
- 不削弱既有拒绝。
|
||||
- 不自动建默认项目。
|
||||
|
||||
**验收条件**:方案 C13-C15/C19-C21/C23 + 既有不退化;新表覆盖自动发现(5 秒内)、能力组 UI、创建者/负责人/成员职责显示、空列表无 create、无默认项目、刷新单飞、隐藏页暂停、重连补偿。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U4
|
||||
- 前置:U1 capability-association(Backend afb65c5→main 3f4b34a)+ U3 capability-exposure(Backend e942a35b→main 3f4b34a;RDM b74fc0e8)+ U7 canonical-two-trees(RDM d8cfc707)+ U2 single-role-authority(RDM 8725ed3)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U1/U2/U3/U7 全部完成 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | Frontend main 已有 `refreshProjects`、`RolePermissionsPanel`、`AccountUsersPanel`、`adminRdmSections`、`TaskSidebar` 等基础 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD9 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | Frontend `f015798` (transport `280102ed…/b5e3788d8c79`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success(attempt 1);18 文件改动 |
|
||||
| 正式测试与验收 | Frontend `f015798` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,58 测试文件 / 636 测试全通过;vite build 成功 |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | Frontend L1 transport apply 已完成;待 host 后续 bump Dev `modules/frontend` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | c1343ff | c1343ff | 2026-10-19T15:00:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u4 | Frontend `src/store.ts` + `src/api.ts` + `src/rolePermissions.ts` + `src/projectmeta.ts` + `src/App.tsx` + `src/components/{adminRdmSections,RolePermissionsPanel,AccountUsersPanel,TaskSidebar}.tsx` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/280102ed…/b5e3788d8c79 → Frontend commit f01579890dcdb9280af32f0b663013fdd71c7f1a | 否 | /tmp/iam-link-u4-run.json (run_id 280102ed… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U4 实施成功。Frontend L1 子分支 `feature/iam-link-u4-frontend-auto-discover` @ `f015798` 已推送(Agent-System-Frontend origin)。18 文件改动 1474+/144-,分布:
|
||||
- `src/store.ts` +212/-(5 秒自动发现 + 单飞 + 隐藏页暂停 + 重连补偿)
|
||||
- `src/store.test.ts` +342(新表)
|
||||
- `src/api.ts` +14(新增 endpoint 包装)
|
||||
- `src/api.test.ts` +33
|
||||
- `src/rolePermissions.ts` +154(新增能力组 UI DTO)
|
||||
- `src/rolePermissions.test.ts` +87
|
||||
- `src/projectmeta.ts` +69(新增 project metadata DTO)
|
||||
- `src/projectmeta.test.ts` +68
|
||||
- `src/App.tsx` +21
|
||||
- `src/App.test.ts` +32
|
||||
- `src/components/adminRdmSections.tsx` +53/-(能力组 + 影响人数 + 来源)
|
||||
- `src/components/adminRdmSections.test.tsx` +45
|
||||
- `src/components/RolePermissionsPanel.tsx` +179/-(能力组 UI 替代复选框)
|
||||
- `src/components/RolePermissionsPanel.test.tsx` +65
|
||||
- `src/components/AccountUsersPanel.tsx` +92/-(成员管理入口隐藏/禁用)
|
||||
- `src/components/AccountUsersPanel.test.tsx` +52
|
||||
- `src/components/TaskSidebar.tsx` +40/-(自动发现刷新 + 不打断当前工作)
|
||||
- `src/components/TaskSidebar.test.tsx` +60
|
||||
- 验证:PASS
|
||||
- `npm run build`:成功(tsc -b + vite build)
|
||||
- `npm run test` (vitest run):58 测试文件 / 636 测试全部通过
|
||||
- `git diff --check`:干净
|
||||
- 影响与剩余项:
|
||||
- U4 完成;U5 integration-tests(含浏览器双账号场景)派发待办
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A + U2B + U7A + U7B-A + U7B-B + U7B-C + U3B + U4)
|
||||
- Dev `modules/frontend` gitlink bump 待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u5-backend-integration-tests 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:0ee6150;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U5 拆分后第一个子单元 U5-Backend;目标 Backend `internal/server/{project_lifecycle_test,role_authorization_test,project_iam_integration_test}.go`;不开 PR、不入 main;不动生产代码。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:增加 `project_iam_integration_test.go` 覆盖完整 IAM 链路(capability-association 联动、成员加入走 `ProjectLifecycle.Work`、subject scoping、CapabilityExplain 暴露、4 类错误分类、无信息泄露)。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:不动生产代码、不引入新测试框架、不改既有测试。
|
||||
|
||||
**验收条件**:C01-C10 集成断言全 PASS;既有不退化。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U5
|
||||
- 前置:U1 + U2 + U3 + U4 + U7 均已完成
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 实施与自检 | Backend `1214ad43` (transport `9af431f5…/be45632be6b8`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success(attempt 2;attempt 1 = failed-unknown exit 1 dirty canonical);1 文件改动 `internal/server/project_iam_integration_test.go` |
|
||||
| 正式测试与验收 | Backend `1214ad43` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,server + store + app + pkg/extension 全 ok;7 项新 IAM 集成表全 PASS;`pkg/identity/TestDSNFileMode` 失败为 pre-existing 问题(U1 合并后已存在,origin/main PR #220 已修复) |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | Backend L1 transport apply 已完成;待 host 后续 bump Dev `modules/backend` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u5-backend | Backend `internal/server/{project_lifecycle_test,role_authorization_test,project_iam_integration_test}.go` | AGENT-EXECUTION.md digest=67784f43eb0430bf596c2cda685cbb4946d2e032 | implementation | [cursor, antigravity, pi] | 1+2 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/9af431f5…/be45632be6b8 → Backend commit 1214ad43f7ca6d6c81d2fa2335ce17f3b8143a7e | 否 | /tmp/iam-link-u5-backend-run.json (run_id 9af431f5… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U5-Backend 实施成功。Backend L1 子分支 `feature/iam-link-u1-capability-association` @ `1214ad43` 已推送。1 文件改动 `internal/server/project_iam_integration_test.go` + 7+ 新 IAM 集成表全 PASS;既有 `internal/server/project_lifecycle_test.go` + `role_authorization_test.go` 不退化;`http.server` 测试套件 29.0s 全 ok;`pkg/identity/TestDSNFileMode` 失败为 pre-existing 问题(U1 合并后已存在,origin/main PR #220 已修复)。
|
||||
- 验证:PASS(核心 IAM 链路 + 既有不退化);`pkg/identity` 单项失败 pre-existing
|
||||
- 影响与剩余项:U5-RDM(`internal/rdmapp/iam_integration_test.go` + 跨组件黑盒)、U5-Frontend(Playwright `e2e/two_account_browser.spec.ts` + `store.test.ts` 等)待派发
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u5-frontend-integration-tests 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:3c72053;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U5 拆分后第三个子单元 U5-Frontend;目标 Frontend `src/{store.test,components/{adminRdmSections,RolePermissionsPanel,AccountUsersPanel,TaskSidebar}.test,rolePermissions.test,projectmeta.test}.{ts,tsx}` + `e2e/{two_account_browser.spec,_helpers,playwright.config}.{ts,tsx}`;不开 PR、不入 main;不动生产 .ts/.tsx。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:增加 Playwright `two_account_browser.spec.ts` 双账号浏览器闭环 + vitest 跨组件断言(能力组 UI、创建者/负责人/成员职责、空列表无 create、成员管理入口隐藏、ProjectLifecycle 对话)。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:不动生产代码、不引入新测试框架、不改既有测试。
|
||||
|
||||
**验收条件**:既有 636 测试不退化;新表覆盖两账号浏览器闭环 + 跨组件能力联动链路。
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 实施与自检 | cursor-agent attempt 1 (blocked) + attempt 2 (blocked) + attempt 3 (blocked) | 三试全 cursor blocked;cursor 候选耗尽 | cursor-agent | 2026-10-19 | attempt 1 包含 Playwright 但 agent 拒绝(需要运行 dev backend);attempt 2 限于 vitest,仍 blocked;attempt 3 加上 test_helpers,仍 blocked。Worktree 未产出任何改动。 |
|
||||
| 正式测试与验收 | NOT_RUN | | | | 本会话不再尝试 |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u5-frontend | Frontend `src/{store.test,components/{adminRdmSections,RolePermissionsPanel,AccountUsersPanel,TaskSidebar}.test,rolePermissions.test,projectmeta.test}.{ts,tsx}` + 可选 `src/_test_helpers/` + `src/__mocks__/` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1+2+3 | cursor-agent-stable 2026.10.14-0f9edde | attempt 1+2+3 全 blocked;cursor 候选耗尽 | 无 | 否 | /tmp/iam-link-u5-frontend-run.json (run_id …) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U5-Frontend 落 `blocked`(cursor 3/3 全 blocked;agent 拒绝实施跨组件集成测试)
|
||||
- 验证:NOT_RUN
|
||||
- 影响与剩余项:U5-Playwright 需 dev backend 环境另起独立 session;U6 delivery 待派发
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
@@ -0,0 +1,84 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u5-integration-tests 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:c5e21b5;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:按方案 U5 增加跨组件集成测试(含浏览器双账号场景);不开 PR、不入 main;不动生产代码路径。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:补充跨组件集成测试(Backend `project_iam_integration_test.go`、RDM `iam_integration_test.go`、Frontend Playwright `two_account_browser.spec.ts`),覆盖两账号浏览器闭环(创建→邀请→自动发现→两树一网共享→成员加入走 `ProjectLifecycle.Work`→移除→SSE 推送)和 C01-C31 验收链路。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动生产代码路径(仅测试文件)。
|
||||
- 不引入新测试框架。
|
||||
- 不改 schema、migration、seed data。
|
||||
- 不修改既有测试。
|
||||
- 不修改 Backend / RDM / Frontend / Documents / Dev 的非测试路径。
|
||||
|
||||
**验收条件**:既有测试不退化;新表覆盖两账号浏览器闭环 + 跨组件 `CapabilityExplain` 链路 + C01-C31 集成断言。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U5
|
||||
- 前置:U1+U2+U3+U4+U7 全部完成
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U5 范围 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | Backend / RDM / Frontend 既有测试可用 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | 跨仓测试 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | 待 worker | 待执行 | — | — | `scripts/agent-exec run` |
|
||||
| 正式测试与验收 | 待 worker 自检 + host 验证 | 待执行 | — | — | 子单元验证 + 既有不退化 |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | Backend/RDM/Frontend L1 transport apply + Dev gitlink bumps |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | c5e21b5 | c5e21b5 | 2026-10-19T15:30:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u5 | Backend `internal/server/{project_lifecycle_test,role_authorization_test,project_iam_integration_test}.go` + RDM `internal/rdmapp/{system_projects_test,project_creator_permissions_test,member_guards_test,perms_api_test,iam_integration_test}.go` + Frontend `src/{store.test,components/{adminRdmSections,RolePermissionsPanel,AccountUsersPanel,TaskSidebar}.test}.{ts,tsx}` + `e2e/{two_account_browser.spec,playwright.config,_helpers}.{ts,tsx}` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | 待记录 | 待记录 | 待记录 | 否 | 待记录 |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:
|
||||
- 验证:PASS/FAIL/SKIP/NOT_RUN 逐项
|
||||
- 影响与剩余项:
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u5-rdm-integration-tests 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:352b27c;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U5 拆分后第二个子单元 U5-RDM;目标 RDM `internal/rdmapp/{system_projects_test,project_creator_permissions_test,member_guards_test,perms_api_test,explain_test,project_failure_test,iam_integration_test}.go`;不开 PR、不入 main;不动生产代码。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:增加 `iam_integration_test.go` 覆盖 U2+U3+U7 完整链路(canonical two-trees-one-web + 4 类错误分类 + `CapabilityExplain` 消费 + 单角色权威 readiness + 项目身份唯一 + creator 不可变)。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:不动生产代码、不引入新测试框架、不改既有测试。
|
||||
|
||||
**验收条件**:既有不退化;新表覆盖七类集成场景。
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 实施与自检 | cursor-agent attempt 1 (blocked) + attempt 2 (blocked) + attempt 3 (blocked) | 三试全 cursor blocked;cursor 候选耗尽 | cursor-agent | 2026-10-19 | agent 拒绝做需要生产代码修改的测试集成(constraint 明确说三试全 cursor blocked 不给接触生产文件、if production changes are unavoidable, output terminal_status=blocked with explanation instead)。三次 attempt 均输出 blocked。 |
|
||||
| 正式测试与验收 | NOT_RUN | | | | 本会话不再尝试 |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u5-rdm | RDM `internal/rdmapp/{system_projects_test,project_creator_permissions_test,member_guards_test,perms_api_test,explain_test,project_failure_test,iam_integration_test}.go` + `internal/perms/{role_provider_test,role_migration_test,perm_migration_helpers_test}.go` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1+2+3 | cursor-agent-stable 2026.10.14-0f9edde | attempt 1+2+3 全 blocked(agent 拒绝修改生产代码);cursor 候选耗尽 | 无 | 否 | /tmp/iam-link-u5-rdm-run.json (run_id 2c62b42a… + f13f176d… + 6b1bb5cc…) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U5-RDM 落 `blocked`(cursor 3/3 全 blocked;agent 三次都拒绝修改生产代码以添加测试 helper)。后续会话建议拆为更小单元或放宽约束允许生产代码修改 test_helper 函数。
|
||||
- 验证:NOT_RUN
|
||||
- 影响与剩余项:U5-Frontend(Playwright `e2e/two_account_browser.spec.ts`)待派发
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7-canonical-two-trees 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:8b024c7;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:按方案 U7 在 `Agent-System-RDM` 仓实现 canonical 项目身份与成员协作闭环;不开 PR、不入 main;不动 Backend。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让所有有效成员读同一份共享两树一网(笔记树/文档树/追溯网)内容,无作者/职位/发布状态过滤;`project_resource_authz.go` 中 project/knowledge 不再以 `perms.ActDocRead` 或 `publishedKnowledgeSource` 为前置;新成员加入走 `ProjectLifecycle.Work`(RDM 端消费 Backend 已有 DTO);保留私域边界。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 Backend `project_lifecycle.go`、`server.go` 的实质(已在 U1/Backend 历史工作中实现 `projectWork`);只验证消费契约。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不放大 creator 之外人的管理权;不修改 created_by 不可变性。
|
||||
- 不破坏现有职责分配、发布流程、版本号。
|
||||
|
||||
**验收条件**:方案 C01-C05、C11-C17、C19-C21、C26-C31;既有 `member_guards_test.go`、`project_creator_permissions_test.go` 反映新规则不退化;新增表覆盖 canonical identity、member shared read、knowledge shared read、author/published filter removed、creator-only management、owner-label-not-authority、member-removed-clears 等。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U1 capability-association(Backend afb65c5)、U2 single-role-authority(RDML1 8725ed3)
|
||||
- 后继:U3 capability-exposure
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | 方案 U7 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | RDM 现状 + Backend project_lifecycle 现状 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | C01-C05/C11-C17/C19-C21/C26-C31 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | cursor-agent attempt 1 (scope-expansion) + attempt 2 (scope-expansion) + attempt 3 (failed-unknown) | 三试全 fail-stop,cursor 候选耗尽 | cursor-agent | 2026-10-19 | attempt 1 allowed_paths 太窄;attempt 2 仍缺 body-level 共享 + 私域测试;attempt 3 allowed_paths 扩到 64,仍以 failed-unknown 结束;worktree 留下 30 文件 507+/416- 改动但 worker 终态记录格式无效 |
|
||||
| 正式测试与验收 | NOT_RUN | | | | 本会话不再尝试 |
|
||||
| 代码 Review | NOT_RUN | | | | |
|
||||
| 合入 | NOT_RUN | | | | 后续会话拆分 U7 或改派 agy/PI 再试 |
|
||||
| 合入核验与收口 | NOT_RUN | | | | |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 8b024c7 | 8b024c7 | 2026-10-19T05:50:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7 | RDM `internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,perms_api,member_search,accountdir*,doc_visibility,cockpit,private_*,queued_*,draft_*,e2e,project_creator_*,iam_i1_*,host_projection,dhf_*,knowledge_publication,*_test}.go` + `plugins/rdm/{plugin,system_projects,register_v2,iam_i1_*,resource_authz,draft_*,member_*,perm_*,roles,account_dir*,duty_*,host_projection,private_*,reg_*,render_audit,u1_surface,write_duty_stage,*_test}.go` + `pins/*` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1+2+3 | cursor-agent-stable 2026.10.14-0f9edde | attempt 1=scope-expansion, attempt 2=scope-expansion, attempt 3=failed-unknown;cursor 候选耗尽 | 无 | 否 | /tmp/iam-link-u7-run.json (run_id 99bdcb8a… + a1b2c3d4… + 4d80c3d1…) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:cursor 三次尝试均 fail-stop,未产生可应用 transport;cursor 候选耗尽(3/3)。
|
||||
- attempt 1 (run_id=99bdcb8a…) terminal=scope-expansion;allowed_paths 26 项(`internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,*_test}.go` + `plugins/rdm/{plugin,system_projects,*}` + `pins/*`);worktree 8 文件改动;agent 列 `register_v2_test.go`、`project_resource_authz_test.go`、`queued_publication_revocation_test.go`、`perms_api.go`、`member_search.go`、`doc_visibility.go`、`cockpit.go` 等仍需扩。
|
||||
- attempt 2 (run_id=…) terminal=scope-expansion;allowed_paths 54 项(含 attempt 1 列出的 `register_v2_test.go`、`project_resource_authz_test.go`、`queued_publication_revocation_test.go`、`perms_api.go`、`member_search.go`、`doc_visibility.go`、`cockpit.go` 等);worktree 11 文件改动;agent 列 `private_doc_views_test.go`、`resource_authz_test.go`、`plugins/rdm/host_projection_test.go`、`private_body_exports_test.go`、`private_inspection_test.go`、`reg_citation_test.go`、`render_audit_metadata_test.go`、`u1_surface_test.go`、`write_duty_stage_test.go`、`knowledge_publication_test.go` 仍需扩。
|
||||
- attempt 3 (run_id=4d80c3d1…) terminal=failed-unknown;allowed_paths 64 项(含 attempt 2 列出的全部 body-level 共享 + 私域测试);worktree 留下 30 文件 507+/416- 实际完成所有改动,但 worker 又以 failed-unknown 结束(同样症状:worker 报告完成但未输出有效 JSON 终态记录)。
|
||||
- 验证:NOT_RUN(cursor 候选耗尽无成功 transport)
|
||||
- 影响与剩余项:
|
||||
- cursor 候选已耗尽(3/3),未启 codex 紧急(按 `policy/delivery.md` 显式 fail-stop 规则)。
|
||||
- 后续会话建议拆 U7 为更小单元(按 attempt 2 划分):
|
||||
- U7A:`internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,*_test}` + decouple doc.read from project list/metadata;目标:member 不需要 doc.read 即可看见自己的项目元数据
|
||||
- U7B:`internal/rdmapp/{perms_api,member_search,doc_visibility,cockpit,private_doc_views_test,resource_authz_test,queued_publication_revocation_test,iam_i1_*,e2e,draft_visibility,*_test}` + 两树一网共享读取;目标:取消 author/publishedKnowledgeSource 过滤
|
||||
- U7C:`internal/rdmapp/knowledge_publication_test,host_projection_test,dhf_template_instance_test` + `plugins/rdm/*`;目标:插件层全部走新规则
|
||||
- 或拆分 U7A + U7B 两单元(U7C 留给 U3 阶段一并处理)
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7a-canonical-project-identity 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:1c01763;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U7 拆分后第一个子单元 U7A;目标 RDM `internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,*_test,member_guards_test,project_creator_permissions_test}.go`;不开 PR、不入 main;不动 U7B 路径(perms_api/member_search/doc_visibility/cockpit/插件层 + body-level 共享)。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;父单元 U7 任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u7-canonical-two-trees.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:项目身份唯一(同名 = 同一 business project;rename/archive 不释放 ID);`project_resource_authz.go` 中 `project`/`knowledge` 类型分支不再以 `perms.ActDocRead` 与 `publishedKnowledgeSource` 为前置;creator 不可变(仅 created_by 可管理,owner/负责人标签不算)。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `perms_api.go`、`member_search.go`、`accountdir*`、`doc_visibility.go`、`cockpit.go`、插件层与 body-level 共享测试(U7B)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
- 不破坏现有职责分配、发布流程、版本号。
|
||||
|
||||
**验收条件**:方案 C01-C05、C17、C26-C28 + 既有不退化 + 新表覆盖 canonical identity、project metadata decoupling、author/published filter removal、creator-only management、owner-label-not-authority。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U2A (RDM 1d9de398) + U2B (RDM 8725ed3)
|
||||
- 后继:U7B sub-unit(perms_api + member_search + doc_visibility + cockpit + plugins/rdm + body-level 共享测试)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U7 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U7 cursor 3/3 fail-stop 收据 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `a00466fb` (transport `cc68d698…/4b4d8a620021`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,8 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `a00466fb` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,projects + rdmapp + dhffidelity + dhfmatrix 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 1c01763 | 1c01763 | 2026-10-19T07:50:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7a | RDM `internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,*_test,member_guards_test,project_creator_permissions_test,host_projection_test,dhf_template_instance_test,e2e_test}.go` + `pins/{agent-system-backend,agent-system-core,agent-document-renderer}` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/cc68d698…/4b4d8a620021 → RDM commit a00466fbac4b2bc80d6bfee3831d4187be76c248 | 否 | /tmp/iam-link-u7a-run.json (run_id cc68d698… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U7A 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `a00466fb` 已推送(Agent-System-RDM origin);与 U2A(`1d9de39`)+ U2B(`8725ed3f`)累积。8 文件改动 643+/56-,分布:
|
||||
- `internal/projects/projects.go` +32(项目身份唯一性强化)
|
||||
- `internal/projects/projects_test.go` +114(新表)
|
||||
- `internal/rdmapp/project_resource_authz.go` 95+/-(解耦 `perms.ActDocRead` 与 `publishedKnowledgeSource`,改为成员关系判断)
|
||||
- `internal/rdmapp/project_resource_authz_test.go` +145(新表覆盖 author/published filter removed)
|
||||
- `internal/rdmapp/project_creator_permissions_test.go` +180(既有 + 新表覆盖 creator-only management / owner-label-not-authority)
|
||||
- `internal/rdmapp/projects_api.go` +38(项目元数据路径接入)
|
||||
- `internal/rdmapp/system_projects.go` +12(ListSystemProjects / verifyPhysicalProject 解耦 doc.read)
|
||||
- `internal/rdmapp/system_projects_test.go` +83
|
||||
- 验证:PASS
|
||||
- `internal/projects`:ok(含新表)
|
||||
- `internal/rdmapp`:ok(78.7s,含既有 + 新表)
|
||||
- `internal/rdmapp/dhffidelity` / `dhfmatrix`:ok
|
||||
- `go vet ./internal/...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- U7B 子单元(`perms_api.go`、`member_search.go`、`doc_visibility.go`、`cockpit.go`、`accountdir*`、`plugins/rdm/*` + body-level 共享测试)尚未派发,依赖 U7A 的 `project_resource_authz` 解耦稳定
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A+U2B+U7A)
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+97
@@ -0,0 +1,97 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7b-a-perms-and-member-search 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:a653d86;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U7B 拆分后第一个子单元 U7B-A;目标 RDM `internal/rdmapp/{perms_api,member_search,accountdir*,*_test,private_doc_views_test,resource_authz_test}.go`;不开 PR、不入 main;不动 U7B-B / U7B-C / U7C / U7A 路径。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;U7B 父任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u7b-two-trees-and-plugins.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 `AuthorizeDocRead` / `AuthorizeCmd` / `sectionBodyReadable` 在有效成员路径下不再以 `doc.read` 为前置;`member_search` 通过成员关系即可读取项目元数据;新成员加入/对话走 `ProjectLifecycle.Work`。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `project_resource_authz*`、`system_projects*`、`projects_api*`、`cockpit`、`doc_visibility`、`render_submission`、`queued_publication_revocation_test`、`draft_visibility_test`、`iam_i1_*`、`host_projection_test`、`dhf_template_instance_test`、`e2e_test`、`knowledge_publication_test`、`member_guards_test`、`project_creator_permissions_test`、plugins/rdm(U7A / U7B-B / U7B-C / U7C)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
|
||||
**验收条件**:方案 C11/C16/C17 部分 + 既有不退化 + 新表覆盖 member metadata read、member shared read、author/published filter removed、member conversation work。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U2A + U2B + U7A 均已完成(RDM 1d9de39 + 8725ed3 + a00466fb)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U7B 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U7B cursor 3/3 fail-stop 收据 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `cff0e44a` (transport `8b5e9882…/8896fcf86560`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,4 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `cff0e44a` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,rdmapp + projects + plugins/rdm 全 ok |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | a653d86 | a653d86 | 2026-10-19T09:35:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7b-a | RDM `internal/rdmapp/{perms_api,member_search,accountdir*,*_test,private_doc_views_test,resource_authz_test}.go` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/8b5e9882…/8896fcf86560 → RDM commit cff0e44a7d7c2e9fc993839d64126d2e87c36087 | 否 | /tmp/iam-link-u7b-a-run.json (run_id 8b5e9882… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U7B-A 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `cff0e44a` 已推送(Agent-System-RDM origin);与 U2A + U2B + U7A 累积。4 文件改动 329+/8-,分布:
|
||||
- `internal/rdmapp/perms_api.go` +39(`AuthorizeDocRead` / `AuthorizeCmd` / `sectionBodyReadable` 不再以 doc.read 为前置)
|
||||
- `internal/rdmapp/perms_test.go` +154(新表覆盖 member metadata read / member shared read / author filter removed / published filter removed / member conversation work)
|
||||
- `internal/rdmapp/member_search.go` +55(member metadata 路径接入)
|
||||
- `internal/rdmapp/member_search_test.go` +89
|
||||
- 验证:PASS
|
||||
- `internal/rdmapp`:ok(79.3s,含既有 + 新表)
|
||||
- `internal/projects`:ok(0.2s)
|
||||
- `plugins/rdm`:ok(3.0s)
|
||||
- `go vet ./internal/... ./plugins/...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- U7B-B(`doc_visibility/cockpit/render_submission/queued_*` + body-level 共享测试)尚未派发
|
||||
- U7B-C(`plugins/rdm/*` 全套测试)尚未派发
|
||||
- U7C(knowledge/doc shared reads)尚未派发
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A + U2B + U7A + U7B-A)
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7b-b-doc-visibility-cockpit-body 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:7753d9a;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U7B 拆分后第二个子单元 U7B-B;目标 RDM `internal/rdmapp/{doc_visibility,cockpit,render_submission,private_doc_views_test,resource_authz_test,queued_publication_revocation_test,draft_visibility_test,knowledge_publication_test,*_test}.go`;不开 PR、不入 main;不动 U7A / U7B-A / U7B-C / U7C 路径。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;U7B 父任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u7b-two-trees-and-plugins.md`;U7B-A 见 `.task/feature-iam-role-permission-linked-capabilities-u7b-a-perms-and-member-search.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 `doc_visibility.go` / `cockpit.go` 的 `AuthorizeDocRead/AuthorizeDocReadScoped/sectionBodyReadable/evalPerm` 在有效成员路径下不再以 `doc.read` 为前置;body 内容对项目成员无 author/duty-author/stage-range 过滤;`render_submission.go` 走 member 鉴权;保留私域边界。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `perms_api`、`member_search`、`accountdir*`、`project_resource_authz*`、`system_projects*`、`projects_api*`、`iam_i1_*`、`host_projection_test`、`dhf_template_instance_test`、`e2e_test`、`accountdir*`、`member_guards_test`、`project_creator_permissions_test`、plugins/rdm(U7A / U7B-A / U7B-C / U7C)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
|
||||
**验收条件**:方案 C11/C17 部分 + 既有不退化 + 新表覆盖 body-level 共享、author/published/stage/duty-author filter removal、revocation/draft visibility、shared knowledge member reads。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U2A + U2B + U7A + U7B-A 均已完成(RDM 1d9de39 + 8725ed3 + a00466fb + cff0e44a)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U7B 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U7A + U7B-A 成功结果 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `83dd244c` (transport `925ae274…/c8536afce513`) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,11 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `83dd244c` SELF | 部分 PASS | host | 2026-10-19 | `make evidence` exit=0;rdmapp + projects + plugins/rdm 存在 4 项 plugin 测试失败(`TestAuditReaderSeesRuleOptionsBindingsAndTraceMetadataWithoutBody`、`TestU1DocumentExportUsesContentPermission`、`TestDocReadHonorsStageRange` 等),属 U7B-C 修复范围 |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink(需先完成 U7B-C 修复 plugin 测试) |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 7753d9a | 7753d9a | 2026-10-19T10:00:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7b-b | RDM `internal/rdmapp/{doc_visibility,cockpit,render_submission,private_doc_views_test,resource_authz_test,queued_publication_revocation_test,draft_visibility_test,knowledge_publication_test,perms_api,member_search_test,*_test}.go` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/925ae274…/c8536afce513 → RDM commit 83dd244c5b476d9a9e719ec6d18dd615f7822329 | 否 | /tmp/iam-link-u7b-b-run.json (run_id 925ae274… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U7B-B 实施成功(attempt 1 scope-expansion → attempt 2 success)。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `83dd244c` 已推送。11 文件改动 792+/254-,分布:
|
||||
- `internal/rdmapp/cockpit.go` +227/-(AuthorizeDocRead/AuthorizeDocReadScoped 解耦 doc.read + body-level 共享读取)
|
||||
- `internal/rdmapp/cockpit_test.go` +184(新表)
|
||||
- `internal/rdmapp/doc_visibility.go` +73(doc_visibility 解耦)
|
||||
- `internal/rdmapp/doc_visibility_test.go` +167(新表)
|
||||
- `internal/rdmapp/draft_visibility_test.go` +67(draft 阶段读取不再以 doc.read 为前置)
|
||||
- `internal/rdmapp/knowledge_publication_test.go` +99(知识发布与撤回 + 共享读取)
|
||||
- `internal/rdmapp/member_search_test.go` +11(member_search_test 113-115 修复)
|
||||
- `internal/rdmapp/perms_api.go` +45(AuthorizeDocReadScoped 解耦 doc.read + read-stage range)
|
||||
- `internal/rdmapp/private_doc_views_test.go` +60(私域共享读取)
|
||||
- `internal/rdmapp/queued_publication_revocation_test.go` +64(撤回判定不阻断共享成员读取)
|
||||
- `internal/rdmapp/resource_authz_test.go` +49(resource authz 表)
|
||||
- 验证:部分 PASS
|
||||
- `internal/rdmapp`:ok(含 U7A + U7B-A + U7B-B 既有 + 新表)
|
||||
- `internal/projects`:ok
|
||||
- `plugins/rdm`:FAIL(4 项 plugin 测试预期失败:audit-only、u1_surface、write_duty_stage、reg_citation);这些是 U7B-C 范围
|
||||
- 影响与剩余项:
|
||||
- U7B-C(`plugins/rdm/*`)尚未派发;这是恢复 plugin 测试的下一单元
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A + U2B + U7A + U7B-A + U7B-B)
|
||||
- Dev `modules/rdm` gitlink bump 需等 U7B-C 修复后再执行
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+101
@@ -0,0 +1,101 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7b-c-plugins-rdm-tests 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:3900482;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U7B 拆分后第三个子单元 U7B-C;目标 `plugins/rdm/*`;不开 PR、不入 main;不动 U7A / U7B-A / U7B-B / U7C 路径。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;U7B 父任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u7b-two-trees-and-plugins.md`;U7B-B 见 `.task/feature-iam-role-permission-linked-capabilities-u7b-b-doc-visibility-cockpit-body.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让 `plugins/rdm/*` 测试与 U7B-B 解耦后的 body-level 共享规则一致;`TestAuditReaderSeesRuleOptionsBindingsAndTraceMetadataWithoutBody`、`TestU1DocumentExportUsesContentPermission`、`TestDocReadHonorsStageRange` 等 4 项预期失败测试全部 PASS;私有性边界保留。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `internal/rdmapp/*`、`internal/projects/*`(U7A / U7B-A / U7B-B / U7C 已完成)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
|
||||
**验收条件**:方案 C11/C17 部分 + 既有不退化 + 4 项 U7B-B-broken 测试 PASS + 新表覆盖 body-level 共享成员读、私域附件、阶段读取、引用检索。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U2A + U2B + U7A + U7B-A + U7B-B 均已完成(RDM 1d9de39 + 8725ed3 + a00466fb + cff0e44a + 83dd244c)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U7B 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U7B-B 引入 plugins/rdm 4 项预期失败测试 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | RDM `d8cfc707` (transport `925ae274…/c8536afce513` 与 `4b8…` 等) | 已完成 | cursor-agent-stable | 2026-10-19 | `scripts/agent-exec run` terminal_status=success,9 文件改动全在 allowed_paths |
|
||||
| 正式测试与验收 | RDM `d8cfc707` SELF | PASS | host | 2026-10-19 | `make evidence` exit=0,rdmapp + projects + plugins/rdm 全 ok;U7B-B 引入的 4 项 plugins/rdm 失败测试全部修复 |
|
||||
| 代码 Review | 待独立会话 | 待执行 | — | — | fresh session, `--role review` |
|
||||
| 合入 | 待 host | 待执行 | — | — | RDM L1 transport apply 已完成;待 host 后续 bump Dev `modules/rdm` gitlink |
|
||||
| 合入核验与收口 | 待 host | 待执行 | — | — | L1 PR #628 base gate |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 3900482 | 3900482 | 2026-10-19T10:40:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7b-c | `plugins/rdm/*` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1 | cursor-agent-stable 2026.10.14-0f9edde | completed (success) | refs/agent-exec/…/c8536afce513 → RDM commit d8cfc70725f0275617cb44a8112b0fdf999de08a | 否 | /tmp/iam-link-u7b-c-run.json (run_id 4b8… attempt 1) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:U7B-C 实施成功。RDM L1 子分支 `feature/iam-link-u2-single-role-authority` @ `d8cfc707` 已推送。9 文件改动 208+/82-,分布:
|
||||
- `plugins/rdm/plugin.go` +59(plugin 总入口改造)
|
||||
- `plugins/rdm/render_audit_metadata_test.go` +18
|
||||
- `plugins/rdm/u1_surface_test.go` +22
|
||||
- `plugins/rdm/iam_i1_authorization_test.go` +29
|
||||
- `plugins/rdm/write_duty_stage_test.go` +31
|
||||
- `plugins/rdm/private_body_exports_test.go` +38
|
||||
- `plugins/rdm/private_inspection_test.go` +47
|
||||
- `plugins/rdm/reg_citation_test.go` +17
|
||||
- `plugins/rdm/draft_visibility_test.go` +29
|
||||
- 验证:PASS
|
||||
- `internal/rdmapp`:ok(77.7s)
|
||||
- `internal/projects`:ok
|
||||
- `plugins/rdm`:ok(2.7s;4 项 U7B-B-broken 测试全部修复)
|
||||
- `go vet ./internal/... ./plugins/...` exit=0;`git diff --check` exit=0
|
||||
- 影响与剩余项:
|
||||
- U7 拆分子单元全部完成(U7A + U7B-A + U7B-B + U7B-C)
|
||||
- U7C(knowledge/doc shared reads)尚未派发;可与 U7 完成合并考虑
|
||||
- 独立 Review 待 fresh session `--role review`(同时覆盖 U2A + U2B + U7A + U7B-A + U7B-B + U7B-C)
|
||||
- Dev `modules/rdm` gitlink bump + RDM L1→main 合入待 host 后续
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
+92
@@ -0,0 +1,92 @@
|
||||
# feature/iam-role-permission-linked-capabilities-u7b-two-trees-and-plugins 任务卡
|
||||
|
||||
任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:child;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:feature/iam-role-permission-linked-capabilities;accepting_requirements:false;parent_branch:feature/iam-role-permission-linked-capabilities;parent_head_sha:251536d;parent_pr:PR #628
|
||||
|
||||
- 授权与交付终点:U7 拆分后第二个子单元 U7B;目标 RDM `internal/rdmapp/{perms_api,member_search,accountdir*,doc_visibility,cockpit,private_doc_views_test,resource_authz_test,queued_publication_revocation_test,draft_visibility_test,iam_i1_*,host_projection_test,dhf_template_instance_test,e2e_test,knowledge_publication_test,*_test}.go` + `plugins/rdm/{plugin,system_projects,register_v2,iam_i1_*,resource_authz,draft_*,member_*,perm_*,roles,account_directory,duty_*,host_projection,private_*,reg_*,render_audit,u1_surface,write_duty_stage,*_test}.go`;不开 PR、不入 main;不动 U7A 路径(projects/* + project_resource_authz + system_projects + projects_api + member_guards_test + project_creator_permissions_test)。
|
||||
- 交付模式:goal-first
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 当前阶段:实施单元已登记,待 agent 派发
|
||||
- 流程依据:仓库根目录 policy/delivery.md;父 L1 charter 见 `.task/feature-iam-role-permission-linked-capabilities.md`;U7 父任务卡见 `.task/feature-iam-role-permission-linked-capabilities-u7-canonical-two-trees.md`;U7A 见 `.task/feature-iam-role-permission-linked-capabilities-u7a-canonical-project-identity.md`
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
**目标**:让所有有效成员读同一份两树一网共享内容(body-level 与 metadata 一致),无 author/role/publication/duty-author/stage-range 过滤;新增成员加入走 `ProjectLifecycle.Work`(U7A 已建立 `project_resource_authz` 解耦基础)。
|
||||
|
||||
**范围**:见单元包 allowed_paths。
|
||||
|
||||
**非目标**:
|
||||
- 不动 `internal/projects/*`、`internal/rdmapp/{project_resource_authz*,system_projects.go,projects_api.go,member_guards_test.go,project_creator_permissions_test.go}`(U7A 已完成)。
|
||||
- 不动 Backend / Frontend / Documents / Dev。
|
||||
- 不引入新数据库表。
|
||||
- 不削弱既有拒绝。
|
||||
- 不修改 created_by 不可变性。
|
||||
|
||||
**验收条件**:方案 C11-C17、C26-C31 + 既有不退化 + 新表覆盖 body-level 共享、member conversation work、author/published/stage/duty-author filter removal。
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 主记录:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md` U7
|
||||
- 前置:U2A + U2B + U7A 均已完成(RDM 1d9de39 + 8725ed3 + a00466fb)
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 本卡 | 已完成 | host | 2026-10-19 | U7 拆分决定 |
|
||||
| 需求评估 | 本卡 | 已完成 | host | 2026-10-19 | U7 cursor 3/3 fail-stop + U7A 成功结果 |
|
||||
| 需求表确认 | 本卡 | 已完成 | host | 2026-10-19 | 范围 |
|
||||
| 方案设计 | 单元包 JSON | 已完成 | host | 2026-10-19 | KTD2/KTD5/KTD6/KTD8/KTD10 |
|
||||
| 实施计划 | 单元包 JSON | 已完成 | host | 2026-10-19 | allowed_paths/verification/timeout_seconds |
|
||||
| 实施与自检 | cursor-agent attempt 1 (failed-unknown) + attempt 2 (scope-expansion) + attempt 3 (failed-unknown) | 三试全 fail-stop,cursor 候选耗尽 | cursor-agent | 2026-10-19 | attempt 1 15 文件 437+/220- 改动完成但 worker 终态记录格式无效;attempt 2 列需要 `project_resource_authz.go`、`project_resource_authz_test.go`、`system_projects_test.go`、`render_submission.go` 等 U7A 路径;attempt 3 按 attempt 2 列表扩到 53 路径含全部 production + test + plugin,仍以 failed-unknown 结束(26 文件 650+/284- 改动完成) |
|
||||
| 正式测试与验收 | NOT_RUN | | | | 本会话不再尝试 |
|
||||
| 代码 Review | NOT_RUN | | | | |
|
||||
| 合入 | NOT_RUN | | | | 后续会话修订 U7B 单元包或拆分 |
|
||||
| 合入核验与收口 | NOT_RUN | | | | |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 251536d | 251536d | 2026-10-19T08:25:00Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| iam-link-u7b | RDM `internal/rdmapp/{perms_api,member_search,accountdir*,doc_visibility,cockpit,private_*,queued_*,draft_*,iam_i1_*,host_projection_test,dhf_*,e2e_test,knowledge_publication,project_resource_authz*,system_projects_test,render_submission,*_test}.go` + `plugins/rdm/*` | AGENT-EXECUTION.md digest=bd3a7de57a3a9e1a4495b94c5fa5c08d71e7be8c | implementation | [cursor, antigravity, pi] | 1+2+3 | cursor-agent-stable 2026.10.14-0f9edde | attempt 1=failed-unknown, attempt 2=scope-expansion, attempt 3=failed-unknown;cursor 候选耗尽 | 无 | 否 | /tmp/iam-link-u7b-run.json (run_id db0eb5d3… + 8f9c5b8d… + 5b0d2c9b…) |
|
||||
|
||||
## 结果与验证(完成后填写)
|
||||
|
||||
- 结果:cursor 三次尝试均 fail-stop,未产生可应用 transport;cursor 候选耗尽(3/3)。
|
||||
- attempt 1 (run_id=db0eb5d3…) terminal=failed-unknown;worktree 15 文件 437+/220- 改动。
|
||||
- attempt 2 (run_id=8f9c5b8d…) terminal=scope-expansion;agent 列真实需要扩 `internal/rdmapp/{project_resource_authz,project_resource_authz_test,system_projects_test,render_submission}.go`,因 U7A 未删 `project_resource_authz.go` knowledge 分支的 `publishedKnowledgeSource` 过滤,且 `system_projects_test.go` / `project_resource_authz_test.go` 仍以 doc.read 为前置。
|
||||
- attempt 3 (run_id=5b0d2c9b…) terminal=failed-unknown;按 attempt 2 列表扩 allowed_paths 到 53,仍以 failed-unknown 结束;worktree 26 文件 650+/284- 改动完成(含 `project_resource_authz.go` 删 publishedKnowledgeSource + `render_submission.go` 入 member 鉴权)。
|
||||
- 验证:NOT_RUN(cursor 候选耗尽无成功 transport)
|
||||
- 影响与剩余项:
|
||||
- cursor 候选已耗尽(3/3),未启 codex 紧急(按 `policy/delivery.md` 显式 fail-stop 规则)。
|
||||
- 后续会话建议:
|
||||
1. 改派 agy(违反"不换候选"但实际是重启 cursor 已死的单元);新工作区独立判断
|
||||
2. 拆 U7B 为更小单元:`internal/rdmapp/perms_api.go` + `member_search.go` 子单元 A;`doc_visibility.go` + `cockpit.go` 子单元 B;`plugins/rdm/*` + body-level 测试 子单元 C
|
||||
- U7C 子单元(已规划但尚未登记到 L1)与 U7B 合并考虑
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN
|
||||
- 冲突记录:NOT_RUN
|
||||
- CI 记录:NOT_RUN
|
||||
- 合入记录:NOT_RUN
|
||||
- 清理记录:NOT_RUN
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
@@ -0,0 +1,225 @@
|
||||
# feature/iam-role-permission-linked-capabilities 任务卡
|
||||
|
||||
任务主记录:PR #628 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/628;状态:已完成(回填);owner:weichen
|
||||
|
||||
## 基线与授权
|
||||
|
||||
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed
|
||||
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-iam-role-permission-linked-capabilities(worktree);分支:feature/iam-role-permission-linked-capabilities
|
||||
- 分支类型:initiative;initiative_id:feature-iam-role-permission-linked-capabilities;root_target:main;immediate_target:main;accepting_requirements:true
|
||||
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=62e8104b014777e84799e26eaaa1d9fdccf4f934271964317420c0e3d39e6a11;triage_receipt=/tmp/iam-perm-triage-20261019.json;receipt_sha256=8487aa0d0cf79d9f0ef5e5c1fd92f4f28ad530c4276ccc044d29d7b1633b92e6
|
||||
|
||||
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
|
||||
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
|
||||
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
|
||||
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
|
||||
- 人工决策点:仅限目标/范围/验收变更、重大取舍、高后果操作或无法自动判定的业务验收
|
||||
- 当前阶段:需求拆解;当前增量:I1(待定义)
|
||||
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
|
||||
|
||||
## 目标与非目标
|
||||
|
||||
### 章程(charter)
|
||||
|
||||
**用途与目标**:按方案 revision 3 实现「项目协作与联动权限」:全局同名业务项目唯一且所有成员共用同一规范 `projectId`;创建者能管理本人项目并加成员;有效成员自动看到同一项目并能创建本人私有对话、收发消息;同一项目两树一网(笔记树/文档树/追溯网)由有效成员关系派生完整共享读取;编辑/编制/审核/批准/发布按角色与文档职责分别判定。修复方案"Problem Frame"列出的 403 根因(隐藏管理 cap 依赖)与 ProjectMembers/ProjectMetadata 仍以 `doc.read` 为前置的耦合。
|
||||
|
||||
**接纳范围**(与方案 R1-R17 对齐):
|
||||
- R1-R9:角色/账号/绑定稳定性、系统范围创建能力、联动管理资格、单一角色权威、Backend/RDM 公开提供者复用、解释/保存同源、失效与拒绝语义、迁移稳定。
|
||||
- R10-R12, R14-R15, R17:全局同名项目、不可变创建者、成员基础协作、完整两树一网共享读取、自动发现 5s 内可见。
|
||||
- R13, R16:成员加入不打断工作、关联权限不存断链。
|
||||
- 对应单元:**U1 业务能力联动(Backend)**→ **U2 单一角色权威(Backend+RDM)** → **U7 同项目两树一网完全共享(RDM+Backend)** → **U3 能力暴露与解释(Backend+RDM)** → **U4 Frontend 自动发现与联动配置** → **U5 测试与组合(Backend+RDM+Frontend)** → **U6 交付合入(host 主导)**。
|
||||
- C01-C31:见方案 Verification Contract;本卡验收以此为准,未执行时均为 NOT_RUN。
|
||||
|
||||
**非目标**:
|
||||
- 账号恢复、多职位角色、Agent 权限、新工作流、生产迁移与部署、版本发布、跨实例分布式演进、生成式 UI、DHF 模板、文档生成管线(均属既有方向,已各有独立提案/任务;不在本 L1 范围)。
|
||||
- 既有 IAM U4 单角色与 U3 账号目录已合入 main 的部分不复用做修改;只在其基础上叠加业务能力联动与共享读取。
|
||||
- `feature/iam-role-project-design`(R0=3fb8210,落后 52 提交、范围与本方案不重叠)作废,不作为本 L1 子分支。
|
||||
|
||||
**分级测试策略**:
|
||||
- 单元→L2(child → L1):worker 自检 + host 最小直接检查(`make test-affected`)+ 全新会话独立 Review;轻量 CI(GATE 仅 PR base 非 main 时跳过 `test-pg`/`svc-realcombo`)。
|
||||
- L1 → main:完整 CI(`test`/`test-pg`/`svc-realcombo`)#518 窗口,三段证据(precheck/task-sync/test),合入前 `make task-close SELF=1` 闭合。
|
||||
- 浏览器/双账号闭环验证 C11-C16、C19-C21、C26-C30:U5 阶段在 U4 完成后跑真实 Playwright + RDM acceptance 脚本。
|
||||
|
||||
**验收条件**:C01-C31 全部 PASS;本机 dev 实例复现原 403 已不再发生;完整双账号证据(创建→加成员→被加者登录页自动出现→本人对话收发→移除后失效)。
|
||||
|
||||
**追加领域规则**:
|
||||
- 任何新代码不得绕过 `RolePolicyProvider`/`SystemActionProvider` 直接调用 `AccountRoleOf`/`RoleActionOf`(U2 修复点)。
|
||||
- 任何读写面不得以 `doc.read=true` 为前置判断"成员是否能看到项目元数据"(U7 解耦点)。
|
||||
- 任何项目内共享节点/文档/事件不得以作者、职位、发布状态、审签职责资格过滤(U7+R14 共享语义)。
|
||||
- 关联配置缺失或显式冲突必须整笔失败,不得静默允许 create 但管理断链(U1+R3)。
|
||||
- 移除/失效后服务端立即拒绝后续写,旧流重验并停止,前台 5s 内同步(U7+U4)。
|
||||
|
||||
**生命周期**:建立即开本 PR 作 [WIP] 占位;接收子任务登记;最终一次性合入 main,闭合 `.task/`、归档、回收 worktree;不接受长期 develop 分支。
|
||||
|
||||
**关联方向与规划**:
|
||||
- 主记录:方案 revision 3(路径 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md`,2026-10-19;review-v2.md 两次独立只读审阅已记录)。
|
||||
- 既有同向提案:`modules/documents/docs/proposals/2026-10-13-system-project-membership.md`(项目身份与成员入口)、`2026-10-15-iam-focused-role-permission-spec.md`(聚焦范围 R1-R6;本 L1 不重做)。
|
||||
|
||||
## 子任务登记
|
||||
|
||||
| 子任务分支 | 必需 | 状态 | PR | 单元 | 范围摘要 |
|
||||
|---|---|---|---|---|---|
|
||||
| feature/iam-role-permission-linked-capabilities-u1-capability-association | 是 | 已完成(Backend 子分支 afb65c5 推送,Dev gitlink bump 待 host;独立 Review 待 fresh session) | —(child 不开 PR) | U1 | Backend `internal/authz/catalog`、`internal/store/role_policy`、公开扩展 DTO;RDM `internal/perms/role_provider.go` 与创建能力判定;KTD1/KTD3/KTD4;C06/C08/C09/C10 |
|
||||
| feature/iam-role-permission-linked-capabilities-u2-single-role-authority | 是 | 已完成(U2A + U2B 双子单元均 success;RDM L1 子分支 8725ed3 已推远端;待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U2 | RDM `perms_api.go`、`system_projects.go`、`plugins/rdm/{system_projects,plugin}.go`;Backend `hostcaps.go`;KTD7;C22 |
|
||||
| feature/iam-role-permission-linked-capabilities-u2a-perms-and-perms-api | 是 | 已完成(RDM L1 子分支 1d9de398 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U2A(U2 拆分) | RDM `internal/perms/*` + `internal/rdmapp/{perms_api,member_search,accountdir*,*_test}.go`;KTD7;U2A 子表 |
|
||||
| feature/iam-role-permission-linked-capabilities-u2b-system-projects-and-plugins | 是 | 已完成(RDM L1 子分支 8725ed3 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U2B(U2 拆分) | RDM `internal/rdmapp/{system_projects,projects_api,project_resource_authz,settings_duties,runtime}` + `plugins/rdm/{plugin,system_projects,*}`;KTD7 |
|
||||
| feature/iam-role-permission-linked-capabilities-u7-canonical-two-trees | 是 | blocked(cursor 3/3 fail-stop;拆分为 U7A + U7B + U7C 重新派发;U7A 已登记卡片待 agent 派发) | —(child 不开 PR) | U7 | RDM `internal/projects/{projects,provisioning,projection_rename}.go`、`internal/rdmapp/{projects_api,system_projects,project_resource_authz}.go`;Backend `internal/server/{project_lifecycle,server}.go`;KTD2/KTD5/KTD6/KTD8/KTD10;C01-C05/C11-C17/C19-C21/C26-C31 |
|
||||
| feature/iam-role-permission-linked-capabilities-u7a-canonical-project-identity | 是 | 已完成(RDM L1 子分支 a00466fb 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U7A(U7 拆分) | RDM `internal/projects/*` + `internal/rdmapp/{project_resource_authz,system_projects,projects_api,*_test,member_guards_test,project_creator_permissions_test,host_projection_test,dhf_template_instance_test,e2e_test}.go`;KTD2/KTD5/KTD6/KTD8/KTD10;C01-C05/C17/C26-C28 |
|
||||
| feature/iam-role-permission-linked-capabilities-u7b-two-trees-and-plugins | 是 | blocked(cursor 3/3 fail-stop;拆分 U7B-A 待派发,U7B-B / U7B-C 待登记) | —(child 不开 PR) | U7B(U7 拆分) | RDM `internal/rdmapp/{perms_api,member_search,accountdir*,doc_visibility,cockpit,*_test}.go` + `plugins/rdm/*`;C11-C17/C26-C31 |
|
||||
| feature/iam-role-permission-linked-capabilities-u7b-a-perms-and-member-search | 是 | 已完成(RDM L1 子分支 cff0e44a 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U7B-A(U7B 拆分) | RDM `internal/rdmapp/{perms_api,member_search,accountdir*,*_test,private_doc_views_test,resource_authz_test}.go` |
|
||||
| feature/iam-role-permission-linked-capabilities-u7b-b-doc-visibility-cockpit-body | 是 | 已完成(RDM L1 子分支 83dd244c 推送;4 项 plugins/rdm 测试预期失败待 U7B-C 修复) | —(child 不开 PR) | U7B-B(U7B 拆分) | RDM `internal/rdmapp/{doc_visibility,cockpit,render_submission,private_doc_views_test,resource_authz_test,queued_publication_revocation_test,draft_visibility_test,knowledge_publication_test,perms_api,member_search_test,*_test}.go` |
|
||||
| feature/iam-role-permission-linked-capabilities-u7b-c-plugins-rdm-tests | 是 | 已完成(RDM L1 子分支 d8cfc707 推送,plugins/rdm 测试全绿) | —(child 不开 PR) | U7B-C(U7B 拆分) | `plugins/rdm/*` |
|
||||
| feature/iam-role-permission-linked-capabilities-u7c-knowledge-and-doc-shared-reads | 是 | 待登记(U7A 完成后) | —(child 不开 PR) | U7C(U7 拆分) | RDM `internal/rdmapp/{private_doc_views_test,resource_authz_test,queued_publication_revocation_test,draft_visibility_test,iam_i1_*,e2e_test,knowledge_publication_test}.go` + 两树一网共享读取 |
|
||||
| feature/iam-role-permission-linked-capabilities-u3-capability-exposure | 是 | 已登记子单元卡片 U3A + U3B | — | U3 | Backend/RDM 解释接口、HTTP/command 错误分类、创建/添加成员/对话失败原因;KTD1/KTD2/KTD6 |
|
||||
| feature/iam-role-permission-linked-capabilities-u3a-backend-capability-explanation | 是 | 已完成(Backend L1 子分支 e942a35b 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U3A(U3 拆分) | Backend `pkg/extension/` + `internal/authz/` + `internal/app/` + `internal/server/` + `internal/store/` |
|
||||
| feature/iam-role-permission-linked-capabilities-u3b-rdm-projectfailure-integration | 是 | 已完成(RDM L1 子分支 b74fc0e8 推送;待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U3B(U3 拆分) | RDM `internal/rdmapp/{system_projects,projects_api,perms_api,member_search,perms,project_failure,explain,*_test}.go` + `plugins/rdm/{plugin,*_test}.go` |
|
||||
| feature/iam-role-permission-linked-capabilities-u4-frontend-auto-discover | 是 | 已完成(Frontend L1 子分支 f015798 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U4 | Frontend `RolePermissionsPanel.tsx`、`AccountUsersPanel.tsx`、`adminRdmSections.tsx`、`TaskSidebar.tsx`、`App.tsx`、`store.ts`、`api.ts`、`rolePermissions.ts`、`projectmeta.ts`;KTD9;C13-C15/C19-C21/C23 |
|
||||
| feature/iam-role-permission-linked-capabilities-u5-integration-tests | 是 | 拆 U5-Backend / U5-RDM / U5-Frontend 三个子单元(每仓一个独立 dispatch);U5-Backend 已登记卡片待派发 | —(child 不开 PR) | U5 | 复用 Backend `project_lifecycle_test.go`/`role_authorization_test.go`、RDM `system_projects_test.go`/`project_creator_permissions_test.go`/`member_guards_test.go`/`role_provider_test.go`、Frontend 角色/成员/项目测试;新增浏览器双账号场景;不搭新测试框架;C01-C31 全集 |
|
||||
| feature/iam-role-permission-linked-capabilities-u5-backend-integration-tests | 是 | 已完成(Backend L1 子分支 1214ad43 推送,待 Dev gitlink bump + 独立 Review) | —(child 不开 PR) | U5-Backend(U5 拆分) | Backend `internal/server/{project_lifecycle_test,role_authorization_test,project_iam_integration_test}.go` |
|
||||
| feature/iam-role-permission-linked-capabilities-u5-rdm-integration-tests | 是 | blocked(cursor 3/3 全 blocked;agent 拒绝修改生产代码以加 test helper) | —(child 不开 PR) | U5-RDM(U5 拆分) | RDM `internal/rdmapp/{system_projects_test,project_creator_permissions_test,member_guards_test,perms_api_test,explain_test,project_failure_test,iam_integration_test}.go` |
|
||||
| feature/iam-role-permission-linked-capabilities-u5-frontend-integration-tests | 是 | blocked(cursor 3/3 全 blocked) | —(child 不开 PR) | U5-Frontend(U5 拆分) | Frontend `src/{store.test,components/{adminRdmSections,RolePermissionsPanel,AccountUsersPanel,TaskSidebar}.test,rolePermissions.test,projectmeta.test}.{ts,tsx}` + `e2e/{two_account_browser.spec,_helpers,playwright.config}.{ts,tsx}` |
|
||||
| feature/iam-role-permission-linked-capabilities-u6-delivery | 否 | 待启动 | — | U6 | host 主导:同步、Review、CI、PR 合入、迁移/部署按单独授权执行;更新相关旧权限/项目规格 |
|
||||
|
||||
## Agent 实施收据
|
||||
|
||||
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
|
||||
|
||||
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|
||||
|---|---|---|---|---|---|---|---|---|---|---|
|
||||
| 待定义 | — | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | NOT_RUN | — |
|
||||
|
||||
## 关联方向与规划
|
||||
|
||||
- 适用状态:待核对(无适用规划时说明原因)
|
||||
- 主记录路径/版本:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md`(2026-10-19;review-v2.md 两次独立只读审阅)
|
||||
- 对应里程碑:项目身份与成员协作闭环 + 业务能力联动 + 同项目两树一网完全共享
|
||||
|
||||
## 需求分析
|
||||
|
||||
| ID | 描述 | 项目符合度及依据 | 优先级 | 验收条件 | 依赖 | 结论 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| R1 | 待填写 | 待评估 | 待定 | 待定义 | 待确认 | 待评审 |
|
||||
|
||||
## 方案与计划
|
||||
|
||||
- 方案引用:方案 revision 3 `/tmp/iam-role-permission-plan-20261019-sqfu_4g4/plan.md`(R1-R17, KTD1-KTD10, U1-U6, C01-C31)
|
||||
- 实施计划引用:方案 §"Implementation Units" U1-U6 + 本卡 ## 子任务登记 + 子任务各自的卡片
|
||||
- 测试计划引用:方案 §"Verification Contract" C01-C31;分级门禁见仓库根 `policy/delivery.md#层级任务通道与分级门禁`
|
||||
|
||||
## 阶段记录
|
||||
|
||||
| 阶段 | 对象版本 | 状态 | 决策/执行者 | 时间 | 依据 |
|
||||
|---|---|---|---|---|---|
|
||||
| 需求拆解 | 待定 | 待执行 | — | — | — |
|
||||
| 需求评估 | 待定 | 待执行 | — | — | — |
|
||||
| 需求表确认 | 待定 | 待执行 | — | — | — |
|
||||
| 方案设计 | 待定 | 待执行 | — | — | — |
|
||||
| 实施计划 | 待定 | 待执行 | — | — | — |
|
||||
| 实施与自检 | 待定 | 待执行 | — | — | — |
|
||||
| 正式测试与验收 | 待定 | 待执行 | — | — | — |
|
||||
| 代码 Review | 待定 | 待执行 | — | — | — |
|
||||
| 合入 | 待定 | 待执行 | — | — | — |
|
||||
| 合入核验与收口 | 待定 | 待执行 | — | — | — |
|
||||
|
||||
## 探索试验与迭代
|
||||
|
||||
| 增量/试验 | 假设 | 范围 | 判断和停止条件 | 授权/决策依据 | 结果 | 变更影响 | 需重审补测 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 待定义 | — | — | — | 待核对 | NOT_RUN | 待评估 | 待评估 |
|
||||
|
||||
## 同步记录
|
||||
|
||||
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|
||||
|---|---|---|---|
|
||||
| 启动 | 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed | 7716b28cfff5200e7cfe9ec75aff5bcd71b234ed | 2026-10-19T02:19:19Z |
|
||||
|
||||
## 证据(Evidence)
|
||||
|
||||
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
|
||||
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|
||||
|---|---|---|---|---|---|
|
||||
|
||||
## 交付调度
|
||||
|
||||
- 调度状态:PR #628 已开但 L1→main 合入被 CI 阻止;调度记录:无
|
||||
- entry_id:PR #628 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/628
|
||||
- attempt_id:无
|
||||
- 窗口执行者:未进入 #518 窗口(CI 全量门禁失败)
|
||||
- 固定候选:无(base/head、组件与相关配置引用实际尝试)
|
||||
- 调度依据:policy/delivery.md#合入调度
|
||||
- 固定后证据:源码外 RECEIPT;实际结果后按授权原样导入和闭合
|
||||
- CI 状态:ci/test(PR base gate 已通过)、ci/test-pg、ci/svc-realcombo 均失败
|
||||
- ci/test 失败原因:Backend `3f4b34a` 预期 `agent-intent=651a2e1 / agent-native=28f3ea7 / agent-squad=11ff3a0 / agent-system-core=0cf0344`,Dev 当前 pin 为 `agent-intent=343b1e6 / agent-native=c348441 / agent-squad=490b0b2 / agent-system-core=1a5ef6b`,pins 不一致
|
||||
- ci/test-pg 失败原因:PostgreSQL+pgvector+Redis 服务未就绪
|
||||
- ci/svc-realcombo 失败原因:SQLite+Redis 服务未就绪
|
||||
|
||||
## 结果与验证
|
||||
|
||||
- 结果:
|
||||
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
|
||||
- 影响与剩余项:
|
||||
|
||||
## 规划进展与下一步
|
||||
|
||||
- 本次推进/剩余:待核对(依据实际成果更新适用方案/规划)
|
||||
- 首选下一任务:待核对(无适用规划、已完成或受阻时如实说明,不虚构任务)
|
||||
- 推荐依据:待填写
|
||||
- 前置条件/待确认:待核对
|
||||
- 预期产物/验收条件:待定义
|
||||
- 重复任务核对:待核对(已有/在途任务、PR 与规划记录)
|
||||
- 启动授权:未授权(建议不自动启动新任务,仍须明确授权)
|
||||
|
||||
## 合入与清理
|
||||
|
||||
- Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
|
||||
- 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
|
||||
- CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
|
||||
- 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
|
||||
- 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
|
||||
|
||||
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
|
||||
```json
|
||||
{
|
||||
"summary_schema": 1,
|
||||
"source": "SELF",
|
||||
"timestamp": "2026-10-19T02:18:03.255518+00:00",
|
||||
"command": "make precheck",
|
||||
"exit_code": 0,
|
||||
"cwd": "/home/weichen/projects/Agent-System-Dev",
|
||||
"before_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"after_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"branch": "main",
|
||||
"target_branch": "main",
|
||||
"target_head": "7716b28cfff5200e7cfe9ec75aff5bcd71b234ed",
|
||||
"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=7716b28cff",
|
||||
"[remote] origin/main=7716b28cff ahead=0 behind=0",
|
||||
"[tree] clean submodules_drift=0 uninit=13",
|
||||
"[warn] 13 个子模块未初始化——构建/测试前需物化(不阻断写入)",
|
||||
"[worktrees] linked=4",
|
||||
"[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] 7716b28cff(完整:7716b28cfff5200e7cfe9ec75aff5bcd71b234ed)",
|
||||
"[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": "00d1d77195cce33daea48c77e35a09b4e92695d9dcd9c53704914f7b9cbe8b26",
|
||||
"receipt_sha256": "8ff8d4dd5f4fe50bf0b779d5de7c989c8eab122babf7bee5ba6237de8640f2af",
|
||||
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/8ff8d4dd5f4fe50bf0b779d5de7c989c8eab122babf7bee5ba6237de8640f2af.json"
|
||||
}
|
||||
```
|
||||
|
||||
## 闭合记录(card-autoclose 回填)
|
||||
|
||||
- 依据:merge ac594c90e536cfb670e94680f045a6c8247a2513(PR #643)已包含于 origin/main,分支成果已落盘;本段为合入后回填。
|
||||
- 合并主题:Merge pull request 'IAM L1 → main: capability-association + single-role-authority + capability-exposure + frontend-auto-discover + 7-canonical-two-trees (U1/U2/U3/U4/U7 + U5-Backend)' (#643) from feature/iam-role-permission-linked-capabilities into main
|
||||
- 归档:随闭合移入 .task/archive/;任务执行期的过程证据见原任务记录与 PR。
|
||||
@@ -0,0 +1,130 @@
|
||||
# permux 独立代码审查(Independent Review)— 2026-10-19
|
||||
|
||||
> 审查者:全新会话(未参与实现),按 `.task/feature-iam-role-permission-linked-capabilities-perm-ux.md` 与本审查任务卡执行独立 Read-Only Review。
|
||||
> 审查对象:Dev 子分支 `feature/iam-role-permission-linked-capabilities-perm-ux`(HEAD 234ce30;起始基线 90317d02);组件 commit `modules/backend @ 4130ad78 = origin/feature/iam-perm-ux-backend`,`modules/frontend @ 46a63f02 = origin/feature/iam-perm-ux-frontend`。
|
||||
> 终态:组合 pin `modules/backend @ 4130ad7 + modules/frontend @ 46a63f0`,6/6 单元(U1–U5 + U6 组合交付)落 Dev 子分支。
|
||||
> 审查范围:组件仓 `origin/main…origin/feature/iam-perm-ux-*` 与 Dev 父仓 `90317d02..HEAD` 的提交范围;只读分析与命令验证,不修改、不暂存、不提交。
|
||||
|
||||
## 结论
|
||||
|
||||
**结论:PASS(附 1 项非阻塞观察、4 项非阻塞建议)**。本任务卡记录的实现范围(permux-U1–U6)符合:
|
||||
- 数据完整性:批量事务原子性、幂等回执、单 epoch、锁序一致;
|
||||
- 验收一致性:C01–C04 / C07–C10 在真实 Backend + 真实 Frontend dist 浏览器活体(8 场景)PASS;C05 / C06 / C11 / C12 / C15 由 store/HTTP 单测覆盖且测试通过;C13 由 L1 U7 交付;C14 由 design-guard + 实现约定 + 窄屏 helper 覆盖;
|
||||
- 权限边界:新增端点门禁与既有 `requireSystemAction` 契约一致;只读预览无副作用;
|
||||
- 设计系统:design-guard 棘轮 7/7 通过(见验证命令 §6.4);
|
||||
- 测试充分性:阻塞项为零;下列非阻塞项不影响目标交付。
|
||||
|
||||
---
|
||||
|
||||
## 验证命令与结果(仅读、未写)
|
||||
|
||||
| 命令 | 目的 | 结果 |
|
||||
|---|---|---|
|
||||
| `GOWORK=off go test -count=1 ./internal/authz/... ./internal/store ./internal/server -run "Role\|Policy\|Binding\|AccountSearch\|Batch\|CopyAssign\|Members\|Preview\|Catalog\|System"` | Backend 角色/权限/分配/预览/复制/成员/目录 store+server 单测(覆盖 permux-U1/U2/U6 范围与 409/幂等/版本/批上限/复制联动负控) | `ok agent-system-backend/internal/authz/catalog`、`ok agent-system-backend/internal/store 1.325s`、`ok agent-system-backend/internal/server 3.737s` |
|
||||
| `npx vitest run test/design-guard.test.ts` | DESIGN.md §11 棘轮(动效唯一所有者、裸色值、行内字号、`<details>`) | 7/7 PASS,0.127s |
|
||||
| `npx vitest run test/role-permissions.test.ts test/role-permissions-ui.test.ts test/role-members.test.ts test/permission-explanations.test.ts test/account-users-panel.test.ts test/design-guard.test.ts` | Frontend permux-U3/U4/U5 单元测试 + 跨页选择/重放/草稿基线/成员过滤/设计守护 | 53/53 PASS,0.460s |
|
||||
|
||||
注:`make test` 全量未跑(任务卡「范围纪律」要求);上述过滤后直接检查与实现范围对齐。
|
||||
|
||||
---
|
||||
|
||||
## 重点审查逐项
|
||||
|
||||
### 重点 1 — Backend 批量事务原子性与锁序
|
||||
|
||||
| 子项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| 批量事务原子性(PatchRolePermissionsBatch / AssignUserRolesBatch / CreateRoleCopyAndAssign) | PASS | 三个批量写共用 `policyWriteBatch`,事务内任意错误 `defer tx.Rollback()` 回滚;`PatchRolePermissionsBatch` 通过循环 `patchRolePermissionsTx` 后再统一 `UPDATE authority_state` 推进 epoch,单一幂等回执(`role_policy.go:1078-1095`、`1087-1095`);`AssignUserRolesBatch` 先遍历所有 item 完成 `checkRoleAssignmentTx` 预校验,再 rebind,最后 `checkCapabilityAssociationTx` + `UPDATE authority_state`(`role_policy.go:1078-1095`、`1086-1109`);`CreateRoleCopyAndAssign` 三步(source 校验 → patch 插入 → assign 事务)共用同一 tx(`role_policy.go:1335-1398`)。负控:`TestBatchPatchRolePermissionsStaleLimitAndIdempotency` 验证陈旧版本整批不写、批上限 21、角色重复;`TestBatchAssignUserRolesRejectsWholeBatch` 验证陈旧成员/停用用户/缺失用户/停用角色/重复用户/101 人都整批拒绝;`TestCopyAssignRejectsWithoutResidue` 验证名称重复/源陈旧/用户陈旧/无效 override/101 人/缺 `roles.assign` 全部 0 残留;`TestCopyAssignCreatesRoleAndBindsAtomically` 验证成功路径源角色不变、绑定生效、幂等回执。 |
|
||||
| 单次 epoch 推进 | PASS | 所有写路径共用 `UPDATE authority_state SET authority_epoch=epoch+1 WHERE authority_epoch=epoch`,陈旧时 `RowsAffected()!=1` 返回 `ErrRolePolicyVersion` / `ErrConflict`。`TestBatchAssignUserRolesRebindsAndReplays` 断言 `batch.AuthorityEpoch==epoch+1` 且重放不再推进(`role_policy_test.go:1107-1115`)。 |
|
||||
| 幂等回执(同键异 payload 拒绝) | PASS | `replayReceipt` 比较 `operation` + `requestHash`,同键异 payload 返回 `ErrConflict`(`role_policy.go:435-455`)。`TestRolePolicyIdempotencyKeyCannotChangeRequest` 验证 `ReplaceRolePermissions`;`TestBatchAssignUserRolesRebindsAndReplays` 验证批路径;`TestBatchPatchRolePermissionsStaleLimitAndIdempotency` 验证 `batch_patch`。 |
|
||||
| policyWriteBatch 锁序(用户 → authority_state → 角色行) | PASS | `policyWriteBatch` 先 `lockAccountUsers(tx, owners...)`(owner 排序),再 `tx.QueryRow(...authority_state...) FOR UPDATE`(PG)或事务写锁(SQLite),再调 fn(`role_policy.go:240-292`)。`patchRolePermissionsTx` 内 `roleTx(item.RoleID, true)` 取 FOR UPDATE(`role_policy.go:227-237`)。fn 内不再加用户锁,符合"fn must not lock further users, and policyWriteBatch is not reentrant"契约(`role_policy.go:240-243`)。`TestAssignUserRoleConcurrentExpectedVersionAllowsOne` 验证同 actor 不同角色的并发只允许一方成功(`role_policy_test.go:65-99`)。 |
|
||||
| 政策锁后补锁用户 | 不存在 | fn 中所有用户相关写都基于 fn 入参 `targets`(已在 policyWriteBatch 入参时按 owner 序加锁),不再二次锁;`AccountDirectoryRevision` 等读面用独立只读 tx(`role_policy.go:1420-1476`)。 |
|
||||
|
||||
### 重点 2 — patch 模式预览与批量提交语义一致性
|
||||
|
||||
| 子项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| 同一源 merge 函数(preview / commit) | PASS | `previewRolePermissionsTx` 在 `item.Mode=="patch"` 时调用 `mergeRolePermissionPatch(state.roles[role.RoleID], current, next)`(`role_policy.go:718-723`);`patchRolePermissionsTx` 调用 `mergeRolePermissionPatch(previous.roles[role.RoleID], current, patch)`(`role_policy.go:1250`);两路径共用同一函数(`role_policy.go:1168-1207`),预览看到的合并结果与提交落库结果一致。 |
|
||||
| replace 路径回归风险 | PASS | Frontend `previewRoleBatch` 固定传 `mode: 'patch'`(`RolePermissionsPanel.tsx:96`),HTTP 预览请求体含 `mode:"patch"`(`api.ts:143-145`);Frontend 不再以 `replace` 模式走批量事务。replace 模式仍由 `replaceRolePermissions` 单角色端点支持(`roles.go:103-117`、`role_policy.go:470-548`),未受 patch 改动回归。`TestPreviewRolePermissionsReplaceModeKeepsReplaceSemantics` 与 `TestRolePermissionPreviewPatchModeOverHTTP` 显式锁定两条路径语义。 |
|
||||
| 旧项目 settings 关闭迁移文案 | PASS | `projectCreateDisabledPreviewNote` / `projectCreateDisabledNote` 在 disable patch 时给出中文说明(`role_policy.go:611-619`、`1825-1829`),`mergeRolePermissionPatch` 额外把 `current` 中存在但 patch 未列出的联动项加入 `plan.kept`(`role_policy.go:1192-1200`),保证 disable 后的 `KeptLinkedActions` 与 receipt 一致。`TestPreviewRolePermissionsReplaceModeKeepsReplaceSemantics`、`TestCapabilityAssociationDisablingProjectCreateKeepsLinkedRows` 验证。 |
|
||||
|
||||
### 重点 3 — 前端多角色草稿隔离 / 统一保存 / 409 rebase / 跨页选择 / 复制并分配
|
||||
|
||||
| 子项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| 按 roleId 草稿隔离 | PASS | `RoleDraftMap = Record<string, RoleDraft>`(`RolePermissionsPanel.tsx:25-26`);`editRoleDraft` 仅写 `drafts[role.roleId]`,跨角色互不污染(`RolePermissionsPanel.tsx:74-78`);`roleCellValue`、`rolePatchEntries` 按 role 独立取基线(`rolePermissions.ts:74-78`、`97-103`);`dirtyRoles` 仅列出 dirty role。`test/role-permissions.test.ts:79-90` 与 `test/role-permissions-ui.test.ts:44-58` 验证。 |
|
||||
| 统一保存 | PASS | `previewRoleBatch` + `commitRoleBatch` 是唯一写入口(`RolePermissionsPanel.tsx:95-106`);`confirmSave` 先以 `entries = patchEntries()` 调用,再 `setDrafts` 删除已保存角色(`RolePermissionsPanel.tsx:545-555`)。`TestRolePermissionUI.saves every dirty role through one authoritative preview and one batch commit` 验证两角色 dirty 时只发一次预览与一次提交。 |
|
||||
| 409 rebase(按角色独立重放本地变化) | PASS | `rebaseRoleDrafts` 并行 `getRole(roleId)`,逐角色调用 `rebaseRoleDraft`(`RolePermissionsPanel.tsx:111-121`);`rebaseRoleDraft` 复制 `serverValues`,仅在本地相对 `baseline` 变化时回放(`rolePermissions.ts:60-71`)。`test/role-permissions.test.ts:44-58` 与 `test/role-permissions-ui.test.ts:87-103` 验证。`rebaseRoleDrafts` 在 409 路径中被调用并设 `setPreview(null)`(`RolePermissionsPanel.tsx:558-563`)。 |
|
||||
| 跨页选择模型(筛选不扩大集合) | PASS | `MemberSelection.ids` 仅来自逐个勾选或 `selectPage`,搜索/状态/翻页均不动 `selection.ids`(`roleMembers.ts:5-30`)。`selectPage(checked=true)` 只追加本页 id,不覆盖;`selectPage(checked=false)` 只移除本页 id,不动其他页。`test/role-members.test.ts:50-62` 显式断言"搜索变化 / 翻页不扩大集合"。 |
|
||||
| 复制并分配(显式命名 + 权限来源) | PASS | `copyAssignRequest` 强制 `name.trim() != ''`、拒绝空 users 列表(`roleMembers.ts:107-115`);overrides 仅含相对 source 的差异项(`roleMembers.ts:118-130`);后端 `CreateRoleCopyAndAssign` 同步校验(`role_policy.go:1335-1398`),受保护动作不进副本(`role_policy.go:1395-1404`),新角色与源角色完全独立维护(`TestCopyAssignCreatesRoleAndBindsAtomically`)。权限来源(roleId/roleVersion)由 `source` 字段强制随请求传递且 `expectedRoleVersion` 不匹配返回 `ErrConflict`。 |
|
||||
|
||||
### 重点 4 — 无障碍与设计守护(design-guard 棘轮)
|
||||
|
||||
| 子项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| design-guard.test.ts 7 项 | PASS | `npx vitest run test/design-guard.test.ts` → `Test Files 1 passed (1), Tests 7 passed (7), Duration 127ms`。覆盖:DESIGN.md 宪法在位、动效唯一所有者、styles.css 裸色值基线、分层组件 CSS 裸色值、组件 TSX 裸色值、组件 TSX fontSize 数值字面量、组件 TSX 无 `<details>` 折叠。 |
|
||||
| 新样式是否会破坏棘轮 | PASS | 本次新增样式集中在 `styles.css`(`.rp-` 与 `.au-` 前缀类,见 `styles.css:519-580` 与 `597-601`)。所用色全部来自 `var(--*)` 令牌,字体使用 `var(--fs-ui-*)`,唯一裸色字面量 `#0e1116 / #101826 / #0b1f38 / #dfe4f2`(行 448)属 HEX_BASELINE_STYLES 已登记的登录品牌面板;无 `@keyframes`,新增 transition 仅出现在 styles.css(设计守护本文件豁免);新 TSX 文件(`RolePermissionsPanel.tsx`、`AccountUsersPanel.tsx`)无裸色字面量、无 fontSize 数值字面量、无 `<details>` 折叠——以 `@ui` Collapsible 替代(`RolePermissionsPanel.tsx` 全文件 `grep "<details" 0 hits`,同上 `AccountUsersPanel.tsx`、`adminRdmSections.tsx`)。 |
|
||||
| 可访问性(焦点、aria、键盘) | PASS(非阻塞观察下补充) | 矩阵表头 `aria-pressed`、分组 `role="region" aria-label="..."`、单元格 `aria-label="角色名 权限名"`、保存栏 `role="region" aria-label="未保存的权限修改"`、离开守卫 `roleDraftLeaveGuard`(`RolePermissionsPanel.tsx:21,425-435`),`AdminZone.tsx:107` 引用并把守卫返回 `false` 当作取消。键盘焦点:保存/收起按钮 `ref={savePermsRef}` 在 `restoreFocus` 中归还到 `savePerms` 或 `status`(`RolePermissionsPanel.tsx:466-475`)。`test/role-permissions-ui.test.ts:105-110` 断言离开守卫列出每个 dirty role 名。 |
|
||||
|
||||
### 重点 5 — 测试充分性 vs 验收场景 C01–C10 / C15
|
||||
|
||||
| 验收场景 | 覆盖位置 | 结论 |
|
||||
|---|---|---|
|
||||
| C01–C02 多角色矩阵编辑(跨分类与搜索保留草稿、一次提交) | `e2e/iam-perm-ux-live.playwright.ts:172-229`(活体真实服务)+ `test/role-permissions.test.ts:44-62` 与 `test/role-permissions-ui.test.ts:61-86`(重放语义) | PASS |
|
||||
| C03 创建联动(开启 project.create 补齐 4 项 /api/me 联动生效) | `e2e/iam-perm-ux-live.playwright.ts:231-265`(含 admin-grant 用户登入 + `linkedCapabilities.projectCreate=true`+ 4 个 actions 断言) | PASS |
|
||||
| C04 断链拒绝(创建项目开启时联动项不允许不可保存) | `e2e/iam-perm-ux-live.playwright.ts:267-303`(含 409 / roleVersion 不变 / permKey 不变断言) | PASS |
|
||||
| C05 / C06 / C11 / C12 关闭未来创建 / 浏览器层迁移 / 收据回放负控 | `TestCapabilityAssociationDisablingProjectCreateKeepsLinkedRows`、`TestCapabilityAssociationRejectsExplicitConflictAtomically`、`TestRolePolicyIdempotencyKeyCannotChangeRequest`、`TestReplaceRolePermissionsIsAtomicAndIdempotent`、`TestBatchPatchRolePermissionsStaleLimitAndIdempotency`、`TestBatchAssignUserRolesRebindsAndReplays` | PASS(store/HTTP 已覆盖,浏览器层未重复) |
|
||||
| C07 同名辨识(按账号辨识) | `e2e/iam-perm-ux-live.playwright.ts:305-331` + `test/role-members.test.ts:38-48` | PASS |
|
||||
| C08 批量分配(两人预览 → 一次提交) | `e2e/iam-perm-ux-live.playwright.ts:333-354` + `TestBatchAssignUserRolesRebindsAndReplays` | PASS |
|
||||
| C09 409 整批不写且保留选择 | `e2e/iam-perm-ux-live.playwright.ts:356-387`(含保留选择 `已选 2 人` + 角色回退断言) | PASS |
|
||||
| C10 复制并分配(独立维护) | `e2e/iam-perm-ux-live.playwright.ts:389-419`(含源 roleVersion/permKey 不变、bindingCount-1) | PASS |
|
||||
| C13 成员共享读取 / C16 日常实例采用 | 依赖 L1 U7;C16 未授权部署 → 任务卡 NOT_RUN | 非阻塞,按任务卡记录处置 |
|
||||
| C14 键盘/读屏人工走查 | 由 design-guard + 实现约定 + 窄屏 helper 单测覆盖;人工走查未执行 | 非阻塞,按任务卡 NOT_RUN 处置 |
|
||||
| C15 幂等 / 超额负控 | `TestBatchAssignUserRolesRejectsWholeBatch`(101 人、停用、缺失、停用角色、重复用户)、`TestCopyAssignRejectsWithoutResidue`(101 人、缺 `roles.assign` 等) | PASS |
|
||||
|
||||
无负控缺失阻塞项。
|
||||
|
||||
### 重点 6 — 安全与权限边界
|
||||
|
||||
| 子项 | 结论 | 依据 |
|
||||
|---|---|---|
|
||||
| 新增端点门禁(view / manage / assign) | PASS | `roles.go:130`(`POST /api/admin/roles/permissions/preview`)→ `system.permissions.view`;`roles.go:156`(`POST /api/admin/roles/permissions/batch`)→ `system.permissions.manage`;`roles.go:200`(`POST /api/admin/users/role-assignments`)→ `system.roles.assign`;`roles.go:217-223`(`POST /api/admin/users/role-assignments/preview`)→ `system.users.view` AND `system.roles.view`;`roles.go:240-249`(`POST /api/admin/roles/copy-assign`)→ 三动作全部 `system.roles.manage` + `system.permissions.manage` + `system.roles.assign`;`account_search.go:248-263`(`GET /api/admin/roles/{roleId}/members`)→ `system.users.view` AND `system.roles.view`。HTTP 层 `requireSystemAction` → store 层 `requireSystemActionTx`(同一 tx 内重新判定)`role_policy.go:1692-1720`,与既有 requireSystemAction 契约一致。`TestSystemUserActionsDoNotImplyRoleOrPermissionManagement`、`TestDelegatedUserActionsReachTransactionalStoreChecks`、`TestRolePermissionPreviewRequiresPermissionViewOverHTTP`、`TestBatchRoleAssignmentPreviewAndCommitOverHTTP`、`TestCopyAssignRoleOverHTTP`、`TestRoleMembersFilterBeforePagingAndBindCursor` 均覆盖门禁。 |
|
||||
| 成员目录最小信息 | PASS | 新端点 `GET /api/admin/roles/{roleId}/members` 仅返回 `RoleMember`(userId, owner, name, enabled, stateVersion, assignedAt, bindingVersion,`role_policy.go:1035-1045`),不含 profile.contact/isAdmin/凭据等。`TestRoleMembersFilterBeforePagingAndBindCursor` 末尾断言响应不包含 `profile` / `isAdmin`。光标绑定 role + filter + actor + directory revision,无法跨角色/参数复用(`account_search.go:296-307`)。 |
|
||||
| 预览只读无副作用 | PASS | `PreviewRolePermissions` 与 `PreviewUserRoleAssignments` 用 `tx.Begin()` + `defer tx.Rollback()`,无 `tx.Commit()`(`role_policy.go:665-686`、`1126-1159`)。`TestPreviewRolePermissionsIsReadOnly` 三组变更前后快照比对,断言 `roleVersion/epoch/receipts/permissions` 完全一致。`TestRolePermissionPreviewRequiresPermissionViewOverHTTP` 显式断言 viewer 调用 PUT 写端点被拒(`role_authorization_test.go:114-178`)。 |
|
||||
| 用户列表 search 端点最小信息 | 部分(详见非阻塞建议) | `GET /api/admin/users/search` 仍返回完整 `accountProfileJSON`(含 phone/email/staffNo/department/notes/isAdmin/initializationState),但 `searchAdminUsers` 在 actor 额外拥有 `system.roles.view` 时追加 `role` 投影(`account_search.go:194-237`);本任务用此端点做批量分配 picker 时无可避免看到全 profile(仅用于选定人员),非新增行为,非本任务评审焦点。 |
|
||||
| 受保护动作不可降级到角色矩阵 | PASS | `normalizePermissionChanges` 在 `descriptor.Protected=true` 时拒绝写入(`role_policy.go:566-569`),`TestCatalogRejectsUnknownAndProtectsManagementActions` 验证所有 `system.*` 管理动作 `Protected=true`。前端 `catalog.filter(item => !item.protected)`(`RolePermissionsPanel.tsx:521`)从矩阵排除这些动作。 |
|
||||
|
||||
---
|
||||
|
||||
## 非阻塞建议(不阻塞 PR 合入;可作为后续增量)
|
||||
|
||||
1. **跨角色 row-lock 顺序与 deadlock**:`PatchRolePermissionsBatch` / `AssignUserRolesBatch` / `CreateRoleCopyAndAssign` 内对角色行 `FOR UPDATE` 的顺序由请求 `items` 切片决定,未按 roleID 排序。`policyWriteBatch` 仅对 actor + target users 按 owner 排序;跨 actor + 跨事务的不同 `items` 顺序理论上可能触发 PG 死锁检测(事务回滚,非数据损坏)。建议:批量入口按 roleID 升序排序 `items` 后再入 fn,或由 `policyWriteBatch` 在 fn 之前排序 items。非阻塞,仅在极高并发 + 不同顺序组合下产生瞬时回滚。
|
||||
|
||||
2. **`searchAdminUsers` 返回完整 profile**:批量分配 picker 在选择用户时不需要 `phone / email / staffNo / department / notes / isAdmin / passwordSet / initializationState`;可考虑按 view 端点(`system.users.view`)与 assign 端点(`system.roles.assign`)返回裁剪字段,或新增 `fields` 显式控制响应字段(现有 `fields` 仅控制过滤字段)。非阻塞,属既有端点行为。
|
||||
|
||||
3. **`roleDraftLeaveGuard.current = null` 在 unmount 时由 effect cleanup 复位**:`RolePermissionsPanel.tsx:431` 的 effect cleanup 会在依赖变化(`dirtyKey` 变化)时立即把 `current` 置 null;这与"新守卫被设置"的顺序是先 set 后清,存在极短的 `current === null` 间隙(毫秒级)。在 AdminZone 返回按钮的 click 期间几乎不会被命中;如需更稳,可改用 `useRef` 直接保存守卫函数 + `useCallback`,避免 effect 驱动的 reset。非阻塞。
|
||||
|
||||
4. **`canManagePermissions` 取 view 失败时不显示空态**:当 `permissionCatalog()` 拒绝时,`load` 会清空 `catalogFailed=true` 并在选中角色之后追加错误(`RolePermissionsPanel.tsx:501-507`)。与原 DR10 备注一致(保留部分失败可见性),实现正确;建议把 `editable` 同步置 `false` 并在 `focus()` 内显式提示当前矩阵不可编辑,以避免在慢网络下"已切换单角色视图 → 单元格短暂可编辑 → catalog 失败回填"造成闪烁。属 UX 微调,非阻塞。
|
||||
|
||||
5. **`PATCH /api/me/profile` 与权限 patch 两条路径的 `adoptRoleSnapshot` 语义**:当 `PATCH /admin/roles/{id}`(资料 / 启停)成功后 `setDrafts(prev => adoptRoleSnapshot(prev, selected.roleVersion, updated))`(`RolePermissionsPanel.tsx:488`)继承新 roleVersion;但权限草稿在资料/启停 patch 之后仍属同一角色 → 同一基线;当前实现对 `adoptRoleSnapshot` 的判定是"当前基线 roleVersion === 期望 roleVersion 时采纳新 row",逻辑正确,仅在资料 patch 与权限 patch 并发时存在 `expectedVersion != 实际 version` 的窗口(被下一次 save 的 409 路径正确处理)。建议在 `adoptRoleSnapshot` 注释中明示"用于 PATCH 后的非权限写成功继承"。非阻塞。
|
||||
|
||||
---
|
||||
|
||||
## 不属于本任务范围(按任务卡 NOT_RUN 处置,未列入阻塞/建议)
|
||||
|
||||
- C13 成员共享读取(依赖 L1 U7)
|
||||
- C14 完整键盘 / 读屏人工走查
|
||||
- C16 日常实例采用(未授权部署)
|
||||
|
||||
---
|
||||
|
||||
## 引用文件位置索引
|
||||
|
||||
- Backend:`.task/feature-iam-role-permission-linked-capabilities-perm-ux.md` → 组件 commit `modules/backend @ 4130ad78`
|
||||
- 关键文件:`modules/backend/internal/store/role_policy.go`、`modules/backend/internal/server/roles.go`、`modules/backend/internal/server/account_search.go`、`modules/backend/internal/authz/catalog/catalog.go`、`modules/backend/internal/authz/service.go`、`modules/backend/pkg/extension/role_policy.go`
|
||||
- 单测:`modules/backend/internal/store/role_policy_test.go`、`modules/backend/internal/server/role_authorization_test.go`、`modules/backend/internal/authz/catalog/catalog_test.go`
|
||||
- Frontend:组件 commit `modules/frontend @ 46a63f02`
|
||||
- 关键文件:`modules/frontend/src/components/RolePermissionsPanel.tsx`、`modules/frontend/src/components/AccountUsersPanel.tsx`、`modules/frontend/src/components/adminRdmSections.tsx`、`modules/frontend/src/rolePermissions.ts`、`modules/frontend/src/roleMembers.ts`、`modules/frontend/src/permissionExplanations.ts`、`modules/frontend/src/api.ts`、`modules/frontend/src/styles.css`
|
||||
- 单测:`modules/frontend/test/design-guard.test.ts`、`modules/frontend/test/role-permissions.test.ts`、`modules/frontend/test/role-permissions-ui.test.ts`、`modules/frontend/test/role-members.test.ts`、`modules/frontend/test/permission-explanations.test.ts`、`modules/frontend/test/account-users-panel.test.ts`
|
||||
- 活体:`modules/frontend/e2e/iam-perm-ux-live.playwright.ts`
|
||||
- Dev 父仓:当前 `feature/iam-role-permission-linked-capabilities-perm-ux @ 234ce30`(基线 90317d02;组合 gitlink `modules/backend @ 4130ad7` + `modules/frontend @ 46a63f0`)
|
||||
+4
-3
@@ -18,8 +18,9 @@ increment host fallback authorizations. Safe exhaustion without an emergency
|
||||
candidate ends `unavailable` or `blocked`, and that result does not authorize
|
||||
the host to write the unit. The legacy value `all-unavailable` remains
|
||||
parseable and likewise grants no host write authority. Cursor uses
|
||||
`cursor-agent-stable`. `model: auto` lets a CLI use its configured default
|
||||
model; any other value is passed to that CLI as its model selector. The
|
||||
`cursor-agent-stable`. `model: auto` makes Cursor receive an explicit
|
||||
`--model auto`; the other CLIs omit the model flag and use their configured
|
||||
default. Any other value is passed to that CLI as its model selector. The
|
||||
`integration` block declares the host-exempt paths and the transport, admission,
|
||||
and cleanup entry points.
|
||||
|
||||
@@ -101,7 +102,7 @@ section records only this project's choices.
|
||||
actual events have reported `minimax-cn` / `MiniMax-M3` and the local
|
||||
offline catalog lists that profile; each run still records the effective
|
||||
model from that run's events.
|
||||
- Cursor: `auto` (Cursor Auto).
|
||||
- Cursor: `auto`, passed explicitly as `--model auto` (Cursor Auto).
|
||||
- agy: Gemini 3.8 Flash is requested, but its exact selectable model ID and
|
||||
effective identity are `NOT_VERIFIED` (the `agy` models query needs a
|
||||
login that was not available). The profile therefore stays `model: auto`
|
||||
|
||||
Vendored
+1
-1
Submodule deps/development-manager updated: 6c019595fa...1e5ee55a28
+1
-1
Submodule modules/backend updated: c8b1b7eb46...8050c6b289
+1
-1
Submodule modules/frontend updated: dab16052cf...d7768d4ea0
+5
-5
@@ -449,14 +449,14 @@ EOF
|
||||
- mock 档不支持;PG 档须有有效 DSN/dbref
|
||||
|
||||
五个子命令(经 scripts/svc.sh <env> user … 转发到实例二进制):
|
||||
scripts/svc.sh <env> user create --owner <login> [--role user|admin] --out <0600新文件>
|
||||
scripts/svc.sh <env> user initialize-account --user-id <稳定ID> --expected-state-version <版本> --expected-generation <代数> --out <0600新文件>
|
||||
scripts/svc.sh <env> user create --owner <login> [--role user|admin]
|
||||
scripts/svc.sh <env> user initialize-account --user-id <稳定ID> --expected-state-version <版本> --expected-generation <代数>
|
||||
scripts/svc.sh <env> user list
|
||||
scripts/svc.sh <env> user revoke-login-key --id <key-id>
|
||||
scripts/svc.sh <env> user bootstrap-admin --owner <login> --out <0600新文件>
|
||||
|
||||
旧 reset-password、issue-login-key 与带初始密码建号已关闭;本人恢复走管理员提案、
|
||||
目标本人已有可信密码会话确认。凭据只写新建的 0600 交付文件,不回显 stdout。
|
||||
旧 reset-password、issue-login-key 入口已关闭;账号由管理员在网页创建并下发初始密码,
|
||||
首次登录后必须修改。忘记密码时由管理员生成一次性口令(POST /api/admin/users/{owner}/one-time-password)。
|
||||
本帮助描述 U3 代码契约;真实账号操作与生产切换须另行授权。
|
||||
更完整说明:docs/svc.md、docs/svc-deploy/u1-instance-account-binding.md
|
||||
EOF
|
||||
@@ -2451,7 +2451,7 @@ agent_do_user() {
|
||||
local a
|
||||
case "${1:-}" in
|
||||
reset-password|issue-login-key)
|
||||
c_err "[$ENV_NAME] RECOVERY_CONTRACT_REPLACED:旧账号重置/签发入口已关闭;使用本人确认的恢复提案"
|
||||
c_err "[$ENV_NAME] RECOVERY_CONTRACT_REPLACED:旧账号重置/签发入口已关闭;请联系管理员生成一次性口令(POST /api/admin/users/{owner}/one-time-password)"
|
||||
return 2 ;;
|
||||
esac
|
||||
for a in "$@"; do
|
||||
|
||||
@@ -39,10 +39,11 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
aliceOwner = "mi_alice"
|
||||
alicePass = "mi-alice-pass-1"
|
||||
rootPass = "mi-root-pass-1"
|
||||
httpWait = 15 * time.Second
|
||||
aliceOwner = "mi_alice"
|
||||
aliceInitialPass = "MiAliceInitPass123!"
|
||||
alicePass = "mi-alice-pass-1"
|
||||
rootPass = "mi-root-pass-1"
|
||||
httpWait = 15 * time.Second
|
||||
)
|
||||
|
||||
type instance struct {
|
||||
@@ -452,28 +453,35 @@ func (e *env) killNine(t *testing.T, inst *instance) {
|
||||
|
||||
// ---- HTTP 客户端 ----
|
||||
|
||||
// loginAlice 引导 alice 账号并发放 API key(CLI 直连测试库;key 存共享 PG,
|
||||
// 对两实例同时有效——程序化验收的首选凭证,SSE 亦可用 ?key= 兜底)。
|
||||
// U3 后本地无密码创建:user create 只签发待激活账号的一次性激活 Key(凭据
|
||||
// 独占落 JSON),redeem 会话进入 grant-setup 改密设 alicePass,完成后再发 Key。
|
||||
// loginAlice 由管理员创建 alice 初始密码账号,再登录并改密后发放 API key
|
||||
// (CLI 直连测试库;key 存共享 PG,对两实例同时有效——程序化验收的首选凭证,
|
||||
// SSE 亦可用 ?key= 兜底)。
|
||||
func (e *env) loginAlice(t *testing.T) *userClient {
|
||||
t.Helper()
|
||||
// 超级管理员 mi-root 已由 serve 启动时的 SUPER_ADMIN_* 建立;这里只建 alice,
|
||||
// 一次性激活凭据独占落临时 JSON。
|
||||
activation := filepath.Join(t.TempDir(), "activation.json")
|
||||
e.cliIn(t, e.a.dataDir, "user", "create", "--dsn", e.dbDSN, "--owner", aliceOwner, "--name", "Alice", "--out", activation)
|
||||
activateKey := activationSecret(t, activation)
|
||||
// 超级管理员 mi-root 已由 serve 启动时的 SUPER_ADMIN_* 建立;用 root key 走
|
||||
// admin API 创建 alice(带初始密码)。
|
||||
rootKey := e.cliOut(t, "apikey", "create", "--dsn", e.dbDSN, "--owner", "mi-root", "--name", "mi-acceptance-root-create-alice")
|
||||
root := &http.Client{Timeout: httpWait, Transport: bearerRT{key: rootKey}}
|
||||
e.do(t, root, "POST", "/api/admin/users", map[string]any{
|
||||
"owner": aliceOwner,
|
||||
"profile": map[string]any{
|
||||
"name": "Alice",
|
||||
},
|
||||
"password": aliceInitialPass,
|
||||
}, nil)
|
||||
jar, err := cookiejar.New(nil)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sess := &http.Client{Timeout: httpWait, Jar: jar}
|
||||
// e.uc 尚未赋值 → baseFor 走 A;redeem 会话(grant-setup)直接设 alicePass。
|
||||
e.do(t, sess, "POST", "/api/auth/login-key/redeem", map[string]any{
|
||||
"key": activateKey,
|
||||
// e.uc 尚未赋值 → baseFor 走 A;初始密码登录后会话仅允许改密。
|
||||
e.do(t, sess, "POST", "/api/auth/login", map[string]any{
|
||||
"owner": aliceOwner,
|
||||
"password": aliceInitialPass,
|
||||
}, nil)
|
||||
e.do(t, sess, "POST", "/api/auth/password", map[string]any{
|
||||
"next": alicePass,
|
||||
"current": aliceInitialPass,
|
||||
"next": alicePass,
|
||||
}, nil)
|
||||
|
||||
apiKey := e.cliOut(t, "apikey", "create", "--dsn", e.dbDSN, "--owner", aliceOwner, "--name", "mi-acceptance")
|
||||
@@ -540,22 +548,6 @@ func (b bearerRT) RoundTrip(r *http.Request) (*http.Response, error) {
|
||||
return http.DefaultTransport.RoundTrip(r2)
|
||||
}
|
||||
|
||||
// activationSecret 读 CLI 凭据独占文件里的激活 Key(JSON {"kind","owner","secret"})。
|
||||
func activationSecret(t *testing.T, path string) string {
|
||||
t.Helper()
|
||||
b, err := os.ReadFile(path)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
var v struct {
|
||||
Secret string `json:"secret"`
|
||||
}
|
||||
if err := json.Unmarshal(b, &v); err != nil || v.Secret == "" {
|
||||
t.Fatalf("activation credential unreadable: %v", err)
|
||||
}
|
||||
return v.Secret
|
||||
}
|
||||
|
||||
// cliOut 运行 CLI 并取 stdout 首行(apikey create 的明文仅此一次输出)。
|
||||
func (e *env) cliOut(t *testing.T, args ...string) string {
|
||||
t.Helper()
|
||||
|
||||
Reference in New Issue
Block a user