ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Stop That Shit 深潜:锁与预留机制如何防止 Subagent 预算超订

Stop That Shit 深潜:锁与预留机制如何防止 Subagent 预算超订 Stop That Shit 深潜锁与预留机制如何防止 Subagent 预算超订【免费下载链接】stop-that-shitStop That Shit别再造史了面向 Codex/GPT 场景的多平台 Hook Skill Guard拦截 AI coding agent 无需求的哈希、校验和与任务范围膨胀。 A multi-platform Hook Skill Guard for AI coding agents in Codex/GPT workflows: stop unrequested hashes, checksums, and task-scope creep.项目地址: https://gitcode.com/gh_mirrors/st/stop-that-shitStop That Shit别再造史了是一个面向 Codex、Claude Code、OpenCode、Pi 等多平台的 AI coding agent 防护插件。它的 delegation-state.cjs 用预留reservation 会话锁session lock两套机制确保你设置的agentsN并发上限不会被重复的 Subagent 生命周期事件超订——这正是 Subagent 预算超订防护的完整指南。什么是Subagent 预算超订先搞懂问题当 AI agent 把任务委派给 Subagent 时宿主平台会不断抛来各种生命周期事件SubagentStart、SubagentStop、tool_result、session.idle……这些事件可能乱序到达宿主先报完成再报启动重复到达同一个启动事件推送两次迟到到达上一个任务早已释放迟到的启动事件又指向旧 agent如果计数器来一条 1走一条 -1重复事件就会把预算虚耗掉新任务被误杀或者同一批预留被重复记账上限形同虚设。Stop That Shit 的答案是不数事件只认账本。账本里每个预留有明确的容量上限重复事件是幂等的锁保证并发进程改账本时不互相覆盖。预留Reservation先占坑再干活预留的核心逻辑在 delegation-state.cjs 的 reserveDelegation()。当你发起一次委派账本会新增一条预留记录结构非常直白字段含义actionId宿主给这次调用分配的唯一 IDpendingCount还没绑定到具体 agent 的待用名额agentIds已经绑定、正在运行的 agent 名单asyncLaunched是否以异步方式启动预算判定只关心一件事活跃总量 所有预留的 pendingCount agentIds 数量之和见 activeDelegationCount()。决策器在 decision.cjs 中检查已预留 本次申请 agentsN时返回AGENT_BUDGET_EXHAUSTED并拒绝——整批拒绝不消耗任何名额。三道防重复的关键设计同一 actionId 只记一次账。acceptedActions表记住每个 action ID 的已计数量inspectDelegation() 一旦发现新请求复用了已接受的 ID就标记duplicateActionId决策器以DUPLICATE_ACTION_ID拒绝decision.cjs#L179-L187。同一 agent 只绑一次。bindSubagent() 检查agentIdsSeen重复的启动事件直接返回原状态什么都不改。已停止的 agent 最多消耗一个名额。先报停、后报启动的乱序场景下迟到的启动只扣减一个pendingCount重复事件依旧幂等。会话锁Session Lock并发进程不互相踩多平台 Hook 的尴尬在于宿主会为每个事件启动独立的 Hook 进程。两个进程几乎同时发起委派谁先读账本都可能看到过期数据最后写入的一方会把对方的预留覆盖掉——这就是并发超订。Stop That Shit 的解法在 state.cjs锁文件即锁。acquireSessionLock() 用独占模式wx标志创建session.lock文件成功者写入pid:UUID作为令牌失败者每 10ms 轮询一次默认 1.5 秒超时。陈旧锁自动清理。持有者崩溃后锁文件会残留超过 10 秒的陈旧锁会被直接删掉重试不会永久卡死。只写不读也走锁。所有合同更新 账本写入都统一走 updateSession()持锁 → 读 → 改 → 写。而纯读操作不加锁零开销。原子落盘。writeState() 先写临时文件再rename原子替换即使写入中途崩溃账本文件也要么是旧的完整版本、要么是新的完整版本永远不会半截损坏。controller.cjs 中有一句直白的注释Separate host processes can issue independent agent launches close together. Serialize delegation reservations across Hook processes.分离的宿主进程可能几乎同时发起独立委派因此跨 Hook 进程串行化预留。 这套锁 原子替换 校验的组合拳在 ARCHITECTURE.md 中被概括为serialize the delegation ledger so concurrent Hook processes cannot oversubscribe the active agent limit序列化委派账本使并发 Hook 进程无法超订活跃 agent 上限。完整生命周期从占坑到释放把账本操作串起来一次委派的标准流转是这样的阶段账本动作来源1️⃣ 发起委派新增预留占 N 个名额applyDelegationFact(accepted)2️⃣ Subagent 启动绑定 agentIdpendingCount -1bindSubagent()3️⃣ 确认完成解除绑定预留清空后整条删除releaseSubagent()/releaseReservation()4️⃣ 会话结束清空全部预留clearDelegations()其中最保守、也最反直觉的一条规则是只有确认的完成证据才能释放名额。工具返回状态未知时预留原样保留resultUnknown宁可用完预算也不冒险放行——decision.cjs#L215 的拒绝理由会明确提示收集到受支持的完成结果之前请勿复用其预留容量。而 decision.cjs#L190-L199 还设了第二道闸当存在无法证明上界的遗留活动DELEGATION_STATE_UNPROVEN在有限预算下会直接暂停新的委派直到确认完成或开新会话。幂等与降级不确定时只损预算不损正确性这套设计值得新手学习的是它对不确定性的取舍重复通知零副作用delegation-state.test.cjs 验证了agent 只绑定一次重复启动不再增加活跃数delegation-lifecycle.test.cjs 更是把 start/stop/after 三种事件的全部 6 种排列顺序各跑一遍要求每种顺序下名额都恰好释放一次。坏数据进入只读恢复账本文件损坏时recoveryState() 会把会话切入只读恢复模式损坏文件原样保留供备份恢复绝不把畸形计数变成免费容量。宁可误拦不可误放watch 模式下放行的委派同样占名额因为宿主确实允许它执行从 watch 切到 guard 后之前占的名额继续有效——预算账从不过夜清零。小结三招守住 agentsN机制解决的问题关键位置预留账本事件重复/乱序导致的重复记账delegation-state.cjs会话文件锁并发 Hook 进程互相覆盖state.cjs#L254-L295完成证据闸门未知状态下的名额泄漏decision.cjs#L189-L217对新手来说Stop That Shit 给出的通用启示其实超越了这个项目本身给共享资源记账时用有上界的预留 幂等的状态迁移 进程间锁替代简单的计数器加减是防止并发超订的教科书式做法。想继续深入可以从 ARCHITECTURE.md 的 Lifecycle transitions 一节和 test/delegation-state.test.cjs 的边界用例读起。【免费下载链接】stop-that-shitStop That Shit别再造史了面向 Codex/GPT 场景的多平台 Hook Skill Guard拦截 AI coding agent 无需求的哈希、校验和与任务范围膨胀。 A multi-platform Hook Skill Guard for AI coding agents in Codex/GPT workflows: stop unrequested hashes, checksums, and task-scope creep.项目地址: https://gitcode.com/gh_mirrors/st/stop-that-shit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表