docs(specs): словарь программы лаб очеловечен по ревью владельца

- Зачем:
  - термины спеки перейдут в задания, а «хребет», «ветки» и «точка
    прицепа» с калькированными заголовками сюжетов смущали бы студентов.
- Что:
  - хребет → основная программа, шаги → ступени, ветки → факультативы,
    «точка прицепа» заменена формулой «открывается после ступени N»;
  - заголовки разделов и сюжетов переписаны из позиции студента
    («Почему выручка не сходится», «Куда попадают битые строки»);
  - переносы выровнены по ~80 колонок по всему файлу.
- Проверка:
  - текст без учета пробелов не изменился на шаге переносов (SHA-256);
    решения, состав и порядок программы не менялись.
This commit is contained in:
ddadmin committed 2026-09-01 09:07:40 -04:00
1 parent 4fd872f296
commit eed5b4b4e6
1 file changed
+156 -108
+156 -108
View File
@@ -12,21 +12,23 @@
Он знает устройство системы в теории, но почти ничего не делал своими руками. Он знает устройство системы в теории, но почти ничего не делал своими руками.
Поэтому в программе нет вводного блока с теорией. Здесь теория становится Поэтому в программе нет вводного блока с теорией. Здесь теория становится
ремеслом: менти руками осваивает слои хранилища, DQ, оркестрацию и идемпотентность. ремеслом: менти руками осваивает слои хранилища, DQ, оркестрацию и
идемпотентность.
Обещание программы: менти проходит конвейер стенда автором, а не читателем. Обещание программы: менти проходит конвейер стенда автором, а не читателем.
## 2. Устройство программы: хребет и ветки ## 2. Устройство программы: основная программа и факультативы
У частей программы два статуса, третьего нет. У частей программы два статуса, третьего нет.
**Хребет** — обязательная часть. Менти проходит его целиком и по порядку, **Основная программа** — обязательная часть. Менти проходит ее целиком и по
потому что каждый следующий шаг опирается на предыдущий. По хребту растет порядку, потому что каждая следующая ступень опирается на предыдущую. От
самостоятельность: от готовых ТЗ с готовыми сторожами (DQ-проверками) к заданиям, где сторожей менти строит сам. ступени к ступени растет самостоятельность: сначала менти получает готовые ТЗ с
готовыми сторожами (DQ-проверками), а затем строит сторожей сам.
**Ветки** — необязательные лабы. Они собраны в тематические разделы, чтобы **Факультативы** — необязательные лабы. Они собраны в тематические разделы,
менти мог одним взглядом выбрать интересное. У каждого раздела есть точка чтобы менти мог одним взглядом выбрать интересное. Для каждого раздела указано,
прицепа — шаг хребта, после которого материал уже доступен. после какой ступени основной программы он открывается.
В программе используются четыре формы заданий: В программе используются четыре формы заданий:
@@ -35,43 +37,45 @@
остаются как несущая инфраструктура; остаются как несущая инфраструктура;
- *собери рядом* — менти строит свою копию результата рядом с нетронутым - *собери рядом* — менти строит свою копию результата рядом с нетронутым
стендовым и сверяет их построчно; стендовым и сверяет их построчно;
- *расследование* — данные уже лежат на стенде или стенд намеренно ломается, - *расследование* — данные уже лежат на стенде или стенд намеренно ломается, а
а менти ищет причину и объясняет ее. менти ищет причину и объясняет ее.
## 3. Хребет — семь шагов ## 3. Основная программа — семь ступеней
### Шаг 1. Витрины: пять заданий слоя DM ### Ступень 1. Построй пять витрин слоя DM
Первая часть программы опирается на шесть существующих заданий из [`docs/labs/`](../labs/README.md). Первая часть программы опирается на шесть существующих заданий из
Пять ТЗ по витринам входят в первый шаг хребта и выполняются как есть. Их точечный пересмотр — работа реализации. [`docs/labs/`](../labs/README.md). Пять ТЗ по витринам входят в первую ступень
Шестое задание, про свой дашборд в Superset, остается необязательной лабой в ветке «Superset и BI». основной программы и выполняются как есть. Их точечный пересмотр — работа
Набор уроков пяти витрин уже записан в их общем описании: от слоя как договора до честных имен показателей. реализации. Шестое задание, про свой дашборд в Superset, остается факультативом
в разделе «Superset и BI». Набор уроков пяти витрин уже записан в их общем
описании: от слоя как договора до честных имен показателей.
Форма — построить свое по ТЗ. Обратную связь дает даг `homework_check`. Форма — построить свое по ТЗ. Обратную связь дает даг `homework_check`.
### Шаг 2. Свой отчет в Superset ### Ступень 2. Свой отчет в Superset
Менти строит один график в Superset поверх витрины, которую сделал на первом Менти строит один график в Superset поверх витрины, которую сделал на первой
шаге. Урок — увидеть, как собственный результат из хранилища становится ступени. Урок — увидеть, как собственный результат из хранилища становится
отчетом в BI, не превращая знакомство с инструментом в отдельный большой отчетом в BI, не превращая знакомство с инструментом в отдельный большой
проект. проект.
Форма — построить свое по ТЗ. Результат проверяется глазами. ТЗ для этого Форма — построить свое по ТЗ. Результат проверяется глазами. ТЗ для этой новой
нового шага предстоит написать при реализации программы. Полный собственный ступени предстоит написать при реализации программы. Полный собственный дашборд
дашборд остается необязательной лабой в разделе «Superset и BI». остается факультативом в разделе «Superset и BI».
### Шаг 3. Нарежь сессии сам ### Ступень 3. Нарежь сессии сам
До того как открыть стендовый SQL нарезки сессий в DDS, менти самостоятельно До того как открыть стендовый SQL нарезки сессий в DDS, менти самостоятельно
делит события на визиты. Сначала он сравнивает число своих сессий с эталоном `VisitID`. Затем делит события на визиты. Сначала он сравнивает число своих сессий с эталоном
вручную соединяет свою сессию с эталонной и поштучно разбирает хотя бы одно `VisitID`. Затем вручную соединяет свою сессию с эталонной и поштучно разбирает
расхождение границ. Урок — счет называет проблему, но причину приходится хотя бы одно расхождение границ. Урок — счет называет проблему, но причину
искать в отдельных строках. приходится искать в отдельных строках.
Форма — построить свое по ТЗ и провести расследование. Обратная связь состоит Форма — построить свое по ТЗ и провести расследование. Обратная связь состоит
из счетной сверки с `VisitID` и ручного сопоставления границ. из счетной сверки с `VisitID` и ручного сопоставления границ.
### Шаг 4. Перепиши нарезку стенда ### Ступень 4. Перепиши нарезку стенда
Менти удаляет и заново пишет SQL нарезки сессий DDS: расчет объема, пересборку Менти удаляет и заново пишет SQL нарезки сессий DDS: расчет объема, пересборку
и замену. Урок — изменить расчетную сущность внутри готового конвейера и и замену. Урок — изменить расчетную сущность внутри готового конвейера и
@@ -80,36 +84,38 @@
для ошибок, а проверка не содержит готового ответа. для ошибок, а проверка не содержит готового ответа.
Форма — вычитание. Обратную связь дают `dq_check` и поштучная сверка, Форма — вычитание. Обратную связь дают `dq_check` и поштучная сверка,
построенная на третьем шаге. построенная на третьей ступени.
### Шаг 5. Сначала сторож, потом ломай: заказы ### Ступень 5. Сначала сторож, потом ломай: заказы
Сначала менти строит две недостающие DQ-проверки. Первая утверждает равенство Сначала менти строит две недостающие DQ-проверки. Первая утверждает равенство
«цена × количество = items_total». Вторая сверяет слой с источником по дням. «цена × количество = items_total». Вторая сверяет слой с источником по дням. Их
Их менти строит по образцу пяти стендовых проверок в `sql/dq/`. менти строит по образцу пяти стендовых проверок в `sql/dq/`. Обе проверки
Обе проверки должны покраснеть на управляемой ошибке. Затем менти вручную должны покраснеть на управляемой ошибке. Затем менти вручную подкладывает по
подкладывает по строке каждого класса брака, проверяет разбор и убирает эти строки за собой. строке каждого класса брака, проверяет разбор и убирает эти строки за собой.
Только после этого он вычитает разбор заказов ODS `order_parse` и Только после этого он вычитает разбор заказов ODS `order_parse` и трансформацию
трансформацию заказа DDS. Урок — сторожа строят до рискованного изменения, а заказа DDS. Урок — сторожа строят до рискованного изменения, а не после первой
не после первой поломки. поломки.
Форма — построить свои проверки по ТЗ, провести управляемое расследование и Форма — построить свои проверки по ТЗ, провести управляемое расследование и
выполнить вычитание. Обратную связь дают две новые проверки, баланс годных и выполнить вычитание. Обратную связь дают две новые проверки, баланс годных и
ошибочных строк по срезу и существующие сверки заказов. ошибочных строк по срезу и существующие сверки заказов.
### Шаг 6. Собери разбор рядом: события ODS ### Ступень 6. Разбери сырые события и сверь результат со стендом
Менти пакетно разбирает срез сырья событий в собственную таблицу и построчно сверяет результат с нетронутым стендовым ODS. Менти пакетно разбирает срез сырья событий в собственную таблицу и построчно
Урок — изучить разбор потока отдельно от живого приема и использовать стендовый результат как образец для сверки. сверяет результат с нетронутым стендовым ODS. Урок — изучить разбор потока
Матвью разбора остаются несущей стеной: их пересоздание молча теряет сообщения. отдельно от живого приема и использовать стендовый результат как образец для
сверки. Матвью разбора остаются несущей стеной: их пересоздание молча теряет
сообщения.
Форма — «собери рядом». Обратная связь — построчная сверка двух разборов. Ее Форма — «собери рядом». Обратная связь — построчная сверка двух разборов. Ее
границы называются прямо: срок работы ограничен окном хранения сырья, а границы называются прямо: срок работы ограничен окном хранения сырья, а
содержимое неопорных колонок можно сравнить только со стендовым разбором, не с содержимое неопорных колонок можно сравнить только со стендовым разбором, не с
независимым эталоном. независимым эталоном.
### Шаг 7. Мониторинг: куда смотреть ### Ступень 7. Мониторинг: куда смотреть
Сначала менти знакомится с панелями стенда. Затем проводит два безопасных Сначала менти знакомится с панелями стенда. Затем проводит два безопасных
расследования. В первом он находит в `query_log`, что верх списка тяжелых расследования. В первом он находит в `query_log`, что верх списка тяжелых
@@ -117,80 +123,118 @@
источника выглядит как пила, а не как линия, и выбирает правильный слой данных источника выглядит как пила, а не как линия, и выбирает правильный слой данных
для панели. для панели.
Форма — расследование. Обратная связь — найденные запросы и верное Форма — расследование. Обратная связь — найденные запросы и верное объяснение
объяснение формы графика и выбора слоя. Ломательные опыты остаются в ветке формы графика и выбора слоя. Ломательные опыты остаются в факультативе «Что
«Поломки и runbook». Урок шага — куда и на что смотреть в живой системе. делать, когда стенд сломался». Урок ступени — куда и на что смотреть в живой
системе.
**Общее правило вычитания:** ТЗ каждого вычитания на шагах 4 и 5 включает **Общее правило вычитания:** ТЗ каждого вычитания на ступенях 4 и 5 включает
пересчет ключа шардирования по `hostName()`. Счетные сверки читают `_dist`, поэтому учитывают строку даже на чужом шарде пересчет ключа шардирования по `hostName()`. Счетные сверки читают `_dist`,
и остаются зелеными: они не видят саму ошибку раскладки. поэтому учитывают строку даже на чужом шарде и остаются зелеными: они не видят
саму ошибку раскладки.
## 4. Ветки — пять разделов ## 4. Факультативы — пять разделов
Ниже перечислены только названия сюжетов и их уроки. Материал, формы и способы Ниже перечислены только названия сюжетов и их уроки. Материал, формы и способы
проверки остаются в проверки остаются в [инвентаризации](../research/2026-08-31-labs-inventory.md).
[инвентаризации](../research/2026-08-31-labs-inventory.md).
### Сверка и деньги ### Почему выручка не сходится
Эта ветка рекомендована первой среди необязательных. Точка прицепа — после Этот раздел рекомендован первым из факультативов. Он открывается после ступени
шага 1 хребта: материал живет на стенде с этапа 6. 1 основной программы: материал живет на стенде с этапа 6.
- **Недосчет трекера и правило «поведение — по трекеру, деньги — по бэкенду» (#186).** Разрыв воронки подтверждений показывает потерянные события и границу доверия к двум источникам. - **Почему трекер недосчитывает покупки (#186).** Разрыв воронки подтверждений
- **Бизнес-дубль и наивная выручка (#187).** Технический и деловой дубли — разные вещи, поэтому одинаковые строки и одинаковая покупка требуют разных правил. показывает потерянные события и границу доверия к двум источникам.
- **Дельта суммы, объясненная до копейки сравнением позиций.** Расхождение суммы нужно разложить до конкретной вычеркнутой позиции и объяснить до копейки. - **Почему повтор покупки завышает выручку (#187).** Движок убирает технический
- **Две дороги отмены и история версий.** Текущее состояние не заменяет историю, а некоторые различия после истечения срока сырья уже не восстановить. дубль строки, а повтор одной покупки приходится находить по деловому ключу.
- **Опоздавшие заказы и закрытое окно (#188).** Отчет за день становится окончательным лишь после того, как источник больше не может изменить этот день. - **Какая позиция объясняет разницу в сумме.** Расхождение суммы нужно
- **Дыхание выручки.** Внутри окна изменяемости выручка движется, а после закрытия дня фиксируется. разложить до конкретной вычеркнутой позиции и объяснить до копейки.
- **Был ли отмененный заказ оплачен.** Текущее состояние не заменяет историю, а
некоторые различия после истечения срока сырья уже не восстановить.
- **Когда отчет за день можно считать окончательным (#188).** Отчет за день
становится окончательным лишь после того, как источник больше не может
изменить этот день.
- **Почему выручка за день еще меняется.** Внутри окна изменяемости выручка
движется, а после закрытия дня фиксируется.
### Тонкий анализ данных ### Тонкий анализ данных
Точка прицепа — после шага 1 хребта. Открывается после ступени 1 основной программы.
- **Склейка идентичностей во времени (#145).** Текущее знание и знание на дату дают разные отчеты; сведения из будущего меняют прошлое. - **Что мы знали о пользователе в тот день (#145).** Текущее знание и знание на
- **Справочник регионов (#143).** Менти собирает свой словарь по образцу каталога и обогащает отчет через `dictGet`. дату дают разные отчеты; сведения из будущего меняют прошлое.
- **Добавь названия регионов в отчет (#143).** Менти собирает свой словарь по
образцу каталога и обогащает отчет через `dictGet`.
### Superset и BI ### Superset и BI
Точка прицепа — после шага 2 хребта. Открывается после ступени 2 основной программы.
- **Свой дашборд.** Готовая лаба [`docs/labs/superset-dashboard.md`](../labs/superset-dashboard.md) учит хранить пользовательские объекты отдельно от стендовых. - **Свой дашборд.** Готовая лаба
- **Ловушка ноды 2.** Забытый `ON CLUSTER` может остаться незаметным до тех пор, пока дашборд не обратится ко второй ноде. [`docs/labs/superset-dashboard.md`](../labs/superset-dashboard.md) учит
хранить пользовательские объекты отдельно от стендовых.
- **Почему дашборд не видит объект на второй ноде.** Забытый `ON CLUSTER` может
остаться незаметным до тех пор, пока дашборд не обратится ко второй ноде.
### Инженерия стенда ### Инженерия стенда
Точка прицепа — после шага 1 хребта. Сюжеты про переигрывание дня и пошардовую атомарность раскроются полнее после шага 4, когда менти уже спускался в DDS. Открывается после ступени 1 основной программы. Сюжеты про переигрывание дня и
пошардовую атомарность раскроются полнее после ступени 4, когда менти уже
спускался в DDS.
- **Push против pull — два способа принять топик.** Поток и слепок требуют разных способов приема и дают разную наблюдаемость. - **Как принимать данные из Kafka: потоком или слепком.** Поток и слепок
- **Кто читал топик и куда легли данные.** Нода-потребитель может меняться, а раскладку строк определяет ключ шардирования. требуют разных способов приема и дают разную наблюдаемость.
- **Вторая consumer group — дубли.** Еще одна группа потребителей создает еще одну полную копию потока. - **Почему данные попадают на свои шарды независимо от ноды чтения.**
- **Дырка в офсетах.** Разрыв в офсетах показывает потерю, которую трудно заметить по самим данным. Нода-потребитель может меняться, а раскладку строк определяет ключ
- **Две оси времени.** Очистка сырья живет по времени загрузки, а не по модельному дню. шардирования.
- **Предикат и его буквальное отрицание.** Годные строки и брак делят поток без пропусков и пересечений; менти подкладывает по строке каждого класса брака событий и находит их в `ods.event_errors_dist`. - **Почему вторая группа потребителей дублирует поток.** Еще одна группа
- **Три времени и версия-наблюдение.** Версию заказа задает слепок источника, а `FINAL` скрывается за представлением. потребителей создает еще одну полную копию потока.
- **Часовой пояс как способ смотреть на время.** Один момент дает разные дни в разных поясах, поэтому день и пояс нужно называть явно. - **Как заметить пропущенные сообщения по офсетам.** Разрыв в офсетах
- **Сырое против разобранного (`ecommerce`).** Типизированный разбор может молча подменить ошибку значением, и его нужно сверять с источником. показывает потерю, которую трудно заметить по самим данным.
- **Переиграть день X.** Конвейер сам находит дыру и определяет объем повторной обработки по состоянию хранилища. - **Почему сырье удаляется по времени загрузки.** Очистка сырья живет по
- **Атомарность — пошардовая.** Замена дня завершается отдельно на каждом шарде, поэтому целостность результата подтверждает отдельная сверка. времени загрузки, а не по модельному дню.
- **Инкремент против пересборки (#149) — повышенная сложность.** Экономия на пересчете требует хранить историю изменений, которую полная пересборка стирает. - **Куда попадают битые строки.** Годные строки и брак делят поток без
пропусков и пересечений; менти подкладывает по строке каждого класса брака
событий и находит их в `ods.event_errors_dist`.
- **Какая версия заказа считается текущей.** Версию заказа задает слепок
источника, а `FINAL` скрывается за представлением.
- **Почему один момент попадает в разные дни.** Один момент дает разные дни в
разных поясах, поэтому день и пояс нужно называть явно.
- **Проверь, как стенд разобрал JSON в `ecommerce`.** Типизированный разбор
может молча подменить ошибку значением, поэтому менти сам разбирает сырой
JSON и сравнивает результат с массивами стенда.
- **Как конвейер восстанавливает пропущенный день.** Конвейер сам находит дыру
и определяет объем повторной обработки по состоянию хранилища.
- **Что будет, если день заменился не на всех шардах.** Замена дня завершается
отдельно на каждом шарде, поэтому целостность результата подтверждает
отдельная сверка.
- **Как обновлять витрину без полной пересборки (#149) — повышенная
сложность.** Экономия на пересчете требует хранить историю изменений, которую
полная пересборка стирает.
### Поломки и runbook ### Что делать, когда стенд сломался
Точка прицепа — после шага 7 хребта; весь раздел — повышенная сложность. Открывается после ступени 7 основной программы; весь раздел — повышенная
сложность.
- **Keeper — общая память кластера.** Остановка keeper связывает состояние DDL и репликации с тем, что видно на панелях и в системных таблицах. - **Что ломается вместе с keeper.** Остановка keeper связывает состояние DDL и
- **Повисший DDL.** Очередь распределенного DDL показывает путь запроса и ответ каждой ноды. репликации с тем, что видно на панелях и в системных таблицах.
- **Где искать запрос DDL, который не завершился.** Очередь распределенного DDL
показывает путь запроса и ответ каждой ноды.
Итог ветки — runbook, которого сейчас не хватает стенду. Менти пишет его по Итог раздела — runbook, которого сейчас не хватает стенду. Менти пишет его по
результатам опытов, и документ остается в проекте. результатам опытов, и документ остается в проекте.
## 5. Границы вычитания по потокам ## 5. Границы вычитания по потокам
Подробное сравнение потоков и таблица доказательств остаются в [инвентаризации](../research/2026-08-31-labs-inventory.md). Подробное сравнение потоков и таблица доказательств остаются в
Спека берет это сравнение за основу и проводит свои границы. Без оговорок вычитанию отдаются только сессии DDS. [инвентаризации](../research/2026-08-31-labs-inventory.md). Спека берет это
Заказы можно вычитать лишь после самодельных сторожей. Для событий ODS выбрана форма «собери рядом»; вычитание здесь отклонено. сравнение за основу и проводит свои границы. Без оговорок вычитанию отдаются
Прием STG и забор заказов остаются несущей стеной и доступны только для расследований. только сессии DDS. Заказы можно вычитать лишь после самодельных сторожей. Для
Карту идентичностей спека решает не отдавать вычитанию; причины этого выбора названы в следующем разделе. событий ODS выбрана форма «собери рядом»; вычитание здесь отклонено. Прием STG
и забор заказов остаются несущей стеной и доступны только для расследований.
Карту идентичностей спека решает не отдавать вычитанию; причины этого выбора
названы в следующем разделе.
## 6. Что не вошло ## 6. Что не вошло
@@ -200,8 +244,8 @@
Форма «собери рядом» для карты идентичностей тоже не входит. Независимого Форма «собери рядом» для карты идентичностей тоже не входит. Независимого
эталона нет, а слабые инварианты проверяют допустимость связей, но не полноту. эталона нет, а слабые инварианты проверяют допустимость связей, но не полноту.
Аналитический урок идентичности уже несет склейка во времени (#145) в ветке Аналитический урок идентичности уже несет склейка во времени (#145) в
«Тонкий анализ данных». факультативе «Тонкий анализ данных».
Сюжеты, которые инвентаризация относит к лекциям, остаются лекциями: `Sign` и Сюжеты, которые инвентаризация относит к лекциям, остаются лекциями: `Sign` и
CollapsingMergeTree, топологии в бою и идентичность «как в бою». Эта спека CollapsingMergeTree, топологии в бою и идентичность «как в бою». Эта спека
@@ -212,16 +256,17 @@ CollapsingMergeTree, топологии в бою и идентичность «
Эти решения закрывают тикеты после приемки спеки: Эти решения закрывают тикеты после приемки спеки:
- #143, справочник регионов — вошла в ветку «Тонкий анализ данных». - #143, справочник регионов — вошла в факультатив «Тонкий анализ данных».
- #145, склейка во времени — вошла в ветку «Тонкий анализ данных». - #145, склейка во времени — вошла в факультатив «Тонкий анализ данных».
- #148, домашки ниже DM и вычитание — вошла в программу шагами 4–6 хребта. Форму для - #148, домашки ниже DM и вычитание — вошла в основную программу как ступени
каждого потока уточнила инвентаризация #201: вычитание, «сначала сторож» или 4–6. Форму для каждого потока уточнила инвентаризация #201: вычитание,
«собери рядом». «сначала сторож» или «собери рядом».
- #149, инкрементальный `daily_traffic` — вошла в ветку «Инженерия стенда» с - #149, инкрементальный `daily_traffic` — вошла в факультатив «Инженерия
пометкой «повышенная сложность». стенда» с пометкой «повышенная сложность».
- #186, воронка подтверждений — вошла в ветку «Сверка и деньги». - #186, воронка подтверждений — вошла в факультатив «Почему выручка не
- #187, бизнес-дубль — вошла в ветку «Сверка и деньги». сходится».
- #188, опоздавшие заказы — вошла в ветку «Сверка и деньги». - #187, бизнес-дубль — вошла в факультатив «Почему выручка не сходится».
- #188, опоздавшие заказы — вошла в факультатив «Почему выручка не сходится».
## 8. Отклоненные варианты оси ## 8. Отклоненные варианты оси
@@ -231,15 +276,18 @@ CollapsingMergeTree, топологии в бою и идентичность «
менти еще не пользовался. менти еще не пользовался.
- **Два прохода: сначала расследования снизу вверх, потом постройка сверху - **Два прохода: сначала расследования снизу вверх, потом постройка сверху
вниз.** Пролог из восьми расследований откладывает первый собственный вниз.** Пролог из восьми расследований откладывает первый собственный
результат. Вместо этого расследования разнесены по веткам и доступны в результат. Вместо этого расследования разнесены по факультативам и
своих точках прицепа. открываются по мере прохождения основной программы.
- **Сюжетами поперек слоев.** Такой порядок ломает принятое решение, по которому готовые задания открывают программу, и превращает путь в сетку зависимостей. - **Сюжетами поперек слоев.** Такой порядок ломает принятое решение, по
которому готовые задания открывают программу, и превращает путь в сетку
зависимостей.
## 9. Границы спеки и что дальше ## 9. Границы спеки и что дальше
Спека не переписывает существующие ТЗ в `docs/labs/` и общий README; точечный пересмотр относится к реализации. Спека не переписывает существующие ТЗ в `docs/labs/` и общий README; точечный
пересмотр относится к реализации.
Реализация программы тоже находится за границей спеки. В нее входят новые ТЗ Реализация программы тоже находится за границей спеки. В нее входят новые ТЗ
для шагов 2–7 хребта и веток, а также отражение порядка программы в для ступеней 2–7 основной программы и факультативов, а также отражение порядка
`docs/labs/README.md`. Докуда карта #182 ведет работу дальше, решает тикет программы в `docs/labs/README.md`. Докуда карта #182 ведет работу дальше,
#203. решает тикет #203.