Merge pull request 'Fix creator member roster roles and removed-member send feedback' (#659) from fix/multiuser-collab-followups into main
ci / svc-realcombo (push) Successful in 4m40s
ci / test-pg (push) Successful in 14m5s
ci / test (push) Successful in 31m54s

This commit was merged in pull request #659.
This commit is contained in:
2026-10-20 15:10:23 +00:00
2 changed files with 200 additions and 1 deletions
@@ -0,0 +1,199 @@
# fix/multiuser-collab-followups 任务卡
任务主记录:PR #659 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/659;状态:已完成(合入前闭合);owner:weichen
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= aa9f98d2e5b8ce36724f881752b0a95a353df987
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups(worktree);分支:fix/multiuser-collab-followups
- 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false
- 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=34037d0f52e27319a94965baaf2ae922e347bbf5ad152b02033ccde16c77540e;triage_receipt=/tmp/rdir/triage.json;receipt_sha256=d3628fadb7432128a57fa1c1415e9c1049a232c47198bad3d98023e5b5a60abf
- 授权与交付终点:用户 2026-10-20 选择"新开任务,两项都修并部署 8788、浏览器复测";终点=Backend/Frontend/RDM/Dev PR 经 Review 与当前 HEAD CI 后合入,8788 备份后部署并浏览器复测通过;路由沿用用户授权(Cursor 额度耗尽→跳过,agy 失败→PI)。未授权:改写历史、分支保护、发布版本。
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
来源:`.task/archive/fix-multiuser-project-collab.md` 复测后续项。
1. 非管理员创建者的成员页角色目录(Backend 权威切换后):
- `rdm.role.options` 400(`RoleList` 走管理员 `RolePolicyAdmin.ListRoles`)→ Backend 新增可选只读能力(启用角色 roleId/name,任一有效账号的受信分发主体可读),RDM `ProjectRoleOptions` 改用;项目动作授权仍由 RDM 判定。
- 成员专业角色显示"—"(`enabledProfRole` 只读本地缓存,其他成员快照未取)→ RDM 经调用者 Host `RolePolicyForOwner` 只读取展示摘要,不写授权缓存。
- "账号目录暂不可用"(成员姓名走仅管理员可用的 EXT-19 `ListAccounts`)→ Backend 账号目录新增 rdm 专用用途 `project.member-roster`(作用域只限 RDM 解析器返回的当前成员、不得 AllCandidates、允许空检索枚举与 status=all),RDM 解析器按成员读取授权返回当前成员,成员清单姓名改用该用途。
2. 被移出项目的成员发送:Backend `POST /api/conversations/{id}/messages` 对本人会话的项目工作授权"不存在"改回 403 `conversation: not-project-member`(不改其他入口的 404 不泄露语义);Frontend 识别后提示"无法继续发送:你已不在该项目中或项目已关闭;历史对话仍可查看",内容保留。
非目标:不改管理员角色管理面、不改成员候选检索/添加语义、不改其他入口的错误码、不做 UI 重设计。
## Agent 实施收据
路由与 fail-stop 规则见根目录 AGENT-EXECUTION.md 与 policy/delivery.md;每次尝试一行,原始日志留在源码外收据路径。
| 单元 ID | 预期范围 | 配置摘要 | 角色 | 候选顺序 | attempt | CLI/模型 | 终态 | transport | fallback | 源码外收据路径 |
|---|---|---|---|---|---|---|---|---|---|---|
| rdir-backend-role-options-roster-send | Backend `pkg/extension`、`internal/app`、`internal/server`:RoleOptionsProvider、project.member-roster、移出成员发送 403 | AGENT-EXECUTION.md | implementation | Cursor→agy→PI(用户授权:Cursor 额度耗尽、agy 不可用,均 unavailable) | PI run1 | PI(MiniMax-M3) | success(host Review 通过) | 612e044(已 apply)→ [Backend #228](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/228) merge ed956a4 | 否 | /tmp/rdir/be-receipt.json |
| rdir-frontend-removed-member-send | Frontend `src/store.ts` + test:not-project-member 专用提示 | 同上 | implementation | 同上 | PI run1 | PI | success(host Review 通过) | 9f7f4a1(已 apply)→ [Frontend #121](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/121) merge e4cd8f1 | 否 | /tmp/rdir/fe-receipt.json |
| rdir-rdm-creator-role-directory | RDM `member_search.go`、`accountdir*.go`、`dirscope.go`、pins backend/frontend:角色选项改走 RoleOptionsProvider、专业角色展示、成员姓名走 roster 用途 | 同上 | implementation | 同上 | PI run1 | PI | blocked(启动前:pins gitlink 未在规范检出初始化,未启动 CLI) | 无 | 否 | /tmp/rdir/rdm-receipt.json |
| rdir-rdm-creator-role-directory-r2 | 同上(初始化 pins 后以新单元 ID 重跑) | 同上 | implementation | 同上 | PI run1 | PI | success(host Review 通过) | 2a42673(已 apply)→ [RDM #456](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-RDM/pulls/456) merge ed3a0f9 | 否 | /tmp/rdir/rdm2-receipt.json |
| rdir-dev-repin-backend-frontend | Dev gitlink `modules/backend`→ed956a4、`modules/frontend`→e4cd8f1 | 同上 | implementation | 同上 | PI run1 | PI | success | 9c28a17(已 apply) | 否 | /tmp/rdir/devpin-receipt.json |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | aa9f98d2e5b8ce36724f881752b0a95a353df987 | aa9f98d2e5b8ce36724f881752b0a95a353df987 | 2026-10-20T11:50:50Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
## 结果与验证
- 结果:两项后续均已修复并部署 8788(备份 20261020T123051Z 后 `svc.sh dev deploy --from rdm@ed3a0f9`)。
- 验证:
- Dev `make test`(本分支 9c28a17 组合)exit 0(SELF,证据块见下方)。
- 组件 CI(GATE,PR head):Backend 612e04402ddaae77bcbc6489d7dc48d477670f96 vet-and-test run 4478 + governance run 4479 success;Frontend 9f7f4a164b09766c872d4cdf063aafb949a7525f test-and-build run 4474 + governance run 4475 success;RDM 2a4267337aa6dc209f0ddd0ebe5bbecbb69439b2 build-and-test run 4492 + governance run 4493 success。
- 8788 浏览器复测(SELF,Playwright,截图 /tmp/rdir/rt/r01–r05)PASS:非管理员创建者 vf-alice 成员页显示专业角色筛选(4 个启用角色)、bob 专业角色显示"复测成员"、无"账号目录暂不可用"、无 API 错误,按"复测成员"筛选得 1 人;vf-carol 被移出后从仍打开的会话发送 → 后端 403 `conversation: not-project-member`,界面提示"无法发送:你已不在该项目中或项目已关闭,内容已保留",无通用"发送未成功",草稿保留。
- 复测后 vf-alice/vf-bob/vf-carol 已重新停用,临时密码与浏览器会话文件已删除。
- 影响与剩余项:非阻塞简记——无项目账号加载时 `GET /api/projects/surfaces` 返回 404(控制台噪音,不影响功能)。
## 合入与清理
- Review 记录:host(当前主模型,独立于 PI 实施会话)审阅 Backend 612e044、Frontend 9f7f4a1、RDM 2a42673、Dev 9c28a17 的实际 diff 与测试:通过,无阻塞项。
- 冲突记录:各组件 PR 基于最新 main,无冲突;Dev 分支同步见同步记录。
- CI 记录:组件 PR HEAD 的 GATE 结果见"结果与验证";Dev PR 以 `make ci-wait` 核验当前 HEAD。
- 合入记录:[Backend #228](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Backend/pulls/228)→ed956a4;[Frontend #121](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Frontend/pulls/121)→e4cd8f1;[RDM #456](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-RDM/pulls/456)→ed3a0f9(均以 head_commit_id 核验后合入 main);Dev PR 见任务主记录。
- 清理记录: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-20T11:48:06.912214+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev",
"before_head": "aa9f98d2e5b8ce36724f881752b0a95a353df987",
"after_head": "aa9f98d2e5b8ce36724f881752b0a95a353df987",
"branch": "main",
"target_branch": "main",
"target_head": "aa9f98d2e5b8ce36724f881752b0a95a353df987",
"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=aa9f98d2e5",
"[remote] origin/main=aa9f98d2e5 ahead=0 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[worktrees] linked=4",
"[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] aa9f98d2e5(完整:aa9f98d2e5b8ce36724f881752b0a95a353df987)",
"[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": "fca750cab8af9f00ee06d28a9513288c7be9beaeda66843a076313b0352e9b8e",
"receipt_sha256": "6e54ff03616e76c7e9f484fbf6913a447043a4311f5f9f25ac98be99753f141d",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/6e54ff03616e76c7e9f484fbf6913a447043a4311f5f9f25ac98be99753f141d.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-20T12:28:21.313639+00:00",
"command": "make test",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups",
"before_head": "9c28a173139823b85abfe27a87409ace691760a5",
"after_head": "9c28a173139823b85abfe27a87409ace691760a5",
"branch": "fix/multiuser-collab-followups",
"target_branch": "main",
"target_head": "873e957306a791eaa36e5251b45e3ed44a863143",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"added 162 packages in 865ms",
"",
" RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups/modules/ui",
"",
"",
" Test Files 19 passed (19)",
" Tests 187 passed (187)",
" Start at 12:35:40",
" Duration 1.71s (transform 1.52s, setup 0ms, import 3.48s, tests 3.94s, environment 6.46s)",
"",
"knip unused exports 61 <= 61",
"cd deps/agent-command && go vet ./... && go test -count=1 ./...",
"ok \tagent-command\t0.002s",
"ok \tagent-command/conformance\t0.001s",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups'"
],
"output_sha256": "7a0152745a64d99399bda3ca3a0b4718ec33e5a0e1aabfbb742d9833554cbf41",
"receipt_sha256": "b393cb6d303e5f92720ae1a20f22eab5a7af1ac7f145ae6dc6640bf9956ad07d",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/b393cb6d303e5f92720ae1a20f22eab5a7af1ac7f145ae6dc6640bf9956ad07d.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-20T12:30:00.628700+00:00",
"command": "make test",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups",
"before_head": "9c28a173139823b85abfe27a87409ace691760a5",
"after_head": "9c28a173139823b85abfe27a87409ace691760a5",
"branch": "fix/multiuser-collab-followups",
"target_branch": "main",
"target_head": "873e957306a791eaa36e5251b45e3ed44a863143",
"root_target": "main",
"immediate_target": "main",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "3dff520d5ae58e4708e86bb6bc0c5835bb4dcd71171e71e4ec72dd14c3bb4cb0",
"output_tail": [
"added 162 packages in 1s",
"",
" RUN v4.1.11 /home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups/modules/ui",
"",
"",
" Test Files 19 passed (19)",
" Tests 187 passed (187)",
" Start at 12:37:22",
" Duration 1.95s (transform 1.82s, setup 0ms, import 4.29s, tests 4.47s, environment 8.53s)",
"",
"knip unused exports 61 <= 61",
"cd deps/agent-command && go vet ./... && go test -count=1 ./...",
"ok \tagent-command\t0.002s",
"ok \tagent-command/conformance\t0.002s",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-fix-multiuser-collab-followups'"
],
"output_sha256": "6e8bc51b1f3c52ce09b4190798402fb0caee24a0039fcd59e9920b3820af3d60",
"receipt_sha256": "21b110da39b1157e849b5ce920e6c10b84c81025de9fe6083ae7cdb53e8ac237",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/21b110da39b1157e849b5ce920e6c10b84c81025de9fe6083ae7cdb53e8ac237.json"
}
```
| 同步(记录前对象) | 886283a4a534de8c418fa4a60d2d7a5d15c0ccfb | 61912e5504ebbbe904b758106d6a2662a90848cd | 2026-10-20T12:57:09Z |
## 闭合记录(合入前折叠)
- 本卡在 PR #659(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/659)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。
| 同步(记录前对象) | daf02880bb0aff82c2c127bbc9473b680f429907 | 55ee4c9a3d83e8c59e7c602771d9902e23ef6f02 | 2026-10-20T13:21:53Z |
| 同步(记录前对象) | 556201541c9a98f34fdad860cfad886af069279d | 83769b48db21f5da5f85e9fdf961185baf355ff6 | 2026-10-20T14:05:13Z |
| 同步(记录前对象) | 7e19cf3e182b566bdc48a7e690e44ff11b4ab33c | 51617e0bc5dbf1c44412afb96735b4be3e588292 | 2026-10-20T14:31:29Z |
| 同步(记录前对象) | ed3847c85ce111a74f0cb100908abfb40f62db07 | 3c5a4bf8ff2be7f960b8f3b435d6213637314644 | 2026-10-20T14:47:48Z |