repograde
Grade student repositories with optional date filtering in single-repo or bulk mode. Use when the user says "repograde", "grade the repos", "grade this repo since <date>", "bewerte die Abgaben", "korrigiere die Repos", or asks for a repo grading run over a class folder or a single student repository. Do not use for project grading with issues and PRs (use projectgrade) or for knowledge-check exams (use knowledge-assessment).
- License 许可
- MIT
- 最近更新
- 2026-11-11
- Stars
- ★ 1
- Forks
- 0
01 前言 Front Matter
- name
- repograde
- license
- MIT
- metadata
- { "scope": "execution", "category": "education" }
- description
- Grade student repositories with optional date filtering in single-repo or bulk mode. Use when the user says "repograde", "grade the repos", "grade this repo since <date>", "bewerte die Abgaben", "korrigiere die Repos", or asks for a repo grading run over a class folder or a single student repository. Do not use for project grading with issues and PRs (use projectgrade) or for knowledge-check exams (use knowledge-assessment).
- compatibility
- opencode
02 资源文件 1
- 参考文档REPORT-FORMAT.md5.8 KB
03 SKILL.md 正文
Repograde Skill
Purpose
This skill is the canonical workflow for grading student Git repositories. It handles both full-history grading and date-filtered grading (commits from a specified cutoff date onwards) in a single unified workflow.
Output Language: MANDATORY GERMAN
Follow the grading-shared Output Language rule: natural German with proper
UTF-8 umlauts (ä, ö, ü, ß), never English.
Dependencies
This skill relies on grading-shared for: Anrede-Gate (anrede.txt), email
formulas, second-person address rules, database lookup, email JSON structure,
name parsing from repository basename (CRITICAL: last word = first name,
everything before it = last name), repository analysis protocol, assignment
discovery protocol (Aufgaben-Discovery), bulk grading concurrency, German/UTF-8
constraints, JSON escaping rules, email body format, praise guidelines,
Noten-TSV and reporting protocol.
Derive output filenames from the repository basename, while using the provided repository path verbatim to locate the repository.
Consistency Goal (CRITICAL)
The grading output of this skill MUST be highly standardized across repositories and across subagents. Do NOT improvise the structure, heading names, section order, or overall depth.
Every *_grading.md file generated by this skill MUST:
- use the exact section order defined in REPORT-FORMAT.md,
- include all mandatory numeric facts when evidence exists,
- explicitly say when evidence is missing or unclear instead of silently omitting a section,
- stay within the requested level of detail rather than expanding into a free-form essay.
Every *_email.json body generated by this skill MUST:
- follow the exact paragraph order defined by
grading-sharedfor assignment grading emails, - summarize the same core facts as the grading report,
- keep a consistent scope and length across students.
Execution Context
This skill operates from a local folder (current working directory), NOT from within a Git repository. Calling this skill from inside a Git repository is an error.
The CWD contains student Git repositories as subdirectories. These may be
structured as STUDENT_DIR/INNER_PROJECT/.git (two levels deep). The CWD may
also contain name-based symlinks (e.g., Lastname Firstname -> STUDENT_ID)
that provide the student's real name. A BROKEN name-symlink (target does not
exist) means the student has not yet submitted their repository URL — see
grading-shared Broken Name-Symlinks (Missing Repository).
Follow grading-shared Repository Structure Discovery (Inner Git Repository
Discovery) before running any git commands. Use grading-shared Student Name
Resolution via Symlinks to determine the student's name.
The CWD may also contain a _class symlink pointing to the corresponding class
folder in the teaching repository (e.g., _class -> /home/georg/repos/GRG-SWP/2ahwii/).
This symlink provides access to assignments and lesson materials.
Zielordner im -T-Repo (CRITICAL)
Alle Ausgaben dieses Skills werden im privaten -T-Repo abgelegt, niemals
im Arbeitsverzeichnis mit den Schüler-Repos und niemals im öffentlichen
Teaching-Repo.
Der normale Arbeitsplatz ist ~/gits/<kohorte>-<fach>/ (z. B.
~/gits/3aaif-wmc/): kein Git-Repo, darin die Namens-Symlinks auf die
Schüler-Repos und der _class-Symlink ins öffentliche Klassen-Repo:
~/gits/3aaif-wmc/_class -> /home/georg/r/GRG-WMC/3aaif
~/gits/3aaif-wmc/Abazi Hamza -> Hamza473A
Auflösung (in dieser Reihenfolge):
- CWD liegt bereits in einem
-T-Repo:git rev-parse --show-toplevelliefert einen Pfad, dessen Basename auf-Tendet → das ist die Wurzel. - Sonst über
_class:readlink -fauf_class(immer auflösen —~/rist selbst ein Symlink aufrepos/georgernstgraf/); das Ziel hat die Form/…/GRG-<FACH>/<kohorte>→-T-Wurzel ist das Schwesterverzeichnis/…/GRG-<FACH>-T, die Kohorte ist der Basename des Ziels. - Sonst: STOPP und den User fragen (kein Raten).
Zielordner: <T-Wurzel>/<kohorte>/<YYYY-MM-DD>_<slug>/
(z. B. ~/r/GRG-WMC-T/3aaif/2026-11-08_repokontrolle/)
<YYYY-MM-DD>= heutiges Datum des Laufs.<slug>= kurzer Lauf-Bezeichner (z. B.repos,repokontrolle); aus dem User-Auftrag ableiten, sonstrepograde.- Ordner bei Bedarf anlegen (
mkdir -p) — ein neuer Semester-/Lauf-Ordner ist der Normalfall, kein Fehler.
Vor dem ersten Schreibzugriff läuft ein Probelauf (read-only): der
aufgelöste -T-Ordner, der Zielordner und die geplante Dateiliste werden
angezeigt; es wird nichts angelegt und nichts geschrieben. Erst danach wird
gearbeitet.
Die Schüler-Repos bleiben im CWD und werden nur gelesen. roster.tsv ist eine
Zwischendatei und landet unter /tmp/opencode/ (nicht im Lauf-Ordner, nicht im
Commit). Committet wird am Ende im -T-Repo (siehe Commit-Protokoll).
Input
Arguments are inferred from the user's request. Parse the user message to determine the mode:
| User provides | Mode |
|---|---|
| Nothing (just "grade" or similar) | Bulk mode, all commits |
| Repository path only | Single-repo, all commits |
| Date only (ISO format YYYY-MM-DD) | Bulk mode, filtered commits |
| Date + repository path | Single-repo, filtered commits |
Date Validation
If a date argument is detected, it MUST strictly follow ISO 8601:
YYYY-MM-DD
Valid: 2025-03-15, 2024-12-01
Invalid: 2025-3-15, 15-03-2025, 2025/03/15, 2025-03
If the date is invalid, STOP IMMEDIATELY with error: "Invalid date format: '[input]'. Expected ISO date format: YYYY-MM-DD (e.g., 2025-03-15)"
Date Filtering Logic
When a date is provided:
- Parse the cutoff date as
YYYY-MM-DDT00:00:00(midnight at start of day). - Only inspect commits where
commit_date >= cutoff_date. - Use
git log --after="YYYY-MM-DD"to filter commits. - An assignment is RELEVANT if its date is on or after the cutoff, or if it spans a period that includes the cutoff.
Plan Presentation (MANDATORY)
Before starting any grading work, present a plan to the user. The plan MUST include:
- Mode: Single-repo or Bulk mode.
- Date filter: If applicable, show the cutoff date; otherwise "All commits".
- Assignments discovered: List all assignments found (date, topic,
source location). This requires running the full
grading-sharedAssignment Discovery Protocol first. - Repositories to grade:
- Single-repo: show the path and basename (or resolved symlink name if available).
- Bulk: list all discovered student repositories (resolved student name from symlink where available, otherwise basename), with count.
- Zielordner im
-T-Repo: the resolved-Troot, the run folder<kohorte>/<YYYY-MM-DD>_<slug>/and whether it already exists (Probelauf, read-only — see Zielordner section). - Anrede: the word read from
<kohorte>/anrede.txt(Du/Sie); missing file stops the run. - Output files that will be generated (inside the run folder):
- Single-repo:
<basename>_grading.md,<basename>_email.json,<basename>_points.json. - Bulk: per-repo files +
GRADINGS.md+ sharedEMAIL.json+noten.tsv. - Date-filtered bulk also:
CLASS.md.
- Single-repo:
Display this plan and proceed immediately without waiting for confirmation.
Modes
1. Single-repo mode
Use this mode when a repository path is provided (with or without a date).
Protocol:
- Treat the repository path as provided verbatim.
- Navigate to the student repository.
- Follow the
grading-sharedPre-Grading Verification. - Derive the output stem from
basenameof the repository path. - Discover assignments using the
grading-sharedAssignment Discovery Protocol and build a unified assignment list. If no assignment is found, stop immediately. (Assignment files are NEVER inside the student repository.) - If a date filter is active, filter commits to only those at or after the cutoff date.
- Follow the
grading-sharedRepository Analysis Protocol to inspect the repository history and actual commit content, not just commit messages. - Evaluate work against the assignment periods and produce an updated grading result in German.
- Do not write
INDIVIDUAL.md. - Do not write
CLASS.md. - Do not modify shared
EMAIL.json. - Generate
<basename>_grading.mdas the repository grading report in German (inside the-Trun folder). - Generate
<basename>_email.jsonas a JSON array with exactly one object, followinggrading-sharedEmail JSON Structure and Email Body Format, using German body text. - Generate
<basename>_points.jsonas the points sidecar (seegrading-sharedNoten-TSV) — one object withname,kind: "homework",klasseandassignments[{from, to, label, max, points}].
2. Bulk mode
Use this mode when no repository path is provided (with or without a date).
Protocol:
- Discover student repositories following
grading-sharedRepository Structure Discovery, Student Name Resolution via Symlinks, and Bulk Grading Protocol directory exclusion rules. Each student repo's git working directory may be one level deeper than the student directory. Broken name-symlinks are NOT an error and NOT skipped: they mark students without a submitted repository URL and are graded as no-repository cases (see No-Repository Students below). - Follow the
grading-sharedBulk Grading Protocol for concurrency (default max 5, ~3 second delay between runs). - Each subagent writes only
<basename>_grading.md,<basename>_email.jsonand<basename>_points.jsonin German, followinggrading-sharedEmail JSON Structure, JSON Escaping Rules, and Email Body Format, and the points-sidecar schema of the Noten-TSV section. Subagents MUST use the exact*_grading.mdsection headings and order defined in REPORT-FORMAT.md. They MUST NOT produce free-form reports with different lengths or different structures per student. - Subagents must never write shared
EMAIL.jsonand never writenoten.tsv. - Continue until all repositories are processed.
- After all subagents finish:
- Generate
GRADINGS.mdin German with class-wide overview table. - If a date filter is active, also generate
CLASS.mdin German. - Aggregate per-repo
*_email.jsonfiles into sharedEMAIL.jsonfollowinggrading-sharedrules, including JSON Escaping Rules. - Build
noten.tsv(see below).
- Generate
- Commit and push the run folder in the
-Trepo (see Commit-Protokoll).
2b. Noten-TSV und Commit (nach der Aggregation)
-
Roster beschaffen:
wu lesson <KLASSE/FACH> roster > /tmp/opencode/roster.tsv(Fach aus der_class-Adresse, z. B._class -> GRG-WMC/3aaif→wu lesson 3aaif/wmc roster). Schlägtwufehl: STOPP mit deutscher Meldung. -
Probelauf (read-only, Pflicht):
~/.opencode/skills/grading-shared/emit-grade-tsv.py --roster /tmp/opencode/roster.tsvDie Tabelle dem User zeigen.
-
Erst danach schreiben:
… emit-grade-tsv.py --roster /tmp/opencode/roster.tsv --write(ergibtnoten.tsvim Lauf-Ordner). -
roster.tsvist nur ein Zwischenprodukt und wird nicht committet. -
Commit-Protokoll: im
-T-Repo alle Ausgaben des Lauf-Ordners committen und pushen — deutsche Commit-Message nach der Repo-Konvention mit Issue-Nummer, z. B.Abgaben 3AAIF 2026-11-01: Bewertungen, E-Mails und Noten-TSV (#12). Ist keine Issue-Nummer bekannt, beim User nachfragen statt raten. Niemals im öffentlichen Teaching-Repo committen.
3. No-Repository Students (Broken Name-Symlinks)
A broken name-symlink in the CWD marks a student who has not yet submitted
their repository URL. Per grading-shared Broken Name-Symlinks (Missing
Repository):
- Treat the student as a normal grading case (never stop, never skip).
- Grade without evidence: ALL Abgaben 0%,
Endbewertung: 0/100. - Generate
<name>_grading.md(mandatory structure, every section explicitly stating "kein Repository — keine Evidence"), a<name>_email.jsonwhose body follows the Missing Repository Emphasis variant (the URL submission is REQUIRED for a positive assessment), and a<name>_points.jsonwith 0 points for every Abgabe. - Include the student in
GRADINGS.md(0/100) and in the sharedEMAIL.json. - Skip all git commands and the Pre-Grading Verification for these students.
Assignment Matching
After repository analysis, map the detected work onto the unified assignment list.
Step-by-Step Matching Process
-
Parse ALL assignment entries from the unified list.
-
Match commits to assignments:
- For each commit, determine which assignment it relates to.
- Use commit date + content to identify the relevant assignment period.
- A commit dated
2026-02-20likely belongs to an assignment dated2026-02-18.
-
Build completion status for ALL assignments:
- List all assignments in the unified list.
- Mark each as completed or missing.
Matching with Date Filter
When a cutoff date is active:
| Cutoff Date | Assignment Date | Match? | Reason |
|---|---|---|---|
| 2026-02-10 | 2026-02-18 | YES | Assignment given after cutoff |
| 2026-02-10 | 2026-02-05 | NO | Assignment before cutoff period |
| 2026-02-10 | 2026-02-10 | YES | Exact match |
| 2026-02-10 | 2026-03-01 | YES | Assignment within grading period |
Important Considerations
- Parse ALL entries before matching — never stop at the first entry.
- Convert all dates to ISO format — use the same format for comparison.
- Include assignments from the cutoff date onwards — not just commits.
- Clearly indicate in the report whether grading covers all commits or from a specific date onwards.
- Base judgments on actual code and text changes, not only on commit messages.
Bewertung pro Abgabe (CRITICAL)
Jede Abgabe zählt 100 Basispunkte. Bei N Abgaben sind maximal
N × 100 Prozentpunkte erreichbar. Die Endbewertung in /100 ergibt sich
aus erreichte_Punkte / max_Punkte × 100.
Zwei Werte pro Abgabe
Für jede Abgabe werden zwei Werte ermittelt:
- Quality (0–100%): Inhaltliche Bewertung — Korrektheit, Struktur, Vollständigkeit, technisches Verständnis. 0% wenn keine Abgabe erkennbar.
- Factor (Pünktlichkeit): 1.0 (pünktlich) oder 0.75 (verspätet), gemäß
grading-sharedDeadline Calculation.
effective_score = Quality × Factor
Scoring Table (MANDATORY in every report and every email)
Jeder *_grading.md-Report und jede *_email.json MUSS exakt diese
Scoring-Tabelle enthalten.
Format in *_grading.md (Markdown-Tabelle):
| Abgabe | Thema | Quality | Factor | Effective |
|--------|-------|---------|--------|-----------|
| 1 | [Thema] | 80% | 1.0 | 80% |
| 2 | [Thema] | 70% | 0.75 | 52.5% |
| 3 | [Thema] | — | — | 0% |
Format in *_email.json body (ASCII):
Abgabe 1 [Thema]: 80% (pünktlich) -> 80 Punkte
Abgabe 2 [Thema]: 70% (verspätet, daher 25% Abzug) -> 52.5 Punkte
Abgabe 3 [Thema]: nicht abgegeben -> 0 Punkte
Gesamtbewertung
erreichte_Punkte = sum(effective_score_i)
max_Punkte = Anzahl_Abgaben × 100
Endbewertung = round(erreichte_Punkte / max_Punkte × 100)
Beispiel: Fünf Abgaben, max. 500 Punkte:
| Abgabe | Thema | Quality | Factor | Effective |
|---|---|---|---|---|
| 1 | Hono REST-API | 80% | 1.0 | 80% |
| 2 | Fetch Response | 70% | 0.75 | 52.5% |
| 3 | Promises | 90% | 1.0 | 90% |
| 4 | Transpile | — | — | 0% |
| 5 | KI-Provider | 60% | 1.0 | 60% |
Erreichte Punkte: 80 + 52.5 + 90 + 0 + 60 = 282.5 / 500 Endbewertung: 57/100 (57%)
Abdeckungsquote (informativ)
Abdeckungsquote = (Anzahl Abgaben mit Quality > 0%) / Anzahl_Abgaben × 100
Nicht abgegeben = 0%, abgegeben (auch verspätet) zählt für die Quote. Die Abdeckungsquote ist rein informativ; sie geht NICHT zusätzlich in die Endbewertung ein (fehlende Abgaben sind bereits mit 0% eingerechnet).
Edge Cases
- No assignments in period: Report clearly, grade based on available work only.
- Empty repository: Alle Abgaben 0% → Endbewertung 0/100.
- Broken name-symlink (kein Repository): alle Abgaben 0% → Endbewertung
0/100; E-Mail mit Missing Repository Emphasis (Pflicht) — siehe
grading-sharedBroken Name-Symlinks. - Late submissions: Automatic 0.75 factor applied REGARDLESS of how late the submission is (no graduated penalty); noted explicitly in every relevant row of the scoring table.
- Deadline: gemäß
grading-sharedDeadline Calculation — nächste UE nach dem Aufgabendatum (via wu) bzw. eine explizite Deadline im Aufgabetext.
Outputs
All outputs are written into the -T run folder
<T-Wurzel>/<kohorte>/<YYYY-MM-DD>_<slug>/ (see Zielordner section).
Single-repo mode
<basename>_grading.mdin German.<basename>_email.jsonas a one-entry JSON array followinggrading-sharedrules and Email Body Format, with German body text.<basename>_points.jsonas the points sidecar.
Bulk mode (all commits)
- Per-repository
<basename>_grading.mdfiles in German. - Per-repository
<basename>_email.jsonfiles followinggrading-sharedrules and Email Body Format, with German body text. - Per-repository
<basename>_points.jsonpoints sidecars. GRADINGS.mdwith class-wide overview table in German.noten.tsvas the Google-Doc import table (probelauf first, then written).- Shared
EMAIL.json, created only after all per-repo outputs are finished.
Bulk mode (date-filtered)
- Per-repository
<basename>_grading.mdfiles in German. - Per-repository
<basename>_email.jsonfiles followinggrading-sharedrules and Email Body Format, with German body text. - Per-repository
<basename>_points.jsonpoints sidecars. GRADINGS.mdwith class-wide overview table in German (includes cutoff date in header).CLASS.mdwith anonymized class-wide patterns and teacher recommendations in German.noten.tsvas the Google-Doc import table.- Shared
EMAIL.json, created only after all per-repo outputs are finished.
GRADINGS.md Generation (Bulk Mode Only)
After all per-repository grading is complete in bulk mode, generate GRADINGS.md
as a class-wide overview table.
Content Requirements
GRADINGS.md MUST include:
- A table with columns for student identifier (repository basename or name) and
final score (
Endbewertung). - Ordered alphabetically by student name, NOT by grade.
- Written in German.
- If date-filtered, include the cutoff date in the header.
Example Structure
# Bewertungen
| Name | Endbewertung |
|------|-------------|
| Huber Maria | 85/100 |
| Maier Thomas | 72/100 |
| Schmidt Anna | 91/100 |
CLASS.md Generation (Date-Filtered Bulk Mode Only)
When a date filter is active in bulk mode, also generate CLASS.md as an
anonymized class summary for the teacher.
Content Requirements
CLASS.md MUST include:
- Overview: Summary of the grading period (cutoff date, number of repositories graded).
- Common Patterns: Frequently observed strengths across submissions.
- Common Weaknesses: Recurring issues or mistakes.
- Assignment Completion Statistics: Aggregate completion ratios.
- Teacher Recommendations: Actionable suggestions for addressing issues.
Anonymity Rules
- NEVER include student names or repository names that identify individuals.
- Use generic terms in German: "einige Schüler", "viele Abgaben", "vereinzelt".
- Focus on patterns, not individuals.
- This file may be committed to a public repository.
Reporting Expectations
The mandatory *_grading.md structure, its section-content requirements, and
the subagent standardization rules are in REPORT-FORMAT.md.
Email Body
Every <basename>_email.json body MUST follow the grading-shared Email Body
Format section exactly: plain ASCII text with code blocks as the only allowed
Markdown, structured per the assignment grading email template, with subtle
praise per the Praise Guidelines. All text MUST be in German.
Additionally, every repograde email body MUST summarize the following in the same fixed structure for every student:
- greeting,
- automatic assessment disclaimer paragraph,
- grading period opening,
- commit activity summary,
- Abgaben-Übersicht (
Abgabe 1: …,Abgabe 2: …), - Bewertungs-Absätze pro Abgabe — each ending with
Bewertung: XX%and, if late,(verspätet, daher 25% Abzug auf den erreichten Wert), - scoring table (ASCII format per Bewertung pro Abgabe),
- Erreichte Punkte and Endbewertung summary,
- closing.
Within that fixed order, ensure that the combined Abgaben-Bewertung and scoring paragraphs clearly communicate code quality, missing work, lateness, and the final result. The Quality%, Factor, and Effective score of every Abgabe MUST all be visible per the Scoring Table format.
Do not vary this structure between students. For students WITHOUT a
repository (broken name-symlink), the Missing Repository Emphasis variant
replaces paragraph groups 3–6 (see grading-shared Email Body Format).
Constraints
- The grading work directory (typically
~/gits/<kohorte>-<fach>/) must NOT itself be inside a Git repository. All outputs go to the-Trepo instead. - This skill must NOT clone student repositories; use
git pullto update. - If uncommitted changes exist in any student repository, STOP IMMEDIATELY.
- If a date is provided and invalid, STOP IMMEDIATELY.
- Never commit student repositories or modify their history. The
-Trepo IS committed (see Commit-Protokoll) — that is the only commit this skill makes. - All grading content follows
grading-sharedrules (German, second-person, UTF-8 umlauts, email structure, email body format, missing email handling). - In single-repo mode, stop if no assignment source is found.
- In single-repo mode, a provided repository path that is a broken symlink is graded as a no-repository case (see No-Repository Students), not an error.
- In single-repo mode, never write
INDIVIDUAL.md,CLASS.md, or sharedEMAIL.json. - In bulk mode, generate
GRADINGS.mdafter all per-repo grading is complete. - In date-filtered bulk mode, also generate
CLASS.md. - In bulk mode, generate shared
EMAIL.jsononly after all per-repo outputs are complete. - Run
emit-grade-tsv.pyin dry-run mode first and show the table; writenoten.tsvonly with--write. - Stop immediately when
<kohorte>/anrede.txtis missing or invalid (grading-sharedAnrede-Gate). - Use proper quoting for paths with spaces.
- Present the plan to the user BEFORE starting any grading work.
- Use pure AI evaluation for all grading; never write grading scripts. The sub-agent fan-out in bulk mode handles parallelism — do not write batch processing scripts or evaluation programs.
Done when
- [ ] Plan presented before any grading work: mode, date filter, assignments,
repositories,
-Trun folder (read-only Probelauf) and the Anrede source. - [ ]
anrede.txtread viaread-anrede.sh; a missing or invalid file stopped the run before the first write. - [ ] Scoring table with Quality, Factor and Effective per Abgabe present in
every
*_grading.mdand every email body. - [ ] Single-repo mode:
<basename>_grading.md,<basename>_email.jsonand<basename>_points.jsonwritten in the-Trun folder. - [ ] Bulk mode: per-repo files plus
GRADINGS.md, sharedEMAIL.jsonandnoten.tsv(dry-run table shown first,--writeonly after) generated once the last subagent finished. - [ ] Date-filtered bulk mode additionally produced
CLASS.mdwithout student names. - [ ] No-repository students (broken name-symlinks) graded 0/100 with the Missing Repository Emphasis email, not skipped.
- [ ] Student repositories read-only: no commit, no history change, no clone;
only the run folder committed and pushed in the
-Trepo.
04 同仓库更多 Skills
teach
Teach the user a new skill or concept, within this workspace.
sync-upstream-skills
Re-transplant owned skills from their mattpocock upstream after a git pull, applying upstream content changes while preserving opencode-native frontmatter. Also checks for duplicate skill names and dangling cross-skill references. Use when the user says "sync skills", "refresh from upstream", "pull matt's skills", "sync upstream", "update the transplanted skills", or wants to bring the owned transplanted skills up to date. Do not use to add or rename a transplanted skill — that stays manual.
projectgrade
Grade student project repositories based on Git commits, GitHub Issues, and Pull Requests. Use when the user says "projectgrade", "grade the project", "bewerte das Projekt", "Projektarbeit benoten", or asks for a holistic grading of a collaborative repository from inside it, based on commits, issues, reviews and PRs. Do not use for per-lesson assignments (use repograde) or for knowledge-check exams (use knowledge-assessment).
lehrplan
Richtet österreichische HTL-Unterrichts-Repositorien ein und pflegt sie — drei Kernaufgaben: das gesetzliche Lehrplan-Material eines Ausbildungszweigs (z. B. WII, WIT, KIF) aus dem RIS beschaffen inklusive jährlichem Novellen-Check, den Lehrplan eines konkreten Gegenstands aus dem Gesetz extrahieren (mit Erläuterung pro Lernziel: was der Inhalt tatsächlich IST, plus praktische Anwendungen), und Semesterpläne interaktiv entwerfen. Use when der Nutzer 'Lehrplan', 'Unterrichtsvorbereitung prüfen', 'Lehrplan auf Novellen prüfen', 'RIS sync', 'Gesetzesmaterial holen', 'Lehrplan extrahieren', 'Jahrespläne neu ziehen', 'Erläuterungen ergänzen', 'Semesterplan erstellen/überarbeiten' oder 'Einheiten erstellen' sagt, oder wenn in einem Repo gearbeitet wird, das der lehrplan/-Konvention folgt. Do not use for Prepared Lessons (create-lesson), Aufgaben im Kohortenordner (homework) oder Wissensüberprüfungen (knowledge-exam).
knowledge-persistence
Persist session context into the structured docs/ai knowledge files (OKF bundle; committed and pushed at the end). Use when the user says "remember", "merk dir das", "save context", "persist knowledge" or "update knowledge file", at a session checkpoint, or when an observation in this session contradicts docs/ai/ or AGENTS.md. Do not use for reading the knowledge files at session start — that is plain bootstrapping.
knowledge-exam
Generate German knowledge-check exams and solution files from the taught material (class Git history + WebUntis Lehrstoff). Use when the user says "Wissensüberprüfung erstellen", "Knowledge-Check generieren", "Prüfung schreiben", "create the knowledge check", "generate a mini-exam" or "make the exam for class X", or asks for exam questions plus solutions from what was actually taught. Do not use for grading submissions (knowledge-assessment) or for assignments in the class folder (homework).