name: select
description: “群集就绪工作选择器:选择一个源(调用列表、SLICES.md 或 plan-N.md),将其细化为依赖感知的原子任务,并发出一个编排计划(波次 + 委派)加上可选管道。用于提示如 $select、use $select、pick the next ready slice、orchestrate workers from SLICES 或 what should run in parallel next。仅计划;无回写;编排无关。”
选择
意图
选择一个任务源,将其细化为依赖感知的原子任务,在安全时调度并行波次,并发出一个编排计划。
这个技能是仅计划:
- 它不实施更改(无代码编辑;无运行工作者)。
- 它不改变任务源(无
SLICES.md写入,无plan-N.md写入);相反,它根据需要发出显式的手动回写步骤(例如,“标记 <id> 为 in_progress”)。 - 它是编排无关的:输出是中性的计划模式(不绑定到特定执行器)。
它还可能发出一个小管道,用于将计划工件驱动到执行中(手动步骤;可选可循环)。
群集就绪规划
$select 针对并行多代理执行进行了优化,因此它偏好明确、分解和锁安全的计划。
- 探索代码库(只读) 当需要时,以将任务基于真实路径/组件并设置严格的
scope锁。 - 提出澄清问题 当存在多个合理方法时;包括推荐的默认值。
- 原子任务:每个任务应该可由单个工作者独立执行。
- 工作流塑造:首先识别主要工作流,然后将原子任务映射到这些工作流中。
- 角色感知塑造:当有用时使用角色标签(
contract、implementation、integration、checkpoint)以提高排序和审查质量。 - 显式依赖:偏好显式边,而不是依赖通过重叠
scope的隐式序列化。 - 委派元数据:包括
scope(并行安全所需),加上location和validation尽可能。 - 在产出前审查:运行一个单独的审查者模式传递以检查缺失依赖/顺序/锁重叠/验证间隙。
分解启发式(并行质量)
当选定的源是粗糙或线性时,在调度波次前细化任务结构:
- 识别工作流,并尽可能将任务描述限定在一个工作流内。
- 为解锁多个下游任务的API/模式/接口/配置决策创建显式
contract任务。 - 在并行分支后创建显式
checkpoint/integration任务作为连接点。 - 保持中等粒度:每个任务应该可独立PR。
- 偏好显式依赖边以记录真实先决条件并避免意外序列化。
依赖语义(硬 vs 软)
使用两个具有不同含义的依赖通道:
depends_on:硬先决条件;贡献于DAG准备度和波次调度。related_to:软排序/上下文边;从不限制准备度或波次资格。
如果排序不确定或建议性(“最好先做”、“减少返工”),偏好 related_to 而非 depends_on。
调用指令(可选)
如果存在,从调用文本中解释这些指令:
mode:both|triage|newboth(默认):首先处理in_progress;然后选择新工作。triage:仅处理in_progress并推荐关闭/重新打开/继续。new:跳过处理,选择新工作(仍警告in_progress)。
max_tasks:auto|<int>- 如果省略:默认
1对于slices;否则auto。 - 在处理决策后应用。
- 如果省略:默认
review:required|auto|offrequired(默认):运行审查者传递并迭代直到通过(或如果阻塞则停止+询问)。auto:运行一次审查者传递;修复能修复的;继续剩余警告。off:跳过审查者传递。
源优先级
当多个源存在时,使用此优先级选择一个:
- 用户提供的调用文本中的显式任务列表。
SLICES.md(如果存在且可解析)。plan-N.md(最高N,仓库根目录)。
如果最高优先级的源存在但没有可行任务,不要默认为空计划。
- 首先尝试选择一个解锁器(一个被阻塞的叶任务,可以解锁未来准备就绪的工作)。
- 仅当源为空/不可解析,或如果所有都关闭/不可调度时,停止+询问回退。
源检测 + 预检(如何)
在不改变源的情况下检测源:
- 调用任务列表:
- 一个编号/项目符号列表,后跟显式短语如“Use $select” / “$select:”。
- 如果存在,将其视为源且不看其他地方。
SLICES.md:- 存在于仓库根目录(
SLICES.md)。 - 可解析(每个切片部分包含恰好一个YAML映射)。
- 存在于仓库根目录(
plan-N.md:- 在仓库根目录找到匹配
plan-(\d+).md的文件并选择最高N。
- 在仓库根目录找到匹配
预检(尽力而为):
- 对于选定的源,收集候选任务 + 依赖边。
- 如果依赖引用未知任务ID,将引用任务视为阻塞;仅在自动修复失败后警告。
- 如果依赖图是循环/不可调度,调度循环外的工作(如果可能)并发出警告。
- 如果源存在但不可解析/空,在回退前停止并询问。
警告自动修复(只读)
在发出警告前,尝试安全、确定性的修复,不改变源。
顺序(解决时停止):
- ID规范化 + 别名:
- 规范化ids/depends_on/related_to(修剪、小写、去掉前导
#)。 - 如果
depends_on未知,尝试通过数字后缀别名(例如,1->t-1、sl-1)或精确规范匹配映射到唯一已知id。 - 如果解决,用规范id替换依赖并抑制未知依赖警告。
- 规范化ids/depends_on/related_to(修剪、小写、去掉前导
- Scope规范化(安全):
- 规范化每个
scope条目:修剪空白;去掉前导./(规范化./为.);折叠重复/;去掉尾随/(除了/)。 - 如果任何scope条目更改,记录为
auto_fix: scope_normalize。
- 规范化每个
- Scope推断(保守):
- 如果
scope缺失,扫描id/title/subtasks以查找显式路径或glob令牌(包含/、**或文件扩展名)。 - 仅采用现有路径或明显glob的令牌;偏好最窄的非重叠集。
- 如果推断,设置
scope并抑制缺失scope警告。
- 如果
- 编排器降级:
- 如果
agent: orchestrator缺少subtasks,降级为worker。 - 这是一个语义更改;即使修复后仍发出警告。
- 如果
在决策跟踪(auto_fix)中记录自动修复,并为未解决问题保留 warnings。
源适配器(读一个;不即兴)
选择源类型后,读取并应用恰好一个适配器规范:
- list:
codex/skills/select/ADAPTER_LIST.md - slices:
codex/skills/select/ADAPTER_SLICES.md - plan:
codex/skills/select/ADAPTER_PLAN.md
回归测试用例位于 codex/skills/select/FIXTURES.md。
并行规则(安全第一)
仅当任务提供足够元数据以使其有防御性时才调度并行波次。
- 一个任务仅在具有非空
scope列表时才符合并行波次资格。 - 两个任务仅当它们的
scope集不重叠时才共享一个波次。- 将
scope条目视为独占锁。 - 推荐锁样式:目录根或紧密文件glob。
- 保守重叠检查:比较锁根,而非原始字符串。
- 对于每个
scope条目:规范化它(去掉前导./;折叠/),去掉尾随/**或/**/*,然后取到第一个glob元字符(*、?、[)的前缀。 - 如果任何锁根相等或一个锁根是另一个的路径前缀,则视为重叠。
- 对于每个
- 将
- 缺失
scope的任务被视为与所有内容重叠,因此单独调度。- 仅当影响此计划的波次打包时警告
missing_scope。 - 提示:添加一个窄的
scope列表(路径/glob)以解锁并行波次。
- 仅当影响此计划的波次打包时警告
- 具有过宽
scope锁的任务被视为与所有内容重叠,因此单独调度。- 宽示例:
""、.、./、/、*、**、**/*。 - 仅当影响此计划的波次打包时警告
broad_scope。
- 宽示例:
- 如果由于重叠锁根任务必须序列化,偏好显式
depends_on边以使顺序有意。- 仅当锁根嵌套(严格前缀)、任务否则依赖无关(无DAG路径)且顺序由平局决胜/稳定顺序选择时警告
implicit_order。
- 仅当锁根嵌套(严格前缀)、任务否则依赖无关(无DAG路径)且顺序由平局决胜/稳定顺序选择时警告
委派准备度(推荐)
并行波次仅当每个任务可由工作者独立执行时才有用。
- 偏好包含以下的任务:
location:在哪里工作(路径/glob;仅导航;不影响调度)validation:如何证明完成(命令/检查;不影响调度)
- 如果发出任何具有2+任务的波次,且该波次包含至少一个具有
validation的任务,为该波次中缺少validation的任务警告missing_validation。
认领选定工作(必需)
当 $select 选择要现在开始的工作(即,第一个调度波次 waves[0] 中的任务)时,它还必须发出一个认领,以便其他规划者/执行器不会同时选取相同工作。
- 如果选定的源支持状态,认领是:使用源的拼写将选定任务设置为进行中状态。
- 规范令牌:
in_progress - 当读取/处理时,接受常见变体为等效:
in progress、in-progress、in_progress - 当发出认领时,偏好源已使用的令牌;否则默认
in_progress。
- 规范令牌:
- 如果源是
list或plan,发出claim: none。
这仍是仅计划:$select 不执行回写;它拼写要更改的内容。
编排之编排
任务仅在用户提供 subtasks 时才委派给 agent: orchestrator。
如果 agent: orchestrator 设置但 subtasks 为空/缺失,降级为 agent: worker,记录自动修复,并警告。
输出:OrchPlan v1
发出一个包含规范计划的YAML块。
模式(YAML;尽力而为,省略未知键):
schema_version: 1
kind: OrchPlan
created_at: "<rfc3339>"
source:
kind: list|slices|plan
locator: "<自由格式;例如 'invocation', 'SLICES.md', 'plan-3.md'>"
# 可选。如果省略,视为“auto”(不受限制;波次由依赖/锁驱动)。
cap: auto
# 可选。仅人类/工作者上下文(不影响调度)。
prereqs: []
risks: []
tasks:
- id: t-1
title: "..."
description: "..." # 可选
workstream: "..." # 可选
role: contract|implementation|integration|checkpoint # 可选
parallelism_impact: "unlocks <n> tasks" # 可选尽力而为
agent: worker|orchestrator
scope: ["path/**"]
location: ["path/file"] # 可选
validation: ["..."] # 可选
depends_on: []
related_to: [] # 可选非门控链接
subtasks: []
waves:
- id: w1
tasks: [t-1, t-2]
- id: w2
tasks: [t-3]
integration:
boundary: patch-first
order: [t-1, t-2, t-3]
conflict_policy: rebase-author
warnings:
- "..."
决策跟踪(必需)
在OrchPlan YAML后,发出一个简短的纯文本跟踪(紧凑且结构化):
source: 选定的源类型 + 定位器mode: 解析的mode+ 解析的max_taskstriage: 如果看到任何in_progress,状态:continue <id>ORrecommend close <id>ORrecommend reopen <id>ORnoneclaim:mark <in_progress token> <id,...>ORalready <in_progress token> <id>ORnonecounts: 选定源的总数(至少:叶、就绪、阻塞、in_progress)pick: 选定任务id + 3-10字原因next2: 下两个候选(或none)+ 每个3-10字原因waves: (推荐当任务被调度时)N+ 紧凑波次列表(例如,w1[t-1,t-2]; w2[t-3])review:pass|warn|skipped|blocked+ 0-6字备注warnings: 列表计数 + 前1-3键(例如,unknown_deps、status_drift、cycle、broad_scope、implicit_order、missing_validation、linear_graph、missing_role、missing_checkpoint)auto_fix: 列表计数 + 前1-3键(例如,dep_alias、scope_normalize、scope_infer)
程序(高层)
- 解析调用指令(mode/max_tasks/cap)。
- 源检测(选择一个;不合并源)。
- 读取相应的适配器规范(上述)并提取任务。
- 如果任务太粗糙或缺少安全并行所需的元数据,细化它们:
- 分解为具有显式
depends_on的原子任务。 - 识别工作流并注解
workstream当有用时。 - 插入
contract任务当它们可以解锁并行实现分支时。 - 插入
checkpoint/integration任务作为跨分支的显式连接点。 - 将软排序/上下文编码在
related_to中而非depends_on。 - 填充
scope锁(紧密路径/glob),加上location和validation尽可能。 - 保持每个任务可独立PR(中等粒度)。
- 探索仓库(只读)并在需要时查阅权威文档。
- 如果因模糊性阻塞,停止并询问目标问题。
- 分解为具有显式
- 规范化任务:确保
id;应用编排器规则;将未知依赖视为阻塞(待自动修复)。 - 运行警告自动修复(上述);最终化警告。
- 使用
depends_on+scope锁调度波次。 7.5. 如果选择新工作,从waves[0]计算claim并发出指令以在源中标记这些任务为进行中(当源支持状态时)。 - 审查者传递(根据
review):检查依赖/顺序/锁/验证/委派间隙;根据需要修订。- 检测不必要的线性链并在安全时从
depends_on降级建议边到related_to。 - 在可行推断时要求多波次计划中的显式角色/工作流。
- 当多个并行实现分支汇聚时要求检查点/集成连接。
- 在审查者模式中:不扩展范围;不重新设计;仅关闭间隙和减少风险。
- 如果
review=required:迭代直到review: pass或如果阻塞则停止+询问。
- 检测不必要的线性链并在安全时从
- 发出OrchPlan v1 YAML(总是)+ 决策跟踪(必需)。仅当有用时添加管道。
调度算法(并行第一)
使用依赖准备度和 scope 锁构建波次:
- 仅从
depends_on边构建DAG(related_to是非门控的并从DAG准备度中排除)。 - 维护
ready= 未调度任务其所有依赖都已调度。 - 当任务剩余时:
- 将缺失
scope视为与所有内容重叠(即,只能单独调度)。 - 将过宽
scope锁(""、.、./、/、*、**、**/*)视为与所有内容重叠。 - 选择一个
ready的最大子集其scope锁根不重叠(贪心即可)。 - 如果
cap是数字,限制波次到cap任务。 - 从池中移除调度任务;进行到下一波次。
- 将缺失
当必须在冲突任务(重叠范围或限制压力)之间选择时,使用平局决胜:
- 优先级(如果存在):0/P0第一。
- 类型顺序(如果存在):task > bug > feature > chore > epic > docs > question。
- 角色(如果存在):contract/checkpoint > integration > implementation。
- 解锁计数:在此计划中解锁更多其他任务的任务。
- 委派准备度:偏好更紧的
scope和显式validation。 - 风险/难度/爆炸半径(如果存在):偏好更低风险、更小爆炸半径和更清晰范围。
- 稳定顺序:保持源顺序。
发出未解决警告(噪声控制;仅当影响此OrchPlan时警告):
missing_scope: 一个任务缺失scope阻止添加至少一个其他就绪任务到同一波次。broad_scope: 一个任务具有过宽scope阻止添加至少一个其他就绪任务到同一波次。implicit_order: 两个依赖无关任务具有嵌套锁根并同时就绪;顺序由平局决胜/稳定顺序选择。missing_validation: 一个并行波次混合了具有和不具有validation的任务。unknown_deps: 一个depends_on指向未知ID。orchestrator_without_subtasks: 一个任务声明agent=orchestrator而无subtasks。linear_graph: 依赖图大多是链状的,且安全拆分为工作流/合同/检查点似乎可能。missing_role: 多波次计划缺少角色注解当它们对推理/审查需要时。missing_checkpoint: 多个并行实现分支无显式集成/检查点连接。 如果警告被自动修复,从warnings中省略并在auto_fix下列出(除了编排器降级,必须仍警告)。
示例(合成)
示例A:干净并行波次(列表源)
schema_version: 1
kind: OrchPlan
created_at: "2026-02-02T00:00:00Z"
source:
kind: list
locator: "invocation"
cap: auto
tasks:
- id: cfg
title: "添加配置加载器"
agent: worker
scope: ["src/config/**"]
location: ["src/config/loader.ts", "src/config/index.ts"]
validation: ["npm test -w config"]
depends_on: []
subtasks: []
- id: ui
title: "更新设置UI"
agent: worker
scope: ["src/ui/**"]
location: ["src/ui/Settings.tsx"]
validation: ["npm test -w ui"]
depends_on: []
subtasks: []
- id: wire
title: "将配置连接到UI"
agent: worker
scope: ["src/app/**"]
location: ["src/app/bootstrap.ts"]
validation: ["npm test"]
depends_on: [cfg, ui]
subtasks: []
waves:
- id: w1
tasks: [cfg, ui]
- id: w2
tasks: [wire]
integration:
boundary: patch-first
order: [cfg, ui, wire]
conflict_policy: rebase-author
warnings: []
决策跟踪:
- source: list (invocation)
- mode: both; max_tasks=auto
- triage: none
- claim: none
- counts: leaf=3 ready=2 blocked=1 in_progress=0
- pick: cfg; 解锁wire;并行安全范围
- next2: ui; 并行就绪;不相交范围
- waves: 2 w1[cfg,ui]; w2[wire]
- review: pass
- warnings: 0
- auto_fix: 0
示例B:具有混合验证 + 宽范围的并行波次
schema_version: 1
kind: OrchPlan
created_at: "2026-02-02T00:00:00Z"
source:
kind: list
locator: "invocation"
cap: auto
tasks:
- id: api
title: "添加/health端点"
agent: worker
scope: ["src/api/**"]
location: ["src/api/health.ts", "src/api/router.ts"]
validation: ["npm test -w api"]
depends_on: []
subtasks: []
- id: docs
title: "文档/health端点"
agent: worker
scope: ["docs/**"]
location: ["docs/api.md"]
depends_on: []
subtasks: []
- id: big
title: "仓库范围重命名OldName -> NewName"
agent: worker
scope: ["**"]
location: ["."]
validation: ["rg -n \"OldName\" . || true"]
depends_on: []
subtasks: []
waves:
- id: w1
tasks: [api, docs]
- id: w2
tasks: [big]
integration:
boundary: patch-first
order: [api, docs, big]
conflict_policy: rebase-author
warnings:
- "missing_validation: [docs]"
- "broad_scope: [big]"
决策跟踪:
- source: list (invocation)
- mode: both; max_tasks=auto
- triage: none
- claim: none
- counts: leaf=3 ready=3 blocked=0 in_progress=0
- pick: api; 显式验证;紧范围
- next2: docs; 并行就绪;缺失验证
- waves: 2 w1[api,docs]; w2[big]
- review: warn missing_validation,broad_scope
- warnings: 2 missing_validation,broad_scope
- auto_fix: 0
源适配器(仅提取)
适配器规范位于:
codex/skills/select/ADAPTER_LIST.mdcodex/skills/select/ADAPTER_SLICES.mdcodex/skills/select/ADAPTER_PLAN.md
管道
管道位于 codex/skills/select/PIPELINES.md。
输出
- 总是发出OrchPlan v1 YAML,然后决策跟踪。
- 如果无可操作的源任务存在,偏好选择一个解锁器;仅然后发出空计划 + 警告。
- 如果选定的源为空/不可行且存在回退源,在回退前停止并询问。