Загрузка данных


Ты работаешь в проекте:

/Users/23865613/IdeaProjects/untitled/zadanie2/source_project

Контекст:

Этап 3 реализован и частично подтверждён реальным запуском через SberBrowser.

Подтверждено:

- py_compile проходит;
- expand_meta_page() вызывается;
- свёрнутые read-only элементы раскрываются;
- таблицы прокручиваются;
- HTML сохраняется;
- Markdown создаётся;
- projects/SNL/meta создаётся;
- фатальных ошибок expand_meta_page нет.

Но контрольный запуск был прерван внешним тайм-аутом через 600 секунд.

По результатам проверки:

- всего URL в meta_urls.txt: 41;
- HTML-файлов в temp_html: 38;
- output/*.md: 52;
- projects/SNL/meta: 66 файлов;
- HIERARCHY.md имеет статус PARTIAL;
- TASK_COVERAGE.md имеет статус PARTIAL.

Сейчас не нужно добавлять write-возможности или создавать объекты в META.

Цель:

1. Стабилизировать полный запуск.
2. Добавить безопасное продолжение выгрузки.
3. Получать полный отрисованный DOM META после выполнения JavaScript.
4. Раскрывать свёрнутые read-only элементы.
5. Обрабатывать виртуализированные таблицы.
6. Безопасно переходить по внутренним ссылкам на связанные объекты META.
7. Сохранять структуру исходной страницы в читаемый Markdown.
8. Исправить HIERARCHY.md и TASK_COVERAGE.md.
9. Получить честное подтверждение полного экспорта всех URL.
10. Обновлять структурированную архитектуру в projects/SNL/meta.

Важно:

- Не переписывай проект с нуля.
- Не ломай текущую выгрузку.
- Не удаляй expand_meta_page().
- Не удаляй structured_meta_writer.py.
- Не используй API META.
- Не используй requests, httpx, aiohttp или urllib для обращения к META.
- urllib.parse разрешён только для локальной обработки URL.
- Не перехватывай внутренние REST или GraphQL-запросы META.
- Не извлекай токены.
- Не добавляй token, cookie, login или password.
- Не сохраняй cookies.
- Не сохраняй sessionStorage или localStorage.
- Не выполняй автоматический login.
- Не выполняй write-операции.
- Не создавай объекты META.
- Не редактируй объекты META.
- Не удаляй объекты META.
- Не нажимай кнопки создания, сохранения, удаления или редактирования.
- Авторизация выполняется только вручную через SberBrowser.
- Проект остаётся полностью read-only.
- Ошибка одной страницы не должна останавливать всю выгрузку.
- Не объявляй задачу завершённой только по факту успешного py_compile.
- Не объявляй полный экспорт успешным, если процесс был прерван тайм-аутом.

Перед изменениями выполни:

cd /Users/23865613/IdeaProjects/untitled/zadanie2/source_project

Покажи текущую структуру:

find . -maxdepth 3 -type f | sort

Проверь наличие файлов:

- run_exporter.py
- meta_urls.txt
- meta_exporter.yaml
- meta_exporter.yaml.example
- scripts/config_loader.py
- scripts/scrape_meta.py
- scripts/meta_page_expander.py
- scripts/html_to_markdown.py
- scripts/markdown_writer.py
- scripts/structured_meta_writer.py
- scripts/link_discovery.py
- scripts/integration_interactions_parser.py

Если какого-либо файла нет, не выдумывай его содержимое. Зафиксируй отсутствие в предварительном отчёте.

Сначала напиши короткий отчёт:

1. Какие функции уже реализованы.
2. Почему предыдущий запуск не завершился.
3. Какие файлы потребуется изменить.
4. Какие новые файлы потребуется создать.
5. Как будет сохранён read-only режим.
6. Как будет обеспечено продолжение прерванной выгрузки.
7. Как будет выполняться полный захват DOM.
8. Как будет контролироваться обход внутренних ссылок.

После этого приступай к изменениям.

======================================================================
ЧАСТЬ 1. РАЗОБРАТЬСЯ С ПРИЧИНОЙ НЕЗАВЕРШЁННОГО ЗАПУСКА
======================================================================

Сначала изучи:

- run_exporter.py
- scripts/scrape_meta.py
- scripts/meta_page_expander.py
- scripts/html_to_markdown.py
- scripts/markdown_writer.py
- scripts/structured_meta_writer.py
- meta_exporter.yaml
- meta_exporter.yaml.example

Определи:

1. Какой тайм-аут действует на отдельную страницу.
2. Есть ли общий тайм-аут внутри Python-кода.
3. Был ли процесс остановлен самим проектом или только оболочкой GigaCode.
4. Почему первая страница получила ошибку navigate.
5. Какие URL не успели обработаться.
6. Какие HTML-файлы отсутствуют.
7. Какие HTML-файлы могут быть неполными.
8. Какие Markdown-файлы были сформированы из старого кэша.

Не делай предположений без проверки логов.

Проверь:

- final_run.log
- final_full_run.log
- /tmp/run_export_output.txt
- output/EXPORT_REPORT.md
- output/INCOMPLETE_URLS_REPORT.md, если он уже существует

Если логов нет, прямо укажи это.

В отчёте напиши:

- внутренний или внешний был тайм-аут;
- сколько страниц реально начали обрабатываться;
- сколько HTML-файлов было сохранено;
- какие URL не были обработаны;
- можно ли безопасно продолжить выгрузку из существующего HTML.

======================================================================
ЧАСТЬ 2. ДОБАВИТЬ БЕЗОПАСНОЕ ПРОДОЛЖЕНИЕ ВЫГРУЗКИ
======================================================================

Добавь в meta_exporter.yaml и meta_exporter.yaml.example:

resume:
  enabled: true
  skip_existing_html: true
  skip_existing_markdown: false
  min_html_size_bytes: 1000
  rebuild_reports_from_cached_html: true

Логика:

1. Если для URL существует корректный HTML-файл в temp_html и его размер больше min_html_size_bytes, страницу можно не открывать заново.
2. Существующий HTML должен использоваться для повторного формирования Markdown и итоговых отчётов.
3. Если HTML отсутствует, пустой или содержит страницу ошибки, URL нужно выгрузить заново.
4. Если resume.enabled=false, поведение должно остаться прежним.
5. Пропущенная из-за корректного кэша страница не считается ошибкой.
6. skip_existing_markdown=false означает, что Markdown и отчёты должны пересобираться даже при использовании HTML из кэша.
7. Нельзя определять HTML-файл новым способом, несовместимым с текущим проектом. Используй существующий механизм построения имени HTML-файла.
8. Проверяй, что HTML не является:
   - страницей входа;
   - страницей ошибки;
   - пустым SPA-контейнером;
   - заглушкой;
   - документом с отсутствующим основным содержимым.

Добавь функции с понятными именами, например:

- is_cached_html_valid(...)
- load_cached_html(...)
- should_resume_from_html(...)

В логах писать:

RESUME HTML FOUND url="..."
RESUME PAGE SKIPPED url="..."
RESUME HTML INVALID url="..." reason="..."
RESUME PAGE RELOAD url="..."
RESUME MARKDOWN REBUILT url="..."

Не скрывай причину признания HTML невалидным.

======================================================================
ЧАСТЬ 3. СФОРМИРОВАТЬ ОТЧЁТ НЕЗАВЕРШЁННЫХ URL
======================================================================

Создай после каждого запуска:

output/INCOMPLETE_URLS_REPORT.md

Формат:

# Отчёт по незавершённым URL

## Общая статистика

| Показатель | Значение |
|---|---|
| Всего URL | фактическое количество |
| Выгружено заново | фактическое количество |
| Использовано из кэша | фактическое количество |
| Успешно обработано | фактическое количество |
| Не обработано | фактическое количество |
| Ошибок | фактическое количество |

## Необработанные URL

| № | Название | URL | Причина |
|---|---|---|---|

Если все URL обработаны, написать:

Все URL успешно обработаны.

Причины должны быть реальными:

- navigate error;
- timeout;
- браузер закрыт;
- HTML не сохранён;
- HTML невалиден;
- процесс остановлен;
- страница входа;
- недостаточно прав;
- неизвестная ошибка.

Не писать «неизвестная ошибка», если в исключении есть конкретное сообщение.

======================================================================
ЧАСТЬ 4. ПОЛУЧАТЬ ПОЛНЫЙ ОТРИСОВАННЫЙ DOM СТРАНИЦЫ
======================================================================

Недостаточно сохранять только ту часть страницы, которая видна пользователю без взаимодействия.

Нужно получать полный HTML, сформированный браузером после выполнения JavaScript и отрисовки SPA-интерфейса META.

Под «HTML из панели веб-разработчика» понимается итоговый DOM страницы после выполнения JavaScript, аналогичный содержимому вкладки Elements в DevTools.

Не нужно:

- запускать отдельную панель DevTools;
- использовать API META;
- перехватывать сетевые API-запросы;
- читать служебные заголовки авторизации;
- извлекать токены;
- читать cookies;
- сохранять sessionStorage или localStorage;
- использовать CDP для обхода авторизации;
- выполнять JavaScript, изменяющий данные META.

Используй текущую страницу Playwright и получай итоговый DOM через:

page.content()

Но page.content() нужно вызывать только после завершения безопасного раскрытия страницы.

Последовательность обработки каждой страницы:

1. Открыть URL через текущий SberBrowser/Playwright.
2. Дождаться domcontentloaded.
3. Дождаться первичного SPA-рендеринга.
4. Проверить, что открылась META, а не страница входа или ошибки.
5. Выполнить безопасное раскрытие read-only элементов.
6. Прокрутить виртуализированные таблицы и списки.
7. Собрать связанные внутренние ссылки META.
8. Сохранить строки виртуализированных таблиц, которые могут исчезать из DOM.
9. Получить полный текущий DOM через page.content().
10. Сохранить HTML.
11. Преобразовать HTML и собранные дополнительные данные в Markdown.
12. Закрыть страницу.
13. Перейти к следующему URL.

Для каждой страницы добавить лог:

DOM READY
SPA RENDER COMPLETE
PAGE EXPANSION COMPLETE
VIRTUAL TABLE SCROLL COMPLETE
RELATED LINKS FOUND=N
FULL DOM CAPTURED html_length=N

FULL DOM CAPTURED нельзя писать, если page.content() завершился ошибкой.

======================================================================
ЧАСТЬ 5. БЕЗОПАСНО РАСКРЫВАТЬ СВЁРНУТЫЕ READ-ONLY ЭЛЕМЕНТЫ
======================================================================

Доработай scripts/meta_page_expander.py.

Функция expand_meta_page() должна искать и раскрывать:

- элементы с aria-expanded="false";
- details без атрибута open;
- accordion;
- treeitem с aria-expanded="false";
- сворачиваемые группы;
- строки дерева архитектуры;
- раскрывающиеся разделы атрибутов;
- блоки структуры;
- блоки интеграций;
- блоки API;
- блоки стендов;
- кнопки с текстом:
  - Показать ещё
  - Показать все
  - Развернуть
  - Раскрыть
  - Подробнее
  - Далее
  - Следующая страница

Перед каждым кликом обязательно проверять безопасность элемента.

Не нажимать элемент, если его текст, aria-label, title, value или ближайший контекст содержит:

- Создать
- Сохранить
- Удалить
- Редактировать
- Изменить
- Добавить
- Заполнить
- Заполнить с AI
- Отправить
- Согласовать
- Опубликовать
- Архивировать
- Импортировать
- Экспортировать
- Применить
- Подтвердить
- Create
- Save
- Delete
- Edit
- Add
- Write
- New
- Publish
- Archive
- Import
- Export
- Apply
- Confirm
- Submit

Также не нажимать:

- элементы с type="submit";
- элементы внутри формы создания;
- элементы внутри формы редактирования;
- элементы с data-action, указывающим на create, update, delete или save;
- кнопки, открывающие форму изменения данных;
- кнопки с role="button", если их назначение не определено;
- элементы с потенциально destructive-действием.

Перед кликом проверять:

- видим ли элемент;
- доступен ли элемент;
- не находится ли он внутри form;
- не содержит ли запрещённый текст;
- является ли действие раскрытием, а не переходом к записи.

Для каждого действия писать:

EXPAND SAFE CLICK text="..."
EXPAND SKIPPED UNSAFE text="..."
EXPAND SKIPPED FORM CONTROL text="..."
EXPAND SKIPPED UNKNOWN ACTION text="..."

После клика проверять:

- изменилась ли высота страницы;
- изменился ли aria-expanded;
- появились ли новые строки;
- появился ли новый текст;
- появилась ли новая таблица;
- изменилось ли число DOM-элементов.

Если клик не изменил DOM, не повторять его бесконечно.

Хранить множество уже обработанных элементов или их устойчивых сигнатур.

======================================================================
ЧАСТЬ 6. ОБРАБАТЫВАТЬ ВИРТУАЛИЗИРОВАННЫЕ ТАБЛИЦЫ И СПИСКИ
======================================================================

Некоторые таблицы META могут хранить в DOM только видимые строки.

Для страниц:

- /interactionPoints
- /integrationInteractions
- /interactions
- /stands
- /automatedSystem/
- /functionalSubsystem/
- /module/
- /submodule/
- /techComponent/
- /technicalResource/

нужно искать прокручиваемые контейнеры, а не прокручивать только window.

Определи контейнеры по признакам:

- scrollHeight > clientHeight;
- overflow-y: auto;
- overflow-y: scroll;
- role="grid";
- role="table";
- role="tree";
- role="list";
- классы, содержащие table;
- классы, содержащие grid;
- классы, содержащие virtual;
- классы, содержащие scroll;
- классы, содержащие list.

Алгоритм:

1. Найти потенциальные контейнеры.
2. Зафиксировать видимые строки.
3. Получить текст и ячейки строк.
4. Прокрутить контейнер вниз на 70–90% его видимой высоты.
5. Дождаться перерисовки.
6. Считать новые строки.
7. Добавить новые строки в коллекцию.
8. Повторять, пока:
   - scrollTop перестал изменяться;
   - новые строки не появляются два прохода подряд;
   - достигнут конец контейнера;
   - достигнут безопасный лимит итераций.

Собирать уникальные строки по нормализованному содержимому.

Нельзя полагаться только на page.content(), поскольку старые строки виртуализированной таблицы могут исчезнуть из DOM после прокрутки.

Собранные строки нужно:

- хранить в Python;
- передавать генератору Markdown;
- включать в соответствующий отчёт;
- при необходимости сохранять во внутренний JSON-файл без авторизационных данных.

Разрешён внутренний каталог:

temp_data/

Пример:

temp_data/virtual_tables/<safe_page_name>.json

JSON не должен содержать:

- cookies;
- токены;
- заголовки авторизации;
- sessionStorage;
- localStorage;
- логины;
- пароли.

Логи:

VIRTUAL TABLE FOUND
VIRTUAL TABLE ROWS VISIBLE=N
VIRTUAL TABLE NEW ROWS=N
VIRTUAL TABLE TOTAL UNIQUE ROWS=N
VIRTUAL TABLE END REACHED
VIRTUAL TABLE LIMIT REACHED
VIRTUAL TABLE SAVED path="..."

======================================================================
ЧАСТЬ 7. БЕЗОПАСНО ПЕРЕХОДИТЬ ПО ВНУТРЕННИМ ССЫЛКАМ META
======================================================================

Если на странице найдены гиперссылки на связанные архитектурные объекты, skill должен уметь перейти по ним и выгрузить связанные страницы.

Переходы должны быть строго ограничены.

Разрешены только ссылки:

- со схемой https;
- с доменом meta.sberbank.ru;
- с путём, начинающимся на /meta/earp/;
- ведущие на архитектурные объекты:
  - /automatedSystem/
  - /functionalSubsystem/
  - /module/
  - /submodule/
  - /techComponent/
  - /technicalResource/
  - /interactionPoints
  - /integrationInteractions
  - /interactions
  - /stands
  - /api
  - карточки точек взаимодействия;
  - карточки интеграционных взаимодействий;
  - карточки инфопотоков;
  - карточки стендов;
  - карточки API.

Запрещены:

- внешние домены;
- logout;
- login;
- административные страницы;
- страницы создания;
- страницы редактирования;
- страницы удаления;
- URL с create;
- URL с edit;
- URL с delete;
- URL с update;
- URL с save;
- URL с new;
- mailto:;
- javascript:;
- tel:;
- ссылки на скачивание файлов;
- формы;
- действия, требующие POST, PATCH, PUT или DELETE.

Добавь в meta_exporter.yaml и meta_exporter.yaml.example:

link_following:
  enabled: true
  same_domain_only: true
  allowed_domain: "meta.sberbank.ru"
  allowed_path_prefix: "/meta/earp/"
  max_depth: 2
  max_discovered_urls: 300
  open_in_new_page: true
  save_discovered_urls: true

Правила:

1. Сначала обработать URL из meta_urls.txt.
2. Затем обработать найденные связанные URL.
3. Не посещать один URL повторно.
4. Нормализовать URL:
   - убрать fragment;
   - убрать лишний завершающий slash;
   - сохранить значимые query-параметры;
   - привести относительный URL к абсолютному.
5. Ограничить глубину обхода.
6. Ограничить общее число автоматически найденных URL.
7. Недоступность связанной страницы не должна останавливать экспорт.
8. Все переходы выполнять только GET-навигацией.
9. Связанные страницы открывать в новой Playwright Page.
10. После обработки закрывать дополнительную страницу.
11. Не нажимать ссылку в исходном интерфейсе, если её URL можно безопасно открыть через page.goto().
12. Не переходить по навигационным вкладкам, если соответствующий прямой URL уже есть в meta_urls.txt.
13. Сохранять информацию о родительской странице, с которой была обнаружена ссылка.

Добавь функцию:

is_safe_meta_link(
    current_url: str,
    candidate_url: str,
    depth: int,
    visited_urls: set[str],
    config: dict
) -> tuple[bool, str]

Возвращать:

- разрешено или нет;
- точную причину решения.

Проверки:

1. Схема только https.
2. Домен только meta.sberbank.ru.
3. Путь начинается с /meta/earp/.
4. URL не содержит write-фрагментов.
5. URL ещё не посещался.
6. Глубина не превышена.
7. Лимит ссылок не превышен.
8. Ссылка относится к объекту архитектуры.
9. Ссылка не является кнопкой действия.
10. Переход не требует отправки формы.

Логи:

RELATED LINK FOUND url="..."
RELATED LINK ALLOWED url="..."
RELATED LINK SKIPPED EXTERNAL url="..."
RELATED LINK SKIPPED UNSAFE url="..."
RELATED LINK SKIPPED DEPTH url="..."
RELATED LINK SKIPPED LIMIT url="..."
RELATED LINK ALREADY VISITED url="..."
RELATED PAGE EXPORTED url="..."
RELATED PAGE ERROR url="..." reason="..."

======================================================================
ЧАСТЬ 8. НЕ ДОПУСТИТЬ БЕСКОНТРОЛЬНОГО ОБХОДА
======================================================================

Автоматический обход ссылок не должен превращаться в сканирование всей META.

Добавь:

- visited_urls;
- discovered_urls;
- queue;
- depth;
- parent_url;
- source_type.

Каждый элемент очереди должен содержать:

{
  "name": "...",
  "url": "...",
  "depth": 0,
  "parent_url": "...",
  "source_type": "meta_urls.txt или discovered"
}

Сначала в очередь помещаются URL из meta_urls.txt с depth=0.

Связанные URL добавляются с depth=current_depth+1.

При достижении max_depth URL не добавлять.

При достижении max_discovered_urls новые найденные ссылки не добавлять.

После завершения сохранить список обнаруженных URL:

output/DISCOVERED_URLS.md

Формат:

# Обнаруженные связанные URL META

| № | Название | URL | Родительская страница | Глубина | Статус |
|---|---|---|---|---|---|

Статусы:

- Выгружено
- Уже было в meta_urls.txt
- Уже посещено
- Пропущено по глубине
- Пропущено по лимиту
- Unsafe
- Ошибка доступа

======================================================================
ЧАСТЬ 9. СОХРАНЯТЬ СТРУКТУРУ СТРАНИЦЫ В ЧИТАЕМЫЙ MARKDOWN
======================================================================

Markdown должен быть не просто очищенным текстом.

Нужно максимально сохранить логическую структуру страницы META:

- название объекта;
- тип объекта;
- breadcrumbs;
- источник;
- основные разделы;
- иерархию заголовков;
- таблицы;
- списки;
- ссылки;
- пары поле — значение;
- раскрытые блоки;
- атрибуты;
- связанные объекты;
- интеграции;
- API;
- стенды;
- технические ресурсы.

Markdown не может полностью сохранить CSS и пиксельное отображение META. Нужно сохранить смысловую и структурную форму страницы.

Формат каждого отдельного Markdown-файла:

# Название объекта

## Метаданные источника

| Поле | Значение |
|---|---|
| URL | полный URL |
| Тип объекта | определённый тип |
| Дата выгрузки | дата и время |
| Родитель | найденный родитель или «Не найдено» |
| Глубина обхода | 0, 1 или 2 |
| Источник URL | meta_urls.txt или обнаруженная ссылка |

## Навигационный путь

Хлебные крошки страницы в правильном порядке.

## Основная информация

Таблица:

| Поле | Значение |
|---|---|

## Атрибуты

Сохранять таблицами.

Для вкладки «Атрибуты» сохранить разделы:

### Карточка объекта

| Поле | Значение |
|---|---|

### Ответственность

| Поле | Значение |
|---|---|

### Дополнительные атрибуты

| Поле | Значение |
|---|---|

### Технические атрибуты

| Поле | Значение |
|---|---|

Если раздел не найден, писать:

Данные не найдены в текущей выгрузке.

## Структура

Сохранять вложенными списками или таблицами.

## Связанные объекты

| Название | Тип | URL |
|---|---|---|

## Точки взаимодействия

Сохранять все исходные столбцы таблицы.

## Интеграционные взаимодействия

Сохранять столбцы:

| Наименование | Статус ЖЦ | АС поставщика | ТК поставщика | ТК потребителя | Владелец точки |
|---|---|---|---|---|---|

Если присутствуют дополнительные колонки, тоже сохранить их.

## Технологические взаимодействия

Сохранять все найденные столбцы.

## API

Сохранять:

| Название | Метод | Endpoint | Протокол | Описание | Точка взаимодействия | URL |
|---|---|---|---|---|---|---|

Если поле не найдено, писать:

Не найдено.

## Стенды

Сохранять все найденные колонки, минимум:

| Полигон | Имя стенда |
|---|---|

## Технические ресурсы

Сохранять:

| Название | Тип | Родитель | Статус | URL |
|---|---|---|---|---|

## Исходные данные страницы

Очищенный Markdown оставшейся полезной части страницы.

Не включать:

- глобальное меню META;
- меню профиля;
- уведомления;
- кнопки создания;
- кнопки редактирования;
- кнопки удаления;
- повторяющуюся навигацию;
- пустые контейнеры;
- SVG-код;
- CSS;
- JavaScript;
- служебные aria-тексты без смысловой нагрузки;
- дубли строк;
- текст unsafe-кнопок;
- скрытые системные элементы.

Не объединять разные поля в одну длинную строку.

Не превращать таблицу в абзац.

Не удалять полезные ссылки.

======================================================================
ЧАСТЬ 10. СОХРАНЯТЬ ССЫЛКИ В MARKDOWN
======================================================================

Все безопасные ссылки на объекты META сохранять в Markdown.

Формат:

[Название объекта](https://meta.sberbank.ru/meta/earp/...)

Если связанная страница была выгружена в projects/SNL/meta, дополнительно создать относительную ссылку на локальный Markdown-файл.

Пример:

- META: [СНЛ IAM Proxy SIGMA](https://meta.sberbank.ru/meta/earp/...)
- Локальная копия: [README.md](../../interaction_points/СНЛ_IAM_Proxy_SIGMA/README.md)

Не создавать относительную ссылку, если локальный файл не существует.

После генерации проверить относительные ссылки.

Создай функцию проверки, например:

validate_local_markdown_links(root_dir: str) -> list[dict]

Сформируй:

output/BROKEN_LINKS_REPORT.md

Формат:

# Проверка локальных ссылок Markdown

## Общая статистика

| Показатель | Значение |
|---|---|
| Проверено ссылок | ... |
| Корректных | ... |
| Битых | ... |

## Битые ссылки

| Файл | Ссылка | Ожидаемый путь |
|---|---|---|

Если битых ссылок нет, написать:

Битые локальные ссылки не обнаружены.

======================================================================
ЧАСТЬ 11. СОХРАНЯТЬ ПОЛНЫЕ ДАННЫЕ КАРТОЧЕК ОБЪЕКТОВ
======================================================================

Если таблица содержит ссылку на отдельную карточку объекта, одной строки таблицы недостаточно.

При возможности переходить в карточки:

- АС;
- ФП;
- модуля;
- подмодуля;
- технического компонента;
- технического ресурса;
- точки взаимодействия;
- интеграционного взаимодействия;
- технологического взаимодействия;
- инфопотока;
- стенда;
- API.

Из карточки получить:

- основную информацию;
- все read-only атрибуты;
- связанные объекты;
- таблицы;
- вкладки;
- раскрываемые разделы;
- API;
- endpoint;
- статус жизненного цикла;
- владельца;
- поставщика;
- потребителя;
- родительский объект;
- исходные ссылки.

Не создавать значения, которых нет на странице.

Если поле отсутствует, писать:

Не найдено в выгруженной странице.

Карточка должна выгружаться только при прохождении фильтра безопасности ссылок.

======================================================================
ЧАСТЬ 12. АДАПТИВНО ОПТИМИЗИРОВАТЬ EXPAND_META_PAGE
======================================================================

Сейчас обработка 41 страницы может занимать больше 600 секунд.

Не отключай expand_meta_page().

Сделай адаптивную обработку.

Для обычной страницы:

1. Одна начальная прокрутка вниз.
2. Одна прокрутка вверх.
3. Поиск aria-expanded=false.
4. Нажатие только безопасных раскрывающих элементов.
5. Повторный поиск новых раскрывающих элементов.
6. Раннее завершение, если изменений нет.

Завершать цикл раньше, если:

- высота страницы не изменилась;
- новых expand-элементов нет;
- новых таблиц нет;
- новых строк нет;
- два последовательных прохода не дали изменений.

Для специальных URL:

- /interactionPoints
- /integrationInteractions
- /stands
- /interactions

оставить расширенную прокрутку таблиц.

Не нажимать навигационные вкладки, если они ведут на отдельный URL, уже находящийся в meta_urls.txt.

В логе для каждой страницы:

EXPAND clicked=N
EXPAND scroll_rounds=N
EXPAND tables=N
EXPAND virtual_rows=N
EXPAND duration_seconds=N
EXPAND early_stop=true или false

Главная цель:

Сократить время запуска без потери раскрываемых данных.

======================================================================
ЧАСТЬ 13. ИСПРАВИТЬ HIERARCHY.md
======================================================================

Сейчас HIERARCHY.md имеет статус PARTIAL, потому что в нём нет понятных прямых источников.

Файл должен содержать:

# Иерархия архитектуры META

## Источники данных

| Тип объекта | Название | URL |
|---|---|---|

В таблицу должны попадать реальные страницы:

- automatedSystem;
- functionalSubsystem;
- module;
- submodule;
- techComponent;
- technicalResource.

Затем:

## Автоматизированные системы

Для каждого объекта:

- название;
- URL;
- родитель, если применимо.

## Функциональные подсистемы

## Модули

## Подмодули

## Технические компоненты

Не выдумывать связи.

Если родительская связь не определена, писать:

Родительская связь не определена в текущей выгрузке.

HIERARCHY.md считается полным, только если:

- есть раздел источников данных;
- есть хотя бы одна АС;
- есть хотя бы одна ФП;
- есть модули или честно указано их отсутствие;
- есть подмодули или честно указано их отсутствие;
- есть технические компоненты;
- у объектов указаны реальные URL;
- файл содержит не только заголовки.

Если полный экспорт URL не завершён, в конце добавить:

## Ограничение полноты

Полный охват всех URL пока не подтверждён.

После успешного полного запуска этот текст не должен оставаться, если необработанных URL нет.

======================================================================
ЧАСТЬ 14. ИСПРАВИТЬ TASK_COVERAGE.md
======================================================================

Сформируй полноценную таблицу:

# Покрытие требований задания

| Требование | Статус | Файл | Основание |
|---|---|---|---|

Строки:

1. Иерархия АС > ФП > Модуль > Подмодуль > ТК
2. Точки взаимодействия + API
3. Интеграционные взаимодействия + API
4. Технологические взаимодействия
5. Стенды
6. Технические ресурсы
7. Выгрузка атрибутов
8. Структурированная выгрузка projects/SNL/meta
9. Раскрытие свёрнутых элементов
10. Сохранение HTML
11. Полный захват отрисованного DOM
12. Обработка виртуализированных таблиц
13. Формирование читаемого Markdown
14. Сохранение ссылок
15. Обход связанных read-only страниц
16. Read-only режим
17. Отсутствие API
18. Отсутствие token/cookie/login/password
19. Отчёт EXPORT_REPORT.md
20. Отчёт незавершённых URL
21. Проверка локальных ссылок

Допустимые статусы:

- Закрыто
- Частично
- Не закрыто

Статус определять по содержимому, а не только по существованию файла.

Примеры:

- INTERACTION_POINTS.md содержит прямой источник /interactionPoints и найденные элементы — Закрыто.
- Файл существует, но содержит только заголовок — Не закрыто.
- Страница выгружена, но таблица распознана частично — Частично.
- HIERARCHY.md содержит источники, АС, ФП, модули и ТК — Закрыто.
- Полный экспорт прерван — структурированная выгрузка может быть Частично.
- DOM_CAPTURE_REPORT.md содержит полный захват всех успешно обработанных страниц — Закрыто.
- Есть необработанные URL — полный охват не может иметь статус Закрыто.

В основании указывать конкретные факты:

- прямой URL;
- количество найденных элементов;
- название файла;
- количество строк;
- отсутствие необработанных URL;
- результат отчёта качества.

======================================================================
ЧАСТЬ 15. ОБНОВЛЯТЬ STRUCTURED META ПОСЛЕ ПОЛНОГО ЭКСПОРТА
======================================================================

После формирования output/*.md вызвать структурированную выгрузку:

projects/SNL/meta

Используй существующий scripts/structured_meta_writer.py.

Не создавай вторую конкурирующую реализацию.

Проверь, что структурированная архитектура обновляется из актуальных данных текущего запуска.

Для каждого объекта желательно сохранить:

- README.md;
- attributes.md, если есть атрибуты;
- source_url;
- тип объекта;
- родителя;
- ссылки на связанные объекты;
- локальные относительные ссылки.

Структура должна поддерживать:

АС > ФП > ТК

АС > ФП > Модуль > ТК

АС > ФП > Модуль > Подмодуль > ТК

Не выдумывать связь ТК с модулем или подмодулем.

Если связь неизвестна, размещать ТК на уровне ФП и писать:

Связь с модулем или подмодулем не определена в текущей выгрузке.

Проверь каталоги интеграций:

- integration-flow
- integration
- integration-point

Не создавать папку с именем статуса жизненного цикла вместо имени объекта.

Например, папка:

integration_interactions/В_эксплуатации/

является подозрительной, если «В эксплуатации» было значением статуса, а не названием взаимодействия.

Исправь парсинг так, чтобы имя каталога бралось из колонки «Наименование», а не «Статус ЖЦ».

======================================================================
ЧАСТЬ 16. ДОБАВИТЬ ОТЧЁТ ОБХОДА СВЯЗАННЫХ ССЫЛОК
======================================================================

Создай:

output/LINK_FOLLOWING_REPORT.md

Формат:

# Отчёт по обходу связанных ссылок META

## Общая статистика

| Показатель | Значение |
|---|---|
| Исходных URL | ... |
| Найдено ссылок | ... |
| Разрешено ссылок | ... |
| Выгружено связанных страниц | ... |
| Пропущено внешних | ... |
| Пропущено unsafe | ... |
| Пропущено из-за глубины | ... |
| Пропущено из-за лимита | ... |
| Повторных URL | ... |
| Ошибок | ... |

## Выгруженные связанные страницы

| № | Родительская страница | Название | Тип объекта | URL | Локальный файл |
|---|---|---|---|---|---|

## Пропущенные ссылки

| № | Исходная страница | URL | Причина |
|---|---|---|---|

## Ошибки

| № | URL | Ошибка |
|---|---|---|

Не включать credentials, cookies или служебные заголовки.

======================================================================
ЧАСТЬ 17. ДОБАВИТЬ ОТЧЁТ ПОЛНОТЫ DOM
======================================================================

Создай:

output/DOM_CAPTURE_REPORT.md

Формат:

# Отчёт полноты захвата HTML META

| № | Название | URL | HTML-размер | Раскрыто элементов | Таблиц | Уникальных строк | Связанных ссылок | Статус |
|---|---|---|---|---|---|---|---|---|

Статусы:

- Полный захват
- Частичный захват
- HTML из кэша
- Ошибка
- Требуется отдельная карточка
- Виртуализированная таблица может быть неполной

Полный захват нельзя выставлять только по наличию HTML-файла.

Для статуса «Полный захват» необходимо:

- успешное открытие страницы или валидный кэш;
- завершённый SPA-рендер при новой загрузке;
- выполненный expand;
- выполненная проверка scroll-контейнеров;
- HTML сохранён;
- Markdown создан;
- отсутствует фатальная ошибка.

Для HTML из кэша статус:

HTML из кэша

В комментариях или дополнительной колонке можно указать, был ли DOM ранее раскрыт полностью.

======================================================================
ЧАСТЬ 18. ДОБАВИТЬ ОТЧЁТ КАЧЕСТВА MARKDOWN
======================================================================

Обнови:

output/MARKDOWN_QUALITY_REPORT.md

Проверять каждый ключевой Markdown-файл.

Таблица:

| Файл | Заголовок | URL источника | Таблицы | Списки | Ссылки | Дубли | Навигационный мусор | Статус |
|---|---|---|---|---|---|---|---|---|

Статусы:

- OK
- PARTIAL
- EMPTY
- ERROR

Критерии OK:

- есть непустой заголовок;
- есть URL источника;
- есть полезное содержимое;
- поля не объединены в одну строку;
- нет чрезмерного количества дублей;
- нет кнопок write-операций;
- таблицы сохранены, если они были на странице;
- ссылки сохранены.

Ключевые файлы:

- HIERARCHY.md
- INTERACTION_POINTS.md
- INTEGRATION_INTERACTIONS.md
- INTERACTIONS.md
- STANDS.md
- TECH_RESOURCES.md
- ATTRIBUTES.md
- TASK_COVERAGE.md
- EXPORT_REPORT.md

======================================================================
ЧАСТЬ 19. ОБНОВИТЬ КОНФИГ
======================================================================

В meta_exporter.yaml и meta_exporter.yaml.example должны быть настройки:

resume:
  enabled: true
  skip_existing_html: true
  skip_existing_markdown: false
  min_html_size_bytes: 1000
  rebuild_reports_from_cached_html: true

page_expansion:
  enabled: true
  expand_aria_elements: true
  expand_details: true
  expand_accordions: true
  click_show_more: true
  scroll_virtual_tables: true
  preserve_collected_virtual_rows: true
  deny_write_actions: true
  early_stop_after_unchanged_rounds: 2
  max_scroll_rounds_default: 3
  max_scroll_rounds_special: 10

link_following:
  enabled: true
  same_domain_only: true
  allowed_domain: "meta.sberbank.ru"
  allowed_path_prefix: "/meta/earp/"
  max_depth: 2
  max_discovered_urls: 300
  open_in_new_page: true
  save_discovered_urls: true

markdown:
  preserve_headings: true
  preserve_tables: true
  preserve_lists: true
  preserve_links: true
  preserve_breadcrumbs: true
  preserve_field_value_pairs: true
  remove_navigation_noise: true
  remove_duplicate_lines: true
  include_source_metadata: true

structured_output:
  enabled: true
  directory: "projects/SNL/meta"

browser:
  type: "sberbrowser"

Не удаляй уже существующие корректные настройки браузера.

Не меняй корпоративные пути без необходимости.

======================================================================
ЧАСТЬ 20. ОБНОВИТЬ EXPORT_REPORT.md
======================================================================

Добавь в output/EXPORT_REPORT.md:

# Отчёт по выгрузке META

## Общая статистика

| Показатель | Значение |
|---|---|
| Исходных URL | ... |
| Связанных URL обнаружено | ... |
| Всего URL в очереди | ... |
| Выгружено заново | ... |
| Использовано из кэша | ... |
| Успешно обработано | ... |
| Ошибок | ... |
| Необработанных URL | ... |
| HTML-файлов | ... |
| Markdown-файлов | ... |
| Файлов projects/SNL/meta | ... |

## Полнота DOM

Краткая статистика из DOM_CAPTURE_REPORT.md.

## Обход ссылок

Краткая статистика из LINK_FOLLOWING_REPORT.md.

## Соответствие заданию

| Блок задания | Файл результата | Статус |
|---|---|---|
| Иерархия АС > ФП > Модуль > Подмодуль > ТК | HIERARCHY.md | ... |
| Точки взаимодействия + API | INTERACTION_POINTS.md | ... |
| Интеграционные взаимодействия + API | INTEGRATION_INTERACTIONS.md | ... |
| Технологические взаимодействия | INTERACTIONS.md | ... |
| Стенды | STANDS.md | ... |
| Технические ресурсы | TECH_RESOURCES.md | ... |
| Атрибуты | ATTRIBUTES.md | ... |
| Структурированная архитектура | projects/SNL/meta | ... |

Статусы брать из фактического содержимого, а не задавать жёстко.

======================================================================
ЧАСТЬ 21. ПРОВЕРИТЬ PY_COMPILE
======================================================================

Выполни:

cd /Users/23865613/IdeaProjects/untitled/zadanie2/source_project
python -m py_compile run_exporter.py scripts/*.py

Если команда с wildcard не поддерживается оболочкой, выполни проверку через find:

find scripts -name "*.py" -print0 | xargs -0 python -m py_compile
python -m py_compile run_exporter.py

Не продолжай к полному запуску при наличии синтаксических ошибок.

Покажи точный результат.

======================================================================
ЧАСТЬ 22. ПОДГОТОВИТЬ ПОЛНЫЙ ЗАПУСК
======================================================================

Перед запуском:

1. Убедись, что SberBrowser установлен.
2. Убедись, что SberBrowser открыт.
3. Убедись, что пользователь вручную авторизован в META.
4. Убедись, что первый URL из meta_urls.txt открывается вручную.
5. Убедись, что meta_exporter.yaml существует.
6. Убедись, что resume.enabled=true.
7. Убедись, что page_expansion.enabled=true.
8. Убедись, что link_following.enabled=true.
9. Не удаляй корректные HTML-файлы temp_html.
10. Не удаляй существующий output до запуска.
11. Не запускай команду через timeout=600.

Проверь первый URL программно только после ручного подтверждения браузера.

Если браузер не открыт или пользователь не авторизован, не запускай долгую выгрузку и честно сообщи об этом.

======================================================================
ЧАСТЬ 23. ВЫПОЛНИТЬ ПОЛНЫЙ ЗАПУСК БЕЗ ОГРАНИЧЕНИЯ 600 СЕКУНД
======================================================================

Запуск:

cd /Users/23865613/IdeaProjects/untitled/zadanie2/source_project
source .venv/bin/activate
python run_exporter.py 2>&1 | tee final_full_run.log

Не запускай эту команду через оболочку с внешним timeout=600.

Дождись нормального завершения.

Признаки завершения:

- обработана вся очередь URL;
- браузер закрыт корректно;
- выведено «Выгрузка завершена»;
- сформированы финальные отчёты;
- сформирован INCOMPLETE_URLS_REPORT.md;
- сформирован DOM_CAPTURE_REPORT.md;
- сформирован LINK_FOLLOWING_REPORT.md;
- обновлён projects/SNL/meta;
- команда вернула управление терминалу.

Не объявляй запуск успешным, если:

- GigaCode остановил команду по тайм-ауту;
- терминал не вернул управление;
- остались необработанные URL без причины;
- финальные отчёты не созданы;
- projects/SNL/meta не обновлён.

Если выполнить долгий запуск из интерфейса GigaCode невозможно из-за лимита инструмента, тогда:

1. Не заявляй, что запуск выполнен.
2. Подготовь пользователю точную команду для ручного запуска.
3. После ручного запуска попроси только прислать конец final_full_run.log.
4. Не изменяй код повторно без анализа реального лога.

======================================================================
ЧАСТЬ 24. ПРОВЕРИТЬ ПОЛНЫЙ РЕЗУЛЬТАТ
======================================================================

После нормального завершения выполни:

grep -c "START PAGE" final_full_run.log
grep -c "MARKDOWN SAVED" final_full_run.log
grep -c "PAGE ERROR" final_full_run.log
grep -c "RESUME PAGE SKIPPED" final_full_run.log
grep -c "FULL DOM CAPTURED" final_full_run.log
grep -c "RELATED LINK FOUND" final_full_run.log
grep -c "RELATED PAGE EXPORTED" final_full_run.log
grep -c "EXPAND SAFE CLICK" final_full_run.log
grep -c "EXPAND SKIPPED UNSAFE" final_full_run.log
grep -c "VIRTUAL TABLE FOUND" final_full_run.log

Проверь:

find temp_html -type f | wc -l
find temp_data -type f 2>/dev/null | wc -l
find output -maxdepth 1 -type f -name "*.md" | wc -l
find projects/SNL/meta -type f | wc -l

Открой:

- output/HIERARCHY.md
- output/TASK_COVERAGE.md
- output/INCOMPLETE_URLS_REPORT.md
- output/MARKDOWN_QUALITY_REPORT.md
- output/EXPORT_REPORT.md
- output/LINK_FOLLOWING_REPORT.md
- output/DOM_CAPTURE_REPORT.md
- output/BROKEN_LINKS_REPORT.md
- output/INTERACTION_POINTS.md
- output/INTEGRATION_INTERACTIONS.md
- output/INTERACTIONS.md
- output/STANDS.md
- output/TECH_RESOURCES.md
- output/ATTRIBUTES.md, если он создаётся

Выборочно проверь не менее восьми отдельных Markdown-файлов:

1. Страница АС.
2. Страница ФП.
3. Страница модуля.
4. Страница подмодуля.
5. Страница технического компонента.
6. Страница точки взаимодействия.
7. Страница интеграционного взаимодействия.
8. Страница стендов или технического ресурса.

Для каждого проверить:

- есть название;
- указан исходный URL;
- указан тип объекта;
- указана дата выгрузки;
- сохранены заголовки;
- сохранены таблицы;
- сохранены списки;
- сохранены гиперссылки;
- нет навигационного мусора;
- нет write-кнопок;
- поля не объединены в одну строку;
- локальные ссылки ведут на существующие файлы;
- отсутствуют токены и cookies.

======================================================================
ЧАСТЬ 25. ПРОВЕРИТЬ БЕЗОПАСНОСТЬ
======================================================================

Выполни поиск потенциально опасных данных и write-операций.

Проверь Python-код:

grep -RniE "requests|httpx|aiohttp" .
grep -RniE "cookie|sessionStorage|localStorage|password|token" scripts run_exporter.py
grep -RniE "POST|PUT|PATCH|DELETE" scripts run_exporter.py
grep -RniE "Создать|Сохранить|Удалить|Редактировать" scripts

Интерпретируй результаты аккуратно:

- наличие deny-list со словами «Создать» или «Удалить» нормально;
- наличие urllib.parse нормально;
- наличие текста token/cookie в документации безопасности нормально;
- фактического чтения или сохранения credentials быть не должно;
- фактических write-запросов быть не должно.

Создай в финальном отчёте раздел:

## Проверка read-only режима

| Проверка | Результат |
|---|---|
| API META не используется | ... |
| Write HTTP-методы отсутствуют | ... |
| Cookies не сохраняются | ... |
| Tokens не сохраняются | ... |
| Login/password отсутствуют | ... |
| Unsafe-кнопки не нажимаются | ... |

======================================================================
ФИНАЛЬНЫЙ ОТЧЁТ
======================================================================

В конце покажи:

# Финальная стабилизация Этапа 3

## 1. Причина предыдущего прерывания

Указать точно:

- внутренний или внешний timeout;
- сколько URL успело обработаться;
- сколько HTML было сохранено;
- какие URL не были завершены.

## 2. Что изменено

Таблица:

| Файл | Изменение |
|---|---|

Отдельно перечислить новые файлы.

## 3. Результат py_compile

Указать:

- количество проверенных Python-файлов;
- были ли ошибки.

## 4. Результат полного запуска

| Показатель | Значение |
|---|---|
| Исходных URL | ... |
| Обнаружено связанных URL | ... |
| Всего URL в очереди | ... |
| Выгружено заново | ... |
| Использовано из существующего HTML | ... |
| Успешно обработано | ... |
| Ошибок | ... |
| Необработанных URL | ... |
| Время запуска | ... |

## 5. Результат expand_meta_page

| Показатель | Значение |
|---|---|
| Обработано страниц | ... |
| Выполнено безопасных кликов | ... |
| Пропущено unsafe | ... |
| Обработано виртуальных таблиц | ... |
| Собрано уникальных строк | ... |
| Ошибок expand | ... |
| Среднее время страницы | ... |

## 6. Результат полного DOM-захвата

| Показатель | Значение |
|---|---|
| Страниц с FULL DOM CAPTURED | ... |
| Полных захватов | ... |
| Частичных захватов | ... |
| HTML из кэша | ... |
| Виртуализированных таблиц | ... |
| Собрано уникальных строк таблиц | ... |

## 7. Результат обхода гиперссылок

| Показатель | Значение |
|---|---|
| Найдено внутренних ссылок | ... |
| Разрешено | ... |
| Выгружено связанных страниц | ... |
| Пропущено внешних | ... |
| Пропущено unsafe | ... |
| Пропущено по глубине | ... |
| Пропущено по лимиту | ... |
| Достигнут лимит глубины | Да или Нет |
| Достигнут лимит URL | Да или Нет |

## 8. Качество Markdown

| Проверка | Статус |
|---|---|
| Заголовки сохранены | ... |
| Таблицы сохранены | ... |
| Списки сохранены | ... |
| Гиперссылки сохранены | ... |
| Breadcrumbs сохранены | ... |
| Поля и значения разделены | ... |
| Навигационный мусор удалён | ... |
| Дубли удалены | ... |
| Write-кнопки отсутствуют | ... |
| Локальные ссылки проверены | ... |

## 9. Статус отчётов

| Файл | Статус | Комментарий |
|---|---|---|
| HIERARCHY.md | ... | ... |
| INTERACTION_POINTS.md | ... | ... |
| INTEGRATION_INTERACTIONS.md | ... | ... |
| INTERACTIONS.md | ... | ... |
| STANDS.md | ... | ... |
| TECH_RESOURCES.md | ... | ... |
| ATTRIBUTES.md | ... | ... |
| TASK_COVERAGE.md | ... | ... |
| INCOMPLETE_URLS_REPORT.md | ... | ... |
| DOM_CAPTURE_REPORT.md | ... | ... |
| LINK_FOLLOWING_REPORT.md | ... | ... |
| MARKDOWN_QUALITY_REPORT.md | ... | ... |
| BROKEN_LINKS_REPORT.md | ... | ... |

## 10. Проверка read-only режима

| Проверка | Результат |
|---|---|
| API META не используется | ... |
| Write HTTP-методы отсутствуют | ... |
| Cookies не сохраняются | ... |
| Tokens не сохраняются | ... |
| Login/password отсутствуют | ... |
| Unsafe-кнопки не нажимаются | ... |

## 11. Где находится структурированная архитектура

Указать точный путь:

/Users/23865613/IdeaProjects/untitled/zadanie2/source_project/projects/SNL/meta

Показать:

find projects/SNL/meta -maxdepth 8 -type f | sort

## 12. Остаточные ограничения

Указывать только реальные ограничения после полного запуска.

Возможные ограничения:

- виртуализированная таблица не отдаёт все строки в DOM;
- отдельные карточки недоступны по правам;
- отдельные связи родитель — потомок не присутствуют в HTML;
- часть связанных страниц требует отдельного URL;
- ручная авторизация обязательна.

Не писать ограничение, если оно уже устранено.

## 13. Готовность к наставнику

Ответить «Да» только если одновременно выполнены условия:

- полный процесс завершился самостоятельно;
- исходные URL учтены;
- найденные разрешённые связанные URL обработаны или имеют объяснимый статус;
- необработанные URL отсутствуют либо имеют конкретную причину;
- HIERARCHY.md больше не имеет необоснованный статус PARTIAL;
- TASK_COVERAGE.md содержит полноценную таблицу;
- projects/SNL/meta обновлён после полного запуска;
- Markdown читаемый;
- таблицы не превращены в сплошной текст;
- read-only режим подтверждён;
- py_compile прошёл;
- финальные отчёты созданы.

Если хотя бы одно условие не выполнено, написать:

Проект частично готов к демонстрации.

И перечислить конкретные оставшиеся действия.

Главная цель:

Получить безопасный read-only skill, который через SberBrowser и Playwright:

1. Открывает страницы META.
2. Получает итоговый отрисованный DOM.
3. Раскрывает безопасные свёрнутые элементы.
4. Прокручивает виртуальные таблицы.
5. Собирает все доступные строки.
6. Находит внутренние ссылки на связанные архитектурные объекты.
7. Безопасно переходит по разрешённым ссылкам.
8. Не выполняет write-операции.
9. Сохраняет исходный HTML.
10. Формирует читаемый структурированный Markdown.
11. Формирует сводные отчёты в output.
12. Формирует архитектуру в projects/SNL/meta.
13. Может продолжить прерванную выгрузку из существующего HTML.
14. Честно сообщает о неполных или недоступных данных.