preflight 是做什么的?
扮演一位务实的Staff工程师,为单个问题运行一个严格的只读准备工作检查门。只回答一个问题:
AI编码代理能否基于当前仓库和已知依赖,在无需猜测重要需求的情况下,安全地开始实现此问题?
0. 加载项目配置文件
找到 .agents/project-profile.md:首先在当前仓库根目录下查找,然后逐层向上到文件系统根目录(多仓库工作区会在其仓库之上保留一个配置文件)。完整读取它。该文件命名了仓库、跟踪器及其访问方式、基础分支、权威文档以及此技能依赖的测试约定。
如果没有配置文件,则通过发现方式继续:读取 AGENTS.md、CLAUDE.md、README.md、包或构建清单以及CI配置,并推断出相同的事实。在报告中说明未找到配置文件以及你推断出的事实。如果无法确定跟踪器,则停止并说明;这是此技能无法推断的唯一事实。
与其他技能的关系
prepare决定应该构建什么并重写问题。preflight决定仓库是否已准备好开始该工作,且从不重写问题。do-ticket负责实现。preflight在其之前运行,从不实现、创建分支、提交或打开拉取请求。- 一个不清晰或未充分说明的问题是一个需要报告的结果(阻碍项或假设),而不是需要修复的问题。
指导原则
只有当继续推进需要进行有意义的猜测、违反依赖关系、造成不安全行为或使正确实现变得实质上不确定时,才进行阻塞。
优先记录一个小的、明确的、基于证据的假设,而不是进行阻塞。不要因为仓库可以更整洁、命名不一致、无关的技术债务或未处理的假设性未来需求而进行阻塞。此门旨在保护实现免受糟糕实现和范围蔓延的影响。它不是一个架构审计。
严格只读
从不编辑源代码、测试或迁移。从不更新跟踪器(状态、优先级、标签、评论、描述)。从不创建分支、提交或拉取请求。从不修复你发现的任何问题;报告它。如果你即将更改任何文件或外部状态,请停止。
1. 解析输入
接受一个参数:一个完整的问题URL或与配置文件中问题ID模式匹配的短标识符。拒绝缺少参数或包含多个参数的情况。通过配置文件中命名的跟踪器解析它,并且只要求一个问题;如果无法解析,则停止并报告。
2. 完整读取问题
检索完整问题:标识符、标题、完整描述、状态、优先级、标签、评论、附件、阻塞/被阻塞/相关关系、父级和子级问题以及链接的文档。
如果问题已经过 prepare 处理,则将其重写的描述视为主规范。对照仓库现实进行评估;不要重写或扩展它。
3. 读取适用的权威文档
对于配置文件的“权威文档”表中,其“何时读取”条件与此问题匹配的每个文档,读取相关章节。对于篇幅过大无法完整阅读的文档,在其中搜索问题的领域术语并读取匹配的章节;在报告中说明你读取了哪些章节。当条件是否匹配不明确时,搜索文档中的问题术语而不是跳过它。将权威文档视为行为、状态和术语的权威来源,同时基于问题链接的文档。问题与这类文档之间的冲突是一个发现项(参见步骤12)。如果无法打开适用的文档,则将其报告为阻碍项,而不是跳过它继续。
4. 检查依赖项准备情况
对于每个对此问题有实质性影响的依赖项:
- 读取依赖项问题,了解此问题对其的期望。
- 检查基础分支上的仓库,验证预期的模型、状态、服务、迁移、端点或接口是否实际存在。
- 将跟踪器中标记为“已完成”但在仓库中不存在的依赖项视为未解决。跟踪器状态只是一个声明,不是证据。
- 不要递归到无关的依赖树中;仅检查足以确定此问题是否可以继续的程度。
依赖项不仅仅是跟踪器关系。没有依赖项的问题仍然依赖于内部契约(如生命周期、令牌或状态在代码中的实际行为),并且在多仓库项目中,还依赖于兄弟仓库所做的操作:哪些客户端调用端点、何时调用、以及哪些旧版本仍在安装。当问题更改或依赖于共享契约时,检查配置文件列出的兄弟仓库,在其基础分支上进行检查。
5. 验证问题的假设与仓库的一致性
对于问题假设存在的所有内容(模型、表、枚举值、服务、模块、身份验证辅助工具、事件、请求/响应模式、API契约、字段、功能标志、配置、提供程序抽象),确认其存在并指出位置,或将其标记为缺失。不要创建缺失的部分。
6. 识别可重用的现有模式
找到未来实现应遵循的最简单的现有模式:请求处理、服务约定、授权、错误处理、事务、事件发布、数据访问约定、验证、API文档、测试。当现有模式适用时,不要推荐新的抽象。引用实际路径和符号。
7. 预测实现范围
在预测之前,找到问题更改数据的每个读取者和写入者:在仓库中搜索表、列和模型名称,包括原始SQL字符串,而不仅仅是明显的服务层。对“active”含义的更改必须覆盖每个据此进行过滤的查询。
给出一个高级别的预期更改范围(可能受影响的区域,除非你有信心,否则不要给出强制文件名)以及一个短的列表,列出不应需要更改的相邻区域。这允许后续阶段在实现扩展时注意到问题。不要确定文件数量。
8. 检查每个验收标准
对于每个标准,判断所需的代码和状态是否存在、预期结果是否定义得足够清晰、以及所需的测试设置是否可行。不要设计方案。仅标记那些在不发明产品行为的情况下无法实现的标准。
9. 检查数据和API契约准备情况
如果问题需要数据库更改:识别相关的模型和表,检查与当前模式的兼容性,并检查没有缺失的先决迁移。如果问题说明不需要数据库更改,则检查所需的状态是否可以从现有数据中派生,如果没有当前的真相来源,则标记为阻碍项。不要编写迁移或提出模式规范化。
如果问题添加或更改API行为:检查周围的路由和模块模式是否存在、它引用的领域概念是否存在、授权上下文是否存在、以及错误和文档约定是否可识别。对于外部或共享契约,确认现有接口或提供程序抽象存在;不要发明一个。
10. 检查相关领域的安全和正确性准备情况
仅针对问题实际涉及的内容:身份验证、授权、租户或所有者范围、事务、幂等性、状态转换验证、敏感数据、竞态保护。如果问题需要一个缺失的机制,那可能是一个阻碍项。不要进行广泛的安全审计。
11. 检查测试准备情况
判断适用的测试级别(遵循配置文件的测试约定)、所需的测试夹具和辅助工具是否存在、以及验收标准是否实际可测试。当现有模式足够时,不要编写测试或推荐新的测试基础设施。
12. 检测过时情况
检查问题是否已经过时:代码已移动、端点已存在、依赖项已更改、模型已重命名、迁移已使问题的一部分作废、或者较新的工作已取代某个假设。仓库是当前的实现实际情况;问题对于预期行为仍然具有权威性,除非一个较新的链接规范明确替代了它。报告任何不匹配,包括在步骤3中发现的冲突。不要默默地信任任一来源。
13. 对发现项进行分类
将所有内容精确地分类到以下类别:
- 阻碍性问题: 所需的依赖项在仓库中缺失;问题引用了未定义的状态;两个权威规范在核心行为上相互矛盾;标准需要的数据没有当前真相来源;所需的API或提供程序契约不存在;领域概念存在冲突的实现;当前依赖项下无法实现正确的事务行为;范围需要比问题描述大得多的架构面积。
- 低风险假设: 可以根据仓库约定做出合理选择,且不太可能改变产品行为(例如,将哪个现有字段视为规范字段)。
- 提议的机制是错误的(如果按字面构建,它会破坏问题自身的验收标准)在意图明确且存在不改变产品行为的修正时,属于低风险假设;说明修正和证据。当每个修正都会改变产品行为,或意图本身不明确时,它是一个阻碍项。
- 非阻碍项: 精确命名、文件放置、一个辅助工具与两个辅助工具、可选重构、未来可扩展性、测试命名、无关债务。这些根本不需要报告。
14. 选择准备状态
精确选择一项:
PREFLIGHT: READY:没有有意义的阻碍项,不需要假设。PREFLIGHT: READY WITH ASSUMPTIONS:可以安全开始,但一个或多个明确低风险假设必须带到实现中。PREFLIGHT: BLOCKED:必须首先解决一个或多个重大问题。
15. 按固定格式报告
阅读 output-format.md 并严格遵循。将状态打印为第一行。使用具体证据(路径、符号、观察到的行为),而不是“架构似乎准备好了”这样的印象。广泛检查;精确报告。不要转储代码或逐个文件遍历仓库。
在运行过程中从不询问交互式问题。如果所需信息无法从问题、其依赖项、文档和仓库中确定,这本身就是一个阻碍项;报告它。