Warp Closing Issue
Overview
Assess user-supplied Warp commits against user-supplied GitHub issues. Produce a
scoped assessment and draft comment first; public GitHub writes require explicit
confirmation after the user sees the exact target issues and comment body.
Hard Rules
- Stay within the user-supplied commit SHA(s) and issue number(s). Do not search for
extra commits or issues; ask the user for more SHAs/issues if scope is incomplete.
- Read the issue body and comments, not just the title.
- Treat commit messages as orientation, not proof. Inspect diffs and changed files.
- Treat
changelog/*.md fragments as the editable source of pending changelog
intent. Treat generated CHANGELOG.md sections as released history or
release-build metadata, never as behavioral fix evidence by themselves.
- Commenting is not always closure. Supported actions are
close, comment-only,
keep open, and no public update.
- Never post comments or close issues before showing the assessment and exact draft.
- Public comments use full 40-character SHAs as plain text for GitHub auto-linking.
- For multiline GitHub comment bodies, never use
gh api -f body=@file
or gh api --raw-field body=@file; these forms can send @file
literally. Use gh issue comment --body-file <file> for new issue
comments, or gh api --input <json> for PATCH/non-issue-comment writes.
- Keep local execution noise out of public comments: no
WARP_CACHE_PATH,
/tmp/..., local worktree paths, or shell setup.
- Do not use a local test command as the public test note. Public comments describe
test coverage changes in the commit set: new tests, modified tests, or no tests.
- Do not treat passing committed tests as sufficient behavioral verification when
the issue includes a runnable repro or clear expected behavior. When feasible,
write and run small temporary probes inspired by the issue.
- Require behavioral probe summaries in the private assessment. Public comments may
mention probes only when they clarify the recommendation, remaining risk, or
requester-facing behavior.
- Format public comment Markdown for GitHub rendering: put each prose paragraph and each list item on one physical source line. Use hard line breaks only between structural blocks such as paragraphs, headings, list items, and fenced code blocks; never wrap prose to a fixed column width.
- Surface actionable, issue-related future work under
### Follow-up to consider. Include the section only when the assessment found a specific improvement, and distinguish non-blocking follow-ups from gaps that prevent closure.
Optional command snippets live in commands.md. Prefer the
GitHub app/MCP connector when it fits; gh is installed and authenticated here and is
fine for gaps or simple issue operations.
Checklist
Resolve scope. Record supplied commits, issues, and requested outcome, if any:
closure assessment, progress update, comment only, or unspecified. If one
supplied commit contains all others, use the newest such commit as the
assessed head. For disjoint histories, inspect each commit tree separately
and do not invent a combined fragment view.
Gather evidence. For each issue, extract author, author association, reported
symptoms, reproducers, expected behavior, follow-up comments, maintainer asks, and
current state. For each commit, inspect message, diff, tests, docs, changelog
fragments, generated changelog changes, and touched areas such as warp/native/.
For every touched fragment:
- Read
changelog/README.md and validate the identifier, category, optional
counter, and content. A numeric filename identifies a GitHub issue and
Towncrier generates its link; the fragment text should not repeat it.
- Compare a numeric identifier with the supplied issue number. Inspect sibling
fragments with the same identifier at the assessed head so complementary,
duplicate, and counter-based entries are not mistaken for separate fixes.
If an Added/Fixed/Changed set describes iterations on one not-yet-released
feature, flag it for changelog audit; do not consolidate fragments in this
issue-assessment workflow.
- When combined rendering matters, run the pinned Towncrier draft from the
assessed worktree and map the rendered bullet back to its source paths.
A draft is read-only; never edit generated
CHANGELOG.md.
When the issue or commit appears to change public API behavior, inspect the
relevant code, docs, tests, source fragments, rendered entry, and historical
changelog for intended API surface and examples.
Classify commits.
| Type |
Meaning |
| Behavioral fix |
Changes the code path behind the issue. |
| Test-only |
Adds confidence, but cannot close by itself. |
| Docs/changelog-only |
Source fragments or generated release metadata; supporting context, not fix evidence. |
| Follow-up |
Completes or corrects earlier issue-linked work. |
| Beyond scope |
Related cleanup or broader behavior worth surfacing. |
Map requirements. For each issue requirement, state commit evidence, test
coverage evidence, behavioral probe evidence if available, and status:
addressed, partial, or missing.
Assess public API behavior. If the issue or commit changes public API
surface or behavior, identify:
- Python scope: constructors, functions, arguments, configuration, exceptions,
or unsupported combinations visible from
warp.
- Kernel scope: existing or new Warp builtins callable only inside
@wp.kernel / @wp.func.
- Behavior type: new API, existing API now works in more cases, changed
semantics, explicit unsupported behavior, or deprecation/removal.
- Example accuracy: include short examples only when they clarify the issue;
never show kernel-only APIs as host-side Python calls.
Review tests. Inspect the supplied commits for test changes. Use unordered
bullets in the assessment/comment:
- New tests: file path, test function/class names, and what each case checks.
- Modified tests: file path, test names, and what behavior or expectation changed.
- No tests: state that no test changes were included and recommend whether that was
reasonable or a potential review oversight.
You may still run committed tests when useful, but prefer probes that add issue
specific signal beyond "the merged tests pass." Follow Warp policy locally:
unique WARP_CACHE_PATH, uv run, and rebuild native
libraries when warp/native/ changes require it. Do not put local verification
commands in the public issue comment.
Probe issue-shaped behavior. When the issue has a repro, expected behavior,
or clear boundary conditions, create one or more temporary scripts that exercise
the reported behavior on the supplied commit/worktree. These are transient
working artifacts; do not add them to the repo unless the user explicitly asks.
Prefer probes that:
- Recreate the original repro as directly as possible.
- Vary only issue-relevant dimensions likely to expose blind spots.
- Assert observable behavior, not just absence of a crash.
- Run outside the test suite when the issue is about script, import, process,
runtime, environment, cache, or packaging context.
- Use
uv run and a unique WARP_CACHE_PATH for Warp commands.
Avoid probes that:
- Merely rerun a committed test without adding issue-specific signal.
- Expand into broad fuzzing or unrelated API compatibility.
- Depend on timing or local environment details unless the issue is
environment-specific.
Classify probe results in the private assessment:
passes: supports closure or progress assessment.
fails in scope: blocks closure or changes recommendation to comment-only
/ keep open.
inconclusive: mention as residual risk, but do not overstate it.
not run: explain why, such as unavailable hardware, excessive cost, or
insufficient repro detail.
Decide action.
close: every reported symptom and expected behavior is addressed, relevant
comments are covered, test coverage is adequate or the lack of tests is
reasonable for the change, and behavioral probes pass or were not feasible for
a defensible reason.
comment-only: supplied commits are relevant progress, but the issue should remain
open.
keep open: gaps remain and a public comment would not add value.
no public update: commits are peripheral, speculative, or already covered.
Include a requester-verification recommendation. If the issue author appears
external to NVIDIA, prefer a resolution/progress comment that leaves the issue open
so they can verify. If the issue author matches the current requesting user, closure
is appropriate once the requirements are addressed; verify that identity from local
user guidance, GitHub authenticated user data, or explicit user input rather than
hardcoding a username.
Draft before writing. Output:
Assessment: <close | comment-only | keep open | no public update>
Issue <#>: <title>
- Requested outcome: <...>
- Commits: <primary full SHA(s)>; supporting: <full SHA(s) or none>
- What changed: <behavior summary>
- Public API behavior: <none | Python scope summary | kernel scope summary | unsupported cases>
- Test coverage:
- <new/modified/no tests detail>
- Behavioral probes:
- <required private probe summary: passes/fails in scope/inconclusive/not run, behavior checked, and issue relevance>
- Beyond issue scope: <extra changes or none>
- Requester verification: <close now | leave open for requester verification and why>
- Recommendation: <action and why>
Spotted Improvements:
- <actionable follow-up or none>
Draft comment:
<opening resolution or progress statement and issue-specific explanation; put each prose paragraph on one physical source line>
### Public API behavior
<include only when relevant>
### Test coverage
- <new, modified, or absent test coverage; put each list item on one physical source line>
### Behavioral verification
<include only when public probe results materially clarify the outcome, risk, or requester-facing behavior>
### Follow-up to consider
- <include only for actionable, issue-related future work; state when it does not block closure>
Confirm whether to post this comment to <#>. If closure is recommended, also
confirm whether to close <#> as completed.
Comment Shape
For closure, start with:
This is addressed by <full-sha>.
For progress/comment-only updates, start with:
Progress update: <full-sha> landed <summary>.
Then explain what changed in issue terms, mention supporting commits if useful, and
state whether the issue should remain open. Mention docs/changelog-only commits only
as supporting metadata. If leaving an externally filed issue open for requester
verification, say that directly. Drop empty sections.
Use level-three headings for named public sections:
Leave one blank line between each level-three heading and its following paragraph, list, or code block.
### Public API behavior: include only for relevant public API behavior.
### Test coverage: always include.
### Behavioral verification: include only when executed public probe results materially clarify the outcome, risk, or requester-facing behavior; do not add it solely to say that no probe was feasible.
### Follow-up to consider: include only for actionable, issue-related future work found during assessment; do not add it for a concern already fully handled in another required section.
Include test coverage as unordered bullets. Name changed test files and test functions. If no tests changed, say whether that is reasonable for the commit type or a potential oversight.
When public API behavior is relevant, include ### Public API behavior before test coverage. Prefer prose bullets for small changes. Use short code blocks only when they make scope clearer. Use Public API behavior, not Public API surface, when APIs already existed and the commit expands or fixes their behavior.
Suitable items from private Spotted Improvements become public follow-ups only when they do not duplicate a concern fully handled in another required section. Follow-ups may cover test coverage, refactoring, features, bug fixes, documentation, or maintainability; do not add unrelated wish lists or invented work. State explicitly when a follow-up does not block closure.
Split examples by scope when both Python and kernel APIs are involved. Python
scope includes constructors, host-side functions, arguments, configuration, and
exceptions. Kernel scope includes Warp builtins that must be called from
@wp.kernel / @wp.func. For example:
### Public API behavior
**Python scope**
- `wp.Mesh(..., bvh_constructor="cubql")` now supports the fixed behavior.
- `wp.Bvh(..., constructor="cubql")` is now supported.
- Grouped meshes/BVHs and winding-number support remain unsupported for cuBQL.
**Kernel scope**
- Existing `wp.mesh_query_point*`, `wp.mesh_query_furthest_point_no_sign`, and `wp.mesh_query_aabb*` builtins now work with cuBQL-backed meshes.
Behavioral probe summaries are required in the private assessment. In the public
comment, mention probes only when they clarify the outcome, explain residual risk, or
help the requester verify the fix. When included publicly, summarize checked behavior
and result without local commands, cache paths, temp paths, or worktree paths.
Write in a factual maintainer voice, usually third person: "The change updates...",
"Coverage was added...". Keep wording direct and precise, adding detail when it
clarifies impact, scope, test coverage, remaining gaps, beyond-scope work, or follow-up.
Do not restate the commit message mechanically; use the comment to augment the commit
with issue-specific context.
Write Actions
After explicit confirmation, post the issue-specific comment. For each posted or
edited comment, fetch the comment by ID and verify the public body matches the
reviewed draft before closing anything. Close only issues that were both
recommended for closure and explicitly confirmed for closure. Verify final GitHub
state and report comment IDs, URLs, state, state reason, and close time.
If any write fails, stop and report the exact failure. Do not retry against a different
issue by guess.
Red Flags
- About to call a GitHub write API before showing the draft.
- The draft implies completion for a progress update.
- The issue has multiple requirements and the commits cover only one.
- The commit touches
warp/native/ and rebuild state was not considered.
- The only evidence is the commit message.
- The issue has a runnable repro but the assessment only reruns committed tests.
- The private assessment omits behavioral probe results or a reason probes were not run.
- The draft contains
/tmp/, WARP_CACHE_PATH, or local paths.
- A multiline
gh api write uses -f body=@file or --raw-field body=@file
instead of gh issue comment --body-file or gh api --input.
- The public comment shows a kernel-only Warp API as if it can be called directly
from Python scope.
- Public comment prose or a list item is manually wrapped across physical source lines instead of relying on GitHub's responsive rendering.
- A named public section uses a colon label instead of the required level-three heading.
- The assessment found distinct actionable, issue-related future work not fully handled in another required section, but the draft omits
### Follow-up to consider, or presents a non-blocking follow-up as a closure blocker.
Maintenance
When editing the Codex-side project skill, sync the mirrored Claude copy before
committing:
uv run tools/pre-commit-hooks/sync_skills.py --from codex
1---2name: warp-closing-issue3description: Use when the user provides Warp commit SHA(s) and GitHub issue number(s) to assess, draft issue comments, post progress updates, or recommend whether issue threads should stay open or close.4license: Apache-2.05---67# Warp Closing Issue89## Overview1011Assess user-supplied Warp commits against user-supplied GitHub issues. Produce a12scoped assessment and draft comment first; public GitHub writes require explicit13confirmation after the user sees the exact target issues and comment body.1415## Hard Rules1617- Stay within the user-supplied commit SHA(s) and issue number(s). Do not search for18 extra commits or issues; ask the user for more SHAs/issues if scope is incomplete.19- Read the issue body and comments, not just the title.20- Treat commit messages as orientation, not proof. Inspect diffs and changed files.21- Treat `changelog/*.md` fragments as the editable source of pending changelog22 intent. Treat generated `CHANGELOG.md` sections as released history or23 release-build metadata, never as behavioral fix evidence by themselves.24- Commenting is not always closure. Supported actions are `close`, `comment-only`,25 `keep open`, and `no public update`.26- Never post comments or close issues before showing the assessment and exact draft.27- Public comments use full 40-character SHAs as plain text for GitHub auto-linking.28- For multiline GitHub comment bodies, never use `gh api -f body=@file`29 or `gh api --raw-field body=@file`; these forms can send `@file`30 literally. Use `gh issue comment --body-file <file>` for new issue31 comments, or `gh api --input <json>` for PATCH/non-issue-comment writes.32- Keep local execution noise out of public comments: no `WARP_CACHE_PATH`,33 `/tmp/...`, local worktree paths, or shell setup.34- Do not use a local test command as the public test note. Public comments describe35 test coverage changes in the commit set: new tests, modified tests, or no tests.36- Do not treat passing committed tests as sufficient behavioral verification when37 the issue includes a runnable repro or clear expected behavior. When feasible,38 write and run small temporary probes inspired by the issue.39- Require behavioral probe summaries in the private assessment. Public comments may40 mention probes only when they clarify the recommendation, remaining risk, or41 requester-facing behavior.42- Format public comment Markdown for GitHub rendering: put each prose paragraph and each list item on one physical source line. Use hard line breaks only between structural blocks such as paragraphs, headings, list items, and fenced code blocks; never wrap prose to a fixed column width.43- Surface actionable, issue-related future work under `### Follow-up to consider`. Include the section only when the assessment found a specific improvement, and distinguish non-blocking follow-ups from gaps that prevent closure.4445Optional command snippets live in [commands.md](references/commands.md). Prefer the46GitHub app/MCP connector when it fits; `gh` is installed and authenticated here and is47fine for gaps or simple issue operations.4849## Checklist50511. **Resolve scope.** Record supplied commits, issues, and requested outcome, if any:52 closure assessment, progress update, comment only, or unspecified. If one53 supplied commit contains all others, use the newest such commit as the54 assessed head. For disjoint histories, inspect each commit tree separately55 and do not invent a combined fragment view.56572. **Gather evidence.** For each issue, extract author, author association, reported58 symptoms, reproducers, expected behavior, follow-up comments, maintainer asks, and59 current state. For each commit, inspect message, diff, tests, docs, changelog60 fragments, generated changelog changes, and touched areas such as `warp/native/`.61 For every touched fragment:62 - Read `changelog/README.md` and validate the identifier, category, optional63 counter, and content. A numeric filename identifies a GitHub issue and64 Towncrier generates its link; the fragment text should not repeat it.65 - Compare a numeric identifier with the supplied issue number. Inspect sibling66 fragments with the same identifier at the assessed head so complementary,67 duplicate, and counter-based entries are not mistaken for separate fixes.68 If an Added/Fixed/Changed set describes iterations on one not-yet-released69 feature, flag it for changelog audit; do not consolidate fragments in this70 issue-assessment workflow.71 - When combined rendering matters, run the pinned Towncrier draft from the72 assessed worktree and map the rendered bullet back to its source paths.73 A draft is read-only; never edit generated `CHANGELOG.md`.74 When the issue or commit appears to change public API behavior, inspect the75 relevant code, docs, tests, source fragments, rendered entry, and historical76 changelog for intended API surface and examples.77783. **Classify commits.**7980 | Type | Meaning |81 | --- | --- |82 | Behavioral fix | Changes the code path behind the issue. |83 | Test-only | Adds confidence, but cannot close by itself. |84 | Docs/changelog-only | Source fragments or generated release metadata; supporting context, not fix evidence. |85 | Follow-up | Completes or corrects earlier issue-linked work. |86 | Beyond scope | Related cleanup or broader behavior worth surfacing. |87884. **Map requirements.** For each issue requirement, state commit evidence, test89 coverage evidence, behavioral probe evidence if available, and status:90 addressed, partial, or missing.91925. **Assess public API behavior.** If the issue or commit changes public API93 surface or behavior, identify:94 - Python scope: constructors, functions, arguments, configuration, exceptions,95 or unsupported combinations visible from `warp`.96 - Kernel scope: existing or new Warp builtins callable only inside97 `@wp.kernel` / `@wp.func`.98 - Behavior type: new API, existing API now works in more cases, changed99 semantics, explicit unsupported behavior, or deprecation/removal.100 - Example accuracy: include short examples only when they clarify the issue;101 never show kernel-only APIs as host-side Python calls.1021036. **Review tests.** Inspect the supplied commits for test changes. Use unordered104 bullets in the assessment/comment:105 - New tests: file path, test function/class names, and what each case checks.106 - Modified tests: file path, test names, and what behavior or expectation changed.107 - No tests: state that no test changes were included and recommend whether that was108 reasonable or a potential review oversight.109110 You may still run committed tests when useful, but prefer probes that add issue111 specific signal beyond "the merged tests pass." Follow Warp policy locally:112 unique `WARP_CACHE_PATH`, `uv run`, and rebuild native113 libraries when `warp/native/` changes require it. Do not put local verification114 commands in the public issue comment.1151167. **Probe issue-shaped behavior.** When the issue has a repro, expected behavior,117 or clear boundary conditions, create one or more temporary scripts that exercise118 the reported behavior on the supplied commit/worktree. These are transient119 working artifacts; do not add them to the repo unless the user explicitly asks.120121 Prefer probes that:122 - Recreate the original repro as directly as possible.123 - Vary only issue-relevant dimensions likely to expose blind spots.124 - Assert observable behavior, not just absence of a crash.125 - Run outside the test suite when the issue is about script, import, process,126 runtime, environment, cache, or packaging context.127 - Use `uv run` and a unique `WARP_CACHE_PATH` for Warp commands.128129 Avoid probes that:130 - Merely rerun a committed test without adding issue-specific signal.131 - Expand into broad fuzzing or unrelated API compatibility.132 - Depend on timing or local environment details unless the issue is133 environment-specific.134135 Classify probe results in the private assessment:136 - `passes`: supports closure or progress assessment.137 - `fails in scope`: blocks closure or changes recommendation to `comment-only`138 / `keep open`.139 - `inconclusive`: mention as residual risk, but do not overstate it.140 - `not run`: explain why, such as unavailable hardware, excessive cost, or141 insufficient repro detail.1421438. **Decide action.**144 - `close`: every reported symptom and expected behavior is addressed, relevant145 comments are covered, test coverage is adequate or the lack of tests is146 reasonable for the change, and behavioral probes pass or were not feasible for147 a defensible reason.148 - `comment-only`: supplied commits are relevant progress, but the issue should remain149 open.150 - `keep open`: gaps remain and a public comment would not add value.151 - `no public update`: commits are peripheral, speculative, or already covered.152153 Include a requester-verification recommendation. If the issue author appears154 external to NVIDIA, prefer a resolution/progress comment that leaves the issue open155 so they can verify. If the issue author matches the current requesting user, closure156 is appropriate once the requirements are addressed; verify that identity from local157 user guidance, GitHub authenticated user data, or explicit user input rather than158 hardcoding a username.1591609. **Draft before writing.** Output:161162 ```markdown163 Assessment: <close | comment-only | keep open | no public update>164165 Issue <#>: <title>166 - Requested outcome: <...>167 - Commits: <primary full SHA(s)>; supporting: <full SHA(s) or none>168 - What changed: <behavior summary>169 - Public API behavior: <none | Python scope summary | kernel scope summary | unsupported cases>170 - Test coverage:171 - <new/modified/no tests detail>172 - Behavioral probes:173 - <required private probe summary: passes/fails in scope/inconclusive/not run, behavior checked, and issue relevance>174 - Beyond issue scope: <extra changes or none>175 - Requester verification: <close now | leave open for requester verification and why>176 - Recommendation: <action and why>177178 Spotted Improvements:179 - <actionable follow-up or none>180181 Draft comment:182 <opening resolution or progress statement and issue-specific explanation; put each prose paragraph on one physical source line>183184 ### Public API behavior185186 <include only when relevant>187188 ### Test coverage189190 - <new, modified, or absent test coverage; put each list item on one physical source line>191192 ### Behavioral verification193194 <include only when public probe results materially clarify the outcome, risk, or requester-facing behavior>195196 ### Follow-up to consider197198 - <include only for actionable, issue-related future work; state when it does not block closure>199200 Confirm whether to post this comment to <#>. If closure is recommended, also201 confirm whether to close <#> as completed.202 ```203204## Comment Shape205206For closure, start with:207208```markdown209This is addressed by <full-sha>.210```211212For progress/comment-only updates, start with:213214```markdown215Progress update: <full-sha> landed <summary>.216```217218Then explain what changed in issue terms, mention supporting commits if useful, and219state whether the issue should remain open. Mention docs/changelog-only commits only220as supporting metadata. If leaving an externally filed issue open for requester221verification, say that directly. Drop empty sections.222223Use level-three headings for named public sections:224225Leave one blank line between each level-three heading and its following paragraph, list, or code block.226227- `### Public API behavior`: include only for relevant public API behavior.228- `### Test coverage`: always include.229- `### Behavioral verification`: include only when executed public probe results materially clarify the outcome, risk, or requester-facing behavior; do not add it solely to say that no probe was feasible.230- `### Follow-up to consider`: include only for actionable, issue-related future work found during assessment; do not add it for a concern already fully handled in another required section.231232Include test coverage as unordered bullets. Name changed test files and test functions. If no tests changed, say whether that is reasonable for the commit type or a potential oversight.233234When public API behavior is relevant, include `### Public API behavior` before test coverage. Prefer prose bullets for small changes. Use short code blocks only when they make scope clearer. Use `Public API behavior`, not `Public API surface`, when APIs already existed and the commit expands or fixes their behavior.235236Suitable items from private `Spotted Improvements` become public follow-ups only when they do not duplicate a concern fully handled in another required section. Follow-ups may cover test coverage, refactoring, features, bug fixes, documentation, or maintainability; do not add unrelated wish lists or invented work. State explicitly when a follow-up does not block closure.237238Split examples by scope when both Python and kernel APIs are involved. Python239scope includes constructors, host-side functions, arguments, configuration, and240exceptions. Kernel scope includes Warp builtins that must be called from241`@wp.kernel` / `@wp.func`. For example:242243```markdown244### Public API behavior245246**Python scope**247248- `wp.Mesh(..., bvh_constructor="cubql")` now supports the fixed behavior.249- `wp.Bvh(..., constructor="cubql")` is now supported.250- Grouped meshes/BVHs and winding-number support remain unsupported for cuBQL.251252**Kernel scope**253254- Existing `wp.mesh_query_point*`, `wp.mesh_query_furthest_point_no_sign`, and `wp.mesh_query_aabb*` builtins now work with cuBQL-backed meshes.255```256257Behavioral probe summaries are required in the private assessment. In the public258comment, mention probes only when they clarify the outcome, explain residual risk, or259help the requester verify the fix. When included publicly, summarize checked behavior260and result without local commands, cache paths, temp paths, or worktree paths.261262Write in a factual maintainer voice, usually third person: "The change updates...",263"Coverage was added...". Keep wording direct and precise, adding detail when it264clarifies impact, scope, test coverage, remaining gaps, beyond-scope work, or follow-up.265Do not restate the commit message mechanically; use the comment to augment the commit266with issue-specific context.267268## Write Actions269270After explicit confirmation, post the issue-specific comment. For each posted or271edited comment, fetch the comment by ID and verify the public body matches the272reviewed draft before closing anything. Close only issues that were both273recommended for closure and explicitly confirmed for closure. Verify final GitHub274state and report comment IDs, URLs, state, state reason, and close time.275276If any write fails, stop and report the exact failure. Do not retry against a different277issue by guess.278279## Red Flags280281- About to call a GitHub write API before showing the draft.282- The draft implies completion for a progress update.283- The issue has multiple requirements and the commits cover only one.284- The commit touches `warp/native/` and rebuild state was not considered.285- The only evidence is the commit message.286- The issue has a runnable repro but the assessment only reruns committed tests.287- The private assessment omits behavioral probe results or a reason probes were not run.288- The draft contains `/tmp/`, `WARP_CACHE_PATH`, or local paths.289- A multiline `gh api` write uses `-f body=@file` or `--raw-field body=@file`290 instead of `gh issue comment --body-file` or `gh api --input`.291- The public comment shows a kernel-only Warp API as if it can be called directly292 from Python scope.293- Public comment prose or a list item is manually wrapped across physical source lines instead of relying on GitHub's responsive rendering.294- A named public section uses a colon label instead of the required level-three heading.295- The assessment found distinct actionable, issue-related future work not fully handled in another required section, but the draft omits `### Follow-up to consider`, or presents a non-blocking follow-up as a closure blocker.296297## Maintenance298299When editing the Codex-side project skill, sync the mirrored Claude copy before300committing:301302```bash303uv run tools/pre-commit-hooks/sync_skills.py --from codex304```