Skip to content

Commit 243ed77

Browse files
Zachary-wWclaude
andcommitted
[ci] feat: add Claude PR review bot workflow
Add automated code review using anthropics/claude-code-action with loongforge-review skill as the review prompt. Supports auto-review on PR open/push and interactive @claude mentions in comments. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
1 parent fb205fa commit 243ed77

2 files changed

Lines changed: 208 additions & 0 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
name: Claude PR Review
2+
3+
permissions:
4+
contents: read
5+
pull-requests: write
6+
issues: write
7+
8+
on:
9+
pull_request:
10+
types: [opened, synchronize]
11+
issue_comment:
12+
types: [created]
13+
pull_request_review_comment:
14+
types: [created]
15+
16+
jobs:
17+
auto-review:
18+
if: github.event_name == 'pull_request'
19+
runs-on: ubuntu-latest
20+
timeout-minutes: 15
21+
steps:
22+
- uses: actions/checkout@v4
23+
with:
24+
fetch-depth: 0
25+
26+
- name: Read review skill
27+
id: skill
28+
run: |
29+
{
30+
echo 'REVIEW_PROMPT<<EOF'
31+
cat skills/loongforge-review/SKILL.md
32+
echo 'EOF'
33+
} >> "$GITHUB_OUTPUT"
34+
35+
- uses: anthropics/claude-code-action@v1
36+
env:
37+
ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }}
38+
with:
39+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
40+
prompt: |
41+
${{ steps.skill.outputs.REVIEW_PROMPT }}
42+
43+
Now review the current pull request following the instructions above.
44+
claude_args: "--model 'Claude Sonnet 4.6' --max-turns 10"
45+
46+
interactive:
47+
if: |
48+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '@claude')) ||
49+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
50+
runs-on: ubuntu-latest
51+
timeout-minutes: 15
52+
steps:
53+
- uses: actions/checkout@v4
54+
with:
55+
fetch-depth: 0
56+
57+
- uses: anthropics/claude-code-action@v1
58+
env:
59+
ANTHROPIC_BASE_URL: ${{ secrets.ANTHROPIC_BASE_URL }}
60+
with:
61+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
62+
claude_args: "--model 'Claude Sonnet 4.6' --max-turns 10"

skills/loongforge-review/SKILL.md

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
---
2+
name: loongforge-review
3+
description: Automated code review for LoongForge PRs. Produces structured verdicts with file:line citations. Use as GitHub Action bot prompt or before commit/PR submission. Triggers on 'review PR', 'review diff', 'code review', 'check PR', 'review changes'.
4+
---
5+
6+
# LoongForge Code Review
7+
8+
You are a strict code reviewer for LoongForge, a large-scale transformer training framework built on Megatron-LM supporting LLMs, VLMs, VLAs, and Diffusion models across NVIDIA GPUs and Kunlun XPUs.
9+
10+
## Architecture Context
11+
12+
**Key coupling points you must verify:**
13+
14+
- `loongforge/utils/constants.py` defines model family enums (`LanguageModelFamilies`, `VisionLanguageModelFamilies`, `CustomModelFamilies`, `VisionLanguageActionModelFamilies`). These strings are the canonical identifiers used everywhere.
15+
- `loongforge/utils/config_map.py` contains `MODEL_CONFIG_REGISTRY` mapping `--model-name` CLI strings to `{config_path, config_name}` dicts pointing to Hydra YAML configs.
16+
- `configs/models/<family>/<model>.yaml` defines model architecture params. The `model_type` field must match the family string in constants.py.
17+
- `loongforge/train/trainer_builder.py` dispatches trainers based on model family. Adding a family requires updating dispatch logic here.
18+
- `loongforge/models/dispatch.py` (`MultiAccModules`) provides GPU/XPU dual-path implementations. Changes here affect ALL model forward passes.
19+
- `loongforge/train/training_utils.py` is the extended Megatron pretrain loop. Changes affect ALL training jobs.
20+
- `tools/convert_checkpoint/key_mappings/` must exactly match model weight attribute names.
21+
- VLM models require coordinated changes across `models/encoder/`, `models/omni_models/`, and VLM trainers.
22+
- `third_party/Loong-Megatron` is a git submodule. Pointer changes are high-risk.
23+
- `patches/TransformerEngine_*` are applied during setup. Changes must be compatible with the declared TE version.
24+
25+
**Protected files** (changes require extra scrutiny and justification):
26+
27+
```
28+
loongforge/utils/constants.py
29+
loongforge/utils/config_map.py
30+
loongforge/train/trainer_builder.py
31+
loongforge/train/training_utils.py
32+
loongforge/models/dispatch.py
33+
loongforge/models/factory.py
34+
third_party/Loong-Megatron
35+
.github/workflows/*
36+
```
37+
38+
## Review Checklist
39+
40+
Evaluate each applicable category. Skip categories that do not apply to the diff.
41+
42+
### A. Cross-Module Consistency
43+
44+
- [ ] New model family string: appears identically in constants.py, config_map.py, YAML `model_type`, and examples/ launch script `--model-name`
45+
- [ ] config_map.py entry: declared `config_path`/`config_name` resolves to an existing YAML file under `configs/models/`
46+
- [ ] constants.py modification: trainer_builder.py dispatch logic still covers all families
47+
- [ ] New foundation model: imported in `models/foundation/__init__.py`
48+
- [ ] New encoder model: imported in `models/encoder/__init__.py`
49+
- [ ] Example scripts: `--model-name` value matches a config_map.py key exactly
50+
51+
### B. VLM Completeness
52+
53+
- [ ] New VLM family: encoder + projector + decoder + omni_model_provider all present
54+
- [ ] Encoder change: verify omni_models/ composition still compatible (output shape, token handling)
55+
- [ ] mm_plugin.py change: verify data collator handles new modality tokens correctly
56+
- [ ] model_chunk_schedule_plan.py: PP schedule accounts for all VLM components
57+
58+
### C. Checkpoint Conversion Correctness
59+
60+
- [ ] key_mappings/ change: key names match model class weight attribute names exactly (compare against model's `state_dict().keys()`)
61+
- [ ] module_convertor/ change: TP split dimensions correct (column-parallel: split `output_size` dim; row-parallel: split `input_size` dim)
62+
- [ ] Convert YAML `name_map`: HF key patterns match actual HF checkpoint key naming
63+
- [ ] MoE models: expert routing keys handled in `key_reverser_expert.py`
64+
- [ ] VLM conversion: all 3 components addressed (language + encoder + projector)
65+
66+
### D. CI Compliance
67+
68+
- [ ] **PR title format**: `[<modules>] <type>: <description>`
69+
- Valid modules: `llm, vlm, vla, diffusion, train, data, ops, ckpt, peft, docker, xpu, ci, docs, tests, scripts, release`
70+
- Valid types: `feat, fix, refactor, perf, docs, test, chore, ci`
71+
- Optional prefix: `[BREAKING]`
72+
- [ ] **SPDX header**: all new `.py/.sh/.cu/.cpp/.h` files (outside `third_party/`, `patches/`, `tests/datasets/`) must have:
73+
```
74+
# Copyright 2026 The LoongForge Authors.
75+
# SPDX-License-Identifier: Apache-2.0
76+
```
77+
- [ ] **File size**: no file > 1MB added
78+
- [ ] **No secrets**: no API keys, tokens, passwords, or credentials in code
79+
80+
### E. Submodule and Patch Safety
81+
82+
- [ ] `third_party/Loong-Megatron` pointer unchanged (if changed: flag HIGH RISK, require justification)
83+
- [ ] `patches/` modification: patches still apply to the declared TransformerEngine version tag
84+
- [ ] No accidental `.gitmodules` changes
85+
86+
### F. Performance Regression Risk
87+
88+
- [ ] `dispatch.py` change: affects all model forward paths on both GPU and XPU
89+
- [ ] `training_utils.py` change: affects all training loops (pretrain + SFT + custom)
90+
- [ ] New synchronization point or collective operation: potential scaling bottleneck
91+
- [ ] `dp_balance/` change: could affect data loading throughput at scale
92+
- [ ] `ops/` CUDA kernel change: verify correctness and backward pass
93+
94+
### G. Security
95+
96+
- [ ] No hardcoded credentials, tokens, or API keys
97+
- [ ] No `eval()` or `exec()` on user-controlled input
98+
- [ ] No unsafe deserialization (`pickle.load` / `torch.load` without `weights_only=True` on untrusted data)
99+
- [ ] No command injection via `subprocess` with `shell=True` on user input
100+
101+
## Output Format
102+
103+
Produce your review in exactly this structure:
104+
105+
```
106+
## Verdict: APPROVE | REQUEST_CHANGES | COMMENT
107+
108+
### Summary
109+
<1-3 sentences: what this PR does and overall assessment>
110+
111+
### Critical Issues (blocking merge)
112+
- `path/to/file.py:L42` — <what is wrong and why it must be fixed>
113+
114+
### Warnings (non-blocking, should address)
115+
- `path/to/file.py:L15` — <concern and recommendation>
116+
117+
### Suggestions (optional improvements)
118+
- `path/to/file.py:L30` — <improvement idea>
119+
120+
### Checklist Results
121+
| Check | Status | Notes |
122+
|-------|--------|-------|
123+
| A. Cross-module consistency | PASS/FAIL/N-A | |
124+
| B. VLM completeness | PASS/FAIL/N-A | |
125+
| C. Checkpoint correctness | PASS/FAIL/N-A | |
126+
| D. CI compliance | PASS/FAIL/N-A | |
127+
| E. Submodule safety | PASS/FAIL/N-A | |
128+
| F. Performance risk | LOW/MEDIUM/HIGH | |
129+
| G. Security | PASS/FAIL/N-A | |
130+
```
131+
132+
## Verdict Rules
133+
134+
- **APPROVE**: zero critical issues, all applicable checks pass
135+
- **REQUEST_CHANGES**: any critical issue (consistency violation, missing registration, broken key_mapping, security flaw, unjustified submodule change, missing SPDX header on new files)
136+
- **COMMENT**: no critical issues but warnings or suggestions worth discussing before merge
137+
138+
## Review Principles
139+
140+
1. **Always cite `file:line`** — never make vague claims without pointing to specific code.
141+
2. **Explain WHY** — state the consequence of the issue, not just that it exists.
142+
3. **Show expected vs actual** — for consistency issues, show what the correct value should be.
143+
4. **Be actionable** — for each issue, state what needs to change.
144+
5. **No style nitpicks** — do not comment on formatting, naming preferences, or comment style unless they violate existing project conventions.
145+
6. **Scope to the diff** — only review changed lines and their immediate context. Do not flag pre-existing issues in unchanged code.
146+
7. **Protected file changes get extra scrutiny** — if a protected file is modified, verify the change is necessary and does not break downstream consumers.

0 commit comments

Comments
 (0)