| name | cubrid-pr-review |
| description | Review a CUBRID pull request from a CUBRID Git worktree whose current HEAD exactly matches the supplied PR number or URL, using the host CLI's native review engine and a local report. Uses Claude Code's built-in /code-review workflow or Codex CLI's built-in /review workflow, then applies CUBRID-specific checks. Use when the user requests review of the CUBRID PR currently checked out in the working directory. |
| allowed-tools | Bash(gh *), Bash(git *), Bash(jq *), Bash(codex review *), Bash(test -d /home/vimkim/gh/my-cubrid-docs), Bash(mkdir -p /home/vimkim/gh/my-cubrid-docs/*), Bash(scripts/*), Read, Write, Glob, Grep, Skill, mcp__plugin_oh-my-claudecode_t__lsp_diagnostics, mcp__plugin_oh-my-claudecode_t__lsp_diagnostics_directory, mcp__plugin_oh-my-claudecode_t__lsp_hover, mcp__plugin_oh-my-claudecode_t__lsp_goto_definition, mcp__plugin_oh-my-claudecode_t__lsp_find_references, mcp__plugin_oh-my-claudecode_t__lsp_document_symbols |
CUBRID PR Reviewer
Review CUBRID database engine pull requests and produce a concise Korean review report. CUBRID is a multi-threaded, open-source RDBMS with a large C/C++ codebase, so reviews focus on correctness, memory safety, and concurrency.
When to Use
- User supplies a CUBRID PR number or URL for the PR currently checked out in the working directory
- User says "review this PR", "PR ๋ฆฌ๋ทฐ", "์ฝ๋ ๋ฆฌ๋ทฐ ๋ถํ", "๋ฆฌ๋ทฐํด์ค"
- User requests LSP/clangd analysis of PR changes
- Even if the user just pastes a CUBRID PR link without explicit instructions, this skill applies only when the current worktree is at that PR's exact head commit.
Arguments
/cubrid-pr-review <pr-number> โ Review that PR when the current worktree HEAD matches it
/cubrid-pr-review <pr-url> โ Review that PR when the current worktree HEAD matches it
/cubrid-pr-review โ Ask the user for a PR number or URL
Output Format
Write the report under the local CUBRID docs tree, never in the CUBRID repo root or current directory:
/home/vimkim/gh/my-cubrid-docs/<ticket-id>/PR-<NUMBER>-report-<AGENT>.md
<ticket-id> is the lowercase CBRD ticket number, for example cbrd-26583. <AGENT> is the current host CLI: claude for Claude Code or codex for Codex CLI. For example, the same PR reviewed by both agents produces /home/vimkim/gh/my-cubrid-docs/cbrd-26583/PR-6950-report-claude.md and /home/vimkim/gh/my-cubrid-docs/cbrd-26583/PR-6950-report-codex.md; never use the shared legacy name PR-6950-report.md. The report is local-only โ never post it to GitHub.
Report Path Rules
- Use
/home/vimkim/gh/my-cubrid-docs as the report root. If that directory is unavailable, stop and ask the user for the docs path; do not fall back to the CUBRID repo root or cwd.
- Extract the first
CBRD-XXXXX ticket id from the PR title, then the PR body if the title has none. Normalize the directory name to lowercase (cbrd-xxxxx).
- If no CBRD ticket id is present, stop before writing the report and ask the user for the ticket id.
- Create the ticket directory if it does not already exist.
- Compute
REPORT_PATH once after <AGENT> is set, then use that exact path for the initial report, the /grill-with-docs output path, and the final printed saved path.
Language Rules
- Section headers (
##): English
- Subsection headers (
###): English (Note: cubrid-jira-issue-write uses Korean ###; for review reports we keep ### English to match the Findings category names like Blocking (must fix).)
- Body text: Korean
- Tables: Korean content, English column headers OK
- Code snippets, function names, file paths: keep as-is
Character Restrictions
- NO emoji (no checkmarks, crosses, rockets, warnings, etc.) (These examples appear here only as illustrations of what NOT to put in the report.)
- NO non-BMP Unicode or special symbols (no
->, <-, check/cross marks, stars, bullets like โ/โ )
- Use ASCII alternatives:
-> instead of arrows, [x]/[ ] for checkboxes, */- for bullets
- Reason: matches house style across
cubrid-pr-create and cubrid-jira-issue-write, and avoids encoding issues if the report is later pasted into a ticket comment.
Length Budget
- Hard cap: 80 lines for typical PRs, 200 lines for large multi-module PRs.
- If the report would exceed 80 lines, first try to compress: drop low-signal findings, shorten code excerpts to the smallest illustrative span, collapse adjacent items. Going over 96 lines is permitted only when the PR has 5+ Blocking findings.
Report Template
# PR #<NUMBER> ์ฝ๋ ๋ฆฌ๋ทฐ ๋ณด๊ณ ์
**PR:** [<OWNER>/<REPO>#<NUMBER>](https://github.com/<OWNER>/<REPO>/pull/<NUMBER>)
**์ ๋ชฉ:** <PR title>
**์์ฑ์:** <author>
**HEAD SHA:** `<head_sha>`
**๋ฆฌ๋ทฐ ์ผ์:** <today's date>
> **TL;DR** (<Verdict>): 1-3 ๋ฌธ์ฅ์ผ๋ก ๊ฒฐ๋ก ๊ณผ ํต์ฌ ์ด์ 1-2๊ฐ.
## Summary
- **๋ณ๊ฒฝ ์์ฝ**: ํ ์ค๋ก PR์ด ๋ฌด์์ ๋ฐ๊พธ๋์ง
- **์ฃผ์ ์ด์**: ๊ฐ์ฅ ์ค์ํ 1-2 ํญ๋ชฉ (์์ผ๋ฉด "์์")
- **ํ์ธ ํ์ ์ฌํญ**: ์์ฑ์๊ฐ ํ์ธ/์๋ตํด์ผ ํ ์ง๋ฌธ (์์ผ๋ฉด "์์")
---
## Findings
<see Findings Rules below. ๋ฐ๊ฒฌ ์ฌํญ์ด ์ ํ ์์ผ๋ฉด ์ด ์น์
๋ณธ๋ฌธ์ `์์` ํ ์ค๋ก ๋์ฒดํ๊ณ ์๋ ์ธ subsection์ ๋ชจ๋ ์๋ตํ๋ค. ์ผ๋ถ ์นดํ
๊ณ ๋ฆฌ๋ง ๋น์ด ์๋ค๋ฉด ์ฑ์์ง ์นดํ
๊ณ ๋ฆฌ๋ง ๋จ๊ธฐ๊ณ ๋น์ด ์๋ subsection์ ํต์งธ๋ก ์๋ตํ๋ค.>
### Blocking (must fix)
<๋ฒ๊ทธ, ๋ฉ๋ชจ๋ฆฌ/๋์์ฑ ์์ ์ฑ ์๋ฐ ๋ฑ ๋จธ์ง ์ ์ ๋ฐ๋์ ์์ ๋์ด์ผ ํ๋ ํญ๋ชฉ.>
### Non-blocking (should consider)
<์์ ์ ๊ถํ์ง๋ง ๋จธ์ง๋ฅผ ๋ง์ง๋ ์๋ ์ฌํญ.>
### Questions for the author
<์์ฑ์์๊ฒ ํ์ธ์ด ํ์ํ ์ง๋ฌธ.>
## JIRA Context
<JIRA ํฐ์ผ ์ ๋ณด ์์ฝ ๋ฐ PR์ด ํฐ์ผ ์๋์ ์ผ์นํ๋์ง ํ๋ ์ค. JIRA ์์ผ๋ฉด ์น์
์๋ต.>
## Existing Comments
<PR์ ๋ฌ๋ ค ์๊ณ ์์ฑ์/๋ฉ์ธํ
์ด๋ ๋ต๋ณ์ด ์๋ top-level ์ฝ๋ฉํธ(`in_reply_to_id == null` ์ธ ๊ฒ ์ค author/maintainer ๋ต๊ธ์ด ์๋ ๊ฒ)๋ง ์งง์ ํ๋ก ์ ๋ฆฌ. ์์ผ๋ฉด ์น์
์๋ต.>
Top-of-Report Summary Rules
The > **TL;DR** blockquote and ## Summary block are required for every report. They exist so a reader can decide in 20 seconds whether the PR is shippable.
- TL;DR carries the verdict. TL;DR ๋ผ๋ฒจ์
**TL;DR** ๋ค ๊ดํธ ์์ Blocking / Non-blocking / ์์ฑ์ ํ์ธ ํ์ ์ค ํ๋๋ก ์ ๊ณ , ๊ทธ ๋ค 1-3 ๋ฌธ์ฅ ํ๋ฌธ ํ๊ตญ์ด๋ก ํต์ฌ ์ด์๋ฅผ ์์ฝํ๋ค. ๊ฐ์ ๊ฒฐ๋ก ์ Summary์ ๋ค์ ์ฐ์ง ์๋๋ค.
- Summary bullets: ๊ฐ ํญ๋ชฉ ํ ์ค. ์์ธํ ๋ด์ฉ์
## Findings์์ ํ์ด ์ด๋ค.
- ์ฌ์ํ PR(์ฃผ์/typo)์์๋ TL;DR ํ ์ค์ ํญ์ ํฌํจํ๋ค.
Findings Rules
This is the single source of truth for how findings are written. The template above just refers here.
- Signal over volume. ๋ฐ๊ฒฌ ์ฌํญ์ด ์์ผ๋ฉด ๋ณธ๋ฌธ์
์์ ํ ์ค๋ก ๋๋ธ๋ค. ์ฑ์ฐ๊ธฐ์ฉ ํญ๋ชฉ์ ๋ง๋ค์ง ์๋๋ค. 30์ค์ง๋ฆฌ ๋ณด๊ณ ์๊ฐ 300์ค์ง๋ฆฌ ๋ณด๊ณ ์๋ณด๋ค ๋ซ๋ค. TL;DR๊ณผ Summary๋ ๋ณธ๋ฌธ์ ์์ฝ์ด์ง ๋ณธ๋ฌธ ์์ฒด๊ฐ ์๋๋ค โ ๊ฐ์ ๋ฌธ์ฅ์ ๊ทธ๋๋ก ๋ณต๋ถํ์ง ์๋๋ค.
- One sentence per finding is the default โ
ํ์ผ:๋ผ์ธ + ํ ๋ฌธ์ฅ ์ค๋ช
+ ๊ทผ๊ฑฐ ์ฝ๋/์ง๋จ. ์ฝ๋ ์ธ์ฉ์ 1-5์ค๋ก ์ถฉ๋ถํ๋ค.
- Every finding needs evidence: ์ฝ๋ ์ค๋ํซ(ํ์ผ:๋ผ์ธ)์ด๋ LSP/clangd ์ง๋จ. "might be wrong" ๊ฐ์ ๋ชจํธํ ์ง์ ์ ๊ธ์ง.
- Only flag issues introduced by this PR. ์ด๋ฏธ ์กด์ฌํ๋ ๋ฌธ์ , ์ด๋ฏธ ๋ค๋ฅธ ์ฝ๋ฉํธ์์ ์ง์ ๋ ํญ๋ชฉ, ์์ ๋์ง ์์ ๋ผ์ธ์ ์ ์ธํ๋ค.
- Skip what CI catches. ํฌ๋งทํ
, astyle, cppcheck ๊ฒฝ๊ณ ๋ฑ CI๊ฐ ์ก๋ ํญ๋ชฉ์ ๋ณด๊ณ ํ์ง ์๋๋ค.
Plain Language
The report is read by the PR author under time pressure โ and the author may be a recent hire who hasn't memorized every acronym in the module. Write so a junior engineer who can read C/C++ but hasn't lived in this file can act on the report in one pass.
- One idea per sentence. Short, declarative Korean. If a finding needs three sentences, the second and third belong as evidence (code excerpt) โ not as more prose.
- Lead with the defect, then the cause, then the consequence. "์๋ฌ ๊ฒฝ๋ก์์
pgbuf_unfix ๋๋ฝ -> ํ์ด์ง ํ์ด ์๊ตฌํ ์ ๊ธด ์ฑ ๋จ์ ๋ค๋ฅธ ํธ๋์ญ์
์ด ํด๋น ํ์ด์ง๋ฅผ ์ก์ ์ ์์" beats "์ ๋ฐ์ ์ผ๋ก ์ดํด๋ณด๋ ... ๊ฐ๋ฅ์ฑ์ด ์์ด ๋ณด์
๋๋ค." The consequence clause is what tells the author why this is blocking, not just what is wrong.
- No hedging or filler. Drop "~์ธ ๊ฒ ๊ฐ์ต๋๋ค", "ํน์", "์ ๋ฐ์ ์ผ๋ก", "๋ณธ ๋ฆฌ๋ทฐ์์๋". State the fact: "์๋ฌ ๊ฒฝ๋ก์์
pgbuf_unfix ๋๋ฝ."
- Keep code identifiers as-is. Function names, file paths, macros stay in their original English form inside backticks. Don't translate them.
- Show, don't summarize. When a finding hinges on a few lines of code, paste those lines (1-5 lines) instead of describing them.
- Gloss CUBRID-internal terms on first use. On the first mention of an internal-only concept in the report (
OOS, pgbuf_*, recdes, OR_VAR_*, "6๊ณณ ๋ฃฐ", build-mode names like SERVER_MODE/SA_MODE, latch protocols), add a one-clause aside in parentheses: "pgbuf_unfix (ํ์ด์ง ๋ฒํผ ํ ํด์ )", "6๊ณณ ๋ฃฐ (์ ์๋ฌ ์ฝ๋๋ error_code.h, error_code.c ๋ฑ 6๊ฐ ํ์ผ์ ๋ชจ๋ ๊ฐฑ์ ํด์ผ ํจ)", "SERVER_MODE (์๋ฒ ํ๋ก์ธ์ค ๋น๋ ๋ชจ๋)". After the first gloss, use the term raw. Universal C/DB vocabulary (malloc, mutex, assert) does not need glossing. If reference.md already has the long-form explanation, gloss in one clause and link by name.
Execution Steps
Step 1: Setup
Validate the invocation and capture metadata in one shot:
scripts/check-prereqs.sh "$PR_NUMBER_OR_URL"
The script is the mandatory gate. It accepts only a PR number or canonical https://github.com/CUBRID/cubrid/pull/<number> URL, requires the current directory to be inside a Git worktree, verifies that the PR targets CUBRID/cubrid, and requires the current worktree's HEAD SHA to equal the PR head SHA. It prints JSON with owner, repo, number, repo_root, local_head, head_sha, base_ref, title, body, author, state, and draft only after all checks pass.
If it exits non-zero, surface the error and stop immediately. Do not fetch, checkout, switch branches, create a worktree, or offer to review the remote diff anyway. The user must place the current worktree at the exact PR head and rerun the skill. If the checks pass but the PR is not open or is marked draft, warn the user once and ask whether to proceed before continuing.
Step 2: Gather Context (parallel)
Run these in parallel:
- PR diff:
gh pr diff <NUMBER> -R <OWNER>/<REPO>. If gh pr diff returns empty or fails, surface the error and stop โ there is nothing to review.
- Existing PR comments:
gh api "repos/<OWNER>/<REPO>/pulls/<NUMBER>/comments" --jq '.[] | {id, user: .user.login, path, line: .original_line, in_reply_to_id, body}'
gh api "repos/<OWNER>/<REPO>/issues/<NUMBER>/comments" --jq '.[] | {id, user: .user.login, body}'
- JIRA context (if the ticket id extracted by the Report Path Rules exists): invoke
/cubrid-jira CBRD-XXXXX to fetch ticket context.
- Read
reference.md (sibling file in this skill's directory) for CUBRID-specific review knowledge: error-code six-place rule, memory/error-handling conventions, lock/page-buffer/WAL/MVCC protocols, build-mode guards, key data structures, false-positive guidance. If reference.md is missing on this checkout, warn the user once and proceed using only the review categories listed in Step 3 below โ do not invent CUBRID-specific rules.
- Read any CLAUDE.md / AGENTS.md in directories containing changed files. Use Glob to walk ancestor directories of each changed file looking for these context files.
Step 3: Run the Native Review Engine
Use the current host CLI's built-in reviewer as the primary review pass. Determine the host from runtime-provided identity or capabilities; do not infer it from whether claude or codex binaries happen to be installed, because both may coexist.
Set <AGENT> for the report path from that same host identity: claude under Claude Code and codex under Codex CLI. Keep this value unchanged for the remainder of the workflow.
After <AGENT> is set, resolve the report path before invoking the native reviewer:
- Confirm
/home/vimkim/gh/my-cubrid-docs exists.
- Extract
CBRD-XXXXX from the Step 1 PR title, falling back to the PR body only if the title has none.
- Normalize the ticket directory to lowercase, for example
cbrd-26583.
- Create
/home/vimkim/gh/my-cubrid-docs/<ticket-id> if it does not exist.
- Set
REPORT_PATH=/home/vimkim/gh/my-cubrid-docs/<ticket-id>/PR-<NUMBER>-report-<AGENT>.md.
Claude Code must therefore write ...-report-claude.md; Codex CLI must write ...-report-codex.md. Both hosts use the same docs-tree ticket directory and never save the report in the CUBRID repo root or current working directory.
Immediately before invoking the native reviewer, rerun scripts/check-prereqs.sh "$PR_NUMBER_OR_URL". Abort if it fails or returns a different head_sha from Step 1. Immediately after the native reviewer finishes, run the gate once more. If it fails or the PR head changed, discard all candidate findings and stop without writing a report. This prevents reviewing or reporting against a PR that moved after setup.
Claude Code
Invoke the built-in /code-review workflow exactly once for the PR URL. Supply the PR diff, relevant CLAUDE.md files, PR metadata, and the CUBRID reference.md rules as review context.
Override the built-in workflow's publishing step: analysis only, never call gh pr comment, submit a review, or mutate GitHub. Capture its high-confidence findings locally as candidate findings. This local-only constraint is higher priority than /code-review's default behavior. If the runtime cannot invoke /code-review without publishing, stop before invocation and clearly report that the installed command is incompatible with this skill's local-only contract.
If /code-review is unavailable, report that code-review@claude-plugins-official must be enabled. Do not silently substitute a generic agent review.
Codex CLI
Invoke the built-in /review workflow exactly once. In the installed Codex CLI shape, --base is mutually
exclusive with a prompt argument, so the mandatory native reviewer command is:
codex review --base "origin/<BASE_REF>"
Do not append a prompt argument or pipe prompt-specific instructions on stdin with - when --base is used.
Run it from the current worktree already validated by Step 1. The host workflow must gather PR diff, PR/JIRA
context, existing comments, reference.md, and relevant CLAUDE.md / AGENTS.md files before this native pass,
then perform CUBRID-specific validation, filtering, and report formatting after it. Do not fetch, checkout, switch
branches, reset, clean, or create another worktree. Capture stdout as candidate findings. Treat a non-zero exit or
empty output as a review-engine failure; surface it instead of silently replacing the native review with a weaker
ad-hoc pass.
Shared Review Brief
For Claude Code, supply this brief to the native reviewer. For Codex CLI's --base-only command, do not pass it via
argv or stdin; apply it during host-side verification and filtering after the native pass:
- Read the full functions surrounding suspicious hunks and trace call chains where needed.
- Check logic/correctness, memory safety, concurrency/thread safety, JIRA intent, build-mode guards, and the
reference.md "Comment & Convention Hygiene" rules.
- Check buffer/integer overflow and unchecked input when the diff touches the SQL parser, broker protocol, or CCI client interface; skip generic security checklists otherwise.
- Ignore pre-existing, CI-caught, already-commented, unmodified-line, and out-of-scope issues.
- Return evidence for every finding; no speculative or filler findings.
After the native pass, verify its candidate findings against the actual diff and reference.md. The host skill remains responsible for CUBRID-specific validation and report formatting; do not blindly copy native output.
LSP analysis (optional). If compile_commands.json is available, run lsp_diagnostics on changed files for clangd warnings on changed lines, lsp_hover/lsp_goto_definition on suspicious types, and lsp_find_references if a function signature changed. Skip silently if LSP is unavailable.
If reference.md flags a rule (e.g., new error code -> 6 places), do not restate the rule body; link to it by name and point to the file:line that needs updating.
Step 4: Filter
Drop findings that are:
- Pre-existing (not introduced by this PR)
- Already raised in existing PR comments
- Stylistic (formatting, naming) unless CLAUDE.md or the
reference.md "Comment & Convention Hygiene" section mandates it
- On unmodified lines
- Out of the PR's stated scope โ don't critique the design of code the PR didn't intend to change, even if the diff exposed it
Every surviving finding needs a code snippet or diagnostic as evidence.
Step 5: Write the Report
- Draft the TL;DR + Summary first. Write the verdict label and conclusion before the body โ this forces a clear stance and reveals whether the rest of the report supports it.
- Write Findings tightly. One sentence per item. Group as Blocking / Non-blocking / Questions, omitting any subsection that has no items. If no category has any items, replace the section body with a single
์์ line and omit all three subsections.
- Add JIRA Context and Existing Comments only if useful. Omit empty sections.
- Save to
REPORT_PATH, using the host-derived claude or codex value from Step 3 and the docs-tree ticket directory from the Report Path Rules.
- Print three things so the user can sanity-check the call at a glance: (1) the saved file path, (2) the verdict label extracted from the TL;DR (
Blocking / Non-blocking / ์์ฑ์ ํ์ธ ํ์), (3) the TL;DR sentence(s) without the label prefix.
Example Output
A short finished report looks like this โ use it as a shape anchor, not a template to fill out verbatim. The example below is about 30 lines, well under half the 80-line budget; for a typical PR this is plenty.
# PR #6950 ์ฝ๋ ๋ฆฌ๋ทฐ ๋ณด๊ณ ์
**PR:** [CUBRID/CUBRID#6950](https://github.com/CUBRID/CUBRID/pull/6950)
**์ ๋ชฉ:** [CBRD-26583] Re-enable OOS OID replacement in heap records
**์์ฑ์:** vimkim
**HEAD SHA:** `abc1234`
**๋ฆฌ๋ทฐ ์ผ์:** 2026-05-06
> **TL;DR** (Blocking): `heap_record_replace_oos_oids` ์๋ฌ ๊ฒฝ๋ก์์ `pgbuf_unfix` ๋๋ฝ์ผ๋ก ํ์ด์ง ํ ๋์ ๊ฐ๋ฅ. ํด๋น ํ ๊ณณ๋ง ๊ณ ์น๋ฉด ๋จธ์ง ๊ฐ๋ฅ.
## Summary
- **๋ณ๊ฒฝ ์์ฝ**: heap ๋ ์ฝ๋์ OOS OID ์นํ ๋ก์ง์ `feat/oos`์ ๋ค์ ํ์ฑํ
- **์ฃผ์ ์ด์**: `heap_file.c:12345` ์๋ฌ ๊ฒฝ๋ก ํ์ด์ง ํ ๋์
- **ํ์ธ ํ์ ์ฌํญ**: ์์
---
## Findings
### Blocking (must fix)
- `src/storage/heap_file.c:12345` โ `er_set` ํ `goto exit` ์ ์ `pgbuf_unfix(thread_p, page_p)` ๋๋ฝ. ํด๋น ํจ์ ์ง์
์์ `pgbuf_fix` ํ์ผ๋ฏ๋ก ๋ชจ๋ ์ข
๋ฃ ๊ฒฝ๋ก์์ unfix ํ์. ๊ทผ๊ฑฐ: ๊ฐ์ ํจ์ line 12302์ ์ ์ ์ข
๋ฃ ๊ฒฝ๋ก์๋ unfix ์กด์ฌ.
## JIRA Context
CBRD-26583 ์ ๋ชฉํ๋ OOS OID ์นํ ์ฌํ์ฑํ. ๋ณธ PR์ ๊ทธ ๋ฒ์ ์.
(JIRA Context only; Existing Comments was omitted because no unresolved top-level comments existed. Non-blocking and Questions for the author subsections are also omitted because they had no items.)
Mandatory: Iterate with Grill-with-Docs
Every review report must go through /grill-with-docs before being posted or shared. Do not deliver a single-pass review. Single-pass reviews drift toward weak evidence ("might be wrong" hedges), pre-existing-issue leakage, mis-scoped findings, and verdict labels that don't match the Findings.
This step is required, not optional. It applies to every review. No agent-side judgment โ including size, scope, perceived triviality, or perceived risk โ is a valid skip criterion. The only legitimate skip is when the user, in the message that triggered this skill, explicitly says "skip grill" or "don't grill this" (or unambiguous equivalent: "no grill", "skip the grill loop", "just push it"). If in doubt, do the grill loop.
How to hand off:
After saving the initial review to REPORT_PATH, invoke /grill-with-docs with:
- Topic & purpose: PR review report for
<OWNER>/<REPO>#<NUMBER>, audience is the PR author and CUBRID maintainers
- Output path:
REPORT_PATH (the loop revises the docs-tree report in place)
- Source material: the PR diff, JIRA ticket context, this skill's
reference.md, any CLAUDE.md / AGENTS.md in directories of changed files
- Review angle: every Finding has file:line evidence (no "might be wrong" hedging), no pre-existing / CI-caught / out-of-scope items leaked through, TL;DR verdict label matches the Findings, length budget respected (80-line target, 200 hard cap), no emoji or non-BMP unicode, every CUBRID-internal term on first use has a one-clause inline gloss (a junior engineer who has not opened this file should follow the report on one read), every blocking finding spells out the consequence (defect -> cause -> impact), not just the symptom
- Round cap: default 5