
【免费下载链接】task-state-guardReconcile stuck AI-agent tasks after restarts and timeouts. Preview SQLite changes, close stale delivery states, and never guess success.项目地址https://gitcode.com/gh_mirrors/ta/task-state-guard点击查看免费下载TaskStateGuard 是面向 AI 智能体与后台 worker 的嵌入式 SQLite 任务状态对账护栏服务重启后它按明确的截止时间与宽限期把卡住的running任务收敛为timed_out并拒绝把未知结果猜成成功。正因为账本保存了任务生命周期与投递状态的元数据**威胁模型threat model**就成了部署前必读的一课它定义了哪些资产被保护、信任边界画在哪里、以及每一类攻击如何被防御。本文带你完整走读 THREAT_MODEL.md重点讲清三件事Linux/macOS 上的 POSIX0600文件权限收紧、Windows 上 fail-closed 的 DACL 边界以及符号链接与硬链接别名检测。先分清TaskStateGuard 保护的是什么在谈防御之前先明确两个问题保护什么、信任谁。资产AssetsSQLite 账本中只有 UUID、时间戳、固定注册表里的有限 reason code、父子关系以及可选的 SHA-256 payload 指纹——没有提示词、没有任务正文、没有自由文本字段见 THREAT_MODEL.md 的 Assets 一节。信任边界Trust boundary宿主进程与本地服务账户被视为可信运维可以检查 SQLite 文件、WAL 文件与备份包内没有任何网络客户端或服务端因此也不存在远程服务被攻破这一维度。 一句话概括信任边界同操作系统的其他用户、恶意路径别名、网络盘都在边界之外服务账户自己的进程在边界之内。POSIX 0600Linux 与 macOS 的权限收紧策略在 Linux 和 macOS 上TaskStateGuard 会主动检查并收紧文件权限而不是被动接受系统默认值。核心逻辑集中在 store.py 的_prepare_storage_path方法检查/动作源码位置说明目录创建使用0700store.py新建的父目录默认仅属主可访问父目录必须属主可控store.py要求数据库父目录由当前用户所有且不允许组/其他人可写祖先目录必须带 sticky 位store.py防止其他账户在共享目录里替换路径项打开文件时带O_NOFOLLOWstore.py内核层面拒绝跟随符号链接以0o600创建并强制收紧store.pyos.open初始模式0600再用os.fchmod收紧后复核确认失败即拒绝启动WAL/SHM/journal sidecar 同样收紧store.py可观测的 SQLite 附属文件若权限不合格会被chmod为0600或整体失败这套策略对应的威胁是 THREAT_MODEL.md 中的两条Another OS account swaps POSIX path entries during open—— 通过属主可控的叶子目录 sticky 祖先 O_NOFOLLOW组合防御A path alias redirects writes to another file—— 通过下文要讲的链接别名检测防御。值得注意的一个设计细节权限收紧发生在打开文件描述符之后fchmod并再次用fstat复核。这意味着即使chmod路径与真实文件之间存在竞态程序也会以无法确保安全为由安全失败fail closed而不是带病运行。符号链接别名防御数据库、sidecar 与 Windows reparse point这是威胁模型里最攻击者视角的一节。假设攻击者把tasks.sqlite替换为一个指向别处的符号链接或多个硬链接写入就会悄悄落到另一个文件上而账本表面看起来一切正常。TaskStateGuard 的防御分三层全部在 store.py 中1. 链接形态识别——_is_link_likestore.py同时识别 POSIX 符号链接S_ISLNK和 Windows reparse pointFILE_ATTRIBUTE_REPARSE_POINT属性位一个函数覆盖两个平台的别名概念。2. 单链接常规文件要求—— 数据库主文件必须满足st_nlink 1store.py任何可观测的符号链接、reparse point、多硬链接别名都会直接抛出InvalidInput。同样的规则也应用于-journal、-wal、-shm三个 sidecarstore.py。3. 文件身份前后校验—— 打开数据库前记下(st_dev, st_ino)身份元组store.py每次操作前再用_verify_storage_pathstore.py核对文件是否仍是同一个 inode、是否仍是单链接常规文件。身份变了就抛StateConflict(database file identity changed)。对应的威胁描述见 THREAT_MODEL.mdA path alias redirects writes to another file → Observable main-database and SQLite-sidecar symlinks, Windows reparse points, and multi-hardlinks are rejected; stable file identity is required and checked around connection opening.⚠️注意边界这套检查依赖文件系统可靠地报告身份identity与链接数hardlink count。网络盘、映射盘、远程挂载不在支持范围内——因为库无法可靠识别所有远程文件系统所以数据库必须在本地磁盘是部署方的硬性责任SECURITY.md Operational guidance 一节。Windows DACL为什么是fail closed 显式确认Windows 的文件访问控制由DACL自主访问控制列表决定语义上和 POSIX 的0600仅属主可读写类似但Python 标准库既无法读取也无法设置 DACL。这意味着库无法像 POSIX 分支那样顺手收紧权限。TaskStateGuard 的选择是把球交还给你但用失败即关闭的方式兜底默认拒绝在 Windows 上构造Ledger时如果不传allow_external_aclTrue直接抛出InvalidInputstore.py。CLI 对应参数是--allow-external-acl且必须放在子命令之前例如.\.venv\Scripts\task-state-guard.exe --db .\private-state\tasks.sqlite --allow-external-acl reconcile --active-grace-seconds 600 --delivery-grace-seconds 600 --dry-run显式确认不验证 DACL--allow-external-acl的语义是调用方确认私有 DACL 已在外部配置好它不创建、不检查、不认证任何 DACLREADME.md 中Linux、macOS 与 Windows 命令差异一节。父目录必须预先存在Windows 分支不会替你创建目录父路径缺失时直接报database parent must be pre-created under external ACLstore.py。对应威胁模型中的原文A Windows database inherits a permissive DACL → Windows use fails closed by default. The caller must pre-create a private directory and explicitly acknowledge external ACL enforcement; the opt-in does not verify the DACL.残余风险声明也很直白CI 验证的是这条 fail-closed 边界本身而不是 DACL 的保密性THREAT_MODEL.md Residual risks 一节。换句话说配置 DACL 的责任在你TaskStateGuard 只保证你忘了确认时它绝对不跑。威胁—缓解对照速查表除了上述三大主题THREAT_MODEL.md 还列出了完整的威胁与缓解措施。下面挑出与存储层最相关、新手最容易忽略的几项威胁缓解措施两个 worker 并发关闭同一任务BEGIN IMMEDIATE WAL busy_timeout 条件状态检查串行化写入提示词通过持久化或诊断泄露无明文 payload 字段只接受校验过的 SHA-256 指纹doctor输出仅含计数任意错误文本成为隐蔽数据通道reason code 来自固定注册表被拒绝的 CLI 值从不回显被拒绝的敏感输入进入 SQLite 或进程流校验先于变更综合测试扫描 stdout、stderr、数据库、WAL 与 SHM 中的 canary不健康的 doctor 报告被当作命令成功healthyfalse的完整报告以退出码1结束脏 schema v1 存了任意 reason 元数据v1→v2 迁移前逐条校验 reason 值与状态兼容性不安全则升级前失败dry-run 意外改写存储已关闭账本用两次身份/时间/哈希一致的有界读取后才反序列化入私有内存不稳定或超过 64 MiB 一律失败完整的威胁—缓解对照表共 18 项请直接阅读 THREAT_MODEL.md 的 Threats and mitigations 一节。残余风险读清单时别漏掉不做什么威胁模型文档最有价值的部分往往不是承诺而是明确不承诺的事。THREAT_MODEL.md Residual risks and non-goals 一节值得逐条过SHA-256 不隐藏低熵输入低熵 payload 可被离线猜测若有此威胁应改用包外的带密钥指纹️特权宿主攻击者不在边界内它可以直接读写数据库和应用内存磁盘加密与 OS 加固不归本包管同 OS 用户的进程彼此可信它们可以直接改 SQLite 文件schema 指纹能检测事故和多数篡改但不是防伪签名DACL 无法被标准库验证Windows 隐私依赖外部配置的私有目录 显式确认UNC 路径、映射网络盘、远程挂载不受支持账本不执行、不重试、不投递工作它只记录与对账可信运行时提供的状态外部副作用是否发生永远由传输层自己记录回执后确认。上手建议把威胁模型变成部署清单把本文内容浓缩成一份可执行的部署检查单数据库放在支持 SQLite 锁与稳定文件身份的本地文件系统专用服务账户目录Linux/macOS确认0600文件/0700新建目录收紧由库自动完成父目录不被组/其他人写Windows先由管理员配置仅服务账户可访问的私有 DACL再传allow_external_aclTrue或--allow-external-acl不要手工制造任何数据库、-journal、-wal、-shm的符号链接或硬链接把成功的 CLI 输出当作敏感数据保护——它有意包含 UUID、父子关系与时间戳非正常关机后跑一次task-state-guard doctorhealthyfalse或任何错误都按故障调查而不是再跑一次。小结TaskStateGuard 的安全设计可以概括为三个词——最小资产只存元数据不存正文、失败即关闭Windows DACL、链接别名、权限收紧任何一步不达标都直接拒绝运行、边界外不承诺同用户进程、特权宿主、远程文件系统都如实声明在边界之外。理解了 THREAT_MODEL.md 里的这 18 项威胁与 store.py 中对应的每一道防线你就具备了安全部署这本状态账本的全部前提。赞分享【免费下载链接】task-state-guardReconcile stuck AI-agent tasks after restarts and timeouts. Preview SQLite changes, close stale delivery states, and never guess success.项目地址https://gitcode.com/gh_mirrors/ta/task-state-guard点击查看免费下载相关推荐从 T-01 到 T-43Agent 沙箱最危险的 10 个威胁与防御清单从 T 01 到 T 43Agent 沙箱最危险的 10 个威胁与防御清单 当 AI Agent 从演示原型走向生产工作负载一个此前容器时代从未真正AI Agent人工智能云原生容器运行时零信任后端F3D 3D查看器指南一条命令打开 60 多种 3D 格式还能批量导出截图F3D 3D查看器指南一条命令打开 60 多种 3D 格式还能批量导出截图 同事发来一个 glb 模型、供应商给了一份 stp、实验室里还有一个 ply 和桌面应用图形学3D渲染数据可视化5分钟快速部署Loghouse在Kubernetes集群中搭建完整日志监控系统5分钟快速部署Loghouse在Kubernetes集群中搭建完整日志监控系统 想要在Kubernetes集群中快速搭建一个高效的日志监控系统吗Loghou上一篇终极俄语AI助手Aura Ru Dolphin Qwen2.5-1.5b.Q4_K_M_imatrix完全指南下一篇Emscripten与Backbone集成WebAssembly模型与视图创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考