# Практикум: внедрение и поддержка компьютерных систем

Учебная симуляция. Восемь независимых работ L02–L09 по 180 минут; варианты A/B/C. L01 проходит в существующем ServiceDesk и в архив не входит. Все данные синтетические; никаких настоящих установок, резервных копий, нагрузочных тестов или изменений рабочих компьютеров.

## Запуск

Распакуйте ZIP целиком. Откройте `index.html` в современном браузере. Сборка, сервер, аккаунт, интернет и библиотеки не требуются: используются обычные локальные JS/CSS, без ES-модулей и fetch. Для Jino загрузите содержимое архива в отдельную директорию сайта так, чтобы `index.html`, `model.js`, `app.js` и `style.css` лежали рядом. Никакой публикации при подготовке архива не выполнялось.

Прямой `file://` доступ не удалось проверить в Chromium среды разработки: административная политика запрещает эту схему. Проверка настоящего браузера выполнена через временный локальный HTTP. Это ограничение проверки, а не заявленный успешный тест file://. В обычном браузере при запрете localStorage приложение продолжает работу в памяти и сообщает о необходимости экспорта; хранение для file:// зависит от браузера.

## Работа студента

1. Выберите работу слева и поле «Вариант». Каждое сочетание Lxx/A–C хранится отдельно.
2. Во вкладке «Практикум» прочитайте исходный контракт и четыре исследовательских задания. Распределение времени: 20 минут на исходное состояние, 35 на диагностику, 60 на эксперименты, 40 на повтор и контроль, 25 на доказательства и вывод.
3. Введите «Название снимка» и нажмите «Создать снимок». Меняйте один параметр, выполняйте пробу, объясняйте результат.
4. Откройте «Состояние», «Проверки» и «Журнал». «Проверить состояние» добавляет проверку в журнал и открывает её результаты. Проверки вычисляются заново из модели, без заранее записанного PASS.
5. Во вкладке «Доказательства» сохраните «Экспорт доказательств» и «Экспорт конфигурации». Первый файл предназначен для анализа, второй — для восстановления сессии. Для сдачи дополните доказательства своей гипотезой, сравнением снимков, обоснованием изменений и выводом.

«Сбросить сценарий» требует подтверждения и очищает только выбранную работу и вариант. До сброса сохраняйте экспорт. Переключение вариантов ничего не сбрасывает. Сброс не считается устранением инцидента.

## Навыки и модель

- L02: два хоста, runtime ровно 18, свободный порт, минимум 2 ГБ перед установкой. Пакет расходует 2 ГБ. Начальные сочетания неисправностей различаются между хостами и вариантами. Preflight сохраняет входы проверки. «Занять выбранный порт» моделирует конкурирующий процесс между проверкой и установкой; install вычисляет предусловия заново, отмечает stalePreflight и сохраняет отказ в raceEvidence. Проверки требуют подтверждённого отказа по устаревшему успешному preflight. «Освободить выбранный порт» снимает модельный конфликт. Повторная установка не расходует место повторно. Очищается только выделенный учебный кэш. Изменение runtime/порта останавливает службу.
- L03: три ПК, API v1 в рублях / v2 в копейках, совпадение версий клиента/API. Три разных заказа проверяют нулевую сумму, 123,45 рубля, кириллицу и переход суток при преобразовании +03:00 в UTC. Проверяется транспорт и точное содержимое, а не только HTTP 200. Адаптер может неверно отбросить время или трактовать локальное время как UTC.
- L04: UI → API → очередь → обработчик. Возможные причины: остановленный обработчик, неверный маршрут или заполненная фоновая очередь. Пробы и трасса requestId локализуют отказ. Первичная успешная обработка и успешная повторная попытка после устранения отказа записывают ui/api/queue/worker с одним requestId и attempt. Повтор уже завершённого ID записывает ui/api и явно сообщает возврат прежнего результата без очереди/обработчика; нового заказа нет. «Освободить фоновую очередь» сохраняет пользовательские заявки.
- L05: 20 детерминированных запросов на окно. p95 — отсортированная успешная выборка, ранг ceil(0.95×N), индекс ранг−1. Ошибки делятся на все запросы. По умолчанию >700 мс / >5%, два последовательных превышения одного показателя; счётчики раздельные. Алерт удерживается до одного окна с успешными ответами и обоими показателями в норме. Пустое окно / нет успехов не зелёные. UI всегда создаёт полные окна по 20; пустые выборки проверены отдельно тестом модели. Пороги можно менять; история пересчитывается. Фон влияет только на последующие окна. A/C предлагают задержки, B — ошибки.
- L06: бюджет 8 vCPU / 16 ГБ, два сервиса, БД допускает общий пул 24. Для каждого сервиса вычисляется `ratio = max(CPU demand / CPU, RAM demand / RAM, min pool demand / pool, total pool / 24)`. Исправность: ratio ≤1.5 и total pool ≤24; соответствует задержке ≤150 мс и ошибкам ≤10% до округления. Задержка = round(100×ratio), ошибки = round(max(0,ratio−1)×20). В состоянии видны оба сервиса и исходные ресурсы каждого прогона. Превышение бюджета отвергается без изменений. Критерий сравнимости — та же нагрузка и ровно одно изменённое числовое поле распределения.
- L07: шесть ПК, группы 1/2; обязательная > групповая > локальная > stable по умолчанию. `none` снимает значение конкретного уровня. Пакет next несовместим с legacy, stable совместим со всеми. Проба одного ПК не заменяет охват шести. Таблица показывает эффективное значение и источник. Изменение политики инвалидирует прежние пробы.
- L08: на старте 20 рабочих записей, старая F0 (t=0), пустой J1 и t=15. Включение настройки не создаёт копию. «Создать полную копию» копирует текущее неповреждённое состояние, вычисляет контрольную сумму, фиксирует время F0 и начинает новый журнал. «Внести пакет изменений» после созданной копии добавляет три записи и изменяет ID=5 одновременно в рабочей базе и J1; повтор пакета не изменяет данные или время. Создание полной копии после пакета действительно сохраняет все 23 записи и начинает новый пустой J1. После инцидента заменять копию нельзя. FNV-1a обнаруживает модельное повреждение, но не является криптографической защитой. Восстановление F0 создаёт отдельную песочницу; J1 идемпотентен по данным и проверяет конфликты. Повреждённые F0 и J1 отвергаются атомарно: песочница, время и журнал действий сохраняются. Перед отдельным переключением обязательно «Сравнить ID и значения»; переключение повторно сверяет песочницу с целевым состоянием. RPO = время инцидента − максимум времени восстановленной F0 и её записей; RTO = время первого успешного переключения − время инцидента. При пустой песочнице RPO не определён. Создание копии и восстановление +4 мин, внесение пакета +3, проигрывание J1 +2, переключение +2, настройка/повреждение/сравнение/проверка сумм +1. «Продвинуть модельное время» добавляет 1–60 мин. Повтор J1 сохраняет данные, но расходует 2 мин. Повреждённую копию нельзя исправить флажком: сохраните доказательства и начните отдельный эксперимент после сброса.
- L09: только разрешённые команды и четыре фиксированных условия, без eval/скриптов/удаления данных. Сохранение редактора создаёт версию; каждое исполнение оставляет трассу before/after, результат условия и skipped. Экспорт runbook содержит команды; импорт в чистый сценарий того же варианта и исполнение проверяют передачу без подсказок. История версий и исполнений передаётся в доказательствах/конфигурации, а не в переносимом runbook. Номера версий локальны сессии. Несохранённый текст редактора не экспортируется.

## Сохранение и импорт

Текущая schemaVersion — 2. Форматы версии 1 отвергаются явно: изменение начальных моделей делает их воспроизведение неоднозначным. Старое хранилище v1 не стирается; текущие сессии используют отдельное пространство v2.

Ключи localStorage: `ops-lab-v2:L02:A` … `ops-lab-v2:L09:C`; выбор панели сценария — `ops-lab-v2:selection`. Хранится проверяемый журнал команд, из которого детерминированно восстанавливается состояние. Схемы и точные имена элементов приведены в `UI-CONTRACT.md`.

Импорт конфигурации проверяет JSON, точные ключи на каждом уровне, тип, версию схемы, сценарий, вариант, допустимые команды, параметры и их диапазоны. Затем весь журнал воспроизводится во временной модели; только после успеха заменяется текущая сессия. Неизвестные поля, опасные команды и превышение ресурсов отклоняются атомарно. Повторный импорт того же файла даёт то же состояние, журнал и снимки. Он не дописывает действия в конец.

Лимиты: 1 МБ на импорт JSON, 300 действий на сессию, название снимка до 80 символов, runbook 1–24 команды. При исчерпании лимита сохраните результаты и начните отдельный эксперимент. Экспорт доказательств может превышать 1 МБ: он не импортируется. Экспорт конфигурации компактен. Файлы другого сценария/варианта отвергаются: сначала переключите нужные работу и вариант.

## Ограничения

Локальная учебная модель не выполняет реальные системные команды. Ресурсная модель условна; её числа нельзя переносить на реальные серверы. Зелёные проверки не оценивают качество объяснения студента и не доказывают полный охват исследования. Данные доступны владельцу браузера, поэтому это не защищённый экзамен и не система учёта оценок. Встроенных преподавательских решений и эталонных последовательностей исправления в архиве нет.

Сохранение зависит от разрешения и квоты браузера. При очистке данных браузера или перемещении локальной папки прежнее хранилище может оказаться недоступным; используйте экспорт. Одновременное редактирование одной сессии в двух вкладках не объединяется: последнее сохранение выигрывает. При работе вдвоём передавайте файл, а не редактируйте один профиль одновременно.

Сетевая отправка отсутствует, CSP запрещает connect-src. Внешних шрифтов, аналитики, CDN, аккаунтов и зависимостей нет. Временный HTTP-сервер использовался только для тестирования и не входит в поставку. Поддержка старых браузеров не заявлена. Проверенный браузер и результаты — в `QA-REPORT.md`.
