This file covers pull-request review behavior and comment style. Detailed code
ownership, style, build, and testing rules live in AGENTS.md files and the
project docs linked from the root guide.
Good reviews are direct, specific, and short. The team's comments are almost always 1–3 lines. Reviewers commonly ask a question rather than making a demand — "can we ...?", "why not ...?" — which signals a soft suggestion versus a hard requirement.
- Match title and description to the code — the description should follow
.github/PULL_REQUEST_TEMPLATE.md, the "Why?" should explain the value for the user, and stale or missing major changes should be flagged with a suggested update - Compactness — the implementation should be as small as possible; avoid redundant state and remove anything unused
- Consistency — changes must match existing code in style, naming, abstraction level, and philosophy
- Optimize the hot path — prioritize performance comments when the changed code runs frequently
- Don't pile on — if the same issue is already raised in an unresolved thread, do not raise it again; support the existing thread instead. If the author replied with a good explanation, move on
Large PRs slow down the entire team. Enforce these hard limits:
- More than 500 added lines — not allowed; ask the author to split
- Bug fix PRs — must contain only the fix and directly related test coverage; no unrelated refactoring
- Feature PRs — must not refactor code unrelated to the feature
- Refactoring — must be in a separate PR, with no functional changes
Derive required test coverage first from the PR's stated goal, then from the behavioral risks introduced by the implementation. Avoid asking for tests that cover incidental implementation details without a plausible regression risk.
- Bug fixes — should usually add or update a focused regression test, because the existing suite did not catch the issue. If a test is not practical, ask the author to explain the coverage gap
- New APIs — should usually include a test that exercises the new API contract, including error handling or compatibility behavior when relevant
- Internal flow changes — should be covered by existing tests/CI or by a new focused test. If relying on existing coverage, identify the relevant test or CI job before asking for more tests
- Build/CI changes — should have enough validation to show the stated CI behavior changed as intended, either through CI results, dry-run output, or a small script/unit test when practical
- Configure/build options — new or changed user-facing configure flags
should usually add CI coverage for the explicit enable/disable path that
changed. In UCX this often belongs in
buildlib/tools/builds.shorcontrib/test_jenkins.sh; for disable options, also verify the disabled module, object, or generated artifact is absent when practical
Apply the AGENTS.md discovery rule from the root guide for changed paths, and
read any style docs relevant to the diff before posting findings.
Check whether changed folders need AGENTS.md updates: add guidance for new
recurring patterns, remove stale local guidance, and do not leave ownership
gaps.
Review by risk, in order:
- API/ABI and wire compatibility.
- Correctness, error handling, cleanup, and resource lifetime.
- Concurrency and hot-path performance.
- Test expectations and build metadata for changed files.
- Documentation and style.
Focused checks:
- For resource lifetime changes, verify ownership and cleanup scope before posting a finding. For keyed or cached resources, trace the key/value scope end to end and check whether cleanup affects only the intended key, all matching keys, or unrelated live users.
- When a change marks, initializes, validates, or reclassifies an object/state, trace the object from acquisition to first use. The fix should be placed at the earliest point where the invariant becomes true, before any consumer can observe the old state.
- When a PR adds or changes
AC_ARG_WITH,AC_ARG_ENABLE,AC_DEFINE, or anAM_CONDITIONAL, trace the option throughconfigure.m4,Makefile.am, and CI/build scripts. Check explicit--with-*/--enable-*failure paths, explicit--without-*/--disable-*paths, default behavior, and whether a relevant build job exercises the new behavior.
When a finding depends on a code rule, cite the rule from the relevant
AGENTS.md, docs/CodeStyle.md, docs/LoggingStyle.md, or
docs/OptimizationStyle.md instead of restating broad style guidance.
| Situation | Phrasing pattern | Example |
|---|---|---|
| Hard requirement | Direct statement | blocker: this will crash on NULL |
| Standard request | pls + imperative |
pls define all vars at the top of the func |
| Soft suggestion | maybe / can we |
maybe we could remove this wrapper? |
| Opinion | IMO |
IMO it can be uint8_t and we limit to 256 channels |
| Nit | minor: prefix |
minor: pls add blank line before |
| Question about intent | Direct question | does it break wire compatibility? / why is it needed? |
| Alternatives | why not / instead |
instead of X, can we use Y? |
| Code suggestion | Inline block | ```suggestion ... ``` |
Severity levels:
| Prefix | Meaning |
|---|---|
blocker: |
Must fix before merge: crash, data corruption, security hole, broken CI |
| (none) | Should fix; warrants discussion if there is a good reason not to |
minor: |
Nice to fix, will not block merge |
Severity formatting: Do not use markdown severity headings, emoji labels,
[P2], [important], or uppercase labels such as MINOR/BLOCKER. If
severity is needed, use only the inline prefixes from the table: blocker: or
minor:.
Blocker bar is high. Config naming debates, default value choices, and documentation gaps are
never blockers — they go in the no-prefix or minor: bucket.
Length: 1–2 sentences per comment. Use a longer comment only when the issue is complicated and non-obvious.
Language: Use simple English — many contributors are non-native speakers.
Comment order: Start with the requested change, then briefly explain why it
is needed when the reason is not obvious. Example:
pls add $(UCX_LT_RELEASE) here as well; otherwise libucs_signal stays outside the suffix scheme.
Comment scope: One comment per distinct issue; do not bundle unrelated points.
Comment placement: Inline comments for file-level issues; general PR comment only for PR-level concerns.
Review body: Avoid generic review-summary comments such as Code Review,
finding counts, severity counts, or N findings posted inline. Leave the
review body empty when inline comments are self-contained. Use a top-level PR
comment only for a real PR-level concern.
Code suggestions: Prefer a GitHub suggestion block
(```suggestion ... ```) when the requested change is obvious and
mechanical. If needed, add one short sentence after the suggestion explaining
why the change is needed. For anything requiring judgment, describe the problem
and let the author propose the fix.