Skip to content
Back to skills

Issue Brief

ASecurity

Explain a GitHub issue, discussion, or feature request in plain language before deciding whether to build it. Covers what the reporter actually wants, a numbered walkthrough of the failure using real hostnames/ports/endpoints, how the code behaves today with file:line anchors, what implementing it would take, and the traps (security regressions, open PRs touching the same files, older issues with the same root cause). Use whenever a github.com issues/ or discussions/ link is pasted, or the us...

  • 374 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 3, 2026
ai-agentsgoshellbashnodegitapifrontendbackendsecurity

Works with

  • api

Security analysis

A100/100

Scanned September 3, 2026

npx -y skills add VasiHemanth/tokentelemetry --skill issue-brief --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Issue Brief?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Issue Brief
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/vasihemanth-issue-brief/badge)](https://www.skillsdirectory.com/skills/vasihemanth-issue-brief)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: issue-brief
description: Explain a GitHub issue, discussion, or feature request in plain language before deciding whether to build it. Covers what the reporter actually wants, a numbered walkthrough of the failure using real hostnames/ports/endpoints, how the code behaves today with file:line anchors, what implementing it would take, and the traps (security regressions, open PRs touching the same files, older issues with the same root cause). Use whenever a github.com issues/ or discussions/ link is pasted, or the user says check / look at / verify / assess / analyse this issue, what does this issue want, is it worth doing, what would it take, or refers to one by number (issue 198, discussion 49). Also handles the follow-ups "what are the cons" and "explain that in simple terms". NOT for pull requests (use /review) and NOT for implementing. An issue-brief ends with the working tree untouched.
---

# issue-brief — explain an issue before building it

The output is an **explanation**, not a design doc and not a diff. Assume the
reader has not read the reporter's post and does not have the file layout in
their head. Lead with the plain meaning; the architecture comes fourth.

## 1. Fetch the thing

Issues:

```bash
gh issue view <number-or-url> --json number,title,state,author,createdAt,closedAt,labels,body,comments
```

**Discussions need GraphQL.** There is no `gh discussion` command (verified on
gh 2.92), and `gh issue view` will not resolve a discussion number. Use:

```bash
gh api graphql -f query='
{ repository(owner:"VasiHemanth", name:"tokentelemetry") {
    discussion(number: NNN) {
      number title url category{name} author{login} createdAt body
      comments(first:20){ nodes { author{login} body } }
    } } }'
```

Then, before writing anything:

- **Check it isn't already done.** Grep the codebase for the feature's nouns.
  Issue 135 (Pi agent support) was closed and fully shipped; the tell was
  `PI_SESSIONS_DIR` and `test_pi_scan.py` already sitting on main.
- **Search for the same root cause elsewhere**, open and closed
  (`gh issue list --search`). Issues 198 and 96 were the same two-port problem
  reported twice, a year apart, by different people.
- **Check open PRs that touch the files you'd touch** (`gh pr list`). They set
  the landing order.

## 2. Answer in this order

1. **What the reporter actually wants**, in one or two sentences of plain
   language, jargon stripped. Name them. Link the earlier issue or PR if it's
   a repeat.
2. **A concrete walkthrough of the problem.** Pick one realistic setup and
   trace it as numbered steps, with real hostnames, real ports, real
   endpoints. Never "suppose a user does X". Say what the user *sees* first,
   then why it happens.
3. **How it works today**, only the part that bears on the issue, with
   `file.py:line` anchors so the claim can be checked.
4. **What implementing it would take**: the shape of the change and which
   layer it belongs in, not a full diff.
5. **Traps and interactions.** Security regressions, open PRs on the same
   files, closed issues with the same root cause, what has to land first.
6. **A verdict and one next step** ("worth accepting, want me to draft the
   reply comment?").

Steps 3 and 4 collapse to a sentence each when the issue is simple. Steps 1,
2 and 6 are never skipped.

## 3. Prose rules

- **Symptom before mechanism.** "It looks broken but nothing crashed, the page
  just never got its data," and only then the middleware ordering.
- **Expand every acronym and product name once**, the first time it appears.
  The reporter's Pangolin / SSE / CORS gets one clause of explanation.
- **Don't paste code blocks.** Quote a few lines at most, or cite `file:line`
  and let the reader open it.
- **No hedging stacks.** One verdict. If it is genuinely balanced, say what
  evidence would decide it.
- **Say what you touched.** State explicitly that the tree is untouched, or
  what changed if implementation was requested separately.

## 4. "What are the cons?"

Answer as **con → mitigation pairs**, grouped by how much they matter, and say
plainly which group each falls in:

- **Blocker.** Must ship in the same PR or the feature is a regression.
- **Verify before merge.** Fine in principle, needs a number on the bench.
- **Acceptable.** The ordinary cost of the approach. Name it and move on.

Every con gets a mitigation or it isn't finished. A con with no mitigation is
a blocker by definition.

## 5. Worked example (issue 198, single-port proxy)

> **What they want.** Jiaocz runs TokenTelemetry behind Pangolin, a reverse
> proxy that maps a *domain* to *one* port. They want the API reachable
> through the web port so one domain is enough. Same root cause as issue 96
> (SSH tunnel with only 3000 forwarded).
>
> **What breaks.** TokenTelemetry runs two servers: 3000 serves the page, 8000
> serves the data.
> 1. You open `tt.mydomain.com`. The dashboard loads, layout fine.
> 2. The page fetches `tt.mydomain.com:8000` for sessions.
> 3. Nothing is there. The proxy only published 3000.
> 4. Empty shell. Blank charts, zero sessions.
>
> **Today.** `frontend/src/lib/api.ts` builds `API_BASE` from
> `window.location.hostname` plus `NEXT_PUBLIC_API_PORT`. Everything funnels
> through `apiFetch`, no SSE, no WebSockets, one binary endpoint.
>
> **The trap.** `RemoteAuthMiddleware` (`backend/main.py:228`) exempts
> loopback. Proxy everything through Next and every request arrives from
> 127.0.0.1, so the token gate is bypassed for the whole internet and
> `/remote-access` (`main.py:5709`) hands the token to any visitor who asks.

Note what the example does. The failure is walked before a single filename
appears, and the security trap is stated consequence-first ("bypassed for the
whole internet"), not as a description of middleware registration order.

## 6. Don't

- Don't open a worktree or edit files. This skill is read-only.
- Don't comment on the issue, close it, or label it unless asked.
- Don't use this for pull requests. `/review` covers those.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.