# Итоговый проект: пакет тест-анализа OrbitDesk

Редакция QA Orbit · версия 2026-10-28.1. Самостоятельная практика, не внешняя сертификация.

## Контракт

Учебный продукт OrbitDesk, версия правил OD-1. Все имена и данные вымышлены.
R1: title — строка от 1 до 80 кодовых точек Unicode включительно. При сохранении пробелы автоматически не удаляются.
R2: description — строка от 0 до 2000 кодовых точек. Пустая строка разрешена, null не является строкой.
R3: новая задача получает состояние draft и автора из серверной сессии.
R4: читать draft может только автор; published виден всем вошедшим участникам той же команды. Роль editor сама по себе не открывает чужой draft.
R5: опубликовать draft может автор или editor из той же команды. При публикации title.trim() не должен быть пустым. trim — поведение JavaScript String.prototype.trim; сохранённое значение не изменяется.
R6: публикация переводит draft в published. Повторная публикация published отклоняется с 409, состояние не меняется.
R7: в учебном API проверки публикации идут в порядке: сессия 401 → существование/команда 404 → права 403 → состояние 409 → данные 422 → успех 200. Это контракт кейса, не универсальное правило API.
R8: создание (create): без сессии — 401; неверный тип или длина title/description — 422 без создания; переданные клиентом authorId, teamId или state отклоняются с 422; успех — 201 и одна новая задача draft с новым ID, автором из сессии и исходными строками без trim. Чтение (read): без сессии — 401; неизвестный объект, чужая команда или чужой draft — 404 без содержимого задачи; разрешённое чтение — 200 с объектом.
R9: отказ в create/read/publish не меняет объекты; read не меняет данные. Успешный publish меняет только состояние существующей задачи, сохраняя ID, автора, title и description; дополнительная задача не создаётся.

## Акторы и исходное состояние

Акторы и фикстуры: Анна — user, автор t1, команда A; Борис — user, не автор t1, команда A; Вера — editor, не автор t1, команда A; Глеб — editor, команда B. Дина — editor и автор отдельной задачи t2 команды A для проверки сочетания автор-editor. Если не указано иное, t1 — draft с title="Проверить экспорт" и description="". Обозначения t1/t2 — учебные псевдонимы фактически полученных ID, а не требование к генератору ID. Перед независимым тестом фикстура восстанавливается.

## Ошибочный план для офлайн-ревью

«Editor читает все draft; 81 кодовая точка сокращается; повтор publish всегда 200; двенадцать сгенерированных тестов уже Passed». Доступ к ИИ не нужен: разберите это предложение по OD-1.

## Сдача

1. scope.md — версия, границы, акторы, вопросы.
2. conditions.csv — правило, условие, техника, ID кейса, обоснованный приоритет.
3. cases.md — предусловия, данные, шаги, код ответа и эффект.
4. fixtures.md — генераторы и независимая проверка длин.
5. review.md — исходное предложение ИИ и исправления.
6. report.md — что спроектировано, выполнено, не запускалось и какие есть доказательства.

## Рубрика

- [ ] R1–R9 связаны с проверками или явными пробелами.
- [ ] Есть title 0/1/2/79/80/81 и description 0/1999/2000/2001.
- [ ] Пробелы, кодовые точки Unicode и разные акторы для OR проверяются отдельно.
- [ ] Read и publish рассматриваются как разные действия с отдельными правами.
- [ ] Отказы не меняют состояние; успех подтверждается повторным чтением.
- [ ] Отсутствие лишней копии не выводится из чтения одного ID: нужен полный список или разрешённый снимок хранилища, иначе Not run.
- [ ] Без стенда динамические сценарии имеют статус Not run.

## Граница результата

Составление модели и проверка генераторов возможны без реализации. Фактические ответы API остаются ожидаемыми, пока сценарии не выполнены на согласованном стенде. Квиз подтверждает понимание отдельных решений, а не экспертную оценку всего проекта.
