Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
de4dd92
Add score extraction from CI logs
claude Dec 3, 2025
ad7d23c
Update fundamental-statistics-2025.yaml
markpolyak Dec 3, 2025
97dc8dd
Update fundamental-statistics-2025.yaml
markpolyak Dec 3, 2025
7bad787
Add comprehensive documentation for score extraction feature
claude Dec 3, 2025
056f235
Fix score extraction pattern for flexible whitespace matching
claude Dec 3, 2025
f8036cf
Add comprehensive debug logging for score extraction
claude Dec 3, 2025
9303bc1
Add diagnostic logging to detect missing Python script output
claude Dec 3, 2025
170d59a
Fix score extraction pattern matching issue
claude Dec 3, 2025
2b60184
Add detailed encoding and pattern matching diagnostics
claude Dec 3, 2025
5f8c1d6
Fix score extraction pattern matching issue
claude Dec 3, 2025
07e74ed
Update fundamental-statistics-2025.yaml
markpolyak Dec 3, 2025
ed5e2bc
Remove excessive debug logging from score extraction
claude Dec 3, 2025
1380148
Add comprehensive course configuration documentation
claude Dec 3, 2025
b96b49e
Update fundamental-statistics-2025.yaml
markpolyak Dec 3, 2025
6570a19
Fix penalty calculation for deadlines without time
claude Dec 3, 2025
5bf6357
Update fundamental-statistics-2025.yaml
markpolyak Dec 10, 2025
0dc5a50
Create machine-learning-2025.yaml
markpolyak Dec 10, 2025
74a3fa0
Update index.yaml
markpolyak Dec 10, 2025
d39e9ae
Add files via upload
markpolyak Dec 10, 2025
1239a78
Update index.yaml
markpolyak Dec 10, 2025
f24f7e3
Update fundamental-statistics-2025.yaml
markpolyak Dec 10, 2025
237bef2
Update machine-learning-2025.yaml
markpolyak Dec 10, 2025
09b1f49
Add archived courses feature to frontend
claude Dec 10, 2025
9087b4c
Redesign course status toggle UI for better UX
claude Dec 11, 2025
726f551
Move course status toggle lower to avoid overlap with admin button
claude Dec 11, 2025
7633443
Fix language selector dropdown z-index to appear above all buttons
claude Dec 11, 2025
ef6c1e4
Add disablePortal to language selector to fix z-index issues
claude Dec 11, 2025
e4f07f5
Update fundamental-statistics-2025.yaml
markpolyak Dec 16, 2025
94fdc51
Update operating-systems-2025.yaml
markpolyak Dec 22, 2025
9c9c04c
Update fundamental-statistics-2025.yaml
markpolyak Dec 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 16 additions & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ See `docs/PROJECT_DESCRIPTION.md` for full project documentation.

- **Backend**: Single file `main.py` (FastAPI monolith, ~750 LOC)
- **Frontend**: `frontend/courses-front/` (React 19 + Vite)
- **Courses**: `courses/index.yaml` + individual YAML files
- **Courses**: `courses/index.yaml` + individual YAML files (see `docs/COURSE_CONFIG.md` for all options)
- **Tests**: `tests/` (pytest)

### Development Commands
Expand Down Expand Up @@ -60,7 +60,10 @@ LOG_LEVEL=INFO # Logging level (optional)
- **Success**: `v` written to Google Sheets
- **Failure**: `x` written to Google Sheets
- **With penalty**: `v-{n}` where n = penalty points
- **With score**: `v@{score}` where score = points earned (e.g., `v@10.5` or `v@10,5`)
- **With score and penalty**: `v@{score}-{n}` (e.g., `v@10.5-3` or `v@10,5-3`)
- **Protection**: Can only overwrite empty cells, `x`, or cells starting with `?`
- **Decimal separator**: Automatically detected from Google Sheets locale settings

### Lab Config Structure (course YAML)

Expand All @@ -79,8 +82,20 @@ labs:
- cpplint
files: # Required files in repo
- lab2.cpp
score: # Optional: Extract score from logs
patterns: # List of regex patterns (tried in order)
- '##\[notice\]Points\s+(\d+(?:[.,]\d+)?)/\d+' # e.g., "##[notice]Points 10/10" -> 10
- 'Score\s+is\s+(\d+(?:[.,]\d+)?)' # e.g., "Score is 10.5" -> 10.5
- 'Total:\s+(\d+(?:[.,]\d+)?)' # e.g., "Total: 10" -> 10
```

**Score extraction notes:**
- Patterns are regex with first capturing group = score value
- Accepts both `.` and `,` as decimal separator in logs
- Output format matches Google Sheets locale (e.g., `10.5` for en_US, `10,5` for ru_RU)
- If score patterns configured but not found in logs → error
- If score patterns not configured → no score extraction (backward compatible)

## CI/CD

- **Tests**: Run on every push via `.github/workflows/tests.yml`
Expand Down
68 changes: 64 additions & 4 deletions courses/fundamental-statistics-2025.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ course:
- ОснСтат
semester: Осень 2025
university: ИТМО
email: k43guap@ya.ru
email: mdpoliak@itmo.ru
timezone: UTC+3
github:
organization: itmo-fs-2025
Expand All @@ -35,6 +35,11 @@ course:
short-name: ДЗ0
penalty-max: 5
ignore-task-id: True
# score:
# patterns:
# - '##\[notice\]Points\s+(\d+(?:[.,]\d+)?)/\d+' # "##[notice]Points 10/10" -> 10
# - 'Score\s+is\s+(\d+(?:[.,]\d+)?)' # "Score is 10.5" -> 10.5
# - 'Total:\s+(\d+(?:[.,]\d+)?)' # "Total: 10" -> 10
ci:
- workflows
files:
Expand All @@ -54,9 +59,16 @@ course:
"1":
github-prefix: fs-lab1
short-name: ДЗ1
# taskid-max: 25
ignore-task-id: True
penalty-max: 6
taskid-max: 10
# ignore-task-id: True
penalty-max: 5
score:
patterns:
- 'ПРЕДВАРИТЕЛЬНАЯ.*?ОЦЕНКА.*?ЖУРНАЛ:\s*(\d+(?:[.,]\d+)?)' # Гибкий паттерн для "ПРЕДВАРИТЕЛЬНАЯ ОЦЕНКА В ЖУРНАЛ: 10.0"
# - 'ИТОГО:\s*(\d+(?:[.,]\d+)?)\s*баллов' # "ИТОГО: 100 баллов" -> 100
# - '##\[notice\]Points\s+(\d+(?:[.,]\d+)?)/\d+' # "##[notice]Points 10/10" -> 10
# - 'Score\s+is\s+(\d+(?:[.,]\d+)?)' # "Score is 10.5" -> 10.5
# - 'Total:\s+(\d+(?:[.,]\d+)?)' # "Total: 10" -> 10
ci:
- workflows
files:
Expand All @@ -72,5 +84,53 @@ course:
- Результат выполнения работы
- Исходный код программы с комментариями
- Выводы
"2":
github-prefix: fs-lab2
short-name: ДЗ2
taskid-max: 10
penalty-max: 5
score:
patterns:
- 'ПРЕДВАРИТЕЛЬНАЯ.*?ОЦЕНКА.*?ЖУРНАЛ:\s*(\d+(?:[.,]\d+)?)' # Гибкий паттерн для "ПРЕДВАРИТЕЛЬНАЯ ОЦЕНКА В ЖУРНАЛ: 10.0"
ci:
- workflows
files:
- lab2_distributions.ipynb
moss:
language: python
max-matches: 100
local-path: lab2
"3":
github-prefix: fs-lab3
short-name: ДЗ3
taskid-max: 10
penalty-max: 5
score:
patterns:
- 'ПРЕДВАРИТЕЛЬНАЯ.*?ОЦЕНКА.*?ЖУРНАЛ:\s*(\d+(?:[.,]\d+)?)' # Гибкий паттерн для "ПРЕДВАРИТЕЛЬНАЯ ОЦЕНКА В ЖУРНАЛ: 10.0"
ci:
- workflows
files:
- exercises.ipynb
moss:
language: python
max-matches: 100
local-path: lab3
"4":
github-prefix: fs-lab4
short-name: ДЗ4
taskid-max: 10
penalty-max: 5
score:
patterns:
- 'ПРЕДВАРИТЕЛЬНАЯ.*?ОЦЕНКА.*?ЖУРНАЛ:\s*(\d+(?:[.,]\d+)?)' # Гибкий паттерн для "ПРЕДВАРИТЕЛЬНАЯ ОЦЕНКА В ЖУРНАЛ: 10.0"
ci:
- workflows
files:
- exercises.ipynb
moss:
language: python
max-matches: 100
local-path: lab4
misc:
requests-timeout: 5
10 changes: 8 additions & 2 deletions courses/index.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,18 @@ courses:
featured: true
logo: "/courses/logos/os-2025_logo.png"

- id: "ml-2025-spring"
- id: "mlb-2025-spring"
file: "machine-learning-basics-2025.yaml"
status: "active"
status: "archived"
priority: 90
logo: "/courses/logos/mlb-2025_logo.png"

- id: "ml-2025-autumn"
file: "machine-learning-2025.yaml"
status: "active"
priority: 90
logo: "/courses/logos/ml-2025_logo.png"

- id: "fs-2025-autumn"
file: "fundamental-statistics-2025.yaml"
status: "active"
Expand Down
Binary file added courses/logos/ml-2025_logo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
157 changes: 157 additions & 0 deletions courses/machine-learning-2025.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
---
# Configuration file for lab-grader

course:
name: Машинное обучение
alt-names:
- Машинное обучение
- МО
- Machine learning
- ML
semester: Осень 2025
university: ИТМО
email: mdpoliak@itmo.ru
timezone: UTC+3
github:
organization: itmo-ml-2025
teachers:
- "Mark Polyak"
- markpolyak
google:
spreadsheet: 13AEYDlW989lUwhIF6p3KrWlw2Iofoy2YuL55V2urIaw
info-sheet: График
task-id-column: 0
student-name-column: 1
lab-column-offset: 1
staff:
- name: Поляк Марк Дмитриевич
title: преп. практики
status: лектор
- name: Поляк Марк Дмитриевич
title: преп. практики
status: лабораторные работы
labs:
"0":
github-prefix: ml-lab0
short-name: ЛР0
penalty-max: 5
ignore-task-id: True
ci:
- workflows
files:
- goals.md
- info.md
- report.pdf
moss:
language: c
report:
- Задание
- Результат
validation:
commits:
-
filter: console
min-count: 1
"1":
github-prefix: ml-lab1
short-name: ЛР1
# taskid-max: 40
ignore-task-id: True
penalty-max: 2
ci:
workflows:
- run-autograding-tests
- Test python scripts
files:
- exercises.ipynb
moss:
language: python
max-matches: 1000
local-path: lab1
report:
- Цель работы
- Индивидуальное задание
- Описание входных данных
- Результат выполнения работы
- Исходный код программы с комментариями
- Выводы
"2":
github-prefix: ml-lab2
short-name: ЛР2
# taskid-max: 20
ignore-task-id: True
penalty-max: 2
ci:
- workflows
files:
- exercises.ipynb
moss:
language: python
max-matches: 1000
local-path: lab2
report:
- Цель работы
- Задание на лабораторную работу
- Результат выполнения работы
- Выводы
"3":
github-prefix: ml-lab3
short-name: ЛР3
# taskid-max: 20
ignore-task-id: True
penalty-max: 2
ci:
- workflows
files:
- exercises.ipynb
moss:
language: python
max-matches: 1000
local-path: lab3
report:
- Цель работы
- Задание на лабораторную работу
- Результат выполнения работы
- Выводы
"4":
github-prefix: ml-lab4
short-name: ЛР4
# taskid-max: 20
ignore-task-id: True
penalty-max: 2
ci:
- workflows
files:
- models_train.ipynb
moss:
language: python
max-matches: 1000
local-path: lab4
report:
- Цель работы
- Задание на лабораторную работу
- Результат выполнения работы
- Выводы
"5":
github-prefix: ml-lab5
short-name: ЛР5
# taskid-max: 20
ignore-task-id: True
penalty-max: 2
ci:
- workflows
files:
- models_train.ipynb
moss:
language: python
max-matches: 1000
local-path: lab5
report:
- Цель работы
- Задание на лабораторную работу
- Результат выполнения работы
- Выводы
misc:
requests-timeout: 5


6 changes: 3 additions & 3 deletions courses/operating-systems-2025.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ course:
short-name: ЛР2
taskid-max: 20
taskid-shift: 4
penalty-max: 9
penalty-max: 8
ci:
- workflows
files:
Expand Down Expand Up @@ -174,7 +174,7 @@ course:
github-prefix: os-task4
short-name: ЛР4
taskid-max: 30
penalty-max: 8
penalty-max: 7
ci:
- workflows
files:
Expand Down Expand Up @@ -204,7 +204,7 @@ course:
github-prefix: os-task5
short-name: ЛР5
taskid-max: 30
penalty-max: 10
penalty-max: 8
# ignore-completion-date: True
ci:
workflows:
Expand Down
Loading