Skip to content

Commit f031558

Browse files
committed
Harden human-first curriculum and assessments
1 parent a5869c5 commit f031558

28 files changed

Lines changed: 19775 additions & 5156 deletions

‎.gitignore‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,8 @@ __pycache__/
44
.ruff_cache/
55
python_path.db*
66
*.pyc
7+
graphify-out/.graphify_*
8+
graphify-out/cache/
9+
graphify-out/cost.json
10+
graphify-out/manifest.json
11+
graphify-out/memory/

‎CONTRIBUTING.md‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,12 @@ uv run pytest -q
2424
- У урока есть лестница от примера и прогноза к воспроизведению, Parsons/изменению и обязательному коду.
2525
- Ни теория, ни отвлекающие варианты, ни заготовка, ни подсказка, ни скрытый тест не используют инструмент до вводящего урока.
2626
- Кодовые задания должны быть короткими, детерминированными и совместимыми с учебным раннером.
27-
- Финальное задание комбинирует текущую тему только с уже знакомыми навыками и проверяет минимум два сценария, когда это возможно.
27+
- Каждая Python-карточка теории должна быть самодостаточной и явно указывать ожидаемый консольный вывод, включая пустой вывод для определений и присваиваний.
28+
- Финальное задание комбинирует текущую тему только с уже знакомыми навыками и проверяет минимум два поведенческих сценария. 108 тематических заданий расширенной части и все проекты хранят исполняемый эталон для CI в `reference_solution`; он должен проходить все сценарии и никогда не отдаётся публичным API.
29+
- Структурный `source`-тест допустим только вместе с поведенческими проверками, когда конкретная форма входит в цель урока.
2830
- Не добавляйте большие заимствованные фрагменты чужих курсов. Пересказывайте идеи своими словами и ссылайтесь на первоисточник в PR.
2931

30-
Полный норматив и чек-лист автора находятся в [docs/LEARNING_DESIGN.md](docs/LEARNING_DESIGN.md). Любое изменение контента должно сохранять пустой результат `audit_learning_pipeline(LESSONS)`; это проверяется тестами CI.
32+
Полный норматив и чек-лист автора находятся в [docs/LEARNING_DESIGN.md](docs/LEARNING_DESIGN.md). Любое изменение контента должно сохранять пустой результат `audit_learning_pipeline(LESSONS)`, `audit_projects(PROJECTS, LESSONS)` и `audit_exam_coverage(EXAMS, LESSONS, QUESTION_BY_ID)`; это проверяется тестами CI.
3133

3234
## Коммиты и PR
3335

‎README.md‎

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ Python Path делает обучение практичным и последо
1111

1212
| | Сейчас в курсе |
1313
| --- | --- |
14-
| 📚 Программа | **32 раздела · 151 урок · 585 заданий** |
14+
| 📚 Программа | **32 раздела · 151 урок · 585 заданий · 32 экзамена** |
1515
| 🧠 Практика | Извлечение из памяти, интервалы 1/3/7/14/30, смешанные серии и исправление ошибок |
16+
| 🛠️ Проекты | **15 инструментов** от открытки до менеджера задач |
1617
| 🏆 Мотивация | XP, звёзды, стрик, достижения, повторение ошибок |
1718
| 📱 Интерфейс | Адаптивный, без фронтенд-сборки |
1819
| ⚙️ Технологии | FastAPI · SQLite · vanilla JavaScript · uv |
@@ -44,7 +45,7 @@ uv run uvicorn app.main:app --host 0.0.0.0 --port 8000
4445
2. Строки, модули, файлы, JSON/CSV, исключения и ООП.
4546
3. Типы, стандартная библиотека, регулярные выражения, тесты и Git.
4647
4. CLI, окружения, HTTP/API, SQL, параллельность и async.
47-
5. Четыре выпускных мини-проекта: задачи, заметки, API-клиент и релиз приложения.
48+
5. Выпускной блок: менеджер задач, заметки, API-клиент и подготовка приложения к релизу.
4849

4950
Перед основным курсом есть «Спокойный старт» из 20 микроуроков: `print`, строки, переменные, типы, `len`, f-строки, `input`, преобразования и строковые методы — без перегрузки несколькими новыми идеями сразу. Пороговые темы тоже раздроблены: отдельно изучаются `if`/`else`, цикл/накопитель, `while`/`break`, вызов/параметр/`return`, список/`append`, `split`, `sum`, словарь и множество.
5051

@@ -54,17 +55,17 @@ uv run uvicorn app.main:app --host 0.0.0.0 --port 8000
5455

5556
- Каждый урок содержит подробную теорию, исполняемые примеры с выводом и переход от узнавания к самостоятельному коду.
5657
- Используются выбор, свободное воспроизведение, Parsons-блоки, код и накопительные финальные задачи.
57-
- Подсказки исчезают постепенно: направление → план → почти готовая форма.
58-
- Следующий урок открывается после успешного прохождения предыдущего.
59-
- Урок нельзя сдать, пропустив обязательный код; контрольная точка требует 70% и практические задания.
58+
- Подсказки открываются постепенно: направление → инструмент → алгоритм → почти готовая форма. Последняя доступна только после своей попытки, а решение с подсказкой не считается самостоятельным повторением.
59+
- Если забыл точное имя, каждое задание с редактором даёт справочник нужных уже изученных функций, методов и конструкций с формой вызова, объяснением и нейтральным примером.
60+
- Урок нельзя сдать, пропустив обязательный код; порог урока — 75%. Новый раздел откроется только после экзамена предыдущего. В экзамене код получает отдельный, ранее не показанный поведенческий сценарий и может быть написан любым эквивалентным способом.
6061
- Практика берёт только завершённые уроки, чередует форматы и распределяет повторения по интервалам 1/3/7/14/30 дней.
6162
- Ошибка попадает в мягкий режим повторения и исчезает из слабых мест после двух последовательных верных решений.
62-
- Код проверяется в изолированном Python-процессе с AST-фильтром и двухсекундным лимитом.
63+
- Код проверяется в отдельном Python-процессе с AST-фильтром и двухсекундным лимитом. Доступны виртуальные файлы, SQLite, `argparse`, async, очереди и до четырёх потоков.
6364
- `input()` работает через безопасный симулятор: ответы вводятся под редактором, по одной строке для каждого вызова.
6465
- Вкладка «Песочница» даёт свободный редактор с историей запусков и консолью: можно экспериментировать без проверки задания.
6566
- После сдачи урока и серии практики показывается реальный консольный вывод выполненного кода.
66-
- В разделе «Проекты» есть шесть мини-инструментов: они открываются по конкретным prerequisite-урокам и проверяются на нескольких входных сценариях.
67-
- Curriculum-linter проверяет метаданные, скрытые тесты и запрет незнакомых конструкций до объяснения.
67+
- В разделе «Проекты» есть 15 инструментов: они открываются по конкретным prerequisite-урокам и проверяются на нескольких сценариях.
68+
- Curriculum-linter проверяет метаданные, все видимые поверхности, эталонные решения, скрытые тесты и запрет незнакомых конструкций до объяснения.
6869
- Один пользователь, локальный SQLite: можно заниматься без регистрации и облака.
6970

7071
## Как устроена практика
@@ -76,7 +77,7 @@ uv run uvicorn app.main:app --host 0.0.0.0 --port 8000
7677
3. **Смешанная серия** — чередовать выбор, воспроизведение, Parsons и код из разных изученных тем.
7778
4. **Выбранный раздел** — тренировать все завершённые уроки раздела, а не только последний.
7879

79-
У каждого задания есть план решения, а после серии показывается результат и понятный следующий шаг.
80+
У каждого кодового задания есть план решения и тот же справочник инструментов, что в уроке: практика не требует помнить наизусть, что `.lower()` меняет регистр, `.split()` возвращает список, а `.get()` умеет дать запасное значение. После серии показывается результат и понятный следующий шаг.
8081

8182
## Личный прогресс и тесты
8283

@@ -99,9 +100,12 @@ uv run pytest -q
99100
app/
100101
main.py # FastAPI-приложение и JSON API
101102
content.py # базовые уроки и объединение программы
103+
gentle_start.py # первые 19 коротких уроков без перегрузки
102104
foundation_expansion.py # плавные микроуроки и накопительные задачи
103105
extended_curriculum.py # 108 уроков расширенной части
106+
advanced_practice.py # 108 уникальных тематических кодовых заданий
104107
learning_design.py # метаданные, интервалы и curriculum-linter
108+
projects.py # 15 проектов и их исполняемые спецификации
105109
evaluator.py # проверка ответов и учебного кода
106110
db.py # SQLite-прогресс
107111
static/ # адаптивный интерфейс

‎SECURITY.md‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22

33
## Учебный раннер
44

5-
Python Path выполняет только короткий код для учебных задач. Перед запуском код проверяется по AST, импорт ограничивается allowlist, а файлы доступны только через временную виртуальную папку (`open`/безопасный `pathlib`). Выполнение идёт отдельным Python-процессом с ограниченным набором встроенных функций и завершается по таймауту. Системные, процессные и произвольные сетевые операции закрыты.
5+
Python Path выполняет только короткий код для учебных задач. Перед запуском код проверяется по AST, импорт ограничивается allowlist, а выполнение идёт отдельным Python-процессом с ограниченным набором builtin-функций и двухсекундным таймаутом.
6+
7+
Учебные `open()`, `pathlib.Path` и SQLite перенаправлены в одну временную папку; SQLite запрещает `ATTACH`, загрузку расширений и файловые функции. `argparse` не читает аргументы из файлов, `sys` отдаёт только безопасные учебные поля, а одновременно можно запустить не более четырёх потоков. Дочерние процессы, произвольные сетевые операции и доступ к хостовым файлам закрыты.
68

79
Это снижает риск для локального тренажёра, но не заменяет инфраструктурную изоляцию. Не размещайте текущую версию как публичный сервис, в котором чужие пользователи могут исполнять произвольный код.
810

0 commit comments

Comments
 (0)