Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Posts review findings from a JSON file as inline comments on a GitHub Pull Request, attaching each comment to its file and line. Use when you have a list/JSON of review findings (each with a file path, line number, and a message such as summary/failure_scenario) and want them published on a PR as inline review comments. Triggers include "post these review comments on the PR", "associate comments to files in the PR", "publish review findings to PR
.claude/skills/giuseppe-trisciuoglio-pr-review-comments/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | -77% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 98% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 19% | 0% |
| case-17 | ✗→✓ | ▲ Improved | -27% | 0% |
Publish a JSON array of review findings as inline comments on a GitHub Pull Request, each anchored to its file and line. Uses the GitHub API through the authenticated gh CLI, so no token handling is needed.
gh CLI installed and authenticated (gh auth status). The script auto-detects therepo with gh repo view; pass --repo OWNER/REPO to override.
file, line.Message comes from summary and/or failure_scenario (combined into the body), or an explicit body. See references/json-schema.md for the full schema and a sample.
GitHub only accepts an inline comment if the target line is part of the PR's diff. line is the line number in the new file (use side: "LEFT" for removed lines). The script fetches the PR diff, validates every finding against the actual hunks, and skips any whose line is outside the diff — reporting them at the end so nothing is lost silently. There is no way to attach a line comment to an unchanged, undiffed line.
gh repo view.bash scripts/post_pr_comments.py --pr <N> --json <path> --dry-run
the diff moved, the line numbers in the JSON may be stale — reconcile before posting.
bash # Grouped (default): one PR review bundling all comments scripts/post_pr_comments.py --pr <N> --json <path> --event COMMENT
# Individual: one separate inline comment per finding scripts/post_pr_comments.py --pr <N> --json <path> --mode individual
| Mode | Endpoint | Use when | |------|----------|----------| | grouped (default) | POST /pulls/{n}/reviews | Publishing a set of findings as one review. One notification; can set --event APPROVE \| REQUEST_CHANGES \| COMMENT. | | individual | POST /pulls/{n}/comments | Adding standalone comments incrementally, or when each finding should be its own thread/notification. |
Default to grouped with --event COMMENT unless the user wants a verdict or separate threads.
--pr N PR number (required)
--json PATH JSON array of findings (required)
--repo OWNER/REPO Override auto-detected repo
--mode grouped|individual Default: grouped
--event COMMENT|APPROVE|REQUEST_CHANGES Grouped-mode verdict (default COMMENT)
--review-body TEXT Top-level summary body for the grouped review
--commit SHA Commit to anchor to (default: PR head SHA)
--dry-run Validate and print payloads without postingstart_line (and optional start_side) in the JSONobject alongside line; the script passes them through.
--dry-run before a real post on an unfamiliar PR — stale line numbers are themost common failure and the dry-run surfaces them as "skipped" without side effects.
gh api calls for this — it handlesdiff validation, repo/commit detection, and body assembly consistently.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-12 | pass→pass | 11,202 | 2,413 | -78% | 1 | 1 | 0% | 1,809 | 1,234 | -32% | 0 | 0 | — |
case-01 | fail→fail | 4,073 | 3,707 | -9% | 1 | 1 | 0% | 471 | 1,318 | +180% | 0 | 0 | — |
case-02 | fail→fail | 7,097 | 5,919 | -17% | 1 | 1 | 0% | 442 | 1,157 | +162% | 0 | 0 | — |
case-03 | fail→fail | 6,841 | 6,667 | -3% | 1 | 1 | 0% | 193 | 1,258 | +552% | 0 | 0 | — |
case-04 | pass→pass | 5,724 | 4,192 | -27% | 1 | 1 | 0% | 990 | 1,620 | +64% | 0 | 0 | — |
case-05 | pass→pass | 7,375 | 6,352 | -14% | 1 | 1 | 0% | 1,157 | 1,960 | +69% | 0 | 0 | — |
case-06 | pass→pass | 8,646 | 6,199 | -28% | 1 | 1 | 0% | 1,583 | 2,021 | +28% | 0 | 0 | — |
case-07 | fail→pass | 35,404 | 2,951 | -92% | 1 | 1 | 0% | 5,998 | 1,407 | -77% | 0 | 0 | — |
case-08 | fail→pass | 4,130 | 3,078 | -25% | 1 | 1 | 0% | 720 | 1,422 | +98% | 0 | 0 | — |
case-09 | fail→pass | 4,299 | 2,865 | -33% | 1 | 1 | 0% | 652 | 1,355 | +108% | 0 | 0 | — |
case-10 | fail→pass | 5,812 | 2,844 | -51% | 1 | 1 | 0% | 1,046 | 1,247 | +19% | 0 | 0 | — |
case-11 | pass→pass | 10,526 | 1,904 | -82% | 1 | 1 | 0% | 1,654 | 1,202 | -27% | 0 | 0 | — |
case-13 | pass→pass | 7,384 | 2,143 | -71% | 1 | 1 | 0% | 1,183 | 1,216 | +3% | 0 | 0 | — |
case-14 | pass→pass | 10,323 | 3,778 | -63% | 1 | 1 | 0% | 1,817 | 1,512 | -17% | 0 | 0 | — |
case-15 | pass→pass | 5,285 | 2,773 | -48% | 1 | 1 | 0% | 920 | 1,285 | +40% | 0 | 0 | — |
case-16 | pass→pass | 10,110 | 5,558 | -45% | 1 | 1 | 0% | 1,554 | 1,683 | +8% | 0 | 0 | — |
case-17 | fail→pass | 11,343 | 2,452 | -78% | 1 | 1 | 0% | 1,749 | 1,281 | -27% | 0 | 0 | — |
case-18 | pass→pass | 8,388 | 3,948 | -53% | 1 | 1 | 0% | 1,311 | 1,202 | -8% | 0 | 0 | — |
case-19 | pass→pass | 12,215 | 4,996 | -59% | 1 | 1 | 0% | 2,007 | 1,870 | -7% | 0 | 0 | — |
case-20 | pass→pass | 7,877 | 1,881 | -76% | 1 | 1 | 0% | 1,092 | 1,180 | +8% | 0 | 0 | — |
case-21 | pass→pass | 4,539 | 1,833 | -60% | 1 | 1 | 0% | 683 | 1,161 | +70% | 0 | 0 | — |
case-22 | pass→pass | 8,164 | 3,037 | -63% | 1 | 1 | 0% | 1,301 | 1,378 | +6% | 0 | 0 | — |
case-23 | pass→pass | 12,630 | 10,421 | -17% | 1 | 1 | 0% | 2,050 | 2,596 | +27% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 23 cases were attempted, and 21 counted toward the lift figure. The other 2 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +22 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.