process-code-review — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited process-code-review (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
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.
Constraint:
@skills/pr-summary/SKILL.md on the linked issue / JIRA ticket follows the language of the source assignment. Never mix languages inside the same comment; never use bilingual Kritické (Critical) style parentheses.@rules/laravel/laravel.mdc, @rules/laravel/architecture.mdc, @rules/laravel/filament.mdc, and @rules/laravel/livewire.mdc@rules/git/general.mdc Pull Policy, in order: resolve the default branch (DEFAULT_BRANCH="$(git symbolic-ref --short refs/remotes/origin/HEAD | sed 's@^origin/@@')" — never hardcode origin/main), git fetch origin, git pull --rebase to take the PR branch's own remote first, then git rebase "origin/$DEFAULT_BRANCH" to bring the default branch in, resolve any conflicts, and git push --force-with-lease. Do not git pull again after the rebase — it would undo the sync. If the rebase changed composer.lock, run composer install immediately so dependencies match the new lockfile. If the rebase surfaces conflicts that cannot be resolved cleanly, stop and report it (the existing merge-conflict constraint).skills/code-review-github/scripts/load-issue.sh <NUMBER|URL> — the single deterministic entry point. Never call gh issue view, gh pr view, or gh api /repos/.../issues/... directly. Read review comments, files, commits, status checks, and closingIssues off the resulting JSON document. If the script is unavailable (missing tool, exit code 2/3) fall back to the GitHub MCP server, and always prefer the MCP fallback for review-thread / line-anchored comments that the script does not return.load-issue.sh returns general comments[] and reviews[] but never the line-anchored review threads nor their resolved/unresolved state. Fetch them deterministically with the GraphQL reviewThreads connection — this is not one of the forbidden REST endpoints (gh issue view, gh pr view, gh api /repos/.../issues/...): gh api graphql -f query='
query($owner:String!,$repo:String!,$number:Int!,$cursor:String){
repository(owner:$owner,name:$repo){
pullRequest(number:$number){
reviewThreads(first:100, after:$cursor){
pageInfo{ hasNextPage endCursor }
nodes{
id isResolved path line
comments(first:100){ nodes{ author{login} body url createdAt } }
}
}
}
}
}' -F owner=<owner> -F repo=<repo> -F number=<number>Do not accept a truncated list — the "every unresolved thread" guarantee depends on completeness. When reviewThreads.pageInfo.hasNextPage is true, repeat the query with -F cursor=<endCursor> until it is false; when any thread's comments.nodes reaches the page size, page that thread's comments the same way. If gh api graphql is unavailable, fall back to the GitHub MCP server for the same thread list plus its resolved state.
comments[]).reviewThreads query — add every thread where isResolved == false (human reviewer and bot) as a checklist item, and skip every thread where `isResolved == true`. Record each thread's id so it can be marked resolved once its fix lands (see Resolve addressed reviewer threads below).#### Reproducer extraction (per finding)
For every Critical and Moderate finding, extract the reproducer fields published by the CR skills (@skills/code-review/SKILL.md, @skills/code-review-github/SKILL.md, @skills/code-review-jira/SKILL.md, @skills/security-review/SKILL.md):
n/a — <reason> when the Fix narrative is sufficient)Read the reproducer fields off comments[] and body / descriptionText returned by the deterministic loader for the originating tracker instead of re-fetching the issue:
skills/code-review-github/scripts/load-issue.sh <NUMBER|URL>. Never call gh issue view, gh pr view, or gh api /repos/.../issues/... directly.skills/code-review-jira/scripts/load-issue.sh <KEY|URL>. Never call acli directly.Use these to write a failing test before applying the fix:
n/a); rerun the test until it passes.If a CR-skill finding lacks Faulty Example, Expected Behavior, or Test Hint, request a CR rerun rather than guessing — the CR skills are responsible for providing them. Suggested Fix may legitimately be n/a per the CR rules.
Free-form reviewer threads are exempt from the reproducer requirement. Unresolved threads written by human reviewers will not carry the four structured fields. Do not request a CR rerun for them and do not block. Instead, derive the intent from the comment text, apply the minimal best-effort fix that satisfies it, and add or adjust a test at your discretion (a regression test when the comment describes a behavior bug; none when it is a naming / readability / dead-code remark). Keep the change scoped strictly to what the reviewer asked for. The exemption removes only the mandatory reproducer workflow — a behavior-changing best-effort fix still has to satisfy the diff-scoped coverage gate enforced by the Review loop below (@rules/php/core-standards.mdc Testing).
While reading the affected files in preparation for the CR fixes, you may encounter problems that are unrelated to the reviewer feedback but were already present in those files. The following categories qualify:
@rules/php/core-standards.mdc, @rules/git/general.mdc, @rules/laravel/*, …) or any other rule under .claude/rules/.@rules/security/backend.md, @rules/security/frontend.md, or @rules/security/mobile.md would flag (injection, missing authn/authz, unsafe deserialization, sensitive-data exposure, …).Rules:
@rules/git/general.mdc: fix(<scope>): pre-existing — <description> for bugs and security, refactor(<scope>): pre-existing — <description> for rule violations without behavior change.pre-existing — prefix is mandatory so reviewers can identify these commits at a glance.fix(<scope>): pre-existing — … (bug, security) — add the regression test in the same commit as the fix; the test must fail before the fix lands and pass after.refactor(<scope>): pre-existing — … (project-rule violation, behavior-preserving) — apply @rules/refactoring/general.mdc Test Coverage Contract: when the target lines are below 100% coverage, author a dedicated test(<scope>): cover <area> before pre-existing refactor commit before the refactor commit, and do not modify pre-existing tests inside the refactor commit (mechanical renames forced by the refactor itself stay exempt and must be flagged in the commit body).cr-status PR comment posted during PR update, list every pre-existing fix under a ## Pre-existing fixes heading with a one-line rationale, so reviewers can review them independently of the CR thread.cr-status comment as a deferred follow-up with the reason — the reviewer can then file a follow-up issue.@skills/code-review/SKILL.md). Do not gate on the full-suite coverage percentage during a CR / review loop iteration.php artisan migrateThis is a blocking loop. Do not advance to Finalization, PR update, or Completion until the loop converges. The final report (technical and non-technical) is published only once, after convergence.
iteration = 1 and maxIterations = 5 (safety net to avoid runaway loops).@skills/code-review-github/SKILL.md@skills/code-review-jira/SKILL.mdThe invocation must include the explicit quiet-mode instruction (see Quiet review runs below). The review run must not publish to the PR or to the issue tracker during loop iterations — capture findings in memory only. Each iteration's CR wrapper runs its Reviewer Comment Fulfillment Gate (canonically defined in @skills/code-review-github/SKILL.md), so the review reloads every reviewer comment / thread and re-verifies that the fixes applied in the previous iteration actually satisfy each reviewer instruction.
criticalCount and moderateCount in the latest review, and read the reviewer comments: M/N fulfilled verdict the wrapper records. Let unfulfilledCount = N − M (the reviewer instructions still not satisfied and not rejected-with-reason). Each not-fulfilled instruction is already raised by the gate as a Critical finding, so it is included in criticalCount — unfulfilledCount is tracked separately only to make the convergence condition and the loop report explicit.criticalCount + moderateCount == 0 and unfulfilledCount == 0 → converged, exit the loop. The run may not converge while any reviewer comment is still not fulfilled (the change does not yet correspond to what the reviewer asked for) — fulfilling every loaded reviewer instruction is a first-class convergence condition alongside the zero-Critical / zero-Moderate gate.iteration, and go back to step 2.iteration > maxIterations and the loop still has not converged, stop and surface the remaining findings to the user — do not push or publish a partial report. The user must triage the residual findings manually before any final report goes out.#### Quiet review runs (during the loop)
code-review-github and code-review-jira honour the suppression: no PR comment, no JIRA comment, no linked-issue summary is posted while the loop is still iterating.criticalCount + moderateCount == 0) is the only iteration whose output is published — that publication is performed by the PR update + Completion steps below, not by the review skill itself.build.xml/phing.xml; fall back to Composer scripts in composer.json)Precondition: the Review loop above must have exited with criticalCount + moderateCount == 0. If the loop hit maxIterations without converging, do not proceed — return the remaining findings to the user for manual triage instead.
@skills/test-like-human/SKILL.md. The user-perspective testing skill runs on demand only — leave it for the user to trigger via /test-like-human after the PR is updated.gh pr create --draft) per Draft pull requests; the Promote the PR out of Draft step below marks it ready once this converged run is published@rules/git/general.mdc)@rules/reports/general.mdc)Precondition: same as Finalization — convergence required.
cr-status marker namespace. On GitHub, the marker makes the status comment identifiable as a status post (separate from the cr-comment namespace); on JIRA the helper ignores the marker argument, so cr-status and cr-comment posts are distinguished by content only (resolved-items body vs. ## Pre-existing fixes section vs. CR findings). Concretely:skills/code-review-github/scripts/upsert-comment.sh <PR-NUMBER|URL> - cr-status (body on stdin). The helper appends <!-- cr-status:actor=<gh-login> --> to the body for traceability and POSTs a new comment on every run — it never PATCHes a prior status comment. Action (created) is logged on stderr; include it in the in-conversation completion report.skills/code-review-jira/scripts/upsert-comment.sh <KEY|URL> - cr-status. The helper POSTs a new comment on every run — it never edits a prior status comment in place. Fall back to the JIRA MCP server's addCommentToJiraIssue on exit code 2/3.cr-comment namespace) stays untouched by this skill.## Pre-existing fixes section in the cr-status body listing each commit subject (fix/refactor(<scope>): pre-existing — …) with a one-line rationale derived from the commit body, so reviewers can review the pre-existing fixes independently of the CR thread. Omit the section entirely when no pre-existing fix landed (consistent with the always-omit-empty-section convention).#### Resolve addressed reviewer threads (GitHub)
After the fixes are committed and pushed (Finalization above), mark every reviewer review thread whose finding was actually fixed as resolved, using the thread id captured during intake:
gh api graphql -f query='mutation($threadId:ID!){ resolveReviewThread(input:{threadId:$threadId}){ thread{ isResolved } } }' -F threadId=<thread-id>cr-status report instead of resolving it.gh api graphql is unavailable, fall back to the GitHub MCP server's resolve-review-thread operation.#### Promote the PR out of Draft (GitHub)
Convergence is exactly the moment the PR becomes ready to merge, so this skill owns the Draft → ready transition per @rules/git/general.mdc Draft pull requests:
criticalCount + moderateCount == 0), mark the PR ready for review now: gh pr ready <PR-NUMBER|URL>. This is the same class of GitHub PR state change as resolving a review thread, not a code change.maxIterations without converging, the PR stays a Draft — never promote a PR that still carries Critical / Moderate findings.gh pr ready is idempotent. If gh pr ready is unavailable, fall back to the GitHub MCP server's mark-ready operation.#### Per-item justification (required)
Every resolved review point in the PR comment must include a brief justification using this format:
- [x] {short finding title}
- **Why:** {what was wrong / what the reviewer asked for}
- **Reason:** {root cause or rule that was violated}
- **Solution:** {what was changed and why this is the best fit}Rules:
Precondition: Review loop has converged (criticalCount + moderateCount == 0).
@skills/code-review-github/SKILL.md@skills/code-review-jira/SKILL.md@skills/record-project-memory/SKILL.md with the converged CR context and the PR link. It appends to docs/memory/PROJECT_MEMORY.md only the lessons that clear the promotion bar in @rules/compound-engineering/general.mdc Compound Memory (per project) (a recurring CR finding is the canonical input); a CR that surfaced nothing durable records nothing.M/N fulfilled verdict) — every actionable reviewer instruction satisfied, or rejected/deferred with its recorded reason~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.