code-review-jira — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited code-review-jira (Agent Skill) and scored it 91/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 1 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 1 flagged
The text {match} is the classic direct prompt-injection phrasing. Placed in a skill body that the agent reads as trusted instructions, it tries to make the agent abandon its prior rules and follow whatever comes next — a full system-prompt override.
ignore/disregard/forget … previous instructions sentence.Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Perform code review for JIRA issues by analyzing related pull requests and publishing results to:
CLAUDE.md and the sibling instruction files that section lists after the branch checkout, and review against the rules they carry, not only the packaged ones.@skills/pr-summary/SKILL.md and the mirrored linked-GitHub-issue summary follow the language of the source JIRA assignment. Never mix languages inside the same comment; never use bilingual Kritické (Critical) style parentheses.git add, git commit, git push, git reset, git checkout -- …, etc.). Checking out the relevant branch and git pull to read the latest code are required (the mandatory Branch checkout gate below); mutating the working tree or pushing to the remote is not. Publishing is limited to PR / linked-issue comments via gh and to JIRA ticket comments via acli.**, #, ` `, - `).skills/code-review-jira/scripts/load-issue.sh <KEY|URL> — the single deterministic entry point. Never call acli directly. Read issue header, description, comments, attachments, subtasks, issue links, custom fields, devSummary, and pullRequests off the resulting JSON document.ECOMAIL-1234), a /browse/<KEY> URL, or any URL containing ?selectedIssue=<KEY>.skills/code-review-jira/scripts/gather-issue-context.sh <KEY|URL> instead of hand-assembling the JSON. To read only the comments as a structured array, use skills/code-review-jira/scripts/parse-comments.sh <KEY|URL>. Both build on load-issue.sh, so the same exit codes and MCP fallback apply. Attachment content and the inventoried URLs are not fetched by the scripts (acli cannot download them) — read them with your own tools when a finding depends on them.expand=changelog), available next transitions, and friendly custom-field names (expand=names).pullRequests arraygit fetch origin, git checkout <branch>, git pull — so the review always runs against the actual current codebase on disk (the checked-out working tree), never against the remote diff in isolation. Confirm local HEAD equals the PR head SHA. If the checkout fails (missing ref, detached HEAD, or local changes that would be overwritten), stop and report it instead of reviewing from the diff. Every sub-review then reads the checked-out files. Immediately after the checkout, load the project-local agent instructions per the Constraints above — reading them from the checked-out commit is what makes them reflect the code under review.#### Issue Context Analysis Before reviewing code, load and analyze the full JIRA issue:
#### Reviewer Comment Fulfillment Gate (mandatory)
Run the Reviewer Comment Fulfillment Gate defined canonically in @skills/code-review-github/SKILL.md against the GitHub PR linked to this JIRA issue — that is where this skill publishes technical CR findings and where reviewer comments and line-anchored review threads live. After loading all PR comments, verify each actionable reviewer instruction is satisfied by the current checked-out diff (the applied change corresponds to what the reviewer asked for), raise one Critical finding per not-fulfilled instruction on the GitHub PR comment with the four reproducer fields, and record the reviewer comments: M/N fulfilled verdict on the GitHub PR comment summary line. The JIRA non-technical comment never carries this gate's findings.
skills/code-review-github/scripts/load-issue.sh <PR-URL> (if not already loaded) and read statusCheckRollup[]. Identify which checks ran on the PR head commit (headRefOid) and their result. Pass this CI check map to the Coverage gate decision in @skills/code-review/SKILL.md (Validation → Coverage gate; the Reuse-CI-results detail now lives in @rules/code-review/general.mdc Validation & Coverage Gate) so only missing or non-green checks are run locally.Inline dispatch. Each sub-review below runs inline in this wrapper's context — invoke each skill directly (@skills/<name>/SKILL.mdwith anyMODE=crflag), passing the PR URL / number and the branch already checked out, and declare the publishing contract for this CR run (quiet vs publish; see step 4). Each invoked skill must return its findings as the canonical markdown block (## Assignment Complianceblock, Critical / Moderate / Minor lists with reproducer fields, refactoring proposals). The CR wrapper then assembles the outputs into the final GitHub PR comment + JIRA / linked-issue summary. Run the sub-reviews one at a time — do not dispatch them as parallel subagents.
>
The mysql-problem-solver / refactor-entry-point-to-action conditionals follow the same rule: when their trigger fires, invoke them inline after the always-run set, still one at a time.
@rules/code-review/general.mdc Two-part CR output): non-technical, full acceptance-criteria checklist against the assignment. The skill does not publish anywhere itself — it returns either the assembled ## Assignment Compliance markdown block, rendered on every run that has a linked tracker (including the affirmative Goal met: Yes checklist on a clean run; the wrapper converts it to JIRA Wiki Markup before passing it to pr-summary for the JIRA target, and keeps GitHub Markdown for the linked-GitHub-issue mirror), or the status no linked issue — assignment compliance skipped (when no linked tracker exists). The CR wrapper passes the returned block as an embedded block to @skills/pr-summary/SKILL.md only when a block is returned so each tracker (JIRA ticket, linked GitHub issue) receives one consolidated comment per CR run (per issue #498); on the skip status the wrapper embeds nothing. Do not embed the block into the GitHub PR comment — the PR comment carries the Technical review only.@skills/code-review/SKILL.md Specialized Reviews → Always run; it is distinct from the per-Critical-finding verification (issue #537) and must not duplicate gaps already raised by assignment-compliance-check.@rules/code-review/general.mdc Refactoring & Tech Debt (DRY) Analysis — diff-scoped detail. The JIRA non-technical comment never carries these technical sections. Canonical definition of the lens invocation lives in @skills/code-review/SKILL.md Specialized Reviews → Always run. MODE=cr guarantees no code changes, commits, fixers, or review chaining.@skills/refactor-entry-point-to-action/SKILL.md with `MODE=cr` to surface the entry-point → Action proposals. Both refactoring skills run read-only — no code changes, no commits, no fixers, no review chaining — `MODE=cr` enforces this. Fold their output into the Refactoring (DRY / Tech Debt Reduction) section (in-scope) and Refactoring Proposals section (out-of-scope) of the GitHub PR comment. The JIRA non-technical comment never carries these technical sections.@skills/code-review/SKILL.md Specialized Reviews (raw SQL, Eloquent / query-builder calls, eager loads, model scopes, ModelManager / Repository methods, migrations, seeders, DynamoDB / NoSQL access). Capture its findings and surface them on the GitHub PR comment under the dedicated ## Database Analysis section (see Output Rules) — never silently fold them into the Critical / Moderate / Minor buckets. The JIRA non-technical comment does not carry this section (it stays plain-language via pr-summary).@skills/code-review/SKILL.md is executed for the diff, including its mandatory documentation verification (locate the docs or request the link — never assess from memory)#### Refactoring & Tech Debt (DRY) Analysis (PR diff only)
@skills/class-refactoring/SKILL.md (run with MODE=cr — read-only), walking that skill's complete guideline set. The walked guidelines, the per-item routing, and the de-duplication + no-drop contract are owned by @rules/code-review/general.mdc Refactoring & Tech Debt (DRY) Analysis — diff-scoped detail — apply it as written; do not narrow the walk to a subset and do not restate the guideline list here. The duplicated-logic half of the walk runs through the reuse-first gate in @rules/code-review/general.mdc Reuse Existing Logic — first decide whether the new logic is necessary at all, then whether an existing implementation must be reused instead of a parallel one.Quiet mode (loop iterations from `@skills/process-code-review/SKILL.md`): when the caller explicitly requests "do not publish; return findings as in-memory markdown for this loop iteration only", skip all publishing below — no GitHub PR comment, no JIRA comment, no linked-GitHub-issue mirror. Return the assembled review markdown to the caller and stop. Only the final (publishing) call from process-code-review after convergence runs Publish Results in full.>
Iteration input. The same caller passes the current Review loop iteration asiteration = <n>; a run without it isiteration = 1. Fromiteration > 2the assembled report — whether returned in quiet mode or published here — carries Critical and Moderate findings only, per@rules/code-review/general.mdcLate-Iteration Report Scope — Critical & Moderate Only (CR iteration > 2).
#### GitHub (technical findings only — always-new comment per CR run)
<!-- cr-comment:actor=<gh-login> --> is still appended to the body for traceability (auto-appended by the helper) but no longer drives an upsert lookup. History across runs lives in the comment sequence itself; never re-create a Previous CR Status section in the body.skills/code-review-github/scripts/upsert-comment.sh <PR-NUMBER|URL> - (body on stdin). The helper detects the current actor (gh api user --jq .login), appends the marker, and POSTs a new comment. The published URL is emitted on stdout; the action (created) on stderr — log it in the PR comment summary line.addIssueComment — also as a fresh post. Never call updateIssueComment to edit a prior CR comment and never quote / reply to one; the always-new-comment convention replaces the previous in-place edit flow.file:line reference in the body of each finding instead.#### JIRA (consolidated non-technical comment — fresh comment per CR run)
@skills/pr-summary/SKILL.md. This CR skill must not author its own JIRA summary. The JIRA non-technical comment carries only `TL;DR` and `How to test` — the TL;DR being one or two plain-language sentences on what changed and why — plus, when they exist, two conditional blocks: a Clarifying questions block and an Assignment Compliance block (assignment discrepancies + Critical items). No Authors line, no Summary of changes section, no severity counts, no file paths — pr-summary renders this reduced JIRA shape from @skills/pr-summary/templates/pr-summary-jira.md.@rules/code-review/general.mdc Clarifying Questions — Answered-Question Suppression & Severity Gate (issue #758) defines it: run the mandatory answer walk over all tracker comments (skills/code-review-jira/scripts/parse-comments.sh <KEY|URL>, plus skills/code-review-github/scripts/parse-comments.sh on the PR and every closingIssues[] entry) before asking anything, drop every question the thread already answered and the diff implements, re-route an answered-but-unimplemented requirement to a Critical finding on the GitHub PR comment instead, and render only Critical and Moderate questions — Minor ones are dropped silently. When at least one question survives, render it as a h2. Clarifying questions block in JIRA Wiki Markup (one * bullet per question, each a single plain-language sentence, no severity label and no count) and pass it as an embedded block to pr-summary so it renders after How to test. When none survives, pass nothing — never emit an empty "no questions" block. Do not invent questions to fill the section; ask only what genuinely blocks acceptance.pr-summary exactly once for the JIRA ticket, passing the conditional blocks together (clarifying questions first, then assignment compliance) so the reader gets one comment per CR run. @skills/assignment-compliance-check/SKILL.md returns the Functional review block — the full acceptance-criteria checklist with a Goal met: Yes/No verdict — on every run that has a linked tracker, including the affirmative report when every criterion is Met; convert that block to JIRA Wiki Markup per @rules/jira/general.mdc (## → h2. , **bold** → *bold*, ` code → {{code}}, - → `, Markdown link `[label]` + `(url)` → `[label|url]`) and pass it as an embedded block — `pr-summary` appends it verbatim after `How to test`. Only when `assignment-compliance-check` returns the `no linked issue — assignment compliance skipped` status does the wrapper skip passing that block. `pr-summary` then POSTs a new comment via `skills/code-review-jira/scripts/upsert-comment.sh` (JIRA MCP server fallback on exit code 2/3). Every CR run creates a fresh JIRA comment* — the always-new comment convention means the chronological sequence of JIRA comments is the audit trail across runs, consistent with GitHub. Never post a separate JIRA comment for clarifying questions or assignment compliance on top of it.pr-summary, pass through any test-parameter gating detected in the diff (feature flag, ENV switch, query-string parameter, request header, admin toggle, allow-list) so the first `How to test` step enables the toggle before the tester proceeds. The JIRA comment does not carry a separate Available behind line — the gating lives inside the test steps.@skills/pr-summary/SKILL.md with the JIRA tracker target so it renders @skills/pr-summary/templates/pr-summary-jira.md in JIRA Wiki Markup and upserts the comment on the originating JIRA ticket through the helper above (no direct acli jira workitem comment add calls that bypass the marker).** / __, no #/## ATX headings, no ` `/`` ` ``, no - bullets, no Markdown [label] + (url) links. Any such artifact must be converted per @rules/jira/general.mdc` so the JIRA UI never shows raw markup characters.pr-summary already enforces this by design, and the embedded blocks obey the same rule. Technical content stays exclusively on the GitHub PR comment.#### Linked GitHub issues (consolidated mirror — always-new comment per CR run)
closingIssues[] of the GitHub PR JSON is non-empty), delegate the linked-GitHub-issue comment to @skills/pr-summary/SKILL.md (GitHub tracker target). The skill renders @skills/pr-summary/templates/pr-summary-github.md in GitHub Markdown and posts it via skills/code-review-github/scripts/upsert-comment.sh on each entry in closingIssues[] (one fresh comment per linked issue per CR run — marker <!-- cr-comment:actor=<gh-login> --> appended for traceability, no in-place edit). Pass the same author + test-parameter-gating context as the JIRA invocation above — the mirrored comment must carry the same Authors and Available behind lines.@skills/assignment-compliance-check/SKILL.md returns the Functional review block on every run that has a linked tracker (including the affirmative report on a clean run); pass its GitHub-Markdown version as an embedded block so the linked-GitHub-issue audience also sees one consolidated comment per CR run instead of two separate posts. Only when the compliance check returns the no linked issue — assignment compliance skipped status does the wrapper skip passing an embedded block. Follow-up runs add a new comment rather than editing the previous one — the chronological sequence is the audit trail.pr-summary, so they are guaranteed to match.closingIssues[] is empty, skip this block and note "no linked GitHub issue — mirror skipped" in the PR comment summary line.Summary line are always rendered in the GitHub PR comment. The Coverage: header line, the ## Coverage section, and the coverage … slot in the summary line are all conditional — render them only when the coverage gate produced something to report (uncovered changed lines or unavailable / non-runnable tooling, both Critical findings). When every changed line is at 100% coverage and the tool ran successfully, drop all three coverage surfaces; the Counts line is the clean signal. Every other section — Findings (including each severity sub-heading), Refactoring (DRY / tech debt), Refactoring proposals, and Database Analysis — appears only when it has at least one item. Never emit None. / Not applicable. / n/a / 100% placeholders for empty sections or omitted coverage surfaces; drop the whole heading and body instead. History across CR runs is preserved by the chronological sequence of always-new GitHub PR comments — never re-create a Previous CR Status section in the body.laravel/framework is in composer.json require), the architecture walk-through defined in @skills/code-review/SKILL.md Core Analysis runs on every CR run, but the ## Architecture heading is rendered on the GitHub PR comment only when the walk produces at least one finding. When findings exist, render the heading and list them. When the walk is clean, omit the heading entirely — never render a walked, 0 findings status line, a clean placeholder, or any other confirmation that the check ran. On non-Laravel projects, omit the ## Architecture section entirely. The JIRA non-technical comment (produced by pr-summary) never includes this section.iteration = <n> and n > 2, the posted GitHub PR comment carries Critical and Moderate findings only — drop every Minor finding (in Findings, Architecture, Database Analysis, and every specialized-review sub-section), the whole Refactoring (DRY / tech debt) section, and the whole Refactoring proposals section, and render the header line **Report scope:** critical+moderate only (iteration {n}) — Minor findings and refactoring sections not rendered while the Counts and summary lines keep their real, unchanged numbers. No walk or sub-review is skipped and the Critical + Moderate merge gate is unchanged. Canonical: @rules/code-review/general.mdc Late-Iteration Report Scope — Critical & Moderate Only (CR iteration > 2).@rules/php/core-standards.mdc and, for Laravel projects, @rules/laravel/architecture.mdc. Use n/a — <reason> only when a snippet adds no value over the one-line Fix description (e.g. naming-only changes, dead-code removal, pointers to an existing helper whose name already says enough).@skills/process-code-review/SKILL.md can convert each finding into a reproducer test and apply the fix directly from the PR comment.@skills/code-review/SKILL.md Specialized Reviews), the posted GitHub PR comment must include a dedicated ## Database Analysis section before ## Coverage. The section reports only the mysql-problem-solver findings (with severity mirroring Critical / Moderate / Minor), each carrying a Suggested Fix that renders the concrete optimization artifact — the rewritten query in full, the exact index DDL, or the rewritten batching code in a fenced code block — or, when the slowdown is the justified branch, the three-part documentation block that is the artifact there. Naming the fix category in prose does not satisfy the requirement on its own, per @rules/code-review/general.mdc Database Analysis section and @rules/sql/optimalize.mdc. Each DB-performance defect appears here exactly once and is never duplicated into the Critical / Moderate / Minor buckets; a security finding on the same file:line is a different defect and always keeps its own entry in the severity buckets. Do not include the queries / migrations inspected list or any EXPLAIN / static-analysis summary — those stay inside the internal investigation. When no DB operations are present, omit the section entirely. The same section also carries the deployment-safety findings from @rules/code-review/general.mdc Database Change Deployment Safety — destructive change shipped with the code that reads the old surface, blocking ALGORITHM=COPY DDL, missing / no-op down(), non-replayable migration, backfill inside a migration, an un-pre-flighted new constraint, a missing index for a newly queried column, and an unstated deploy order — each with the same mandatory artifact (the corrected migration, the online-DDL command, the pre-flight counting query, the index DDL, or the deploy-order block). The JIRA non-technical comment (produced by pr-summary) never includes this section.## Coverage section before the summary line only when the coverage gate has something to report — uncovered changed lines (Critical findings) or unavailable / non-runnable coverage tooling (Critical finding). When every changed line is at 100% coverage and the tool ran successfully, omit the ## Coverage section, the Coverage: header line, and the coverage … slot from the summary line per @skills/code-review/SKILL.md Output Rules. The coverage gate itself (per the Coverage gate in @skills/code-review/SKILL.md) still runs on every review; only the user-visible section is short-circuited.templates/github-output.mdpr-summary with the JIRA tracker target; do not author or embed a custom template here.@rules/code-review/general.mdc Clarifying Questions — Answered-Question Suppression & Severity Gate: questions the tracker thread already answered and the diff implements are dropped, and only Critical / Moderate ones are rendered, unlabelled) and Assignment Compliance (assignment discrepancies + Critical items). It carries no Authors line, no Summary of changes section, no severity counts, no file paths, no line numbers, no code snippets — pr-summary enforces this reduced shape by design. Plain language understandable by non-developers.h2. / h3. headings, *bold*, _italic_, {{inline}}, {code:php} ... {code}, * / # bullets, [label|url], {quote}) is handled by @skills/pr-summary/templates/pr-summary-jira.md per @rules/jira/general.mdc. Do not "translate" the output back to GitHub Markdown when posting via acli / JIRA MCP server, and never let a raw Markdown control character (**, #, ` `, - `) reach the published comment — the JIRA UI would show it literally.@skills/test-like-human/SKILL.md. The user-perspective testing skill runs on demand only (via /test-like-human or an explicit follow-up); CR-track skills must never chain into it.~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.