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


Продолжай с текущего состояния. Не анализируй проект заново.

Работай только в:

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

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

- PROJECT_STATE.md
- scripts/attribute_scraper.py
- scripts/scrape_meta.py
- scripts/meta_page_expander.py
- scripts/structured_meta_writer.py

Текущий подтверждённый статус:

- scripts/attribute_scraper.py уже создан;
- для АС и ФП найдены все четыре заголовка:
  - Карточка;
  - Ответственность;
  - Дополнительные атрибуты;
  - Технические атрибуты;
- реальные данные уже собираются:
  - АС — 11 пар;
  - ФП — 12 пар;
- но новый классификатор не подключён к фактическому сбору;
- все пары пока записываются в «Без раздела»;
- данные из _scroll_and_collect_rows() не передаются в attribute_scraper.

Нужно не проводить новый аудит, а завершить реализацию.

======================================================================
1. ПОДКЛЮЧИТЬ attribute_scraper К РЕАЛЬНОМУ ПРОГОНУ
======================================================================

Найди фактическое место в scripts/scrape_meta.py или
scripts/meta_page_expander.py, где после открытия вкладки «Атрибуты»
собираются строки функцией:

_scroll_and_collect_rows(...)

или эквивалентной функцией.

После открытия вкладки и раскрытия всех секций необходимо вызвать новый
DOM-классификатор из scripts/attribute_scraper.py.

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

В результате основной код должен получать структуру:

{
    "Карточка": [...],
    "Ответственность": [...],
    "Дополнительные атрибуты": [...],
    "Технические атрибуты": [...],
    "Без раздела": [...]
}

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

======================================================================
2. ЕДИНСТВЕННЫЙ ИСТОЧНИК ДАННЫХ
======================================================================

После подключения классификатора именно его результат должен передаваться:

- в результат scrape_meta;
- в промежуточные данные страницы;
- в structured_meta_writer;
- в attributes/README.md.

Старый плоский список атрибутов допускается оставить только как резервный
fallback, если DOM-классификатор завершился с ошибкой.

Запрещено одновременно записывать:

- результат нового классификатора;
- и старый плоский список;

поскольку это создаст дубли.

======================================================================
3. ПРАВИЛЬНО ПЕРЕДАТЬ ДАННЫЕ ИЗ БРАУЗЕРА
======================================================================

Проверить, что новый классификатор выполняется в контексте Playwright Page
или Locator вкладки «Атрибуты», а не пытается работать с уже потерявшим
структуру текстовым списком.

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

1. открыть нужную страницу;
2. открыть вкладку «Атрибуты»;
3. раскрыть доступные секции;
4. дождаться стабилизации DOM;
5. получить активный container с role="tabpanel";
6. вызвать DOM-классификатор;
7. вернуть классифицированные пары;
8. сохранить HTML страницы;
9. сформировать Markdown.

Не классифицировать строки после удаления заголовков.

======================================================================
4. ИСПРАВИТЬ ФОРМАТ attributes/README.md
======================================================================

Обновить генерацию файлов:

projects/SNL/meta/as/SberGeo/attributes/README.md

projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/attributes/README.md

Формат:

# Атрибуты

## Карточка

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

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

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

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

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

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

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

Раздел выводится только при наличии строк.

Раздел «Без раздела» выводить только в самом конце и только если после
DOM-классификации действительно остались неклассифицированные пары.

======================================================================
5. ВЫПОЛНИТЬ БРАУЗЕРНЫЙ ПРОГОН
======================================================================

Выполнить целевой браузерный прогон только для страниц:

- АС SberGeo;
- ФП SberGeo.СНЛ.

Использовать открытую авторизованную сессию SberBrowser.

META — строго read-only.

Запрещено:

- API META;
- requests/httpx/aiohttp/urllib;
- автоматический вход;
- чтение cookies, localStorage, sessionStorage;
- действия сохранения, изменения, создания или удаления.

Не выполнять полный прогон 41 URL, если для исправления атрибутов достаточно
двух страниц.

======================================================================
6. ПРОВЕРИТЬ ФАКТИЧЕСКИЙ РЕЗУЛЬТАТ
======================================================================

После браузерного прогона прочитать оба сформированных attributes/README.md.

Показать таблицу:

| Страница | Карточка | Ответственность | Дополнительные | Технические | Без раздела | Всего |
|---|---:|---:|---:|---:|---:|---:|
| АС | ... | ... | ... | ... | ... | ... |
| ФП | ... | ... | ... | ... | ... | ... |

Критерии:

- АС: итоговое количество не меньше 11 пар без учёта удалённых полных дублей;
- ФП: итоговое количество не меньше 12 пар без учёта удалённых полных дублей;
- хотя бы один реальный раздел должен содержать строки;
- все 11 и 12 пар не могут остаться в «Без раздела», если четыре заголовка
  действительно найдены;
- таблицы должны содержать реальные поля и значения, а не только заголовки.

Показать по две реальные пары из каждого непустого раздела.

======================================================================
7. ПРОВЕРИТЬ FALLBACK
======================================================================

Если DOM-классификатор возвращает ноль строк при найденных четырёх заголовках,
это считать ошибкой реализации, а не отсутствием данных.

В этом случае:

- вывести DOM-диагностику;
- исправить связь между заголовком и строками;
- повторить целевой прогон.

Не завершать работу со статусом «нужен ещё один запуск».

======================================================================
8. ТЕХНИЧЕСКИЕ ПРОВЕРКИ
======================================================================

Выполнить:

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

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

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

Проверить:

- оба запуска формируют одинаковые файлы;
- таблицы не дублируются;
- количество пар не растёт;
- «Без раздела» не заполняется повторными копиями;
- архитектурная иерархия не меняется;
- интеграции не меняются;
- ТК не перемещаются;
- старые каталоги не восстанавливаются.

======================================================================
9. ОБНОВИТЬ PROJECT_STATE И ОТЧЁТЫ
======================================================================

Обновить:

- PROJECT_STATE.md
- output/ATTRIBUTES_REPORT.md
- output/REQUIREMENTS_REPORT.md
- output/TASK_COVERAGE.md

Не писать, что требование закрыто, пока оба attributes/README.md не содержат
реальные пары, распределённые по разделам.

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

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

1. где attribute_scraper подключён к основному потоку;
2. какие функции изменены;
3. результат браузерного прогона АС;
4. результат браузерного прогона ФП;
5. количество строк каждого раздела;
6. количество строк «Без раздела»;
7. сверку прежних 11 и 12 пар;
8. содержимое заголовков обоих attributes/README.md;
9. результат py_compile;
10. результат двух регенераций;
11. подтверждение идемпотентности;
12. остались ли незакрытые требования.

Не завершать ответ фразой «требуется ещё один запуск».

Работа считается завершённой только после фактического целевого браузерного
прогона и проверки созданных Markdown-файлов.

Не выполнять git commit и git push.