Files
Agent-System-Dev/.task/fix-pal-component-delivery-pins.md
T
weichen 0ce8d33875 Record the sync checkpoint
Why: bind the task validation checkpoint to the integration baseline.

Evidence: SELF recursive component checks; sync_base=ccb6dfaa9cdf7e69eb15d7df024dee55f37b8df1; before_record=2af80d6a24bcde0a6da1f091acdb25c7e1e9a1f4.

Impact: task metadata only.

Refs: .task/fix-pal-component-delivery-pins.md
2026-10-21 13:32:30 +00:00

10 KiB
Raw Blame History

fix/pal-component-delivery-pins 任务卡

任务主记录:<PR 链接,交付前填写>;状态:进行中;owner:weichen

  • 权威仓:ssh://git@192.168.3.2:2222/weichen/Agent-System-Dev.git;目标分支:main;R0(initial_base_sha)= a496ea0f02

  • 工作区:/home/weichen/projects/Agent-System-Dev-wt-fix-pal-component-delivery-pins(worktree);分支:fix/pal-component-delivery-pins

  • 分支类型:standalone;root_target:main;immediate_target:main;accepting_requirements:false

  • 需求分流:verdict=NEW;selected_initiative=无;requirement_sha256=5bd167003a0df76cc4ce5252be7b24ce28dbcc9614493a978e3e1b7a8e864dcc;triage_receipt=/tmp/pal-pins-triage.json;receipt_sha256=0f53fa4aab99a9d10ebac3f76c9be1308b4b84b1066a59230f1497bff05e917c

  • 授权与交付终点:<本次允许的动作与终点;未授权事项写明>

  • 交付模式:goal-first(目标、范围和交付终点一次确认;范围内连续推进)

  • 实施执行:agent-per-unit(配置:AGENT-EXECUTION.md)

  • 合入执行:agent(已授权交付范围内,Review 通过、冲突解决且当前 HEAD 的 CI 通过后合入)

  • 流程依据:仓库根目录 policy/delivery.md(归档后仍按仓库根目录定位)

目标与非目标

  • 预期结果:把 PR #634 已合入 Dev main、但未进入交付件的组件内容补齐——Backend 与 RDM 各自合入 main,Dev 推进对应 pin,使 U1–U5 真正进入可部署制品。
  • 已核实基线(合入前):Dev main 钉 modules/backend=dfb31da(不含生命周期内容,差 27 文件/1379 行)、modules/frontend=113103f(即 U6 交付头,随 Dev 交付但未入 Frontend main)、RDM pin c6304224(2026-10-13,落后 RDM main 918 提交,早于 #454)。
  • 非目标:不改 U1–U5 的规格语义;不部署(C16 另起,需 pin 就位后进行);不处理 feature/rdm-two-trees-followup(PR #635)的范围。

决策记录

  • D1(role cap 是否受 R3 carve-out 约束)——用户裁决 2026-10-21,选 A1。 RDM 的 evalPerm 有两层不同的覆盖:role cap(switch 的 RoleReasonCapDenied 与 legacy 的 !defined || !capAllowed)与项目覆盖层(末尾 ps.OverrideFor)。计划 R3 原文只约束后者(原文用词为 per-action member/project overrides)。
    • 裁决内容:只让项目覆盖层不再撤销创建者权威本身授予的权限;role cap 维持现状、继续阻断创建者。覆盖层的「授予」方向也不变。平台上限、账号停用、职位停用、Linked.Conflicts、归档/结项状态守卫、对非创建者的拒绝全部不变。
    • 实现:internal/rdmapp/perms_api.go 的 evalPerm 末尾,creatorGranted := base && relation == perms.RoleOwner && p.CreatedBy == actor && isManagementAction(act);if set && (override || !creatorGranted)。
    • 该裁决曾以「Decision A1」写进 plugins/rdm/system_projects_test.go 的注释,但当时未在任何仓内决策记录中留痕——这是本卡补记的原因。
  • D2(archive/restore 授权门不得被 R3 收敛吞掉)——由计划原文直接决定,非新决策。 U2 第 219 行:「Do not change archive/restore, which remains a separate lifecycle.」故 canManageProject 按 act 分流:ActProjectArchive 沿用 main 的「创建者或显式授权」门,其余走 R3 的 requireProjectManagement。
  • D3(ArchivedAt 守卫必须还原,ClosedAt 不设)——由计划原文与 R6 共同决定。 归档属 Out of scope,main 的只读守卫必须恢复(含创建者);结项属 U4/R6,R6 明文「The creator can still use project-management actions needed to reopen or administer the project.」,故 ClosedAt 刻意不设守卫。
  • D4(平台上限对创建者同样生效)——由领域规则与 SR-G9 决定。 「system.grants 与平台上限写入门禁保持 system.permissions.manage,不得因 R13 放宽」;perms.SetCap 注释「所有业务主体均受约束」;SR-G9 创建者「仍受有效角色与平台 cap」。故 requireProjectManagement 带 act 参数并恢复 CapAllows。

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 —

同步记录

节点 sync_base_sha tested_head_sha checked_at
启动 a496ea0f02 a496ea0f02 2026-10-21T03:47:24Z

证据(Evidence)

时间(UTC) 命令 被测HEAD exit 来源 sha256(16)

组件交付结果(2026-10-21)

组件 状态 依据
Backend ✅ 已进 main(7158bea) 生命周期工作已由 PR #234 合入;Dev 的 backend pin f084d10 已含该提交(他人推进,已核实祖先关系)
RDM ✅ 已进 main(bc8db88) PR #460,五轮独立 Review 终判 PASS,CI 双作业绿
Frontend ✅ 随 Dev 交付 pin 113103f 即 U6 交付头

交付前的真实状态(核实结论)

两个组件的交付分支在自身顶端均为红。Dev 的 make test 一直只测钉住的旧组件,从未测过交付分支——这正是「Dev 全绿但功能不在交付件里」能同时成立的原因。

修复过程中发现并闭合的授权缺陷

编号 内容 性质
B1 canManageProject 被整体替换,archive/restore 授权门被吞;两个 main 测试被反向改写成「获授者也拒绝」并注释「新旧一致」 越界 + 伪装成延续
B2 已归档项目只读守卫丢失,改名/成员增删/override 全放行 越界(计划禁止改 archive)
B3 平台上限失效:管理员 SetCap 关闭后创建者管理写入全部成功,而 member add 被拒、remove 放行 安全天花板被绕过
F1 已结项项目上命令面 member-add 拒绝创建者,直接 API 却放行 自相矛盾(违反 R6)
F2 role cap 只挡 add 不挡 remove/suspend/reactivate 口径不一致
F3 render-profile 族允许非创建者凭 owner 标签或显式覆盖行使 project.settings 违反 R3

结构根因:R3 把管理路径从 evalPerm 迁到 requireProjectManagement 时逐项丢门(先丢归档,再丢平台上限)。最终形态是两个独立维度——managementLifecycleDenial(归档拒绝、结项按 R6 不设)与 managementCeilingDenial(平台上限、role cap、联动冲突、停用、有效访问)。

顺带落地的治理修复

Development-Manager PR #32(2c2e372)为 admit 增加「权威基线内容认可」:暂存路径若与权威基线逐字节相同即免 transport。已实测生效——原本 65 个暂存路径全被拒,修复后仅 5 个需 transport,其余 60 个自动认可;最终以空合并提交记录祖先关系时 admit: ok,全程无 transport 妥协。

结果与验证(完成后填写)

  • 结果:
  • 验证:<结论摘要 PASS/FAIL/SKIP/NOT_RUN 逐项;逐条证据由 make evidence 写入上方证据表>
  • 影响与剩余项:

合入与清理

  • Review 记录:NOT_RUN(审阅智能体/平台身份、base/head、结论、问题闭合及重放依据)
  • 冲突记录:NOT_RUN(最新目标同步、冲突处置、组合兼容核验及复审/补测)
  • CI 记录:NOT_RUN(当前 HEAD 完整 SHA、全部必需检查、运行链接、执行身份及 GATE 结果)
  • 合入记录:NOT_RUN(交付授权范围、PR、被核验 HEAD、合入 SHA、目标分支及内容核验)
  • 清理记录:NOT_RUN(授权依据、写者退出确认、worktree/分支/任务卡处置)
{
  "summary_schema": 1,
  "source": "SELF",
  "timestamp": "2026-10-21T03:46:26.935822+00:00",
  "command": "make precheck",
  "exit_code": 0,
  "cwd": "/home/weichen/projects/Agent-System-Dev",
  "before_head": "a496ea0f0249b2b412354677ef97612ccd692d25",
  "after_head": "a496ea0f0249b2b412354677ef97612ccd692d25",
  "branch": "main",
  "target_branch": "main",
  "target_head": "a496ea0f0249b2b412354677ef97612ccd692d25",
  "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=a496ea0f02",
    "[remote] origin/main=a496ea0f02 ahead=0 behind=0",
    "[tree]   clean submodules_drift=0 uninit=0",
    "[worktrees] linked=5",
    "[cards] 已合入未闭合任务卡:feature-project-access-lifecycle.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] a496ea0f02(完整:a496ea0f0249b2b412354677ef97612ccd692d25)",
    "[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": "d63eb6dfcf96743449b73edabd63a126308f731b7528b1e249ec5a7f4ce8aae4",
  "receipt_sha256": "b659e67e444244c0f70ec7f71c89044666ba229581bab6ccca200bbf491cd24c",
  "receipt_path": "/home/weichen/.cache/agent-system-dev/evidence/b659e67e444244c0f70ec7f71c89044666ba229581bab6ccca200bbf491cd24c.json"
}

| 同步(记录前对象) | ccb6dfaa9c | 2af80d6a24 | 2026-10-21T13:32:30Z |