--- summary: "拟议的 SQLite 作家准入的可转让授权合同" read_when: - "将 SQLite 写入器准入移出网关主线程" - "更改会话或代理数据库写入使用的权限所有者" title: "作家准入权" --- # 作家录取权限 该程序将捆绑的作者许可移交给一名专门的工作人员,同时保留当前权限、FIFO 订购、最终主机 COMMIT 授权和收据结算。不建议架构、持久性、配置或更新迁移。重新启动通过现有所有者重建进程本地权限。 瓶颈在于主机调度,而不是布尔检查的成本。被跟踪的 `chat.send` ACK 花费了 765 毫秒中的 673 毫秒等待准入;上述更改在 20 个发送器的情况下测量 ACK p50/p99 为 1,209/1,693 毫秒([ 先前测量 ](https://github.com/openclaw/openclaw/pull/170376))。可行性探测在 0.064 毫秒内从共享状态得到答复,但在策略撤销后错误地授予。转发实时回调会等待 200 毫秒的主机停顿。这些诊断性观察证明了转让权力所有权合同的合理性;他们不预测生产延迟。 第一个切片传输配置文件 revision/status 通过共享单元进行检查,并在 `src/infra/sqlite-writer-admission-service.test-support.ts` 中添加只读准入服务测试工厂。绑定和当前稳定的操作使用与主机断言相同的规范状态。工厂通过真人工人测试进行锻炼;生产调度保留在主机上,直到剩余的依赖项可以转移。测量的中间主机到服务准备绕道增加了延迟,因此被删除。原生发行商在物理 COMMIT 之前立即围栏;已知的回滚保留先前的修订,而不确定的本机结果则保持隔离。退休的一代永远不会因为延迟的描述符传递而复活。即使数据库准入本身在路径到文件身份提升过程中仍然有效,首次创建也会取消未解析的配置文件权限。生命周期在更改身份之前通过其现有的共享完整性修订版发布该升级,包括仅工作人员创建和别名协调。现有的工作任务所有者处理服务失败、终止和重新启动。 该切片不传输策略负载或本机写入授权。描述符直接保留其确切的共享缓冲区,因此任何服务注册映射都无法回收或替换一代。混合physical/request/run权限,最终主机COMMIT和结算仍保持现有路径。描述符还保留现有的共享准入-撤销单元,因此仅工作线程关闭会在异步引流之前拒绝读取。服务读取并不证明主机仍检查剩余的物理保管。后来的所有者必须提供这些合约和本机到服务的传输,然后交易准入才能绕过主机。 代理切片使槽和请求托管规范的共享状态。在替换当前工作或通知观察者之前,调度、排队取消、完成、失败和本机退休会发布到相同的保留单元。接受的取消保留发送历史记录和收货结算。本地阶段在请求宿主准入之前和消耗其授权之后检查这些确切的单元格;迟到的描述符无法通过重用的数字请求 ID 重新获得权限。 服务测试助手还公开了带有有限等待的直接本机端口托管检查。到期会自动关闭待处理的决策,因此延迟的服务回复无法授予该决策。服务关闭会在等待清理之前撤销其纪元;更换使用新鲜电池。这种传输仍然是工人测试执行的先决条件:混合生产准入仍然使用主机,并且在剩余所有者可以转移之前不会添加第二次服务往返。它仅授予经纪人托管权,不授予保单授权、本机 COMMIT 或收据结算。 执行切片为每个逻辑所有者、本地生成和借用者提供了自己的共享生命周期。逻辑关闭在清理之前发布 `closing`,并且可以在清理失败后重新打开;撤销和本地退休仍然是永久性的。借款人释放结束新的呼叫和索赔,而已接受的操作通过结算保留 logical/native 托管权。热操作将这些确切的细胞及其公认的物理身份带到本地阶段和服务。冷创建、准备、删除和策略仍然需要其主机所有者;服务运输不受混合生产准入的约束。 ## 当前所有者和所需转让 下面的源位置参考提交 `4ca02f6c720e6346a0d57b158cc38484fdf5c8da`;路径从 `src/` 开始。入场由这些业主组成;没有人单独授权写入。每行都命名当前的读取、突变边界和建议的可转移事实。 | 所有者和来源锚 | 当前事实和突变点 | 转让合同 | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | 实物入场:`infra/sqlite-database-admission-record.ts:16–84,153–201`; `infra/sqlite-database-admission.ts:565–639` | 文件标识、format/schema事实、写入修订、准确生成和参考文献;事实失效、元数据退休、描述符关闭前显式退休。 | 重复使用现有的 identity/generation/shared 电池和开放时间保留。这些建立物理保管权,而不是用户权限。 | | Logical/native 执行:`state/openclaw-agent-execution-owner.ts:136–152,327–387,492–503,582–605`; `state/openclaw-agent-execution-native.ts:119–127,640–641` | 当前 owner/scope、删除和创建防护、本机可用性、借款人生命周期;释放、关闭和撤销在等待清理之前生效。 | 单独的逻辑、本机、借用者和 creation/deletion 引用。每次转换前发布关闭状态;通过本地定居保留已接受的工作。 | | Creation/deletion: `state/agent-creation-claim.ts:68–106,158–175`; `state/agent-deletion-cleanup.ts:98–132,176–191,314–343`; `sessions/session-agent-work-admission.ts:41–88,112–138`; `state/agent-deletion-journal.ts:410–454,486–564` | 确切的 creation/cleanup 范围、物理目标、租赁、日记帐操作和阶段;发布、删除移交,completion/removal. Ingress 在期刊出版前关闭。 | 精确的 claim/lease/journal 参考和活动修订。突变前失效;保留失败的清理。只有相同的现场创作声明才能绕过其已完成的墓碑。 | | 代理准备情况:`state/agent-database-admission.ts:276–348,383–395` | Per-store/per-agent拒绝和临时准备范围;拒绝更换,成功准备和范围关闭。 | 确切的 refusal/preparation 一代。只有其现场准备范围可以绕过待决拒绝;更换前无效。 | | 经纪商请求:`infra/sqlite-worker-broker-reply.ts:58–70,195–229,545–570` | 精确slot/job,调度状态、取消、维护和访问;当前作业替换和插槽故障。 | 共享作业 identity/state 和适用的取消。调度后调用方中止不得默默放弃已接受的写入。 | | 共享lifetime/maintenance:`state/openclaw-state-db-async-lifecycle.ts:139–159,197–205,412–423,474–483`; process/schema 保管:`infra/gateway-state-owner.ts:145–153,343–385,452–455,627–662` | 捕获共享生成、完整性密封、parent/caller 准入、维护阶段、进程锁定和模式租赁;无效、终结、保管 loss/release. | Generation/phase 和准确的租赁参考号;类型化模式准备。现有的物理验证者发布突变前的损失。路径名、心跳或过期本身并不能提供任何帮助。 | | Request/device 来源:`gateway/device-revocation.ts:135–179,217–241,285–301` | 请求与接受的来源、参考和撤销;验收、设备失效和所有者关闭。 | 不同的 request/source 单元和验收状态。在断开连接或临时传输变化时保留已接受的源托管;提交的源撤销仍然否认。 | | Run/claim: `infra/agent-run-registry.ts:360–501` | 精确的操作实例、声明、生命周期和组合源;相同-ID 替换、发布和源断言后失败。 | 精确的 claim/lifecycle 引用加上类型化源断言;政策评估后重新检查。相同的运行 ID 无法恢复旧的索赔。 | | 接线员:`gateway/operator-run-authority.ts:127–158,284–486` | Gateway/source 身份、范围、简介、任务、角色和模型上限; source/assignment/policy 更改永久撤销捕获。 | 捕获的上限以及当前的 profile/config/plugin-metadata 修订和源参考。保留 original/current 模型策略交集和保留的延续生命周期。 | | 简介:`state/user-profile-events.ts:149–177,213–364`; `state/user-profile-list.ts:236–307` | 个人资料、身份、频道和帐户链接修订、pending/uncertain 突变、提交的目录; COMMIT 之前的围栏和原住民定居点。 | 每个 store/per-key 单元加上不可变的事实。保留精确结合的读数与当前稳定的读数;未知的结果永远不会在超时时重新打开权限。 | | Session/sharing: `gateway/session-access-authority.ts:257–331`; `gateway/session-row-projection-generation.ts:92–145`; `gateway/session-row-membership-read.ts:215–235` | Projection/store/generation,会话 ID/lifecycle,准备情况、会员资格和相关政策; replacement/removal,分享和会员变更。 | 精确的会话参考加上 readiness/membership 修订。挂起可重试,无需退出;身份不匹配或非待定拒绝会永久撤销捕获。在影响发生之前就对作家进行围栏,而不是后来发生的事件。 | | Config/tool 政策:`config/runtime-snapshot.ts:230–242`; `gateway/server-reload-managed.ts:341–346`; `gateway/session-resource-tool-policy.ts:37–116` | 当前 config/role、所选模型、沿袭、插件元数据和沙箱策略;当前配置激活先于通知。 | 不可变的准备输入加上出版商拥有的修订。激活前失效;保留锁定模型拒绝和沙箱平等。事件订阅无法建立此顺序。 | | 来电准备:`config/sessions/session-actor-sqlite.ts:113–150`; `config/sessions/session-entry-patch.ts:84–129`; `config/sessions/session-turn.ts:218–257` | Accepted/current 断言、本机观察、授权、取消、突变防护、源替代和待输入保管。 | 对交易原像的类型化操作、保留顺序、返回值、拒绝和簿记效果;永远不要只序列化最后一个 allow/deny 答案。 | | 原生结算:`infra/sqlite-worker-operation-settlement.ts:104–143`; `infra/sqlite-worker-broker-reply.ts:596–691` | COMMIT 后的实际收据、completion/unknown 结果、回复前的本机退出和发布。 | 保留现有的主机所有者和运输。撤销会阻止新的工作,而不是观察已提交的收据。 | ## 共享发布和保留 每个所有者导出一个不可变的描述符,其中包含其种类、进程纪元、确切的 identity/generation 和保留的依赖项引用。每个可变主题都有所有者编写的原子单元:修订、状态(`ready`、`pending`、`uncertain`、`revoked`)和现有的 lifetime/reference 状态。可变大小的策略事实作为不可变的修订标记消息传播。该服务将这些有效负载存储为投影;共享单元保持规范。缺失、部分或不匹配的修订将拒绝或返回所有者现有的可重试待定结果。使用非重用代;在柜台包装之前退休。 出版顺序是强制性的: 1. 准备替换事实而不暴露它们。在 **更改权威状态或授予更改它的本机效果之前,同步使旧的 revision/status** 无效。保留所有者特定的回滚语义:永久退休保持永久;中止的临时配置激活不得撤销仍保持最新状态的已接受源。 2. 在当前所有者下执行突变。保留 pending/uncertain 区别,直到本地解决确定结果。 3. 在服务中安装新的不可变事实,然后让其原始所有者在安装确认后发布匹配的就绪修订版。延迟的有效负载无法覆盖后续版本。不相关的密钥保持有效;没有每次写入注册表重建或文件系统轮询。 读取器加载所有依赖项 revisions/statuses,评估类型化操作,然后在发布其决定之前一次尝试重新检查所有这些操作。作者在本机阶段之前对这些引用的最后检查是该阶段的权威线性化点。在任一边界观察到的撤销均被否认;稍后的撤销保留了今天的 next-boundary/rollback 语义。最终主机 COMMIT 重新验证仍然是强制性的。这不是持久功能或在等待后使用先前答案的权限。 **each** 所有者的证明义务是完整的写入器清单:所有更改消费事实的路径必须首先失效,包括工作器 COMMIT、配置激活、删除、修复和关闭。更改后的侦听器无法满足它。在结果尚未可用的效果之前发布待定修订;停滞的出版可能会延迟工作,但不能授予陈旧的工作。测试实际的发布者,而不是单独的合成撤销助手。 使用[保留修复](https://github.com/openclaw/openclaw/pull/170423)中的开放时间协调保留物理代:保留原始物理身份,acquire/reconcile暴露句柄之前的引用,平衡废弃的引用,仅重试元数据关闭,并拒绝显式报废或替换。在服务切换之前整合修复;不要重复其协议。权限描述符同样仍然由操作保管保留,直到结算和本机清理,而不仅仅是直到 grant/reply. 撤销和内存回收不同的转换。 ## 服务和类型化操作 代理为每个网关进程拥有一名准入工作人员。它保留现有的每个数据库 FIFO,并通过专用端口仅发送当前作业、确切的依赖关系、阶段和事务事实。该服务拥有决策执行,而不是 SQLite 连接、策略突变、调度顺序或收据。 初始操作是 `assertBoundRevision` 和 `readCurrentSettledFacts` 用于配置文件权限。后来的所有者模块提供了 `assertRunBinding`、`authorizeOperatorPolicy`、`authorizeSessionTarget`、`validatePreparedSources`、`acceptConversationAlternatives` 和 `authorizePendingInputCustody`。每个都有一个封闭的 input/result 类型和一个定义的效果所有者。保留参与者序列:accepted/current 检查→本机观察→策略操作→current/accepted 检查→授予。保持有序的准备工作,包括在前台等待的规划人员 FIFO;仅在具有等价性证明的情况下才将其提前移动。依赖于事务的决策会消耗本机事务的原像。在赠款移交给其指定所有者之前或在分配之前完成的记账工作;它不能成为异步通知。 最终主机COMMIT授权,原生COMMIT,收据公布及结算不变。因此,主机停顿仍然会延迟 COMMIT、调度和 ACK 发布。分别测量;该程序首先删除重复的准入传递等待及其 FIFO 占用,而不是所有主线程延迟。冷 creation/schema 准备在其所有者迁移之前一直是主机所需的。 不透明发布的 SDK 防护是另一种显式主机要求的情况:`config/sessions/session-source-authority.ts:47–67,127–156` 允许任意同步 SQLite 读取。保留该适配器和公共行为;将每个类型化操作的所有捆绑调用者迁移到一起并删除其旧的回调路径。不受支持的回调绝不能落入共享允许快照。通用 SDK 线程外准入需要单独审核的公共合约。 服务失败必须拒绝未授权的请求,并通过现有的本机 retirement/settlement. 路由分派的工作。终止的工作线程无法发布其自身的死亡,并且同步等待不能依赖于端口关闭回调。在切换之前,实现有界服务响应等待:本机等待者自动终止其挂起的请求,无需主机调度;过期永远不会授予权限。经纪商主管在更换之前关闭失败的服务纪元。根据慢主机测量调整内部等待预算;不添加用户配置。保存完整的收据;报告未知写入未知并通过现有所有者进行协调,从不自动重播。在旧的本地监护权解决后,替换使用新的服务纪元和新的注册。网关 crash/restart 丢弃共享内存并补充规范的持久状态;没有任何权限可以仅靠令牌或路径名来生存。 ## 增量交付及证明 每 PR 土地一位所有者。首先传输配置文件 revisions/status 及其现有的 pre-COMMIT 栅栏,并使用服务骨架执行这两个类型的读取。保持混合操作明确主机所需,直到每个依赖项都可转移;不要声称第一片的聊天延迟有所改善。然后按该依赖关系顺序迁移 broker/execution/maintenance 托管、request/run/operator 所有者、config/tool 策略和 session/sharing/source 操作。将每个组拆分为各自的所有者。每个 PR 列出了调用者、突变覆盖范围、删除的回调代码、保留的公共合约和测量的成本;如果没有后来的 PR,早期的 PR 仍然是安全的。 所需的对抗性证明通过真实所有者路径使用障碍:在有效负载交付和评估期间撤销;当主机被阻止时,变异 config/membership;在两个消息顺序中保留然后退出;替换物理文件;重用一次运行 ID;断开接受与不接受的来源; pending/unknown型材COMMIT;回调引起的撤销; duplicate/delayed 赠款和收据; service/native 在授予之前、授予之后和 COMMIT 之后崩溃。断言拒绝、永久状态与可重试状态、未更改的 FIFO 排序、保留已提交的事实和平衡保留。包括进程重新启动和过时时期拒绝。针对相同的合同固定装置运行保留的主机路径和迁移的路径。 对于每个可执行切片,使用合成的隔离团队沙箱和四个预选的 A-B-B-A 块、相同的 instrumentation/builds、每次运行的新鲜状态并且没有丢弃的故障。重用 [ 写入器计数测量 ](https://github.com/openclaw/openclaw/pull/169800) 中的写入器工作负载:20 个会话 × 5 个回合,每个回合排除一次预热,20 个历史记录 messages/session,400 个历史读取,100 个元数据 updates/probe 轮次,四个订阅者、可见观察者、工具事件和控制平面。还重复先前 ACK 测量中的 20 发送器 `chat.send` 协议,保留其夹具和节奏。 分阶段报告准入交付、FIFO hold/occupancy、队列p50/p95、ACK p50/p99、主线程CPU/event-loop延迟、服务CPU和分配、成功操作和拒绝。比较具有不确定性的四个配对块比率并保留失败的运行。预计非 COMMIT 交货等待和 FIFO 占用率较低;本文档没有建立数字加速。噪声内的中性结果仍然符合 requested/simplifying 变化;增加的复杂性需要证明效益。本地验证保留更改文件 formatting/lint 和一些重点测试; PR CI 拥有全闸门。基准仅使用受限沙箱,从不使用生产数据或正常验证租赁。