Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when deciding the verdict of a security review - severity anchors and confidence scale, when to block, approve with notes, add a needs-validation note, drop or reject as unreviewable, the smallest-fix rule and the exact comment templates
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
설치 방법 보기설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.
A security reviewer that blocks on noise gets ignored; one that passes on a hunch ships a breach. The verdict follows a fixed policy so the developer can predict it and the human can trust it.
Core principle: block only what you can prove is exploitable and new; say nothing about what you cannot.
| Severity | Meaning | Typical examples |
|---|---|---|
| CRITICAL | Exploitable now with little or no precondition; full compromise | RCE, auth bypass, SQL injection on a public endpoint, a live production secret committed, a malicious dependency |
| HIGH | Significant, reachable, one realistic precondition | IDOR on another user's data, stored XSS, SSRF to an internal service, path traversal reading server files, pull_request_target running PR code with secrets |
| MEDIUM | Needs specific conditions, or real but bounded impact | CSRF on a state change, reflected XSS behind an unusual flow, user enumeration that enables a further attack, verbose error leaking internal paths |
| LOW | Defence in depth, best practice | Missing header with no vulnerability, weak-but-unused config |
Exposure moves severity, not existence: "only reachable from the internal network" can still be HIGH when internal callers are not trusted. Use the deployment shape from get_project_brief.
Anchors that keep two reviews of the same bug at the same level:
The HIGH/MEDIUM line: does the traced result fully defeat an explicit control for an action with real consequences, or only weaken it? Likelihood — preconditions, attacker position — moves severity down; nothing moves it above the impact the trace shows. If you cannot state the concrete damage, the severity is lower than it feels.
Confidence is about exploitability in this code, not about whether the pattern looks bad:
Evaluate every surviving finding, then apply the strongest outcome:
need_revision, naming exactly what could not be verified.need_revision when any holds:
pull_request_target with a PR-head checkout and secrets in reach, an agent permission-bypass flag, untrusted input reaching an LLM that holds tools.ready_for_qa plus one comment: MEDIUM findings at ≥ 0.8, at most three, highest first; and Needs validation notes, at most two (§6).ready_for_qa, no comment.LOW and < 0.8 findings are dropped: not "for awareness", not "minor", not mentioned.
One add_task_comment, before the move. The developer receives it alongside the architect's review, so it must stand alone.
Security review — changes requested
SEC-1 · HIGH · Broken object-level authorization (CWE-639, OWASP A01:2025) · internal/invoice/handler.go:57
Exploit: an attacker with any customer account can GET /api/invoices/{id} with another customer's id → reads their invoices (amounts, addresses).
Evidence: r.PathValue("id") (handler.go:52) → repo.Get(ctx, id) (repo.go:31, WHERE id = $1 only) → JSON response; no OrgID check on the path. Siblings use repo.GetForOrg.
Fix: use repo.GetForOrg(ctx, id, auth.OrgID(ctx)) and return 404 when it finds nothing; add a test where org B requests org A's invoice.
SEC-2 · CRITICAL · Hard-coded credential (CWE-798, OWASP A07:2025) · config/prod.go:12
Exploit: anyone with read access to the repository can use the Stripe live key → charges and refunds on the production account.
Evidence: const stripeKey = "sk_live_…" (prod.go:12), used by billing/client.go:20.
Fix: load it from the secret manager like the other keys; the key must also be rotated — removing it from the code does not un-leak it.
Reviewed: all 14 changed files; scanners: gitleaks (diff), semgrep p/default on changed files.
Per finding: severity · category (CWE-x, OWASP A0x:2025) · file:line; the exploit sentence ("an attacker with [capability] can [action] → [impact]"); the evidence trace with file:line; the fix. Redact secrets to a recognisable prefix — never paste the full value into a comment.
The fix is the smallest source change that enforces the invariant at the last trusted decision point — the repository method, check or parameter by name, plus the regression test that would fail if the hole reopened. "Sanitise input", "add validation" or "harden this" is not a fix. When one root cause appears at several locations, the fix names every location (coverage-and-variant-pass §4).
Needs validation notes, if any, follow the last SEC-n in the same comment (§6).
Security review — approved with notes
1. MEDIUM · CSRF (CWE-352, OWASP A01:2025) · web/routes/settings.ts:88 — POST /settings/email relies on the session cookie with SameSite=None and no CSRF token; a page the user visits can change their email. Add the csrf middleware its siblings use.
No praise, no list of what was fine, no LOW items, no more than three notes.
For a lead whose source trace is complete, that would be HIGH or CRITICAL, and that exactly one fact outside the repository decides (source-visibility-needs-validation). It has no severity and never blocks on its own; at most two per review.
NV-1 · Identity header trusted behind the auth proxy · internal/api/middleware.go:31
Trace: X-Forwarded-User (middleware.go:31) → auth.SetUser (middleware.go:38) → every /api route; deploy/k8s/api-service.yaml:9 publishes the pod as type LoadBalancer.
Unresolved: whether the cluster's network policy or cloud firewall lets traffic reach that LoadBalancer without passing oauth2-proxy.
Owner check: confirm the LoadBalancer's source ranges or the firewall rule in the cloud console; if it is reachable, drop the header trust or make the Service ClusterIP.
On an otherwise clean review, the comment is headed Security review — approved with notes and carries only the NV items. Never phrase a needs-validation note as a confirmed vulnerability, and never ask anyone to test it against a live system.
move_board_task. A move without its comment hands the developer a rejection with no reason, and the one-word fallback verdict cannot add one.file:line.OWASP Top 10:2025 · CWE Top 25 (2025) · CVSS v4.0 (vocabulary only; the policy above decides)
아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.
로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.
Use when writing acceptance criteria for a task - express each as an observable Given/When/Then that QA can execute, including negative cases
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the diff adds or changes an endpoint, resolver, RPC, job or query that takes an object id, a role check, a request binding or a tenant filter - BOLA/IDOR, function-level authorization, mass assignment and tenant scoping
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use on every UI change - semantic HTML, labels for controls, keyboard-navigable dialogs/menus, visible focus, and never color as the only signal
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when a task changes any screen, form, dialog, menu or control - Lighthouse/axe scan of the changed screens, a keyboard walk, and the thresholds that fail a task
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
How to work a task returned with review, QA or UAT findings. Use when a task is in need_revision or PR review comments are in your context.
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.
Use when the repository keeps its alerting in code, or a person asks for alerts outside TaskTrooper - PrometheusRule YAML, a Cloud Monitoring alert policy in Terraform, a Datadog monitor, each routed to TaskTrooper's alert ingest URL so it opens an incident here
한국어 요약은 준비 중입니다. 원문 설명을 표시하고 있습니다.