U1: restrict role permissions to project access with R13 gate split #637

Merged
weichen merged 9 commits from feature/project-access-lifecycle-u1-role-project-access into feature/project-access-lifecycle 2026-10-19 16:21:47 +00:00
3 changed files with 246 additions and 2 deletions
@@ -0,0 +1,244 @@
# feature/project-access-lifecycle-u1-role-project-access 任务卡
任务主记录:PR #637 https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/637;状态:已完成(合入前闭合);owner:weichen
- 权威仓:ssh://git@git-ssh.u1680832.nyat.app:31411/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= 3e70d76a20a6caf6f2edfd738a86f501c31064b6
- 工作区:/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access(worktree);分支:feature/project-access-lifecycle-u1-role-project-access
- 分支类型:child;initiative_id:feature-project-access-lifecycle;root_target:main;immediate_target:feature/project-access-lifecycle;accepting_requirements:false;parent_branch:feature/project-access-lifecycle;parent_head_sha:a8557f27ed8a1708f814539d7161364daea15dd5;parent_pr:无;parent_source:origin
- 需求分流:免(父 initiative 子任务登记已列出 feature/project-access-lifecycle-u1-role-project-access;parent_head_sha=a8557f27ed8a1708f814539d7161364daea15dd5)
- 授权与交付终点:<本次允许的动作与终点;未授权事项写明>
- 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)
- 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)
- 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)
- 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)
## 目标与非目标
<预期结果、受影响入口/模块/契约;明确不做什么。>
## 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 | — |
| pal-u1a Backend | 角色权限收窄为项目访问布尔 + R13 门禁拆分 + 管理员去旁路 + 归一化 | AGENT-EXECUTION digest(见各收据) | implementation | cursor→agy→pi | 4 次运行:scope-expansion(测试文件未授权)、scope-expansion(仓内 scratch)、failed-unknown(cursor 网络中断)、success | cursor(success 次为 cursor,session not-observable) | success | 已应用 cf9c35a(c8b1b7e→cf9c35a) | never | /tmp/pal-u1a-run.json、run2、run3、run4.json |
## 同步记录
| 节点 | sync_base_sha | tested_head_sha | checked_at |
|---|---|---|---|
| 启动 | 3e70d76a20a6caf6f2edfd738a86f501c31064b6 | a8557f27ed8a1708f814539d7161364daea15dd5 | 2026-10-19T14:59:41Z |
## 证据(Evidence)
<!-- CMD="<命令>" make evidence 写入;手抄/转写输出视为无效证据(AGENTS.md 证据与验证门禁)。 -->
| 时间(UTC) | 命令 | 被测HEAD | exit | 来源 | sha256(16) |
|---|---|---|---|---|---|
| pal-u1b Frontend | 角色编辑收窄为单项目访问布尔 + R13 门禁(roles.manage)+ 旧模型测试重写 | AGENT-EXECUTION digest | implementation | cursor→agy→pi | 1 | cursor(session not-observable) | success | 已应用 2c19439(dab1605→2c19439) | never | /tmp/pal-u1b-run.json |
## 结果与验证
- 结果:
- 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
- 影响与剩余项:
## 合入与清理
- Review 记录:独立审查(全新 cursor 会话,无 resume,未参与实现;输出存 /tmp/pal-u1-review-output.txt)结论 BLOCKED(1 项):缺计划 U1 第 9 条测试(provider 缺失/不兼容拒绝创建项目);五项重点全部成立。阻塞项已由 repair 修复(transport 03646b5,测试 internal/server/role_authorization_test.go 新增场景并 PASS),闭环依据:修复后过滤套件 ok + make test-affected PASS(/tmp/pal-u1-affected3.json)。另:agent-exec review 路由两次 pi 尝试均未产出报告文件(failed-unknown,收据 /tmp/pal-u1-review-run.json、review2-run.json,工作区已清理),改用上述全新会话方式。(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
- 冲突记录:task-sync 于合入前执行;组合 pin 期间发生一次误配(pins2 将前端回退 dab1605),已由 pins3 纠正为 backend 03646b5 + frontend 2c19439(7519672),组合门禁以终态对象通过。(最新目标同步、冲突处置、组合兼容核验及复审/补测)
- 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-19T14:58:45.588024+00:00",
"command": "make precheck",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle",
"before_head": "a8557f27ed8a1708f814539d7161364daea15dd5",
"after_head": "a8557f27ed8a1708f814539d7161364daea15dd5",
"branch": "feature/project-access-lifecycle",
"target_branch": "main",
"target_head": "3e70d76a20a6caf6f2edfd738a86f501c31064b6",
"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-project-access-lifecycle'",
"[repo] branch=feature/project-access-lifecycle head=a8557f27ed",
"[remote] origin/main=3e70d76a20 ahead=3 behind=0",
"[tree] clean submodules_drift=0 uninit=0",
"[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] 3e70d76a20(完整:3e70d76a20a6caf6f2edfd738a86f501c31064b6)",
"[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-project-access-lifecycle'"
],
"output_sha256": "4dbe19daf89259d609baf4cb3df0a993029edc91d8b1f0889987bd6d74a59761",
"receipt_sha256": "7e8ed3a646ae25996e75763ca1d199723ce86193f84ebea48ed622f7e036d0ee",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/7e8ed3a646ae25996e75763ca1d199723ce86193f84ebea48ed622f7e036d0ee.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-19T15:41:10.347615+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|Catalog|Access|Super\" -count=1 && GOWORK=off go vet ./internal/authz/... ./internal/store ./internal/server && git status --porcelain | wc -l'",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access",
"before_head": "a455919908d8949988aafc7b984c8eb870dcba6d",
"after_head": "a455919908d8949988aafc7b984c8eb870dcba6d",
"branch": "feature/project-access-lifecycle-u1-role-project-access",
"target_branch": "main",
"target_head": "2b7fdc39a1f44163f4766701429d61ffd6926f1a",
"root_target": "main",
"immediate_target": "feature/project-access-lifecycle",
"before_tracked_diff_sha256": "59bad28b181e892816c6c432ef14deb2e178ab05190f808e8dd292fabc33e74f",
"after_tracked_diff_sha256": "59bad28b181e892816c6c432ef14deb2e178ab05190f808e8dd292fabc33e74f",
"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\t4.029s",
"ok \tagent-system-backend/internal/server\t3.266s",
"0"
],
"output_sha256": "3546e0a0a2c49bf4b92853a0b97e746823398a5f19c3f4f028d0ff8f015a4c4d",
"receipt_sha256": "80c009bd4f0750a8be9fc3e6bcf71ed3631645e88f0b7b8210c70a35dff62e81",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/80c009bd4f0750a8be9fc3e6bcf71ed3631645e88f0b7b8210c70a35dff62e81.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-19T15:48:12.454853+00:00",
"command": "sh -c 'cd modules/frontend && npx vitest run test/role-permissions.test.ts test/role-permissions-ui.test.ts test/account-users-panel.test.ts test/design-guard.test.ts 2>&1 | tail -3 && npx tsc -b && echo TSC_OK'",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access",
"before_head": "d2e78d53be5d7a9eb549ee87180685feed385fa9",
"after_head": "d2e78d53be5d7a9eb549ee87180685feed385fa9",
"branch": "feature/project-access-lifecycle-u1-role-project-access",
"target_branch": "main",
"target_head": "2b7fdc39a1f44163f4766701429d61ffd6926f1a",
"root_target": "main",
"immediate_target": "feature/project-access-lifecycle",
"before_tracked_diff_sha256": "79fc127e44f0bcb60eca463a19384c65e9f3a70c781dc2ff72d3395affe9dfae",
"after_tracked_diff_sha256": "79fc127e44f0bcb60eca463a19384c65e9f3a70c781dc2ff72d3395affe9dfae",
"output_tail": [
" Start at 15:48:12",
" Duration 385ms (transform 439ms, setup 0ms, import 634ms, tests 27ms, environment 0ms)",
"",
"TSC_OK"
],
"output_sha256": "9241d526c3f2dac26fbd1d7745047cacdf505c4ddd9f525884f1e5f7aca5d8a9",
"receipt_sha256": "998b331751b5e987ae229d179674ae99af97ac850ed87a496bdc011b8f175495",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/998b331751b5e987ae229d179674ae99af97ac850ed87a496bdc011b8f175495.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-19T15:49:58.382245+00:00",
"command": "sh -c 'umask 0022 && make test-affected'",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access",
"before_head": "ef8d142a8a56984d3d674edf3465e6165152961f",
"after_head": "ef8d142a8a56984d3d674edf3465e6165152961f",
"branch": "feature/project-access-lifecycle-u1-role-project-access",
"target_branch": "main",
"target_head": "2b7fdc39a1f44163f4766701429d61ffd6926f1a",
"root_target": "main",
"immediate_target": "feature/project-access-lifecycle",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"(node:4185712) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"(node:4185778) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"(node:4185713) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"",
" Test Files 49 passed (49)",
" Tests 588 passed (588)",
" Start at 15:50:33",
" Duration 797ms (transform 6.87s, setup 0ms, import 11.31s, tests 1.10s, environment 3ms)",
"",
"knip unused exports 57 <= 58",
"make[2]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access'",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access'"
],
"output_sha256": "a8a060112b3e15dd817d7b66314a5ca89ce0ef1f5cc17edba7a939f1278d79fb",
"receipt_sha256": "e60210ccc7eda17e55ca0c72d4ab7b635e1f45650b5d7eb80ffcaea0e1e3a24f",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/e60210ccc7eda17e55ca0c72d4ab7b635e1f45650b5d7eb80ffcaea0e1e3a24f.json"
}
```
<!-- Local receipt: SELF. Digests detect corruption; they do not authenticate a reviewer or CI. -->
```json
{
"summary_schema": 1,
"source": "SELF",
"timestamp": "2026-10-19T16:08:30.705187+00:00",
"command": "sh -c 'umask 0022 && make test-affected'",
"exit_code": 0,
"cwd": "/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access",
"before_head": "75196728eb462b1e18579e4657ffab84ac54dde2",
"after_head": "75196728eb462b1e18579e4657ffab84ac54dde2",
"branch": "feature/project-access-lifecycle-u1-role-project-access",
"target_branch": "main",
"target_head": "2b7fdc39a1f44163f4766701429d61ffd6926f1a",
"root_target": "main",
"immediate_target": "feature/project-access-lifecycle",
"before_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"after_tracked_diff_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"output_tail": [
"(node:414845) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"(node:414911) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"(node:414846) ExperimentalWarning: localStorage is not available because --localstorage-file was not provided.",
"(Use `node --trace-warnings ...` to show where the warning was created)",
"",
" Test Files 49 passed (49)",
" Tests 588 passed (588)",
" Start at 16:09:04",
" Duration 806ms (transform 7.07s, setup 0ms, import 11.27s, tests 1.17s, environment 4ms)",
"",
"knip unused exports 57 <= 58",
"make[2]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access'",
"make[1]: Leaving directory '/home/weichen/projects/Agent-System-Dev-wt-feature-project-access-lifecycle-u1-role-project-access'"
],
"output_sha256": "6575ab5b5ba1b87a87736b5dec8f2be390bee0f9a6fe499825332e5d2027c53b",
"receipt_sha256": "43973a45aae37e8b5aec60342ac1ddc013b8e292f9044a413272f8d983972ae1",
"receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/43973a45aae37e8b5aec60342ac1ddc013b8e292f9044a413272f8d983972ae1.json"
}
```
## 闭合记录(合入前折叠)
- 本卡在 PR #637(https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/637)合入前闭合并归档,随该 PR 一同合入。
- 该 PR 的合并提交即本任务的落地记录。
- 合入后无需回填,也无需单独的闭合 PR。