Skip to content
Back to skills

Review Student Prs

ASecurity

Review and merge student exercise PRs during TP sessions. Arguments: <repo-url> [--class <class-id>] [--timeslot <HH:MM-HH:MM>] [--dry-run]

  • 16 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 20, 2026
educationpythonrustgoc#gitsecurity

Works with

  • mcp

Security analysis

A100/100

Scanned September 28, 2026

npx -y skills add jsboige/CoursIA --skill review-student-prs --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Review Student Prs?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Review Student Prs
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jsboige-review-student-prs/badge)](https://www.skillsdirectory.com/skills/jsboige-review-student-prs)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: review-student-prs
description: Review and merge student exercise PRs during TP sessions. Arguments: <repo-url> [--class <class-id>] [--timeslot <HH:MM-HH:MM>] [--dry-run]
---

# Review Student PRs

Review, validate, and intelligently merge student exercise PRs submitted during TP sessions.

**Target**: `$ARGUMENTS`

## Arguments

- `repo-url`: GitHub repository URL (e.g., `https://github.com/jsboigeECE/2026-ECE-Ing4-Fin-IA-Projet1-Gr01`)
- `--class <class-id>`: Class identifier (e.g., `Gr01`, `Gr02`, `Gr03`)
- `--timeslot <HH:MM-HH:MM>`: Authorized submission window (e.g., `08:00-12:00`). PRs outside this window are flagged
- `--dry-run`: Review only, no merge or commit

## Process

### Phase 1 - Discovery & Identification

1. **Fetch open PRs** from the target repo using `gh pr list`
2. **Filter by timeslot** - Only PRs created within the authorized submission window
3. **Identify students**:
   - Parse PR title/body for student name, group, notebook claimed
   - Cross-reference GitHub username with submission account
   - If available, match against inscription spreadsheet (`G:\Mon Drive\MyIA\Formation\ECE\2026\`)
4. **Flag anomalies**: PRs outside timeslot, duplicate claims on same notebook, unknown accounts

### Phase 2 - Code Review

For each valid PR:

1. **Fetch PR diff** using `gh pr diff <number>`
2. **Identify modified notebooks** and changed cells
3. **Validate exercise completion**:
   - Check that exercise cells have been filled (not empty or placeholder)
   - Verify code is syntactically correct
   - Check markdown cells for explanations if required
4. **Execution validation** (MANDATORY - do not skip):
   - Checkout PR branch locally
   - Execute the modified exercise cell(s) and all prerequisite cells
   - For Python notebooks: `python scripts/notebook_tools/notebook_helpers.py execute <path> --verbose`
   - For .NET notebooks: use MCP cell-by-cell execution
   - Record execution results (pass/fail, output, errors)
   - **If cell fails to execute**: mark as PARTIAL, note the error
   - **If error is environment-only** (missing package on student machine but code is correct): accept with note
   - **If error is code logic**: mark as INVALID
5. **Detect copy-paste / uncommenting**:
   - Compare student's code against the "Exemple guide" in the same notebook
   - If the exercise cell was solved by uncommenting provided solution code: flag as TRIVIAL
   - If this was due to solutions being provided in comments (our error): accept but note it
   - If the student wrote original code different from any example: mark as ORIGINAL
6. **Quality assessment** (per exercise):
   - Code correctness (executes without error)
   - Code originality (ORIGINAL vs TRIVIAL vs COPY)
   - Code quality (reasonable approach, variable naming, structure)
   - Explanation quality (if markdown present)
   - Score: VALID / PARTIAL / INVALID

### Phase 3 - Report Generation

Generate a correction report in `reports/corrections/` (gitignored):

```
reports/corrections/YYYY-MM-DD_<class-id>_review.md
```

Report format:
```markdown
# TP Review - <date> - <class-id>

## Summary
- PRs reviewed: N
- Valid exercises: N (+0.5 pts each)
- Partial: N (manual review needed)
- Invalid: N

## Per-Student Results

### <Student Name> (GitHub: @username)
- **PR**: #<number> - <title>
- **Notebook**: <notebook-name>
- **Timeslot**: <created-at> (VALID/LATE)
- **Exercises**:
  | Exercise | Status | Score | Notes |
  |----------|--------|-------|-------|
  | Ex 1     | VALID  | +0.5  | Clean implementation |
  | Ex 2     | PARTIAL| 0     | Missing explanation |
- **Total bonus**: +X.X points
```

### Phase 4 - Intelligent Merge

For each VALID exercise (skip if `--dry-run`):

1. **Transform exercise result into example**:
   - The student's completed exercise cell becomes a new example cell
   - Rewrite the preceding markdown to frame it as "Example - <topic>" instead of "Exercise"
   - Add brief commentary on the approach used
   - Preserve the student's code as-is (it's their contribution)

2. **Create replacement exercise**:
   - Add a NEW exercise cell after the newly created example
   - The new exercise must be:
     - Different from the one just solved (not a trivial variant)
     - Not directly derivable from the example above
     - At a similar difficulty level
     - Related to the same topic/concept
   - Add appropriate markdown instructions for the new exercise

3. **Curate redundancy**:
   - If multiple students solved the same exercise across PRs:
     - Keep the most pedagogically valuable solution as example
     - Remove redundant examples that don't add new insight
     - Ensure the notebook flow remains coherent
   - If a notebook accumulates too many examples (>3 consecutive examples on same concept):
     - Keep the 2 most distinct/illustrative ones
     - Remove the others
     - Adjust markdown transitions

4. **Commit changes**:
   ```
   feat(ece): integrate student exercise <notebook> - <student> (+0.5 bonus)

   - Exercise result converted to example
   - New replacement exercise added
   - Reviewed and validated during TP <date>

   Co-Authored-By: <Student Name> <student-email-if-available>
   Co-Authored-By: Claude-Code <noreply@anthropic.com>
   ```

5. **Push** to the main branch of the **target student repository** (the `repo-url` argument), after all PRs for the session are processed. That repository's charter governs this push. If the integration lands in `jsboige/CoursIA`, never push to `main`: open one PR for the session instead (CLAUDE.md §A, `git-workflow.md`).

### Phase 5 - Cleanup

1. **Close merged PRs** with a comment thanking the student and confirming bonus
2. **Update the correction report** with final merge status
3. **Summary output** to the user with:
   - Number of exercises validated
   - Bonus points attributed per student
   - Any issues requiring manual attention
   - List of notebooks updated with new exercises

## Important Notes

- **Timing**: Run between classes (e.g., noon-2pm) so afternoon class gets fresh exercises
- **Merge order**: Process PRs in submission order (FIFO)
- **Conflict resolution**: If two PRs modify the same notebook, merge the first, rebase the second
- **Security**: Never execute untrusted code outside the notebook sandbox
- **Backup**: Create a local branch backup before merging: `backup/pre-merge-<date>`
- **No force push**: All merges are regular merges or fast-forwards
- **Report confidentiality**: Reports in `reports/corrections/` are gitignored, never committed

## Notebook Types

| Series | Kernel | Execution Method |
|--------|--------|-----------------|
| Probas | .NET C# | MCP cell-by-cell |
| GameTheory | Python (WSL) | papermill or notebook_helpers |
| ML | Mixed (.NET + Python) | Depends on notebook |

## Spreadsheet Reference

Student inscriptions and evaluations:
- `G:\Mon Drive\MyIA\Formation\ECE\2026\` - CSV/XLSX files
- Match GitHub usernames to student names for bonus attribution

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…