Borrowing it
Nothing to install: this file belongs to dualface/onevoke. Take a copy, put it at the same path in your own repository, and replace the rules that are about this project with yours.
curl -O https://raw.githubusercontent.com/dualface/onevoke/main/AGENTS.mdgit clone --depth 1 https://github.com/dualface/onevokeWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/instructions/dualface/onevoke/agents-md)<a href="https://agentmods.dev/instructions/dualface/onevoke/agents-md"><img src="https://agentmods.dev/badge/instructions/dualface/onevoke/agents-md/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/instructions/dualface/onevoke/agents-md"><img src="https://agentmods.dev/badge/instructions/dualface/onevoke/agents-md.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.12247 | $0.12247 |
| Opus 5.5 | $0.04899 | $0.04899 |
| Sonnet 5.5 | $0.02449 | $0.02449 |
| Haiku 4.5 | $0.01225 | $0.01225 |
Grade A, and why
onevoke AGENTS.md scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2mo ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 112 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Repository Guidelines
本文件是 Onevoke 仓库自身的开发规则. 仓库对外发布的工作流规则在 rules/, 那些文件是交付物, 不是本仓库的开发指引.
本仓库特例
- 本仓库第二阶段安全角色
CSA和Hacker一律标记 N/A, 不运行;PM和QA保持适用. - 审核 base 以来全部改动都是 Markdown 规则或文档时, 不运行审核. 只要包含任一脚本, 代码或其他非 Markdown 文件, 就按适用规则运行
PM和QA;CSA和Hacker仍按上一条标记 N/A. - 对外发布的分支模型固定为
main稳定分支加develop集成分支, 不提供其他长期分支或集成分支选项; 缺少develop时从main自动初始化. - 功能或修复改完后默认: 在
develop提交 → fast-forward 合入main→ 推送develop与main→ POSIX 运行./install.sh, 原生 Windows 运行install.ps1更新本机安装; 用户另有指示时除外.
Project Structure & Module Organization
rules/ONEVOKE-AGENTS.md是发布规则的入口, 只放分册索引, 优先级和默认行为. 其余分册由它的分册表按需引用:BASE-RULES.md跨项目通用条款,KANBAN-RULES.md看板行为契约,GIT-RULES.mdGit 工作流,REVIEW-RULES.md审核契约,CODE-RULES.md架构与代码质量契约. 它们是面向用户和 Agent 的对外接口, 改动前确认与bin/下实现一致. 全部装到~/.agents/下的同名文件.install.sh与install.ps1分别是 POSIX 和原生 Windows 安装器. 两者遍历bin/*和rules/*.md, 把全部普通文件直接覆盖到~/.local/bin/与~/.agents/, 包括ONEVOKE-AGENTS.md; Windows 安装器不修改用户PATH, 必须提示用户把~/.local/bin加入PATH, 命令通过.cmd包装入口运行. Windows 安装器读取既有配置语言时必须实际执行候选 Python 3,py -3失败后继续探测python.exe, 再探测python3.exe; 跳过 0 字节的 Windows App Execution Alias (会打开微软商店的重定向器), 已安装的商店版 Python 从其 AppX 包目录取真实python.exe; 不得从 PowerShell 当前 FileSystem provider 位置或 Win32 进程当前目录选择同名程序, 拒绝这些候选后须继续探测 PATH 中后续同名程序. 若存在share/kanban-web/, 同步安装到~/.local/share/onevoke/kanban-web/供kanban web使用. 升级时检测已退役的codex-review.sh、claude-review.sh和grok-review.sh, 提示用户且仅在明确确认后删除; 拒绝或无输入时保留.~/.agents/AGENTS.md不存在时, POSIX 创建指向ONEVOKE-AGENTS.md的相对符号链接, Windows 优先创建硬链接并回落到符号链接, 两者都不得用独立副本冒充入口; 已有任何同名入口时保持不变. 唯一稳定 stdout 按 locale 为Onevoke 已安装或Onevoke installed; 全局安装最后必须用绝对路径运行onevoke welcome. POSIXinstall.sh --project <目录>把同一套载荷只装到目标 Git 项目主 worktree 的.onevoke/(命令、规则、share), 幂等写入本地/.onevoke/exclude, 目标从任一 worktree 指定都归一到主 worktree; 不创建、修改或探测 HOME 下 Onevoke 路径, 不运行 welcome, 不修改 PATH, 不迁移或卸载全局安装. 非 Git、无效参数、目录或符号链接目标拒绝且不回落全局安装. 项目安装成功时 stdout 在稳定安装行之后给出项目本地onevoke与kanban绝对路径. 同名目标是目录或 Windows reparse point 时须在写任何文件前拒绝, 防止安装器把源文件写入错误边界.bin/onevoke_config.py是onevoke与kanban共用的配置边界, 配置默认在~/.config/onevoke/config.json, 测试用ONEVOKE_CONFIG隔离.install_paths()按当前入口解析作用域: 入口位于.onevoke/bin/时为项目模式, 路径落在 Git 主 worktree 的.onevoke/(config, rules, bin, share), 否则为全局模式并保持~/.config/onevoke/config.json,~/.agents,~/.local/bin,~/.local/share/onevoke; 源码树的bin/与rules/不得判为项目安装.ONEVOKE_CONFIG仍覆盖config_path().project_install_paths(project)供安装器把目标归一到主 worktree;ensure_project_git_exclude(project)幂等写入/.onevoke/到本地info/exclude, 保持既有权限, 复用onevoke_fs的 no-follow 追加与锁, 不安全链接边界必须失败. 配置写入必须校验 schema; POSIX 用同目录临时文件加os.replace()原子替换, 权限为0600. Windows 的configured_language, 读取和写入必须从卷/UNC anchor 逐分量 no-follow, 拒绝符号链接、junction 等 reparse point; load 在不共享 WRITE/DELETE 的同一固定句柄上完成读取、schema 校验和旧配置 DACL 迁移, 无效配置不迁移 ACL; save 仅收紧本次新建的配置目录, 临时文件必须先变为当前用户独占的受保护 DACL 再写入, 最后相对固定父句柄原子替换; 不得收紧既有祖先目录. 任一权限或安全后端失败必须报错.language为cn/en, 默认cn, 可在 welcome 设置; 生效优先级为--lang(经ONEVOKE_LANG_CLI跨进程传递) > 配置 > 环境变量.launcher允许auto/tmux/tmux-session/herdr/foreground/console, POSIX 默认auto, Windows 默认console;console仅支持 Windows;auto与herdr仅支持 POSIX.kanban_agent是默认执行 Agent, 可选的kanban_agents段按large/small两种任务卡规模分别指定执行 Agent, 缺失的规模回落到kanban_agent, 未知规模或非法 Agent 拒绝,kanban_agent_for(config, kind)与execution_agents_in_use(config)是kanban/onevoke共用的读取口;models段保存 kanban 与 review 的模型和推理档位, 缺失层级用默认值补齐, 未知键拒绝;model/large_model/small_model允许空串表示用 CLI 默认模型.review_stages为PM/CSA/Hacker/QA各指定auto/skip/required, 缺省全为auto. 它同时是脚本,review-model <agent>子命令输出两行 (<model>与<effort>, model 可为空行) 供onevoke_review.py读取;review-stages按角色顺序输出四行环节策略;configured-language在配置文件存在时输出cn/en.bin/onevoke提供welcome,doctor,config,review. 入口位于.onevoke/bin/时四个子命令都使用项目安装上下文: 配置读写项目.onevoke/config.json, doctor/welcome 的命令检查与规则接入以项目命令根和规则入口为准, POSIXreview只执行同目录onevoke-review.sh; 本地配置或审核门禁缺失时不得回落全局配置、~/.local/bin或 PATH 中的同名入口. 源码树与全局入口保持既有 PATH 行为. welcome 只在 tty 中提问, 无 tty 时诊断后正常提示重跑; 它显示当前配置总览, 只进入用户选择的单项编辑; stdin/stderr 均为 tty 时用方向键菜单 (Enter 确认, 数字跳转, 总览默认停在保存, q 取消; yes/no 为是/否并支持 y/n), 否则回落编号/文本输入. 「执行 Agent」菜单先问大任务 Agent 再问小任务 Agent, 写入kanban_agents并把kanban_agent设为大任务 Agent; doctor, 规则接入检查和onevoke config都按execution_agents_in_use覆盖实际用到的每个执行 Agent; MemSearch 由reconcile_memsearch按最终配置对账: 在菜单确认启用时执行, 以及执行 Agent 集合相对既有配置有变化时在保存前执行 (未改 Agent 的既有配置原样保留), 对每个受支持 (Codex, Claude) 且尚未覆盖的在用 Agent 执行安装或给出安装提示 (既有已启用配置里的受支持 Agent 视为已覆盖), 不受支持的在用 Agent 逐个告警, 全部不受支持时关闭 MemSearch 并告警. 依赖安装必须经用户明确选择; 模型菜单只列本次配置用到的执行 Agent 和 Reviewer; Windows 优先用 PATH 中的<name>.exe, 只有.cmd/.bat时通过cmd.exe /d /s /v:off /c启动并可执行--version; Windows launcher 菜单只列console与foreground, POSIX 把auto放在最前, 再按 tmux 与 herdr 可用性列适用选项; herdr 已安装或当前已选 herdr 时列在 tmux-session 之后, foreground 之前; 审核环节菜单为四角色配置auto/skip/required. MemSearch Codex 插件只克隆官方仓库并运行上游安装脚本, 不检查仓库和安装状态; 上游安装器需要 Bash, 因此原生 Windows 当前不启用该集成.review按角色配置选择 Codex、Claude、Grok 或 Cursor, POSIX 全局模式分发到 PATH 中的onevoke-review.sh, Windows 直接用当前 Python 进入同目录的onevoke_review.py, 两者共享唯一门禁实现.bin/kanban命令细节 (自rules/KANBAN-RULES.md迁入, 改实现时同步更新本条):init幂等创建看板和 7 个状态目录 (backlog,todo,working,review,done,archived,trash); 旧看板缺review且其余 6 个目录齐全时,ensure_layout在任一命令定位看板时用同一create_state_directory自动补建, 其他目录缺失或review被文件/reparse point 占用仍全部失败, Git 项目只写本地.git/info/exclude, 最后输出当前作用域规则路径; Windows 新看板目录必须用固定父句柄和CREATE_NEW在创建时应用私有 DACL, 创建竞态失败关闭, 既有目录只迁移叶目录 ACL; Git exclude 的父链逐分量 no-follow, 既有 ACL 保持不变, 去重读取与追加使用同一固定叶句柄及文件锁.rules不要求已有看板, 按当前入口输出全局~/.agents/KANBAN-RULES.md或项目.onevoke/rules/KANBAN-RULES.md, 项目模式不回落全局规则.list按状态分组、组内按显示时间倒序, 同时或缺失时按任务 ID 倒序, 默认彩色表格并标出规模,--mobile输出竖屏布局;working显示开始时间,done显示完成时间, 旧卡缺完成时间时用文档最后修改时间.new在backlog/创建小任务,--large创建含spec.md的大任务目录.pick执行backlog -> todo及完整性校验, 不给 ID 时只列候选;move只执行状态模型允许且满足目标要求的迁移,review只能从working进入且要求已填任务分支, 可迁回working或进done.start只接受todo卡, 按卡片规模用kanban_agent_for选 Agent (--agent优先), 卡片有任务组时 prompt 改为任务组版本 (开发, 验证, 提交 push 并汇入组分支后move review退出, 不自行审核集成), 否则为单卡版本, 原子执行todo -> working、写负责人, 开始时间和会话(Claude/Grok 预分配 UUID 经--session-id传入, Cursor 先create-chat预建 chat 并以--resume <chat>启动, 失败不领取; Codex 只记 Agent 名; 旧卡缺会话行时插在负责人后) 再启动 Agent, 成功输出含规模与实际 Agent;resume只接受review/working卡, 必须且只能给--message或--message-file之一, 用卡片会话记录的原 Agent 恢复会话 (Claude/Grok--resume <uuid>, Cursor--resume <chat>, Codexresume <id>且 id 在CODEX_HOME/~/.codex的sessions/**/rollout-*.jsonl中按 mtime 倒序检索以该任务 start/resume prompt 开头的用户消息),review卡先迁回working, 启动失败迁回,working卡不迁移, prompt 为固定说明加事项正文;start与resume共用prepare_launch/launch_agent/rollback_launch/report_launch, 回滚先恢复文档再迁回原状态, 文档没恢复就不迁回且报错写明卡片实际所在目录, 项目模式 prompt 使用命令根下kanban与主 worktreeAGENTS.md的绝对路径且从 task worktree 调用仍指向主 worktree 安装; 模型和大小任务的推理档位读生效配置的models.kanban.<agent>, 默认值为 Codexgpt-5.6-solhigh/medium, Claudeopushigh/medium, Grok 不锁模型 xhigh/high, Cursor 用完整模型 idcursor-grok-4.6-xhigh/cursor-grok-4.6-high且无 effort, 模型为空串时不传--model; 六种 launcher 的 cwd 都是项目根,auto在启动当时按HERDR_ENV再TMUX解析为herdr或tmux且不写回配置, 两者都不在则失败且不领取, 不回落到tmux-session或foreground,tmux只在当前 session 建kb-<任务标题>window 不建 session,tmux-session按项目根绝对路径算出kb-<目录名>-<sha256 前 8 位>的专属 session, 不存在时new-session -d新建并 best-effort 写@onevoke_project标记, 已存在且标记为空或匹配时复用并new-window, 标记属于其他项目时退避到-2…-9候选,herdr要求HERDR_ENV=1且 herdr 在 PATH, 在当前 workspace 新建 tab 后用pane wait-output --regex '\S' --source visible --timeout等根 pane 渲染出首帧输出 (未就绪时 pane run 的命令文本会被终端丢弃), 再在根 pane 执行与 tmux 相同的 Agent 命令, 创建 tab, 就绪等待或 pane run 失败时回滚卡片, 后两者还须关闭本次新建的 tab,foreground要求三个标准流都是 TTY 并等待 Agent 退出,console仅支持 Windows, 用独立控制台启动后返回 PID.console不创建或复用 session, 不支持 attach 或输出抓取, 不得描述为 tmux 等价实现.前置任务固定写在讨论与决策开头, 允许用 ASCII 逗号混写任务 ID 与任务组 ID,N/A或整行缺失表示无依赖;task_dependencies统一返回组内卡、组外卡、任务组三类引用以及任务组当前成员展开后的任务 ID.check不带目标时默认列出除done/archived外的无效入口并校验这些卡片的依赖引用存在且无环,--all才纳入done与archived; 指定任务 ID 时只检查这些精确目标及其跨状态/形态冲突和可达依赖图, 无关无效入口不影响结果, 显式指定的done/archived卡仍检查; 默认遇done/archived前置卡只确认引用存在,--all才沿完整可达图检查; 依赖尚未满足不导致失败. 无参和--all探测全部working/卡, 定向只探测指定目标中的working/卡且跳过review/; 四态为alive/stopped/drifted/unknown, 纯只读且不影响退出码, Windows 与 foreground/console 恒为unknown, herdr 未上报会话身份但 Agent 与状态匹配时为alive并提示无法直投.subscribe校验显式任务组与成员后输出稳定 JSON Lines: 初始snapshot, 状态变化state-change, 默认 15 分钟无变化的heartbeat; 探测集合包含指定成员及可选--watch展开的外部目标, 并沿用 no-follow/reparse 拒绝边界; heartbeat 仅在存在working/被监控任务时携带liveness映射, 每项含agent/status/channel/detail, 探测失败折算unknown且不结束订阅. 其他命令忽略无关的无效入口只在目标任务违规时失败, 状态目录缺失或不可写时全部失败.web的--host/--port覆盖监听地址,--refresh控制服务端扫描秒数,--assets覆盖资源目录,--open尝试打开浏览器;tui的--single强制单栏, 默认每栏最小 40 列并按宽度自适应显示部分或全部栏目, 可用-/=调节栏宽并写入当前作用域配置目录的tui.json(测试用ONEVOKE_CONFIG同目录), 不足最小栏宽时按实际宽度显示单栏并保证选中栏可见,--refresh控制自动刷新秒数 (默认 30),--theme指定 auto/light/dark 配色 (运行中用t循环切换), 且要求 stdin/stdout 都是 TTY.start还在紧随会话的窗口字段记录投递地址: herdr 为herdr:<tab-id>:<pane-id>, tmux/tmux-session 为<launcher>:<session-id>:<window-id>:<pane-id>, foreground/console 为 launcher 名, 缺字段的旧卡在 start 时插入. tmux/tmux-session 先创建占位 window/pane, 持久化地址后才respawn-pane启动 Agent, 再用tmux set-option -p -t <pane-id> @onevoke_session <会话-id>写入 pane 会话标记; Claude/Grok/Cursor 取卡片记录的 id, Codex 复用notify/resume的 rollout 解析取得 id. 地址写入、Agent 启动或 pane 会话标记写入失败都关闭本次 window 并回滚.notify是主控派回事项的单一接口, 与resume使用相同的消息入参与状态范围并接受--paneherdr 覆盖及大于 60 的有限--timeout(默认 120 秒). 地址优先取--pane, 再取窗口; 缺窗口时按 Agent 与会话 id 从herdr pane list唯一反查并回写, 卡片已有 id 的 Agent 直接比对, 只有旧 Codex 缺 id 时复用 rollout 检索. 反查不设 Agent 白名单, 覆盖范围取决于 herdr 版本和各 Agent 集成是否报告agent_session.value; tmux 缺窗口时不可反查. herdr 按 pane、Agent、会话 id 并仅在idle或done状态直投; tmux 系同时校验pane_current_command,pane_in_mode,pane_dead和 pane 的@onevoke_session, 后者必须非空且与卡片解析出的会话 id 完全一致, 缺失时因身份不可证而回落, 不降级为进程名级放行; 不一致属于地址过期, 先反查并只在唯一命中且复检通过后直投. 两类会话标记都只防同用户环境内的误投, 不构成抵御同用户恶意伪造的安全边界. 只在直投地址与探查通过后创建正文载荷, foreground/console 回落不创建; 正文写入创建时即收紧的0700私有目录中的0600文件, 终端只接收以# onevoke-notify:开头的单行路径与 marker 指令; herdr 用agent prompt <pane-id> <instruction>投给 pane 内已在运行的 Agent TUI (按 pane 实际的 bracketed-paste 模式送正文并延时补一次编码后的 Enter, Agent 停在审批或提问 UI 时先行拒绝), 不用面向 shell 的pane run(同批写入的结尾 CR 在 Cursor 等 TUI 不算提交, 正文会停在输入栏), 也不用只接受按键名的pane send-keys, tmux 用send-keys -l后单独发送Enter. herdr 用pane wait-output --match <marker> --source recent做字面子串匹配, tmux 用有界capture-pane按字面子串轮询 marker. 投递动作成功即迁卡并成功返回, marker 超时只警告未确认且不恢复; foreground/console、无通道、探查或发送失败才由notify内部恢复原会话; process 型恢复观察完整 timeout, foreground 迁卡后继续附着等待 Agent, herdr 恢复对本次新建 pane 校验 Agent 与idle/working/blocked状态, 有非空agent_session.value时还须与卡片会话匹配, 未上报有效身份时不因此失败; 该存活判据只判断已知新 pane, 不作为同用户安全边界;done/unknown仍拒绝; 清理失败与原错误合并并提示新 Agent 可能仍存活. 两路都失败时保持正文与状态并同时报告原因; 主控只调用一次notify, 不自行执行回落.resume也接受大于 60 的有限--timeout(默认 120 秒), 启动成功后复用notify恢复分支的validate_resumed_agent: herdr 对本次新建 pane 使用上一条的存活判据, tmux/tmux-session 按可寻址终端判活, foreground 与 console 在完整 timeout 观察期内要求进程不退出. 这里的启动失败包括存活校验失败; 失败时先收集可取得的 Agent 原始输出并清理新实例, 再由rollback_launch恢复原文档和状态, 文档恢复失败则不迁回并报告卡片实际目录. 只有校验通过才报告已唤醒.resume默认恢复卡片原 Agent 和原会话; 显式--agent(即使同名) 表示用户授权以全新会话接管, 覆写负责人/会话/窗口而不改开始时间, 失败时整文和状态回滚. tmux/tmux-session 的新 Codex 会话发现精确 id 后写回卡片; herdr/进程型保留无 id 的codex. 新 Agent 存活后按 dismiss 的身份及单 pane 拓扑门禁尝试优雅退出和关闭原容器; 无地址、foreground/console、Windows 或新旧地址相同记 N/A, 校验或清理失败只报告原容器保留, 不强杀且不回滚接管. 存活与清理各可占用一次完整 timeout, 最坏约 2 倍; 先输出原容器清理/保留行, 再输出已接管. herdr 的pane run成功且卡片会话 reference 非空时,start与resume/notify恢复通道共用 launcher 内的上报路径: Onevoke 通过HERDR_SOCKET_PATH调用pane.report_agent_session, 参数取本次 pane id、卡片 Agent、卡片 reference、source=herdr:<agent>与单调递增的seq, 再在有界预算内用pane get读回相同的agent_session.value; 空 reference (包括新启动且尚未发现 id 的 Codex) 不上报. socket、响应或读回失败只输出一条告警, 不使启动失败, 不回滚卡片或关闭 tab. herdr 自身集成仍可上报同一身份; Onevoke 的路径用于补齐未触发集成钩子的启动方式. herdr 在pane run成功后即算启动成功, 后续上报不进入LaunchFailure的清理与回滚路径. Windows 的 notify 消息临时根只用GetTempPathW取得词法路径, 不经tempfile探测或Path.resolve(); 后续由 no-follow 句柄边界逐分量拒绝 reparse point, 再创建 protected DACL 的私有目录与文件.subscribe --watch可重复指定组外任务或任务组, 后者通过task_group_members共用读取口展开当前成员; 不校验外部目标的组归属, 但拒绝不存在, 空展开及与成员或其他外部目标重复. 三类事件的tasks同时包含成员和外部目标, 传入--watch时每条事件另含顶层watched外部任务 ID 数组, 外部变化同样触发状态事件并重置心跳; 未传时保持既有 JSON 输出和探测边界.dismiss只接受done/或archived/卡且不修改卡片,--timeout必须是大于 60 的有限秒数并默认 120 秒. 它按卡片地址定位 herdr 或 tmux/tmux-session pane; 缺地址的旧 herdr 卡与 pane 不存在/已死, Agent, 会话标记或前台进程不匹配的过期地址允许按 Agent 与会话唯一反查, 0 或多命中与忙态仍拒绝. 反查后以命中 pane 的实际 herdr tab 或 tmux session/window 重跑身份和拓扑校验, 不回写卡片地址; 投递退出命令前必须验证 Agent、会话、运行状态、pane 当前所属容器与定位结果完全一致, 并确认容器只含该 pane. Claude/Codex 送/exit, Grok/Cursor 送/quit; 仅在有界等待确认 Agent 退出后关闭经验证的 tab/window. 身份、拓扑、投递、退出确认、关闭或超时失败均保留现场且不强杀; Windows、foreground 与 console 在无部分动作下拒绝.bin/kanban的start未传--agent时按卡片规模读取生效的kanban_agents.large/kanban_agents.small;--agent始终优先.--launcher可覆盖本次启动且不改机器配置; launcher 为auto时在领取前解析且 Windows 拒绝, 为tmux时在当前 session 后台创建独立 window 且必须已在 tmux session 内, 为tmux-session时不要求已在 tmux 内, 新建或复用 session 时都后台创建 window, 启动后不 attach 或 switch-client, 只打印 session 名, window id 和 attach 提示, 为herdr时必须处于 herdr (HERDR_ENV=1) 且 herdr 在 PATH, 后台新建不获取焦点的 tab 后打印 tab id 和 pane id, Windows 拒绝 herdr 和 auto, 为foreground时必须有交互 tty 并在当前终端等待 Agent 退出, 为console时必须是 Windows, 创建独立控制台进程后打印 PID 并立即返回.web启动只读看板 UI, 默认127.0.0.1:8080, 服务端默认每 60 秒扫描并仅在内容变化时通过 SSE 推送, 客户端按任务 ID 原位更新; 资源来自当前作用域share/kanban-web/(全局为源码树或~/.local/share/onevoke/kanban-web/, 项目为.onevoke/share/kanban-web/, 项目模式不回落全局资源), 由bin/kanban_web.py用标准库 HTTP 服务和string.Template渲染, 是原生 Windows 第一阶段保证的看板 UI.tui复用 Web payload 的扫描、排序和搜索字段 (经scan而非load_board, 不向 stderr 注入无效入口警告), 默认按终端宽度显示活跃栏目, 宽度不足时少显示或按实际宽度显示单栏并保持选中栏可见,-/=调节并记住栏宽,a切换到全部 7 栏,y复制当前任务 ID, 任务卡与详情支持鼠标拖选自动复制, 详情内v/V切换字符/行选择并用y复制;bin/kanban_tui.py依赖curses负责多栏/单栏导航、鼠标点选与滚轮、任务详情 (vim 翻页与正文搜索)、终端缩放和默认每 30 秒的原位刷新, 刷新时按任务 ID 更新并尽量保留选中项和滚动位置. Windows 上只有当前 Python 提供可用 curses 后端时才能运行 TUI, 本阶段不保证.- 新增分册时把它加进
ONEVOKE-AGENTS.md的分册表即可;install.sh,install.ps1和安装测试都遍历rules/*.md, 不必改. - 本仓库根目录的
AGENTS.md是本仓库自己的开发规则, 与rules/下的发布物是两回事, 不要混改. bin/kanban是 Python 3 CLI 的唯一实现入口, 包含看板定位、任务校验、状态迁移和命令解析;bin/kanban_probe.py封装 herdr/tmux pane 事实采集, 不包含投递或存活策略;bin/kanban_liveness.py封装 check/subscribe 共用的只读存活分类和 notify 共用的会话反查;bin/kanban_notify.py封装 notify 的 ready/busy/stale/fallback 分类、忙态重试和过期地址反查决策;bin/kanban.cmd是 Windows 包装入口.bin/kanban_web.py与bin/kanban_tui.py分别封装只读 Web 和终端界面.bin/onevoke负责首次引导、环境诊断、配置展示和 Reviewer 分发,bin/onevoke.cmd是 Windows 包装入口.bin/onevoke_process.py集中解析 Agent CLI, 创建 UTF-8 任务文件与构建进程调用. 执行 Agent 和 Reviewer 都只把必需控制参数与短文件指令交给 CLI; 任务文件不检查 POSIX 权限或 Windows ACL, 并要求 Agent 在完成后尝试删除, 遗留不影响结果. Windows 优先解析.exe, 只有.cmd/.bat时用显式cmd.exe /d /s /v:off /c和环境变量承载的已编码参数启动, 不用shell=True, 不作为任意批处理脚本的通用契约.bin/onevoke_review.py是 Codex、Claude、Grok 与 Cursor 共用的单一审核门禁实现, 集中维护 commit 校验、evidence、prompt 骨架、超时监督和 worktree 篡改检测; 第 7 个可选位置参数reviewed-commit触发增量复审: 它必须是完整 SHA, 在 base 之后且在 commit 之前, evidence 追加reviewed..commit的 FIX RANGE 段, prompt 的范围规则换成「只核实上轮 finding 闭环 + 只审修复范围」, 空串表示全量审核; POSIX 的公开入口是bin/onevoke-review.sh, Windows 的人工交互入口是bin/onevoke-review.cmd,onevoke review的 Windows 程序化分发直接进入该 Python 实现. 模型与推理档位按 环境变量 > Onevoke 配置 > 内置默认 解析, 配置读取失败时回落到内置默认, 不阻塞审核. 用户可见输出语言优先级为ONEVOKE_LANG_CLI标记的显式--lang> 配置 > 环境变量. Codex 在目标 worktree 内以--sandbox read-only --ephemeral运行; Claude 在外部 runtime 目录以--permission-mode plan --tools Read,Grep,Glob --safe-mode --no-session-persistence运行; Grok 在外部 runtime 目录以--sandbox read-only --no-memory --no-subagents运行且只开放read_file,grep,list_dir; Cursor 在外部 runtime 目录以--print --output-format json --trust运行, 把CURSOR_CONFIG_DIR/CURSOR_DATA_DIR指向该 runtime, 不做--sandbox事前阻断. Reviewer 退出后一律对其进程组发 SIGKILL 并等到组内无非 zombie 成员, 收不尽即审核失败; 「是否因残留而拒绝结果」按AgentSettings.spawns_helper_processes分两档: 默认档 (Codex, Claude, Grok) 保持 Reviewer 退出瞬间进程组非空即拒绝; Cursor 置位该标记, 因为 cursor-agent 必然为自己拉起 worker-server 及经 npx 启动的 language server 且不等其收尾, 严格判定会恒定拒绝每一次正常审核. 置位后改用父链归属判定:monitor_process在 Reviewer 存活期间按TREE_OBSERVE_INTERVAL采样进程表, 把能经父链回到组长的成员记为 Reviewer 自身进程树, 只有组内却已脱离父链的 detached 后代 (双 fork 后被 init 收养) 才判为残留并拒绝结果. 采样只能在 Reviewer 存活时进行 — 它一退出子进程即被收养, 父链随即丢失. 拿不到采样结果或拿不到进程表时 fail-closed, 回到默认档的严格判定. 该放宽不改变容器边界 (整组仍被 SIGKILL 收尽), 只改变信任判定, 兜底仍是审核结束后的工作树闸门. Windows 通过GetTempPathW只取得临时根的词法路径, 不允许tempfile在 no-follow 校验前写探测; runtime 从固定临时根句柄以CREATE_NEW和创建时 protected DACL 生成, 随机名碰撞重试, 不得先发布继承 ACL 的目录再收紧. runtime 的根句柄必须不共享 WRITE/DELETE 并持有到 Reviewer 进程树收集、worktree 校验和敏感文件清理完成, 阻止入口改名及原地切换为 reparse point; 清理必须从该固定句柄逐层拒绝 reparse point, 并受深度、条目与轮次预算约束, 任一清理失败都使审核失败. Windows 适配不得改变隔离参数. 新增 reviewer 只扩展该实现的 agent 适配层, 不新增脚本.bin/onevoke_fs.py是跨平台安全文件边界. POSIX 继续使用 no-follow/openat 语义、0600/0700和flock; Windows 必须拒绝符号链接、junction 等所有 reparse point, 用已校验的 Win32 句柄完成普通文件读写、同边界原子替换与迁移, 用受保护 DACL 限制私有对象的当前用户访问, 用LockFileEx实现阻塞式独占锁. 私有对象不得回落到继承 ACL; Git exclude 等明确保持既有权限的中性对象可继承父 ACL, 但仍必须逐分量 no-follow 并固定句柄. 不得在 Windows 回落到未经句柄校验的Path.rename()或无锁实现.bin/merge-worktree-memory.py在集成后合并 worktree 的 memsearch 记忆, 清除合并结果中的非法 UTF-8 字节, 并通过该文件系统层固定来源/目标句柄、拒绝 reparse point、迁移目标记忆 DACL 及加锁; Linux 合并成功后还须用 pidfd 固定并停止来源.memsearch/.watch.pid指向的同路径 MemSearch watcher, 等待独立进程组全部退出并再次合并停止期间的最终写入, 其他 POSIX 遇到存活 watcher 时 fail-closed, 失败时保留 worktree; Windows 由bin/merge-worktree-memory.cmd包装启动.tests/test-onevoke.py用临时 HOME 和伪终端覆盖 welcome、配置和 Reviewer 分发, 并覆盖项目安装上下文的成功与拒绝路径.tests/test-onevoke-config.py覆盖安装上下文解析与项目 Git exclude 的成功和拒绝路径;tests/test-onevoke-process.py覆盖跨平台 Agent 解析、临时任务文件与 Windows batch 参数编码.tests/test-kanban.py覆盖看板生命周期 (含review状态迁移)、按规模选 Agent、会话记录、resume的四种 Agent 恢复参数、Codex rollout 检索与回滚、POSIX launcher (含tmux-session的建/复用/退避/回滚和herdr的成功、拒绝与回滚)、安装及初始化, 并用伪终端覆盖 TUI 启动退出;tests/kanban_notify_liveness_tests.py以 mixin 覆盖 notify 过期地址反查和忙态重试;tests/kanban_takeover_tests.py作为测试 mixin 覆盖 resume 接管、回滚和旧容器清理;tests/kanban_dismiss_tests.py作为测试 mixin 覆盖 dismiss 过期地址反查;tests/test-kanban-probe.py覆盖 pane 事实层的消失、选项缺失和探测失败分类.tests/test-merge-worktree-memory.py覆盖跨平台记忆合并; 四个 agent 的 POSIX 审核测试覆盖共用门禁.tests/test-install-windows.py,tests/test-windows-automation.py,tests/test-windows-console.py,tests/test-windows-fs.py,tests/test-windows-review.py,tests/test-windows-web.py分别覆盖 PowerShell 安装、不可用py.exe到python.exe/python3.exe的实际回退与.cmd入口、Windows 自动化文档的包装入口和 argv 边界、Windows console 领取/启动/PID/失败回滚、显式或配置 herdr 的拒绝、Win32 reparse/ACL/LockFileEx 文件安全 (含配置及 Git exclude 的 parent/leaf junction、FSCTL 原地切换、固定叶替换、创建时私有 DACL、创建碰撞、校验期写入/替换、无效配置 ACL、新建目录与相对 override)、Windows 审核 runtime 创建时 DACL、全生命周期 WRITE/DELETE 根句柄租约、根 FSCTL 切换拒绝、安全清理、临时根 reparse、隔离/超时/篡改检测与分发、原生 Windows Web 的 UTF-8 HTTP 端到端流程.- 运行时创建的
kanban/是本机共享数据, 不属于仓库源码, 不得提交.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2mo ago Changed · +18 lines · +5,023 tokens per session 691267703f06
- 2mo ago First seen · 94 lines · 7,224 tokens per session scan A 83f97430efc3
onevoke AGENTS.md is an instructions file published in the GitHub repository dualface/onevoke (17 stars, last pushed 2mo ago), licensed MIT. It adds 12,247 tokens to every session, about $0.0490 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
onevoke AGENTS.md compared with instructions from other repositories
| Mod | Type | Stars | Last push | Licence | Scan | Tokens | Works with |
|---|---|---|---|---|---|---|---|
| onevoke AGENTS.mddualface/onevoke | Instructions file | 17 | 2mo ago | MIT | A | 12,247 | Codex, OpenCode |
| vscode buildNext.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 9,719 | GitHub Copilot |
| next.js AGENTS.mdvercel/next.js | Instructions file | 143k | today | MIT | A | 7,461 | Codex, OpenCode |
| vscode oss-third-party-notices.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 5,516 | GitHub Copilot |
| langchain AGENTS.mdlangchain-ai/langchain | Instructions file | 149k | today | MIT | A | 4,680 | Codex, OpenCode |
| vscode copilot-instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 3,093 | GitHub Copilot |
| vscode ai-customization.instructions.mdmicrosoft/vscode | Instructions file | 195k | today | MIT | A | 1,907 | GitHub Copilot |