diff --git a/.task/fix-pal-component-delivery-pins.md b/.task/fix-pal-component-delivery-pins.md index 122a59aa..b711af0b 100644 --- a/.task/fix-pal-component-delivery-pins.md +++ b/.task/fix-pal-component-delivery-pins.md @@ -49,6 +49,35 @@ | 时间(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 妥协。 + ## 结果与验证(完成后填写) - 结果: