ajanaku1/policydiff-relay

GitHub: ajanaku1/policydiff-relay

PolicyDiff Relay 是一款策略变更事件响应工具,通过自动比对文档版本差异、重放受影响的指导意见并路由人工审核,确保策略更新后旧回答得到及时修正和确认。

Stars: 0 | Forks: 0

# PolicyDiff Relay:针对既有指导意见的策略变更事件响应 PolicyDiff Relay 旨在找出因策略更新而变得不安全的解答,将每项发现路由给人工审核人员,并跟踪修正进度,直到接收人确认收到。 [![TypeScript](https://img.shields.io/badge/TypeScript-strict-3178C6?logo=typescript&logoColor=white)](https://www.typescriptlang.org/) [![React](https://img.shields.io/badge/React-19-149ECA?logo=react&logoColor=white)](https://react.dev/) [![Base44](https://img.shields.io/badge/Base44-native-15599C)](https://base44.com/) [![测试](https://img.shields.io/badge/tests-102_passing-2F6E55)](#testing) [![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) ![PolicyDiff Relay 控制室](https://static.pigsec.cn/wp-content/uploads/repos/cas/94/9442e2bd3efa927144b1af59103c5a565cf8469712a658b786aea37bec4c77c2.png) ## 目录 - [PolicyDiff Relay 的功能](#what-policydiff-relay-does) - [在线演示](#live-demo) - [演示流程](#demo-journey) - [功能特性](#features) - [界面截图](#screenshots) - [技术栈](#technology) - [系统架构](#architecture) - [安全模型](#security-model) - [本地运行](#running-locally) - [Base44 配置](#base44-setup) - [测试](#testing) - [项目结构](#project-structure) - [已知限制](#known-limitations) - [许可证](#license) ## PolicyDiff Relay 的功能 在员工已经根据某份源文档回答了问题之后,该文档的内容可能会发生变化。文档有了新版本,但基于旧版本的解答依然存在于邮件、工单或案件记录中。 PolicyDiff Relay 会针对确切的策略版本及其引用的条款记录每一次解答。当加入白名单的 Google Doc 发生更改时,应用会导出新内容,存储去重后的版本,比较条款,并仅对可能受该变更影响的指导意见进行重放。模型会提出结构化的发现,而修正则由人工进行审批。 目前的 MVP 使用一份 Google Doc、一个共享的 Gmail 发件人、一个组织以及虚构的接收人数据。 ## 在线演示 [在 Base44 上打开 PolicyDiff Relay](https://policydiff-relay-8292a74a.base44.app)。 使用分配的审核人员或策略管理员账户登录以打开控制室。 ## 演示流程 面向法官的流程大约可在 90 秒内完成: 1. 以策略审核人员的身份登录。 2. 打开从 v4 到 v5 的资格策略对比。 3. 在影响范围图中选择受影响的红色节点。 4. 阅读先前的解答、已更改的条款、原因说明以及修正草案。 5. 批准该修正。后端将重新验证该发现,并创建一个锁定的交付记录。 6. 通过已连接的 Gmail 账户发送修正。 7. 打开接收人链接并确认收到。 8. 通过 Base44 实时功能查看补救账本的更新。 9. 询问 Policy Ops 为什么不确定的发现被阻止了。 10. 导出私有审计包。 绿色的发现依然有效,因为其引用的条款没有改变。琥珀色的发现保持不确定状态,因为策略未定义裁定该发现所需的工作人员分类。 ## 功能特性 - 以源文件和内容哈希为键的不可变策略版本 - 条款级别的标准化与实质性变更候选 - 在模型推理之前进行确定性的重放过滤 - 带有引用证据的受影响、仍然有效和不确定的审核状态 - 由审核人员拥有的审批和服务器端的修正重新验证 - 防止重复 Gmail 交付的发送租约 - 经过哈希处理、过期且仅限一次使用的确认 token - 关于发现、审批、交付、任务和确认的实时更新 - 受限的员工 Agent,可以解释发现或创建审核人员的任务 - 通过五分钟有效期的签名 URL 暴露的私有审计文件 ## 界面截图 | 桌面端控制室 | 移动端审核 | |---|---| | ![桌面端证据绘图界面](https://static.pigsec.cn/wp-content/uploads/repos/cas/94/9442e2bd3efa927144b1af59103c5a565cf8469712a658b786aea37bec4c77c2.png) | ![移动端证据绘图界面](https://static.pigsec.cn/wp-content/uploads/repos/cas/6a/6a137c2be71c75f6beaae0495c10320cc8e06bf1a75755093c22a13aace8e250.png) | 该界面采用了选定的证据制图方向。变更后的条款位于轨道中心。先前的解答按分类显示在周围,而证据面板和补救账本则保留了审核痕迹。 ## 技术栈 | 层级 | 技术 | |---|---| | 前端 | React 19, TypeScript, Vite | | 后端 | Base44 Deno functions | | 数据与访问 | Base44 entities, RLS 和字段级规则 | | 身份验证 | Base44 Auth 和 User extensions | | 源连接器 | Base44 共享 Google Drive 连接器 | | 交付连接器 | Base44 共享 Gmail 连接器 | | 模型调用 | Base44 `InvokeLLM` 结构化输出 | | 实时通信 | Base44 entity subscriptions | | Agent | 具有两个白名单工具的 Base44 `policy_ops` agent | | 审计存储 | Base44 私有文件和签名 URL | | 托管 | Base44 站点托管 | | 测试 | Node test runner 和严格的 TypeScript | ## 系统架构 ``` Google Doc file.update | v ingestPolicyVersion export -> canonicalize -> hash -> deduplicate | v extractPolicyClauses -> comparePolicyVersions | v policy admin activates version | v createReplayJob -> deterministic filters -> replayGuidance | v Finding: affected | still_valid | uncertain | v human approval -> locked Delivery -> shared Gmail | v single-use acknowledgement -> realtime remediation ledger | +----> private audit packet | +----> restricted Policy Ops agent ``` Base44 是系统的记录源和执行边界。浏览器可以读取 RLS 允许的记录并调用指定的函数。它不能直接批准发现、创建交付记录、发送邮件、确认 token 或创建审计包。 ### 数据图 ``` Organization +-- User +-- Policy +-- PolicyVersion +-- PolicyClause +-- PolicyDelta +-- ReplayJob +-- ReplayItem +-- Finding +-- ReviewTask +-- Approval +-- Delivery +-- DeliverySecret +-- Acknowledgement +-- Guidance +-- AuditPacket +-- OperationEvent ``` ### 受信任的函数 | 函数 | 职责 | |---|---| | `seedDemoWorkspace` | 配备一个幂等的 v4 基准和三个虚构的引用解答 | | `seedDemoIncident` | 当连接器自动化不可用时,构建确定性的 v5 事件 | | `loadControlRoomData` | 返回按角色过滤的控制室记录集 | | `ingestPolicyVersion` | 接收 Drive 事件,导出白名单内的 Doc,并对内容进行去重 | | `extractPolicyClauses` | 生成经过 schema 验证的条款并保存其证据 | | `comparePolicyVersions` | 构建一个明确的旧/新版本增量 | | `activatePolicyVersion` | 移动策略指针并开始重放 | | `createReplayJob` | 创建一个持久的重放任务 | | `replayGuidance` | 应用确定性范围并存储结构化的候选发现 | | `createGuidance` | 根据活动版本和有效引用记录一个解答 | | `approveFinding` | 强制执行审核人员角色,认领该发现,并将一个交付任务排入队列 | | `sendCorrection` | 重新验证聚合对象,认领发送任务,并调用 Gmail 一次 | | `reconcileDeliveries` | 处理到期工作,并将有歧义的发送租约隔离 | | `acknowledgeDelivery` | 验证 token 并仅记录一次确认 | | `createAuditPacket` | 将组织记录轨迹写入私有文件 | | `explainFinding` | 返回经过脱敏处理、受证据约束的解释 | | `createReviewerTask` | 创建一个去重的人工任务 | ## 安全模型 每个工作流实体都包含 `organization_id`。RLS 会将其与经过身份验证的用户的组织进行比较,然后检查用户的策略角色。 受信任的工作流记录拒绝客户端直接创建、更新和删除。 字段级规则会隐藏: - 策略版本源文本 - 接收人姓名和电子邮件地址 - Gmail 消息标识符 - 确认指纹和 token 哈希 - 连接器详细信息和私有文件 URI UI 显示的是虚构的指导意见标签,而不是接收人的真实身份。发送函数仅在其重新加载已批准的交付聚合对象之后,才通过其服务角色读取接收人信息。 ### 交付安全 交付的幂等键将审批、指导意见和修正版本绑定在一起。 比较并设置(compare-and-set)状态转换会将 `queued` 或 `retry_wait` 认领为 `sending`。并发调用者无法同时拥有该认领。有歧义的网络结果将保持被认领状态以进行对账,而不是触发盲目的重新发送。 ### 确认安全 公共 token 是通过服务器密钥派生的。只存储其哈希值。Token 会过期,只能使用一次,并绑定到一个交付记录上。重放尝试将被拒绝。 ## 本地运行 ### 前置条件 - Node.js 22 或更高版本 - npm - 用于后端身份验证工作的 Base44 账户 - 用于连接器流程的 Google Workspace 访问权限 ### 安装与启动 ``` npm install npm run dev ``` 打开 [http://localhost:5173](http://localhost:5173)。 当没有可用的 Base44 会话时,本地开发环境会回退到带有清晰标签的虚构数据快照。生产构建绝不会使用该模拟数据。 ### 可用命令 | 命令 | 用途 | |---|---| | `npm run dev` | 启动 Vite 开发服务器 | | `npm run build` | 在 `dist/` 中创建生产站点 | | `npm run package:base44` | 打包独立的 Base44 function 部署构建产物 | | `npm run deploy:base44` | 打包并部署已链接的 Base44 应用 | | `npm run preview` | 在本地提供生产构建的服务 | | `npm test` | 运行单元、集成、授权和契约测试 | | `npm run typecheck` | 检查后端和前端的 TypeScript 项目 | | `npx base44 types generate` | 为 SDK 重新生成实体和函数名称 | ## Base44 配置 ### 1. 身份验证并链接应用 ``` npx base44 login npx base44 link npx base44 types generate ``` `base44/.app.jsonc` 包含本地应用链接,并且会被 Git 忽略。 ### 2. 配置身份验证 该代码库启用了 Base44 的用户名和密码登录。用户记录需要这些扩展: ``` organization_id policy_role: policy_admin | reviewer | auditor | staff ``` 这些字段是客户端只读的。请通过管理设置路径分配它们,而不是通过 `auth.updateMe`。 ### 3. 授权连接器 Google Drive 需要只读访问权限。Gmail 需要仅发送权限。 ``` npx base44 connectors initiate \ --integration-type googledrive \ --scopes https://www.googleapis.com/auth/drive.readonly npx base44 connectors initiate \ --integration-type gmail \ --scopes https://www.googleapis.com/auth/gmail.send ``` 在激活之前,将 Drive 自动化的 `resource_id` 设置为确切的 Google Doc 文件 ID。在确认该 ID 之前,请保持 `allowlisted_policy_file_update` 为不活动状态。 ### 4. 配置虚构基准 部署后端资源后,以策略管理员身份登录并运行: ``` printf '%s\n' \ 'console.log(await base44.functions.invoke("seedDemoWorkspace", { source_file_id: "YOUR_GOOGLE_DOC_FILE_ID", recipient_email: "YOUR_DEMO_INBOX" }))' \ | npx base44 exec ``` 该函数可以安全地重复执行。它会创建或重用一个 v4 策略版本、三个条款和三个虚构的指导意见记录。只有受影响的记录会使用提供的演示收件箱。实际的 Drive 事件仍然会创建 v5 并启动比较流水线。 在设置之前,将 [`demo/eligibility-policy-v4.txt`](demo/eligibility-policy-v4.txt) 粘贴到共享的 Google Doc 中。将其更改为 [`demo/eligibility-policy-v5.txt`](demo/eligibility-policy-v5.txt) 即可触发该事件。 ### 5. 设置服务器密钥 ``` npx base44 secrets set \ ACKNOWLEDGEMENT_SECRET="$(openssl rand -hex 32)" \ PUBLIC_APP_URL="https://your-base44-site.example" ``` 这些值属于 Base44 密钥。请勿将它们添加到客户端环境文件中。 ### 6. 创建控制面板 Workflows 从 [`base44/workflows/setup-prompt.md`](base44/workflows/setup-prompt.md) 创建七个控制面板 Workflows(包括 Drive 的 `file.update` Workflow)。在函数、密钥和连接器授权准备就绪之前,请保持它们为不活动状态。 ### 7. 部署前验证 ``` npm test npm run typecheck npm run build npm run package:base44 npx base44 types generate ``` 部署资源或站点会更改已链接的 Base44 应用。在运行以下命令之前,请遵循项目的审批流程: ``` npm run deploy:base44 ``` ## 测试 该套件在 26 个文件中包含 102 个通过的测试。 ``` npm test ``` 测试覆盖范围包括: - 实体 RLS 和字段级规则 - 经过身份验证的角色检查 - Drive 白名单和内容去重 - 条款和重放输出契约 - 明确的版本绑定 - 人工审批 - 过期聚合拒绝 - 并发交付认领 - 有歧义的 Gmail 结果 - 对账 - Token 过期和重放拒绝 - 受限的 Agent 工具 - 私有审计导出 - 前端 Base44 和实时通信边界 - 审核和交付 UI 的状态转换 有关风险矩阵和与每个案例相关的测试文件,请参见[阶段 4 强化证据](reports/phase-4-hardening.md)。 ## 项目结构 ``` . ├── base44/ │ ├── agents/ # Restricted Policy Ops agent │ ├── auth/ # Base44 authentication settings │ ├── connectors/ # Drive and Gmail scope declarations │ ├── entities/ # Schemas, RLS, and field-level rules │ ├── functions/ # Trusted workflow transitions │ └── shared/ # Hashing, policy, delivery, and workflow logic ├── demo/ # Fictional policy source and 90-second runbook ├── docs/images/ # Verified desktop and mobile screenshots ├── reports/ # Architecture, data model, gaps, and hardening notes ├── src/ │ ├── api/ # Base44 client and control-room gateway │ ├── components/ # Evidence Cartography interface │ ├── data/ # Development-only fictional snapshot │ ├── domain/ # Pure frontend workflow decisions │ ├── hooks/ # Data loading, actions, and realtime subscriptions │ └── types/ # Control-room view types ├── tests/ ├── integration/ # Authorization and hosted-boundary tests └── unit/ # Policy, delivery, ingestion, and UI logic tests └── video/ # Demo script, live captures, renderer, and exports ``` ## 已知限制 - Google Drive 和 Gmail 在每个已部署的工作区中都需要经过授权的共享连接。 - Drive Workflow 必须保持绑定到确切的已在白名单中的 Google Doc。 - 审计下载链接将在五分钟后过期。 - 该 MVP 仅涵盖一份源文档、一个发件人和一个组织。 - 模型仅提出审核候选。它不会做出策略决策。 - 当前的证据别名是指导意见标签,而不是接收人的真实身份。 在实施过程中发现的两个 Base44 文档空白记录在 `reports/` 中。这些权宜之计将实体自动化排除在关键路径之外,并显式地解包已记录的连接器 payload。 ## 许可证 [MIT](LICENSE)
标签:MITM代理, React, Syscalls, TypeScript, 人机协同, 安全插件, 工作流管理, 政策合规, 文本差异比对, 自动化攻击