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


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

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

Этап 2.0 — аудит вкладки «Атрибуты» завершён.

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

- в temp_html сохранены страницы АС SberGeo и ФП SberGeo.СНЛ;
- в локальном HTML присутствуют данные разделов:
  1. Карточка;
  2. Ответственность;
  3. Дополнительные атрибуты;
  4. Технические атрибуты;
- существующий pipeline уже умеет формировать Markdown-блок атрибутов;
- scripts/structured_meta_writer.py не использует этот результат;
- attributes/README.md для АС и ФП сейчас создаются статическим текстом;
- проблема может быть исправлена полностью офлайн;
- браузерный прогон не требуется.

Нужно реализовать этап 2.1 — формирование реальных attributes/README.md
из сохранённого HTML.

Не запускать браузер.
Не обращаться к META.
Не запускать run_exporter.py.
Не выполнять Git-команды.
Не изменять интеграции.
Не изменять иерархию АС, ФП, модулей, подмодулей и ТК.
Не придумывать отсутствующие значения.

======================================================================
1. РЕЗЕРВНЫЕ КОПИИ
======================================================================

Создай резервные копии:

scripts/structured_meta_writer.py.before-attributes-fix
projects/SNL/meta.before-attributes-fix

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

.before-attributes-fix

Если такое имя уже существует, добавить timestamp.

======================================================================
2. НАЙТИ ТОЧНЫЕ HTML-ФАЙЛЫ АС И ФП
======================================================================

Не полагаться только на имя HTML-файла.

Найти сохранённые страницы по содержимому, URL, breadcrumb и META ID:

АС:
- SberGeo;
- META ID 2842;
- страница automated system.

ФП:
- SberGeo.СНЛ;
- META ID 236500;
- страница functional subsystem.

Создать однозначное сопоставление:

AS_HTML → АС SberGeo
FP_HTML → ФП SberGeo.СНЛ

Если для одного объекта найдено несколько файлов, выбрать полный актуальный
DOM и объяснить выбор.

======================================================================
3. ИСПОЛЬЗОВАТЬ СУЩЕСТВУЮЩИЙ HTML → MARKDOWN PIPELINE
======================================================================

Не писать второй независимый HTML-парсер без необходимости.

Проверить существующие функции в:

- scripts/scrape_meta.py;
- scripts/html_to_markdown.py;
- scripts/markdown_writer.py.

Использовать существующую функцию, которая уже формирует Markdown страницы,
например build_meta_markdown(html, url), если она подходит.

Перед импортом проверить отсутствие циклической зависимости.

Если импорт build_meta_markdown из scrape_meta создаёт цикл:

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

======================================================================
4. ИЗВЛЕЧЬ ТОЛЬКО БЛОК АТРИБУТОВ
======================================================================

Из Markdown результата каждой страницы извлечь отдельно четыре секции:

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

Поддержать варианты заголовков:

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

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

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

Не включать в attributes/README.md:

- навигацию страницы;
- breadcrumbs;
- боковое меню;
- кнопки интерфейса;
- другие вкладки;
- HTML-теги и служебные атрибуты;
- информацию другого архитектурного объекта.

======================================================================
5. СОХРАНИТЬ ТАБЛИЧНЫЙ ФОРМАТ
======================================================================

Если данные в источнике представлены таблицей, в итоговом Markdown должна
остаться корректная Markdown-таблица:

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

или исходная многоколоночная структура.

Обязательно сохранить:

- все строки;
- порядок строк;
- названия колонок;
- пустые значения как пустые ячейки или «Не указано» только при наличии
  такого правила в проекте;
- переносы внутри ячеек;
- ссылки;
- кириллицу;
- идентификаторы и коды.

Запрещено:

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

======================================================================
6. СОЗДАТЬ ИТОГОВЫЕ ФАЙЛЫ
======================================================================

Сформировать реальные файлы:

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

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

Рекомендуемая структура:

# Атрибуты АС SberGeo

Источник: [URL страницы META]

## Карточка

[реальная Markdown-таблица]

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

[реальная Markdown-таблица]

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

[реальная Markdown-таблица]

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

[реальная Markdown-таблица]

Для ФП аналогично:

# Атрибуты ФП SberGeo.СНЛ

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

======================================================================
7. ОБРАБОТКА РЕАЛЬНОГО ОТСУТСТВИЯ ДАННЫХ
======================================================================

Для каждой секции различать:

1. Секция и строки найдены:
   - сохранить реальные данные.

2. Заголовок найден, но содержимое действительно пустое:
   - написать:
     «Раздел присутствует в сохранённом DOM, но заполненные значения отсутствуют».

3. Секция отсутствует в сохранённом DOM:
   - написать:
     «Раздел не найден в сохранённом DOM страницы».

Не использовать общий текст «Не найдены» без указания причины.

Добавить диагностическое предупреждение в отчёт, но не останавливать генерацию
остальных секций.

======================================================================
8. НЕ ЗАВЯЗЫВАТЬСЯ НА ИМЯ TEMP_HTML-ФАЙЛА
======================================================================

В structured_meta_writer.py создать или использовать функцию определения
локального источника объекта по:

- типу объекта;
- META ID;
- URL;
- содержимому страницы.

Не хардкодить абсолютные имена вроде:

temp_html/АС.html
temp_html/ФП.html

Допустимо использовать подтверждённые META ID 2842 и 236500 как часть
идентификации объекта, но не как единственный критерий.

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

Создать:

output/ATTRIBUTES_REPORT.md

Структура:

# Отчёт по выгрузке атрибутов

| Объект | HTML-файл | META ID | Карточка | Ответственность | Дополнительные | Технические |
|---|---|---:|---|---|---|---|

Для каждой секции указать:

- количество строк;
- количество таблиц;
- источник;
- статус:
  - extracted;
  - empty;
  - missing;
  - parse_error.

Добавить раздел:

## Потери данных

Указать, были ли обнаружены строки HTML, которые не попали в Markdown.

Добавить раздел:

## Разделение объектов

Подтвердить, что данные АС и ФП не смешаны.

======================================================================
10. STRUCTURED_META_WRITER
======================================================================

Изменить только необходимую логику формирования attributes/README.md.

Удалить статическое заполнение вида:

- «Карточка объекта | Доступна»;
- «Ответственность | Доступна»;
- «Дополнительные атрибуты | Не найдены»;
- «Технические атрибуты | Не найдены».

Вместо него использовать результат извлечения реальных секций.

Остальную логику structured_meta_writer.py не изменять без необходимости:

- интеграционные поддеревья;
- canonical_key;
- атомарная замена;
- иерархия;
- ТК;
- модули и подмодули.

======================================================================
11. ОФЛАЙН-ПРОВЕРКИ
======================================================================

Выполнить:

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

python scripts/regenerate_reports.py

Не запускать run_exporter.py.

После этого повторно выполнить:

python scripts/regenerate_reports.py

Проверить идемпотентность:

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

======================================================================
12. ПРОВЕРКА ИТОГОВЫХ ATTRIBUTES/README.MD
======================================================================

Для обоих файлов проверить:

- ровно один заголовок страницы;
- четыре раздела атрибутов;
- реальные строки;
- корректные Markdown-таблицы;
- отсутствие HTML-тегов;
- отсутствие меню и кнопок META;
- отсутствие данных другого объекта;
- отсутствие прежних статических заглушек.

Выполнить поиск:

grep -RIn \
  "Карточка объекта.*Доступна\|Дополнительные атрибуты.*Не найдены\|Технические атрибуты.*Не найдены" \
  projects/SNL/meta/as/SberGeo/* \
  projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/* || true

Прежние заглушки не должны находиться.

======================================================================
13. ПОКАЗАТЬ РЕЗУЛЬТАТ
======================================================================

Покажи полный текст:

- projects/SNL/meta/as/SberGeo/attributes/README.md;
- projects/SNL/meta/as/SberGeo/fp/SberGeo.СНЛ/attributes/README.md;
- output/ATTRIBUTES_REPORT.md.

Для каждой секции показать статистику:

| Объект | Секция | Таблиц | Строк данных | Статус |
|---|---|---:|---:|---|

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

# Этап 2.1 — офлайн-выгрузка атрибутов

## Изменённые файлы

## Использованные HTML-источники

## Изменение structured_meta_writer.py

## Атрибуты АС

## Атрибуты ФП

## Сохранение табличного формата

## Разделение данных АС и ФП

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

## Первый запуск regenerate_reports.py

## Повторный запуск regenerate_reports.py

## Проверка идемпотентности

## Оставшиеся проблемы

В конце явно указать:

- Карточка АС: extracted / empty / missing;
- Ответственность АС: extracted / empty / missing;
- Дополнительные атрибуты АС: extracted / empty / missing;
- Технические атрибуты АС: extracted / empty / missing;
- Карточка ФП: extracted / empty / missing;
- Ответственность ФП: extracted / empty / missing;
- Дополнительные атрибуты ФП: extracted / empty / missing;
- Технические атрибуты ФП: extracted / empty / missing;
- повторный браузерный прогон потребовался: нет.

После выполнения остановиться.