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...
Scanned 9/3/2026
Install to Claude Code
npx -y skills add VasiHemanth/tokentelemetry --skill issue-brief --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Issue Brief?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/vasihemanth-issue-brief)More formats (shields.io, HTML) on the badges page.
---
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.
Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!