问题
DELETE /api/v1/packages/:id 的卸载路径(SchemaRegistry.uninstallPackage + MetadataProtocol.deletePackage)只删除 sys_metadata 覆盖行和 sys_packages 持久化记录——没有任何按 package_id 清理数据面权限行的逻辑:
sys_permission_set 中 managed_by:'package' 且 package_id = <被卸载包> 的行不会被删除;
- 指向这些权限集的
sys_position_permission_set / sys_user_permission_set 绑定行也原样保留。
ADR-0086 D3 引入 package_id/managed_by 溯源列正是为了让卸载语义可定义(sys-permission-set.object.ts 里的 package_id 索引注释也写明是"for the uninstall/upgrade query"),但消费这条索引做删除的接线目前不存在。ADR-0090 D5 也明确要求:"uninstalling the package (removing its sets by packageId, ADR-0086 D3) revokes it everywhere at once. No ghost grants." 当前实现达不到这一点——卸载后授权继续生效(ghost grants),直到有人手工清理。
复现
- 运行时安装一个带
permissions 声明的包(或声明在 stack 里,启动 seeder 落库);
- 确认
sys_permission_set 出现 managed_by:'package' 的行,并给某岗位绑定该权限集;
DELETE /api/v1/packages/:id 卸载;
sys_permission_set / sys_position_permission_set 行仍在,持有者权限不变。
期望
卸载时按 package_id 删除该包的权限集行及其绑定(级联或先删绑定),使授权立刻全局失效。plugin-security 需要一个卸载钩子(目前完全没有 uninstall 处理器),或由 protocol 的 deletePackage 发出事件供 plugin-security 消费。
备注
🤖 Generated with Claude Code
https://claude.ai/code/session_01DP13MuGwFWLcVxVtuA7rgq
问题
DELETE /api/v1/packages/:id的卸载路径(SchemaRegistry.uninstallPackage+MetadataProtocol.deletePackage)只删除sys_metadata覆盖行和sys_packages持久化记录——没有任何按package_id清理数据面权限行的逻辑:sys_permission_set中managed_by:'package'且package_id = <被卸载包>的行不会被删除;sys_position_permission_set/sys_user_permission_set绑定行也原样保留。ADR-0086 D3 引入
package_id/managed_by溯源列正是为了让卸载语义可定义(sys-permission-set.object.ts里的package_id索引注释也写明是"for the uninstall/upgrade query"),但消费这条索引做删除的接线目前不存在。ADR-0090 D5 也明确要求:"uninstalling the package (removing its sets bypackageId, ADR-0086 D3) revokes it everywhere at once. No ghost grants." 当前实现达不到这一点——卸载后授权继续生效(ghost grants),直到有人手工清理。复现
permissions声明的包(或声明在 stack 里,启动 seeder 落库);sys_permission_set出现managed_by:'package'的行,并给某岗位绑定该权限集;DELETE /api/v1/packages/:id卸载;sys_permission_set/sys_position_permission_set行仍在,持有者权限不变。期望
卸载时按
package_id删除该包的权限集行及其绑定(级联或先删绑定),使授权立刻全局失效。plugin-security 需要一个卸载钩子(目前完全没有 uninstall 处理器),或由 protocol 的deletePackage发出事件供 plugin-security 消费。备注
sys_audience_binding_suggestion通过收敛式对账自行清理 pending 行,不受此缺口影响,但权限集/绑定本体的清理超出其范围。🤖 Generated with Claude Code
https://claude.ai/code/session_01DP13MuGwFWLcVxVtuA7rgq