Apollo Issue Review
Follow this workflow to review an Apollo issue and produce a concise maintainer response.
Core Principles
- - Classify first: behavior/regression issue vs consultative/support question.
- For behavior/regression issues: reproduce first, theorize second.
- For consultative/support questions (for example "is there an official script/doc"): do evidence check first and answer directly; do not force "reproduced/not reproduced" wording.
- Solve the user ask, do not debate whether the user is right or wrong.
- If behavior is already reproduced and conclusion is stable, do not ask for extra info.
- Do not default to "version regression" analysis unless the user explicitly asks for version comparison or it changes the recommendation.
- Match the issue language: English issue -> English reply, Chinese issue -> Chinese reply (unless the user explicitly asks for bilingual output).
- Use canonical Apollo module names from repository reality (AGENTS/module layout/root
pom.xml), and correct misnamed terms succinctly when needed. - If an existing comment already answers the same ask (including bot replies), avoid duplicate long replies; prefer a short addendum that only contributes corrections or missing deltas.
- Never wrap GitHub @mention handles in backticks/code spans; use plain @handle so notifications are actually triggered.
- If a community user volunteers to implement ("认领"/"first contribution"), acknowledge and encourage first, then evaluate the proposal with explicit feasibility boundaries and concrete refinement suggestions.
- For OpenAPI-related asks, explicitly separate Portal web APIs (e.g.,
/users) and OpenAPI endpoints (e.g., /openapi/v1/*); only claim "OpenAPI supports X" when token-based OpenAPI path is verified. - Before concluding "capability not available", cross-check code + docs/scripts + module/dependency hints from
pom.xml to avoid false negatives caused by path assumptions.
Input Contract
Collect or derive these fields before review:
- -
repo: INLINECODE5 - INLINECODE6 : numeric ID
- INLINECODE7 : title/body/comments
- INLINECODE8 :
draft-only (default) or INLINECODE10 - INLINECODE11 :
human (default) or INLINECODE13
Optional but recommended:
- -
known_labels: existing labels on the issue - INLINECODE15 : whether user wants only triage or triage + implementation handoff
If issue_number or issue_context is missing, ask one short clarification before continuing.
Workflow
- 1. Collect issue facts and user ask
- - Read issue body and comments before concluding.
- Extract: primary ask, symptom, expected behavior, actual behavior, and whether user asks one path or an either-or path.
- Keep user asks explicit (for example "better parsing API OR raw text API": answer both).
- Detect whether the thread includes a contribution-claim ask (for example "can I take this issue?") and treat it as a guidance+boundary response, not only a capability yes/no response.
- Detect main language from issue title/body/recent comments and set reply language before drafting.
- Decide issue type up front:
- behavior/regression (needs reproducibility check)
- consultative/support (needs evidence check)
- - Normalize names to canonical module/service terms used by Apollo repo (e.g.,
apollo-portal, not invented service names). - If GitHub API access is unstable, use:
CODEBLOCK0
- 2. Run the right validation path (mandatory)
- - For behavior/regression issues:
- Build a minimal, local, runnable reproduction for the reported behavior.
- Prefer repo-native unit tests or a tiny temporary script over speculation.
- Record exact observed output and types, not just interpretation.
- - For consultative/support questions:
- Verify by repository evidence scan (docs/scripts/code paths), not by speculative reproduction framing.
- For API availability asks, verify in three places before concluding:
1) actual controller paths, 2) docs/openapi scripts, 3) module/dependency pointers in
pom.xml.
- Record exact files/paths searched and what exists vs does not exist.
CODEBLOCK1
- 3. Branch by validation result
- - Behavior/regression path:
- If reproducible:
- State clearly that behavior is confirmed.
- Identify whether this is supported behavior, usage mismatch, or current feature gap.
- Then answer user asks directly (existing API/workaround/unsupported).
- If not reproducible:
- Ask for minimal missing evidence only:
- input sample
- exact read/access code
- expected vs actual output
- Keep this short and concrete.
- - Consultative/support path:
- If capability/script/doc exists: provide exact path/link and usage entry point.
- If it does not exist: state "currently not available" directly and give one practical alternative.
- If an existing comment already covered the same conclusion: post only a concise delta/correction instead of repeating the full answer.
- 4. Draft maintainer reply (focus on action)
- - Start with a one-paragraph summary in the thread language:
- behavior/regression issue: reproduction summary (
复现结论 /
Reproduction Result)
- consultative/support issue: direct conclusion summary (
结论 /
Conclusion)
-
当前能力与边界: what is supported today and what is not.
-
可行方案: exact API/command/workaround user can run now.
-
后续路径: either invite PR with concrete files/tests, or state maintainers may plan it later without overpromising timeline.
- - If the thread includes a contribution-claim proposal, structure the main body as:
1) appreciation and encouragement, 2) feasibility judgment, 3) concrete implementation refinements (what to reuse vs what not to reuse directly).
- - If user ask is either-or, answer both explicitly.
- If already confirmed feature gap, do not request more logs/steps by default.
- Keep wording factual and concise.
- Use canonical module names in final wording; if the issue uses a non-canonical name, correct it briefly without derailing the answer.
- If there is already a correct prior comment, prefer "reference + minimal supplement" format.
- If you mention users/bots, keep mentions as plain text (e.g., @dosubot), not code-formatted mention strings.
- Use localized section labels and wording by issue language (for example:
Reproduction Result / Current Support Boundary / Practical Path / Next Step in English threads).
- 5. Ask for publish confirmation (mandatory gate)
- - Default behavior: generate draft only; do not post automatically.
- Present the exact comment body first, then ask for confirmation in the same thread.
- Use a direct question in the same language as the thread, e.g.:
- Chinese:
是否直接发布到 issue #<id>?回复“发布”或“先不发”。
- English:
Post this to issue #<id> now? Reply "post" or "hold".
- - Treat no response or ambiguous response as
not approved.
- 6. Post the response only after explicit confirmation
- - Allowed confirmation examples:
发布 / 帮我发 / 直接回复上去. - If user intent is unclear, ask one short clarification question before any post command.
- Preferred:
gh api repos/<owner>/<repo>/issues/<id>/comments -f body='<reply>'
- - Fallback when
gh transport is unstable:
TOKEN=$(gh auth token)
curl --http1.1 -sS -X POST \
-H "Authorization: token $TOKEN" \
-H "Accept: application/vnd.github+json" \
-d '{"body":"<reply>"}' \
https://api.github.com/repos/<owner>/<repo>/issues/<id>/comments
- - After posting, return the comment URL as evidence.
Output Contract
Default (output_mode=human) output should be human-friendly:
- 1. INLINECODE36
- - issue type + confidence
- validation result (reproduced / not reproduced / evidence result)
- 2. INLINECODE37
- - labels to add
- missing information (if any)
- whether it is ready for implementation handoff
- 3. INLINECODE38
- - First sentence must match issue type:
- behavior/regression: reproducibility status (
已复现/暂未复现 or
Reproduced/Not yet reproduced)
- consultative/support: direct availability conclusion
- - Include at least one concrete API/code path/file reference.
- If unsupported today: include support boundary + practical workaround + next path.
- If reproducible and conclusion is stable: do not request extra data.
- If not reproducible: request only minimal reproducible inputs.
- If prior comment already solved the ask: provide concise delta only.
- Do not present unverified root cause as fact.
- Keep language matched to issue language unless user asks otherwise.
- 4. INLINECODE41
- - If no explicit publish confirmation exists, end with:
- Chinese:
是否直接发布到 issue #<id>?回复“发布”或“先不发”。
- English: INLINECODE43
If output_mode=pipeline, append one machine-readable block after the human output:
CODEBLOCK4
Load References When Needed
- - Use
references/diagnostic-playbook.md for scenario-specific diagnostics and command snippets. - Use
references/reply-templates.md for reusable Chinese maintainer reply skeletons.
Apollo Issue Review
按照此工作流程审查 Apollo issue 并生成简洁的维护者回复。
核心原则
- - 先分类:行为/回归问题 vs 咨询/支持问题。
- 对于行为/回归问题:先复现,后推测。
- 对于咨询/支持问题(例如“是否有官方脚本/文档”):先进行证据检查并直接回答;不要强行使用“已复现/未复现”的措辞。
- 解决用户的问题,不要争论用户是对是错。
- 如果行为已复现且结论稳定,不要索要额外信息。
- 除非用户明确要求版本对比或这会改变建议,否则不要默认进行“版本回归”分析。
- 匹配 issue 语言:英文 issue -> 英文回复,中文 issue -> 中文回复(除非用户明确要求双语输出)。
- 使用仓库实际情况中的规范 Apollo 模块名称(AGENTS/模块布局/根 pom.xml),并在需要时简洁地纠正错误命名的术语。
- 如果已有评论回答了相同的问题(包括机器人回复),避免重复的长回复;优先使用仅包含修正或缺失差异的简短补充。
- 永远不要将 GitHub @提及 句柄包裹在反引号/代码块中;使用纯文本 @句柄,以便实际触发通知。
- 如果社区用户自愿实现(“认领”/“首次贡献”),首先表示感谢和鼓励,然后评估提案,给出明确的可行性边界和具体的改进建议。
- 对于与 OpenAPI 相关的问题,明确区分 Portal Web API(例如 /users)和 OpenAPI 端点(例如 /openapi/v1/*);仅在验证了基于令牌的 OpenAPI 路径后才声称“OpenAPI 支持 X”。
- 在得出“功能不可用”的结论之前,交叉检查代码 + 文档/脚本 + pom.xml 中的模块/依赖提示,以避免因路径假设导致的漏判。
输入约定
在审查前收集或推导以下字段:
- - repo:<所有者>/<仓库>
- issuenumber:数字 ID
- issuecontext:标题/正文/评论
- publishmode:draft-only(默认)或 post-after-confirm
- outputmode:human(默认)或 pipeline
可选但推荐:
- - knownlabels:issue 上已有的标签
- desiredoutcome:用户是仅需要分类,还是分类加实现交接
如果缺少 issuenumber 或 issuecontext,在继续前先问一个简短的问题来澄清。
工作流程
- 1. 收集 issue 事实和用户需求
- 在得出结论前阅读 issue 正文和评论。
- 提取:主要需求、症状、预期行为、实际行为,以及用户是询问单一路径还是二选一路径。
- 保持用户需求明确(例如“更好的解析 API 或原始文本 API”:回答两者)。
- 检测讨论串是否包含贡献认领需求(例如“我可以接手这个 issue 吗?”),并将其视为指导+边界响应,而不仅仅是能力是/否的响应。
- 从 issue 标题/正文/最新评论中检测主要语言,并在起草前设置回复语言。
- 预先决定 issue 类型:
- 行为/回归(需要可复现性检查)
- 咨询/支持(需要证据检查)
- 将名称规范化为 Apollo 仓库使用的规范模块/服务术语(例如 apollo-portal,而不是编造的服务名称)。
- 如果 GitHub API 访问不稳定,使用:
bash
curl -L -s https://api.github.com/repos/<所有者>/<仓库>/issues/
curl -L -s https://api.github.com/repos/<所有者>/<仓库>/issues//comments
- 2. 执行正确的验证路径(必须)
- 对于行为/回归问题:
- 为报告的行为构建一个最小的、本地的、可运行的复现。
- 优先使用仓库原生的单元测试或一个小的临时脚本,而不是推测。
- 记录确切的观察到的输出和类型,而不仅仅是解释。
- 对于咨询/支持问题:
- 通过仓库证据扫描(文档/脚本/代码路径)进行验证,而不是通过推测性的复现框架。
- 对于 API 可用性询问,在得出结论前在三个地方进行验证:
1) 实际的控制器路径,2) 文档/OpenAPI 脚本,3) pom.xml 中的模块/依赖指针。
- 记录搜索的确切文件/路径以及存在与不存在的内容。
- 示例检查:
bash
rg -n <与 issue 相关的 API 或路径> -S
go test ./... -run <目标测试名称>
或一个在 /tmp 下用于一次性验证的最小 go run 脚本
咨询性证据扫描示例:
rg --files | rg -i <关键词1|关键词2>
rg -n <关键词> docs scripts apollo-* -S
- 3. 根据验证结果分支
- 行为/回归路径:
- 如果可复现:
- 明确说明行为已确认。
- 确定这是支持的行为、使用方式不匹配还是当前功能缺口。
- 然后直接回答用户需求(现有 API/变通方案/不支持)。
- 如果不可复现:
- 仅要求提供最小的缺失证据:
- 输入样本
- 确切的读取/访问代码
- 预期输出与实际输出
- 保持简短具体。
- 咨询/支持路径:
- 如果能力/脚本/文档存在:提供确切的路径/链接和使用入口点。
- 如果不存在:直接说明“目前不可用”并给出一个实用的替代方案。
- 如果已有评论涵盖了相同的结论:仅发布一个简洁的差异/修正,而不是重复完整的答案。
- 4. 起草维护者回复(聚焦于行动)
- 以讨论串语言的一段摘要开始:
- 行为/回归问题:复现摘要(复现结论 / Reproduction Result)
- 咨询/支持问题:直接结论摘要(结论 / Conclusion)
- 然后包括:
- 当前能力与边界:当前支持什么,不支持什么。
- 可行方案:用户现在可以运行的确切 API/命令/变通方案。
- 后续路径:要么邀请提交包含具体文件/测试的 PR,要么说明维护者可能稍后计划,但不过度承诺时间线。
- 如果讨论串包含贡献认领提案,将主体结构组织为:
1) 感谢和鼓励,2) 可行性判断,3) 具体的实现改进(哪些可以直接复用,哪些不能直接复用)。
- 如果用户需求是二选一的,明确回答两者。
- 如果功能缺口已确认,默认不要请求更多日志/步骤。
- 保持措辞事实性和简洁性。
- 在最终措辞中使用规范的模块名称;如果 issue 使用了非规范名称,在不偏离答案的前提下简要纠正。
- 如果已有正确的先前评论,优先使用“参考 + 最小补充”格式。
- 如果你提到用户/机器人,保持提及为纯文本(例如 @dosubot),而不是代码格式的提及字符串。
- 根据 issue 语言使用本地化的章节标签和措辞(例如:英文讨论串中使用 Reproduction Result / Current Support Boundary / Practical Path / Next Step)。
- 5. 请求发布确认(必须的门控)
- 默认行为:仅生成草稿;不自动发布。
- 先展示确切的评论正文,然后在同一讨论串中请求确认。
- 使用与讨论串相同的语言直接提问,例如:
- 中文:是否直接发布到 issue #?回复“发布”或“先不发”。
- 英文:Post this to issue # now? Reply post or hold.
- 将无响应或模糊响应视为 未批准。
- 6. 仅在明确确认后发布响应
- 允许的确认示例:发布 / 帮我发 / 直接回复上去。
- 如果用户意图不明确,在任何发布命令前先问一个简短的问题来澄清。
- 首选:
bash
gh api repos/<所有者>/<仓库>/issues//comments -f body=<回复>
- 当 gh 传输不稳定时的备用方案:
bash
TOKEN=$(gh auth token)
curl --http1.1 -sS -X POST \
-H Authorization: token $TOKEN \
-H Accept: application/vnd.github+json \
-d {body:<回复>} \
https://api.github.com/repos/<所有者>/<仓库>/issues//comments
- 发布后,返回评论 URL 作为证据。
输出约定
默认(output_mode=human)输出应便于人类阅读:
- 1. Issue Summary
- issue 类型 + 置信度
- 验证结果(已复现 / 未复现