Workflow, guardrails, and output format for reviewing NIC pull requests. Use when reviewing a PR locally (Copilot Chat, Claude, or other agent), when running the pr-review prompt, or when acting as the GitHub Copilot Code Review bot. Delegates codebase-specific detail to the domain skills (nic-structure, nic-add-feature, nic-add-policy, nic-docker-images, nic-ci-pipelines, nic-testing) rather than duplicating them.
72
90%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Low
Low-risk findings worth noting
This skill defines how to review a NIC PR: the workflow, guardrails, dimension coverage, and output format. It intentionally does not restate the codebase-specific rules that already live in the domain skills -- load the referenced skill for depth on any topic. If you find yourself wanting to add a paragraph of file paths or function names here, add it to the relevant domain skill instead.
.github/prompts/pr-review.prompt.md invocation.github/copilot-instructions.md, which references this skill)Before writing a Blocking or Non-blocking comment, you must confirm the claim against actual code or config. Speculation is not review. If you cannot verify, downgrade to a Question or skip.
| If the comment claims... | You must first... |
|---|---|
| "X is not tracked / covered / handled by tool Y" | Read Y's config (renovate.json, .golangci.yml, Makefile, workflow file). Default managers cover more than you think. |
| "This library / action does Z on failure / edge case" | Read the library docs or source, or find an existing call site in the repo that proves the behaviour. |
| "This shell / expression / YAML will evaluate as W" | Trace it end-to-end. GitHub Actions expression semantics, bash quoting, and YAML type coercion all have non-obvious rules. |
| "This is a security issue because untrusted input reaches sink S" | Identify the actual trust boundary. Inputs from repo-controlled workflows, composite action callers inside the same repo, and matrix values are not "untrusted" in the OWASP sense. |
| "The generated file / snapshot is wrong" | Re-run the generator (make update-codegen, make update-crds, make test-update-snaps) and diff. Comment on the source, not the artifact. |
| "This will break at runtime" | Grep for at least one caller. Read the surrounding function. A missing nil check may already be guarded upstream. |
If verification is impractical (e.g. requires running the CI), phrase the finding as a Question, not a Blocking or Non-blocking bullet.
Move a finding down the severity ladder when any of these apply:
git diff origin/main...HEAD or gh pr diff <n>. In agent context, use the get_changed_files tool.make lint/make test if in doubt.Use this table to pick which domain skills to load; the referenced skill owns the up-to-date rules for that area.
| Change touches | Focus for the review | Cross-reference skill |
|---|---|---|
CRD types (pkg/apis/**/types.go) | CRD field, codegen, validation | nic-add-feature, nic-add-policy |
Validation (pkg/apis/**/validation/**) | Validation, security (input sanitisation) | nic-add-feature |
Controller (internal/k8s/**) | Sync flow, concurrency, secret handling | nic-structure |
Config generation (internal/configs/** non-template) | Config assembly, layer boundary | nic-structure |
Ingress templates (internal/configs/version1/*.tmpl) | Template parity (OSS vs Plus), snapshots | nic-add-feature |
VS/TS templates (internal/configs/version2/*.tmpl) | Template parity, snapshots, v1-parity check | nic-add-feature |
NGINX process (internal/nginx/**) | Reload safety, process lifecycle | nic-structure |
Helm chart (charts/nginx-ingress/**) | Values <-> schema, workload template consistency | nic-add-feature |
Docker (build/Dockerfile, build/scripts/**) | Layers, credential handling, base images | nic-docker-images |
CI (.github/workflows/**) | Pinned SHAs, matrix JSON, secret sourcing | nic-ci-pipelines |
Integration tests (tests/suite/**) | Fixtures, markers, wait patterns | nic-testing |
Docs / skills / prompts (docs/**, *.md, .github/skills/**, .github/prompts/**) | Markdown lint, link resolution, no drift | -- |
Walk these in order. Each dimension names the concerns to keep in mind; load the referenced skill for the codebase-specific rules -- do not rely on this file to enumerate them.
//nolint:gosec / //gosec:disable must carry a same-line justification.*bool, *int, *Struct) before dereference.%w and include enough context to identify the resource.context.Context; shared state has a mutex or is documented single-writer.must* calls, and unchecked type assertions require a justification, prefer error returns._ = ...) require a one-line reason.nic-structure. Cross-layer leaks are blocking.nic-add-feature and nic-add-policy rather than inventing your own.zz_generated.*, generated CRD YAML) are blocking, require the source change plus the appropriate make target.make test-update-snaps.nic-testing for the patterns (table-driven, snapshot, helmunit, pytest markers).nic-docker-images. Highest-severity findings are credential leaks (--secret mount vs COPY) and unpinned bases.nic-add-feature. Highest-severity finding is values.yaml changed without a matching values.schema.json update.nic-ci-pipelines. Highest-severity findings are unpinned Actions and repository-secret usage instead of the OIDC / Key Vault flow..github/data/version.txt or the Renovate-managed pin.| --- | --- | (MD060).name: and description:, and the description must state when to invoke the skill.make format handles it.golangci-lint.zz_generated.deepcopy.go, pkg/client/**, config/crd/bases/**, chart CRDs, snapshot files). If they look wrong, comment on the source that generated them.These are failure modes reviewers repeatedly hit. Skip the comment when you notice one.
Structure the review as follows. Omit any empty section.
### Summary
One or two sentences: what the PR does and the overall verdict (approve / request changes / comment).
### Blocking
- [file/path.go:LN](file/path.go#LN) -- Reason. Suggested fix in one line.
### Non-blocking
- [file/path.go:LN](file/path.go#LN) -- Suggestion, one line.
### Questions
- [file/path.go:LN](file/path.go#LN) -- Question that needs an answer before merge.Rules:
The bot reads .github/copilot-instructions.md on every PR. The Skills and Code Review Checklist sections there reference this file, so keep this skill authoritative and keep copilot-instructions.md short.
0eb3072
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.