import Spec.Prelude /-! # ProjectWorkspace —— project explorer 与飞书建项入口(ADR-0021) org 后台里的"文件管理器式"项目管理:folder 只负责导航、排序、层级与用量聚合,当前 不是权限资源。project 仍是授权边界。 不变量:folder/project 同 org、folder 不参与权限、普通成员从飞书群创建 project 受 org policy 控制。folder visibility/team policy/继承授权 `OPEN`。 -/ namespace Spec.System variable (I : Identifiers) /-- Project explorer folder 的租户归属(`PINNED`, ADR-0021):folder 是 org 内透明节点。 -/ structure FolderTenancy where /-- 被归属的 folder(`PINNED`, ADR-0021)。 -/ folder : I.FolderId /-- folder 所属 organization(`PINNED`, ADR-0021)。 -/ organization : I.OrganizationId /-- Project 放入 folder 的作用域(`PINNED`, ADR-0021):project 可以位于某个 folder, 但二者必须同 org。folder 不改变 project 权限。 -/ structure ProjectFolderPlacement where /-- 被放置的 project(`PINNED`, ADR-0021)。 -/ project : I.ProjectId /-- project 所在 folder(`PINNED`, ADR-0021)。 -/ folder : I.FolderId /-- Project-folder placement 是良构的 iff project 与 folder 解析到同一 organization (`PINNED`, ADR-0021)。 -/ def ProjectFolderPlacement.WellScoped (placement : ProjectFolderPlacement I) (projectOrg : I.ProjectId → Option I.OrganizationId) (folderOrg : I.FolderId → Option I.OrganizationId) : Prop := ∃ o, projectOrg placement.project = some o ∧ folderOrg placement.folder = some o /-- Folder 当前透明(`PINNED`, ADR-0021):folder 不是权限资源,不持有 grants,移动 project 不改变 project 自身授权。未来 folder policy 若出现,须新增显式语义。 -/ structure FolderTransparent where /-- 透明性命题本身;字段存在是为了让 contract 明确可引用(`PINNED`, ADR-0021)。 -/ current : True /-- 普通 org member 是否可从 Feishu 群自助创建 project 的 org policy(`PINNED`, ADR-0021)。 -/ structure MemberProjectCreationPolicy where /-- policy 所属 organization(`PINNED`, ADR-0021)。 -/ organization : I.OrganizationId /-- 为 true 时普通成员可从未绑定飞书群创建 project;owner/admin 可走后台入口。 -/ membersCanCreateProjects : Bool end Spec.System