# Гид для авторов контента — MEOW DevOps

Формат урока: Module → Lesson → Page (`code_task`).

Поля page:
- `content` — HTML (h1, p, lesson-callout, lesson-example)
- `starter_python` / `starter_sql` (в UI: стартовый код **shell**; поле БД по-прежнему `starter_sql`)
- `expected_tab` — `python` | `sql` (`sql` = вкладка shell в UI)
- `correct_answer` — точный stdout после `.strip()`

Shell VFS (см. `main.js` → `setupMockShell` и `_shell_sim.py`):
- cwd: `/home/meow`
- whoami → `meow`; hostname → `devops-lab`; uname → `Linux`
- файлы: `README.txt`, `logs/app.log`, `logs/access.log`, `/etc/hostname`, `/etc/services.txt`
- команды: `pwd`, `ls`, `cat`, `echo`, `whoami`, `hostname`, `uname`, `head -n N`, `wc -l`, `grep`, `cd`, `mkdir -p` (+ `env`/`help` в UI)

В `_lesson(...)` параметр `starter_shell=` — алиас для `starter_sql`.

Грейдинг: stdout shell без префиксов; сервер сравнивает `.strip()`.

Seed: `seed_module0.py` … `seed_module9.py` + `seed_data.py` + `soften_course`.
`FORCE_RESEED=true` — перезалить курс.

Письма: `SMTP_FROM=MEOW DevOps <noreply@…>`
