Use when triaging a GitHub issue for gflow-cli — a reporter's bug claim, a freshly-filed issue, or deciding whether and how to act on one. Also use when an autonomous agent (hermes-ops) picks up a labelled issue. Read-only: produces a verdict, an end-to-end-verifiability judgment, and a reporter-facing reply. Does not modify code or post anything on its own.
Installs into .claude/skills of the current project.
Are you the author of Issue Assessment?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/ffroliva-issue-assessment)
---
name: issue-assessment
version: "1.0"
description: >
Use when triaging a GitHub issue for gflow-cli — a reporter's bug claim, a
freshly-filed issue, or deciding whether and how to act on one. Also use when
an autonomous agent (hermes-ops) picks up a labelled issue. Read-only: produces
a verdict, an end-to-end-verifiability judgment, and a reporter-facing reply.
Does not modify code or post anything on its own.
---
# `issue-assessment` — triage a gflow-cli issue honestly
Read-only conductor. Verify the reporter's claim against the code, tests, docs,
`KNOWN_ISSUES.md`, and auto-memory; classify it; judge whether it can be
verified end-to-end *in the current environment*; and draft a reply. The output
is a standard artifact a human or the `issue-resolve` skill can act on.
**Core principle:** never assert more than the evidence supports. A claim is
`CONFIRMED` only with line-level code evidence or a reproduction; a fix is
"verified" only after running it on the **affected surface**. Honest
"can't verify here" beats a false green check — a bounced fix costs more trust
than an accurate "not yet."
---
## When to invoke
- A new or updated GitHub issue needs a verdict before anyone spends effort.
- An autonomous run (hermes-ops) reacts to an issue labelled for triage.
- You're about to "just fix" a reported bug — assess first; the scope decision
(reply-only vs hand to `issue-resolve`) depends on this.
Skip for: issues that are obviously feature requests routed elsewhere, or
already-triaged issues entering implementation.
---
## Invocation
```
/gflow:issue-assessment <issue number or URL>
```
This repo's `skills/*/SKILL.md` are plain Markdown — invoke by **reading** the
file (via the `.claude/commands/gflow/*` wrapper), never `Skill(skill=...)`.
---
## Protocol
### 1. Ingest
`gh issue view <N> --json title,body,comments,labels,author,state`. Extract: the
claimed symptom, environment (OS, version, install method), exact repro steps,
and any logs/error classes the reporter pasted.
### 2. Verify (read-only)
Dispatch a search/Explore agent (keep your own context clean) to corroborate or
refute the claim against the real tree. Always check, in order:
- the source path(s) the symptom implicates — cite `file_path:line_number`;
- `KNOWN_ISSUES.md` (is this Open / Mitigated / Resolved already?);
- open issues/PRs (`gh pr list`, `gh issue list`) for duplicates or in-flight fixes;
- auto-memory for prior context on the surface.
Disprove parts of the reporter's framing where the code says otherwise (e.g.
`browser_engine: playwright` is the engine axis, not the channel) — a precise
correction is more useful than agreement.
**Name the affected SURFACES, not just the affected code.** A reporter hits one
surface; the defect usually spans both. gflow ships most capabilities twice — CLI
command and MCP tool — so state explicitly whether the issue reproduces on the CLI,
on the MCP tool, or on both, and whether a fix in one automatically fixes the other
(it does when both route through the same transport; it does not when the MCP path
carries its own params through `worker/codec.py`). Getting this wrong scopes the
whole downstream fix wrong: a "CLI bug" that is really a shared-transport bug leaves
MCP users broken after the issue is closed.
### 3. Classify — exactly one verdict
| Verdict | Meaning |
|---|---|
| `CONFIRMED-BUG` | Reproduced, or root-caused in code with line-level evidence. |
| `LIKELY-BUG / NEEDS-E2E` | Strong code hypothesis, but unverifiable in this environment (e.g. macOS-only or headed-browser bug on a headless/Windows host). |
| `NEEDS-INFO` | A specific discriminating diagnostic is required before deciding. |
| `DUPLICATE` / `KNOWN-ISSUE` | Matches an open issue/PR or a `KNOWN_ISSUES.md` entry. |
| `WORKING-AS-INTENDED` / `INVALID` | Usage error or expected behavior. |
| `WONTFIX / OUT-OF-SCOPE` | Real but deliberately not addressed. |
### 4. e2e-gate — what would verification actually require?
Classify the verification cost before claiming anything is fixed:
- **Browser-free** (pure-Python logic, Gemini tool-path, unit/lint/type, recording-verif) → verifiable anywhere, including the headless VPS. Run it.
- **Headed-Flow-browser required** (generation, selector, auth, reCAPTCHA) → **not** verifiable on a headless or wrong-OS host. Verdict tilts to `LIKELY-BUG / NEEDS-E2E`; never claim success; the final check is a human on the affected surface. (See memory: `done-means-e2e-verified`, `pr-must-verify-on-affected-surface`.)
### 5. Report (the artifact)
Produce the reply below. Post it only if the autonomy gate allows (autonomous
runs may comment; otherwise surface for a human to send).
```
**Assessment of #<N>: <verdict>** (confidence <N>/10)
Restated claim: <one line>.
Findings:
- <evidence as file:line> …
- <corrections to the reporter's framing, if any> …
Root cause / hypothesis: <what and why, or "unconfirmed because …">.
What we need next:
- <the single discriminating diagnostic — for NEEDS-INFO/NEEDS-E2E>, or
- <draft PR link — if issue-resolve ran>, or
- <why this is a dup/invalid/wontfix>.
```
### 6. Hand-off decision (graded, not a hard stop)
- Verdict ∈ {`CONFIRMED-BUG`, `LIKELY-BUG`} **and** scope is single-surface/localized
**and** a fix is verifiable in this environment → chain to **`issue-resolve`** (Phase 9) or **`predict`** (Phase 2).
- Otherwise → reply only; the next step is a human or more info.
### Pipeline Continuation (Next Step Handoff)
Upon completing an Issue Assessment:
1. **Confirmed Bug / Feature Request:** Proactively announce: **"Issue assessed. Next step: Phase 2 Pre-Implementation (`/gflow:predict <proposal>`) or Phase 9 Issue Resolve (`/gflow:issue-resolve <N>`)."**
2. **Needs Info / Unconfirmed:** Request the specific diagnostic and await information before moving to Phase 2.
---
## Skill routing (do not hallucinate skill names)
Re-derive this from `ls skills/` + `ls .claude/commands/gflow/` before relying on
it — names drift. Current map:
| Need | Use | How |
|---|---|---|
| The issue claims a surface is broken/missing/impossible | `/gflow:spike` | read `skills/spike/SKILL.md` — **do this before classifying** |
| High-stakes change (auth/transport/selector/schema) | `/gflow:predict` | read `skills/predict/SKILL.md` |
| Edge cases + BDD skeleton | `/gflow:scenario` | read `skills/scenario/SKILL.md` |
| Touching auth/reCAPTCHA | `/gflow:known-issues` | `.claude/commands/gflow/known-issues.md` |
| Drive the fix | `issue-resolve` | read `skills/issue-resolve/SKILL.md` |
| Worktree / TDD | superpowers | `Skill()` tool (these *are* invocable) |
## Before you classify an absence
A verdict of INVALID / WONTFIX / "not supported on this host" is a claim about the
live product, and this skill is read-only — it cannot produce one from the code alone.
**If the issue asserts that something does not work, and the answer turns on what Flow
actually renders or calls, load [`skills/spike/SKILL.md`](../spike/SKILL.md) and get
evidence first.**
The failure this prevents: a 20 s selector timeout was read as "the character editor
is a labs-only surface, it renders no prompt textbox ever", and that unmeasured
negative reached a code comment, a CHANGELOG entry, a release ledger and a test class
name before anyone looked at the DOM. The feature had worked the whole time. Closing a
reporter's issue on that basis tells a user their working feature is impossible.
Cheap tells that you are about to do it:
- the evidence for the absence is a **timeout**, an exception, or an exit code
- the claim is about a *host*, *cohort* or *account class* you cannot check from here
- you are about to write "cannot", "never", "not supported" in a reporter-facing reply
Spikes are free for DOM and network reads. Thirty minutes of measurement beats a
confident wrong classification that ships.
---
## Output format
A single Markdown block: the verdict line, findings with citations, root-cause
hypothesis, and the "what we need next" step. No code changes, no posting unless
the autonomy gate permits.
---
## Provenance
Designed 2026-06-29 (`docs/superpowers/specs/2026-06-29-issue-assessment-workflow-design.md`).
Validated against issue #222 (a `LIKELY-BUG / NEEDS-E2E` case: macOS + headed
browser, unverifiable on Windows/headless). Authored recipe-shaped after three
baseline runs showed capable agents already comply with the project's discipline
rules — the skill standardizes the procedure and artifact, it does not enforce
discipline the agent lacks.