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


Прочитай только PROJECT_STATE.md и файлы, непосредственно относящиеся к
текущей проблеме.

Не сканируй весь проект заново.

Работай только в текущем проекте.

Предыдущий вывод «все требования закрыты» неверен, потому что одновременно
зафиксированы:

- 0 реальных строк атрибутов;
- 28 URL со статусом WRONG_SECTION.

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

Не выполнять git commit и push.
Не менять Git-ветку.
Не использовать META API.
Не использовать токены, cookies или секреты.
Работать только через открытую авторизованную сессию SberBrowser.
META строго read-only.

======================================================================
1. СОЗДАТЬ РЕЗЕРВНЫЕ КОПИИ
======================================================================

Создать резервные копии изменяемых файлов:

- scripts/scrape_meta.py
- scripts/meta_page_expander.py
- scripts/html_to_markdown.py
- scripts/structured_meta_writer.py

Не создавать копии проектов и каталогов с архитектурой.

======================================================================
2. РАЗОБРАТЬ 28 WRONG_SECTION
======================================================================

Сначала вывести полный список URL со статусом WRONG_SECTION:

| № | Запрошенный URL | Фактический page.url | Заголовок DOM | Ожидаемый раздел | Найденный раздел | DOM hash |
|---|---|---|---|---|---|---|

Сгруппировать URL по типам:

- обычные страницы объектов;
- stands;
- interactions;
- integrationInteractions;
- interactionPoints;
- attributes;
- другие маршруты.

Не считать ситуацию нормальной только потому, что META является SPA.

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

1. можно ли открыть нужный раздел прямым page.goto();
2. если нет — какую видимую ссылку, вкладку или пункт навигации нужно нажать;
3. какой специфичный признак подтверждает открытие раздела;
4. изменился ли DOM hash после навигации.

======================================================================
3. ИСПРАВИТЬ SPA-НАВИГАЦИЮ
======================================================================

Для SPA-подмаршрутов использовать следующий алгоритм:

1. открыть подтверждённую родительскую страницу;
2. дождаться полной загрузки родительской страницы;
3. найти видимую ссылку или вкладку нужного раздела;
4. проверить, что клик безопасный и является только навигацией;
5. нажать;
6. дождаться изменения активной вкладки, заголовка, breadcrumb или таблицы;
7. дождаться изменения DOM hash;
8. проверить специфичный маркер раздела;
9. только после этого сохранять HTML.

Для каждого раздела использовать не общие слова, а специфичные признаки.

Примеры:

stands:
- заголовок или таблица стендов;
- ожидаемые поля стенда;
- значения Major-GO, DEV, ПРОМ, Major-Check при их наличии.

interactionPoints:
- таблица точек взаимодействия;
- реальные названия точек;
- специфичные колонки таблицы.

integrationInteractions:
- таблица интеграционных взаимодействий;
- колонки «Наименование», «Статус ЖЦ», «АС поставщика»,
  «ТК поставщика», «ТК потребителя», «Владелец точки».

interactions:
- таблица технологических взаимодействий;
- специфичные колонки или заголовок этого раздела.

attributes:
- активная вкладка «Атрибуты»;
- четыре подраздела;
- реальные строки данных.

Если корректный раздел не открылся:

- оставить WRONG_SECTION;
- не сохранять DOM предыдущей страницы как результат;
- не считать данные отсутствующими.

======================================================================
4. ИСПРАВИТЬ ВЫГРУЗКУ АТРИБУТОВ
======================================================================

Сейчас вкладка открывается, но извлечено 0 строк.

Нужно определить реальный контейнер атрибутов.

После открытия вкладки:

1. определить внутренний прокручиваемый контейнер;
2. не ограничиваться прокруткой window или body;
3. раскрыть разделы:
   - Карточка;
   - Ответственность;
   - Дополнительные атрибуты;
   - Технические атрибуты;
4. найти строки через реальные элементы DOM:
   - table/tr/td;
   - role=row;
   - role=grid;
   - role=gridcell;
   - data-testid;
   - пары «Поле — Значение»;
5. определить, используется ли виртуализация.

При виртуализации:

- прокручивать внутренний контейнер небольшими шагами;
- после каждого шага ждать обновления строк;
- собирать видимые строки в Python;
- нормализовать текст;
- удалять дубли;
- продолжать до стабилизации:
  три последовательные прокрутки не добавили новых строк
  либо достигнут конец контейнера;
- не полагаться только на итоговый page.content(), потому что ранее
  просмотренные виртуальные строки могут исчезать из DOM.

Собирать данные отдельно для:

- АС;
- ФП;
- каждого из четырёх подразделов.

Не смешивать данные АС и ФП.

======================================================================
5. ПЕРЕДАТЬ СОБРАННЫЕ СТРОКИ В MARKDOWN
======================================================================

Обновить передачу результатов так, чтобы собранные в браузере строки
атрибутов использовались при генерации Markdown.

Целевые файлы:

projects/SNL/meta/as/{AS_NAME}/attributes/README.md

projects/SNL/meta/as/{AS_NAME}/fp/{FP_NAME}/attributes/README.md

Формат каждого раздела:

## Карточка

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

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

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

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

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

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

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

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

- оставить заголовок;
- написать «Данные отсутствуют»;
- зафиксировать доказательство в отчёте.

Если раздел не загрузился:

- не писать «Данные отсутствуют»;
- указать ошибку загрузки.

======================================================================
6. СТЕНДЫ И ИНТЕГРАЦИИ
======================================================================

Не считать объекты отсутствующими, пока соответствующий URL имеет
WRONG_SECTION.

После исправления навигации повторно проверить:

- stands;
- interactions;
- integrationInteractions;
- interactionPoints.

Для стендов проверить, являются ли Major-GO, DEV, ПРОМ и Major-Check
отдельными строками таблицы или значениями одного поля.

Если это отдельные реальные объекты META, сохранить каждый объект у
подтверждённого родителя.

Если это только значения атрибута, сохранить их в таблице атрибутов,
не создавая ложных объектов.

Для integration-flow и integration:

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

Пять interaction-point ФП должны сохраниться только на уровне ФП.

======================================================================
7. КРИТЕРИИ УСПЕШНОГО БРАУЗЕРНОГО ПРОГОНА
======================================================================

После исправлений выполнить полный браузерный прогон.

В итоговой статистике показать:

- всего URL;
- SUCCESS;
- WRONG_SECTION;
- DUPLICATE_DOM;
- ATTRIBUTE_TAB_NOT_OPENED;
- PAGE_ERROR;
- число уникальных DOM hash;
- число сохранённых HTML.

Целевой результат:

- PAGE_ERROR = 0;
- ATTRIBUTE_TAB_NOT_OPENED = 0 для страниц АС и ФП;
- WRONG_SECTION = 0 для обязательных страниц задания;
- DUPLICATE_DOM допустим только если доказано, что два URL действительно
  отображают один и тот же раздел, а не предыдущую страницу.

======================================================================
8. ОТЧЁТ ПО АТРИБУТАМ
======================================================================

Создать или обновить:

output/ATTRIBUTES_REPORT.md

Формат:

| Уровень | Объект | Раздел | Строк найдено | Строк сохранено | Источник | Статус |
|---|---|---|---:|---:|---|---|

В отчёте обязательно показать количество строк отдельно для:

- Карточки АС;
- Ответственности АС;
- Дополнительных атрибутов АС;
- Технических атрибутов АС;
- Карточки ФП;
- Ответственности ФП;
- Дополнительных атрибутов ФП;
- Технических атрибутов ФП.

Статус «Закрыто» разрешён только при наличии реальных строк либо
подтверждённого корректно загруженного пустого раздела.

======================================================================
9. ПРОВЕРКИ
======================================================================

Выполнить:

python -m py_compile run_exporter.py scripts/*.py

Затем браузерный прогон.

После успешного браузерного прогона:

python scripts/regenerate_reports.py
python scripts/regenerate_reports.py

Проверить:

- количество файлов одинаковое;
- содержимое одинаковое;
- таблицы атрибутов не дублируются;
- строки атрибутов не теряются;
- пять interaction-point не дублируются на уровне АС;
- старые плоские каталоги не восстанавливаются.

======================================================================
10. ОБНОВИТЬ СТАТУС
======================================================================

Обновить PROJECT_STATE.md.

Не писать, что все требования закрыты, если:

- количество строк атрибутов равно нулю из-за ошибки загрузки;
- обязательные URL остаются в WRONG_SECTION;
- отсутствие интеграций определено по DOM другой страницы.

В финальном ответе показать:

1. какие файлы изменены;
2. список и количество исправленных WRONG_SECTION;
3. сколько WRONG_SECTION осталось;
4. количество строк каждого раздела атрибутов АС;
5. количество строк каждого раздела атрибутов ФП;
6. какие стенды найдены;
7. какие integration-flow найдены;
8. какие integration найдены;
9. какие integration-point найдены;
10. результаты py_compile;
11. результаты двух регенераций;
12. какие требования ещё не закрыты.

После этого остановиться.