Skip to content

fix(finding-triage,done-check,gh-body-audit,implement,review-pipeline): close a finding by its disposition - #257

Merged
ultimatile merged 10 commits into
mainfrom
fix/173-unresolved-finding-closure
Oct 12, 2026
Merged

ultimatile merged 10 commits into
mainfrom
fix/173-unresolved-finding-closure

Conversation

@ultimatile

Copy link
Copy Markdown
Owner

Summary

A gate that could not get a finding fixed let it through on a waiver worded in the gate itself, and the two gates that did this disagreed on who may waive: skills/done-check/SKILL.md let a concern through when "explicitly waived by the user with reasoning", and skills/gh-body-audit/SKILL.md when it had "an inline waiver with a one-line justification", which names nobody. The disposition catalogue in skills/finding-triage/SKILL.md had no entry for a finding whose validity stays unknown, or whose fix is not a local edit, once the user stops work on it.

The escape is now a disposition. The catalogue gains abandoned and a definition of a closed finding, and both gates take their closing terms from that definition.

Closes #173

Changes

skills/finding-triage/SKILL.md

  • abandoned is a disposition: the user directs that no further work be done on the finding in this run, and either its validity is not known or it is valid and its fix is not a local edit. The decision is the user's alone, and a follow-up is kept where the user directs one.
  • A finding is closed when it holds false-positive, defer, wontfix or abandoned and the run has done what that entry directs.
  • What an entry tells the run to do binds only while the finding holds that entry, so the instruction in uncertain-validity to keep investigating, and the one in opens-a-question to re-enter research, stop binding a finding the user has taken to abandoned.
  • invariant-premise-check states its two outcomes as what follows once the premise is verified, not as the entry's only exits.
  • wontfix contrasts a reason to postpone with "a reason to drop the fix", which leaves the word "abandon" to the new slug.
  • A pre-existing instance of the same flaw does not license abandoned, as it does not license the other three closing entries.

skills/done-check/SKILL.md

  • Step 5 does not proceed "until each concern is resolved or closed, as finding-triage defines closed".
  • Step 4 says only that step 5 binds cross-cutting concerns as it binds a ⚠ row; step 5 alone states the terms.

skills/gh-body-audit/SKILL.md

  • Step 4 iterates "until clean, or each remaining ⚠ is closed, as finding-triage defines closed; a closed ⚠ does not block".

skills/implement/SKILL.md, skills/review-pipeline/SKILL.md

  • Each tells its caller to wait for done-check's step 5 gate and says nothing further about what closes a concern there.

.claude-plugin/marketplace.json

  • metadata.version is 2026.10.12.

Impact

Three behaviors change for a run that reaches one of these gates.

  • A deferral at done-check needs what the defer entry asks for, an issue or a note kept on the user's direction. The gate used to ask for a follow-up issue filed with the user's approval.
  • A ⚠ at gh-body-audit that is valid, or whose validity is unsettled, passes unfixed only on the user's direction. The old wording, "an inline waiver with a one-line justification", named no actor.
  • A concern can no longer pass either gate while work on it continues in the same run. One the user wants worked on later is taken to abandoned with a follow-up kept.

skills/file-issue/SKILL.md, skills/file-pullreq/SKILL.md and skills/research/SKILL.md block on gh-body-audit step 4's terms and state none of their own, so they follow without an edit. skills/review-telemetry/SKILL.md takes its disposition values from the catalogue by reference, and skills/copilot-review/SKILL.md has replies name whichever slug a finding holds; neither is edited.

Verification

  • pre-commit run --all-files on the branch: ruff check and ruff format report Passed. mdformat reports Failed because it rewrites CLAUDE.md, which this change does not touch and which it rewrites the same way on main.
  • rg -n -i 'waiv' skills README.md CLAUDE.md returns four files: the repeat step of skills/codex-review/SKILL.md, and three whose object is not a finding (skills/code-review-gate/SKILL.md waives a missing review, skills/review-pipeline/SKILL.md refers to that waiver, skills/review-telemetry/SKILL.md uses the word of a telemetry entry).
  • Three reading checks, each put to a reader given only the named files from the branch:
    • skills/finding-triage/SKILL.md alone. A finding whose validity rests on an external system the run cannot execute, with the user directing no more work on it in this run, takes abandoned with no second candidate. With the user declining only that verification, the reader gave keeping the entry the finding held as the more literal reading, and noted that no sentence supports reading that answer as abandoned.
    • That file and skills/done-check/SKILL.md. Step 5 lets the run proceed past a concern closed as wontfix and past a row whose auditor quoted no rule clause, closed as abandoned, and not past a concern at uncertain-validity with no direction from the user.
    • That file and skills/gh-body-audit/SKILL.md. The run may not, on its own judgment, proceed past a ⚠ it considers valid.

Notes

…ine,implement): close a finding by its disposition

Add an `abandoned` disposition for a finding whose validity is not
known, or whose fix is not a local edit, when the user directs that the
investigation that would settle it not be run. Define a closed finding
in finding-triage, and have the gates that worded a waiver of their own
point at that definition instead.

The waiver in gh-body-audit named no actor, so it could be read as the
run waiving its own findings; every closure that makes no fix is now
the user's decision.
… bound what an entry directs

Scope each entry's handling to the time a finding holds that entry, so
the exits the investigation-naming entries state do not contradict
`abandoned`. Name both unknowns in the `abandoned` condition instead of
"the investigation".

In done-check, state the row rule for every closure rather than for
three dispositions, and leave the fix to the closed definition. In
gh-body-audit, bind the gate to the report for the draft as filed, and
drop the copy of the gate from the description and the README row.
…e filed draft

State the gh-body-audit gate as what the caller's next step requires —
a report for the draft as it will be filed, with every ⚠ closed — so a
revised draft with no report of its own cannot pass.

Call a finding whose external-system claim cannot be verified open, the
term the closed definition uses. Leave done-check's sentence on what a
deferred row shows as it was.
…): define closed as closure without a fix

Narrow the closed definition to the four dispositions that end a
finding with no edit. A fixed finding passes each gate the way it
already did, by the re-audit coming back clean, so the gates keep their
wording and only the waiver clause becomes a reference to the
definition.

Scope the premise-check outcome sentence to a completed verification,
and say that done-check's gate states how a concern closes rather than
that it owns the list.
Key the `abandoned` condition on the user directing that no further
work be done, whatever work remains, so a finding whose non-local fix
became known in research still has an entry when the user declines it.
Put the direction first so it governs both alternatives.

Restore the opening of done-check step 5, which told the run to fix any
remaining ⚠.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

The disposition model and its gate references are consistent and appropriately centralized.

0 open findings

What changed in this PR

Centralizes finding closure in finding-triage and updates consuming gates to use that shared definition.

Changes:

  • Adds the abandoned disposition and defines closed findings.
  • Aligns audit and implementation gates with the centralized closure contract.
  • Bumps the plugin version to 2026.10.12.
File Description
skills/​finding-triage/​SKILL.md Defines abandonment and finding closure.
skills/​done-check/​SKILL.md Uses centralized closure rules.
skills/​gh-body-audit/​SKILL.md Replaces inline waivers with defined closure.
skills/​implement/​SKILL.md Removes duplicated closure guidance.
skills/​review-pipeline/​SKILL.md Delegates closure semantics to done-check.
.claude-plugin/​marketplace.json Bumps the plugin version.

🧠 Review effort: Balanced


💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

finding-triage: nothing closes a permanently unresolved finding

2 participants