diff --git a/docs/superpowers/plans/2026-10-19-osv-indicator-column.md b/docs/superpowers/plans/2026-10-19-osv-indicator-column.md index d85b527..9bc98ff 100644 --- a/docs/superpowers/plans/2026-10-19-osv-indicator-column.md +++ b/docs/superpowers/plans/2026-10-19-osv-indicator-column.md @@ -12,7 +12,7 @@ **Worktree:** `/Users/andrey.epifancev/projects/awp-ca/.wt/osv-indicators/` — `tabular-parser/`, `docs/`, `fixtures/` на ветке `feat/58-osv-indicators`; `CLAUDE.md`, `.claude/`, `reference-old-arm/` — симлинки. Ниже `$WT` = этот путь. Git — только `git -C $WT/`. Команды Python — из `$WT/tabular-parser/api` с `ENV_FILE=.env.test .venv/bin/python -m pytest …`; `make` — из `$WT/tabular-parser` (сначала один раз `make venv`). codegraph: `codegraph_explore` с `projectPath` = `$WT/tabular-parser`. -**Параллельный трек B** (`/Users/andrey.epifancev/projects/awp-ca/.wt/osv-flat/`, плоская форма AURORA-1661) правит `header.py` (`_account_code`, `_organization`), `hierarchy.py` (стратегии, `resolve_levels`), `classify.py` (`_find_total`, `_trailing_totals`), `checks.py` (`_total`), синтетику s33–s39. Этот план в `hierarchy.py` добавляет только поля `BodyRow`, в `_trailing_totals` и `_total` — по одному условию. Его файлы не трогать сверх этого; при конфликте слияния второй вливающийся трек добавляет своё условие к версии первого. +**Параллельный трек B** (`/Users/andrey.epifancev/projects/awp-ca/.wt/osv-flat/`, плоская форма AURORA-1661) правит `header.py` (`_account_code`, `_organization`), `hierarchy.py` (стратегии, `resolve_levels`), `classify.py` (`_find_total`, `_trailing_totals`), `checks.py` (`_total`), синтетику s37–s44. Этот план в `hierarchy.py` добавляет только поля `BodyRow`, в `_trailing_totals` и `_total` — по одному условию. Его файлы не трогать сверх этого; при конфликте слияния второй вливающийся трек добавляет своё условие к версии первого. ## Global Constraints @@ -21,7 +21,7 @@ - Словари — данные (`api/rules/*.yaml`); каждая новая запись срабатывает хотя бы на одном файле (`tests/fixtures/test_rules_coverage.py`). Паттерны без дефисов, «ё» и переносов (текст нормализуется: дефис и перенос → пробел). - Контракт результата и DBML не меняются. `data_type` строки — только значения контракта (`BU`, `NU`, `SUM`, `CURRENCY`, `QUANTITY`, `null`). - Деньги — `Decimal`. -- Golden-снимки реальных файлов и s01–s32 MUST NOT измениться. Любой diff по ним — стоп, отчёт контроллеру, вопрос владельцу. `make golden-update` — только для новых s40–s43, отдельным коммитом в fixtures. +- Golden-снимки реальных файлов и s01–s32 MUST NOT измениться. Любой diff по ним — стоп, отчёт контроллеру, вопрос владельцу. `make golden-update` — только для новых s33–s36, отдельным коммитом в fixtures. - Файлы контура (`/Users/andrey.epifancev/projects/awp-ca/result_dir.zip`) в git MUST NOT попадать; распаковка — только во временный каталог вне репозиториев (`mktemp -d`). - Каждое решение без обсуждения — строкой в `openspec/changes/osv-indicator-column/design.md`, раздел `## Decisions made without discussion`. Маркеры находок T/C/I/M/R/O — по `~/.claude/CLAUDE.md`. - Перед каждым коммитом в tabular-parser — `make check` из `$WT/tabular-parser` зелёный. Коммиты заканчиваются строкой `Co-Authored-By: Claude Opus 5.5 `. @@ -117,12 +117,12 @@ indicator_column_untyped: --- -### Task 2: Синтетика s40–s43 и ожидания (модель: sonnet) +### Task 2: Синтетика s33–s36 и ожидания (модель: sonnet) **Files:** - Modify: `api/tests/synthetic/generate.py` - Modify: `api/tests/synthetic/test_synthetic_files.py` -- Create: `$WT/fixtures/osv/synthetic/s40_indicator_column_bu_nu.xlsx`, `s41_indicator_column_qty_val_diff.xlsx`, `s42_currency_slices.xlsx`, `s43_no_data_type_header.xlsx` +- Create: `$WT/fixtures/osv/synthetic/s33_indicator_column_bu_nu.xlsx`, `s34_indicator_column_qty_val_diff.xlsx`, `s35_currency_slices.xlsx`, `s36_no_data_type_header.xlsx` - [ ] **Step 1: Построитель листа «по сетке».** В `generate.py` после `form_sheet` добавить (константы `ORG`, `GROUP_TITLES`, `DEBIT`, `CREDIT`, `D` — уже есть): @@ -193,7 +193,7 @@ def _grid_osv( # noqa: PLR0913 - лист описывается полност - [ ] **Step 2: Четыре файла** (суммы согласованы: родитель БУ = Σ детей БУ, «Итого» = корень, тождество строк выполняется у всех строк): ```python -def _s40() -> list[SheetSpec]: +def _s33() -> list[SheetSpec]: """Колонка «Показатели» БУ/НУ (AURORA-1613): счёт 02, шапка без «Выводимые данные», название объединено на строки БУ и НУ, «Итого» по БУ и по НУ. Строки НУ — показатели строки БУ над ними.""" rows = [ @@ -209,7 +209,7 @@ def _s40() -> list[SheetSpec]: return [_grid_osv(account="02", group_label="Основные средства", rows=rows, data_type_line=None, indicator_column=True)] -def _s41() -> list[SheetSpec]: +def _s34() -> list[SheetSpec]: """Колонка «Показатели»: «Вал.», «Кол.», «ПР», «ВР» и неизвестная метка «Ед.» — показатели вне сверки родителя.""" rows = [ GridRow("60", ("1000.00", "400.00", "600.00", "300.00", "1200.00", "300.00"), "БУ"), @@ -226,7 +226,7 @@ def _s41() -> list[SheetSpec]: return [_grid_osv(account="60", group_label="Контрагенты", rows=rows, data_type_line=line, indicator_column=True)] -def _s42() -> list[SheetSpec]: +def _s35() -> list[SheetSpec]: """«Валюта <код>» — строка в рублях, «В валюте» — показатель (AURORA-1661): пары на одном outline-уровне.""" rows = [ GridRow("60", ("9000.00", "2000.00", "1000.00", "500.00", "10000.00", "2500.00")), @@ -242,7 +242,7 @@ def _s42() -> list[SheetSpec]: return [_grid_osv(account="60", group_label="Контрагенты", rows=rows, data_type_line=line, indicator_column=False)] -def _s43() -> list[SheetSpec]: +def _s36() -> list[SheetSpec]: """Шапка без «Выводимые данные», колонки «Показатели» нет: строки — BU по умолчанию с предупреждением.""" rows = [ GridRow("60", ("1000.00", "400.00", "600.00", "300.00", "1200.00", "300.00")), @@ -256,25 +256,25 @@ def _s43() -> list[SheetSpec]: Добавить в `FILES`: ```python - "s40_indicator_column_bu_nu.xlsx": (_s40, to_xlsx), - "s41_indicator_column_qty_val_diff.xlsx": (_s41, to_xlsx), - "s42_currency_slices.xlsx": (_s42, to_xlsx), - "s43_no_data_type_header.xlsx": (_s43, to_xlsx), + "s33_indicator_column_bu_nu.xlsx": (_s33, to_xlsx), + "s34_indicator_column_qty_val_diff.xlsx": (_s34, to_xlsx), + "s35_currency_slices.xlsx": (_s35, to_xlsx), + "s36_no_data_type_header.xlsx": (_s36, to_xlsx), ``` -и поправить описание CLI в `main` («s01…s43»). Номера s33–s39 оставлены треку B. +и поправить описание CLI в `main` («s01…s36»). Номера s37–s44 заняты треком B (#59); рулинг владельца R-1. - [ ] **Step 3: Сгенерировать в fixtures:** `cd $WT/tabular-parser/api && .venv/bin/python -m tests.synthetic.generate $WT/fixtures/osv/synthetic` — проверить `git -C $WT/fixtures status`: изменены только четыре новых файла (s01–s32 побайтно те же; если нет — стоп, отчёт). - [ ] **Step 4: Ожидания и сценарии** в `test_synthetic_files.py`: - `Expect.data_type: str | None = "BU"`; - - `EXPECTED` — `"s40_indicator_column_bu_nu.xlsx": Expect("outline", 2025, "Q3", False, data_type=None)`, `"s41_indicator_column_qty_val_diff.xlsx": Expect("outline", 2025, "Q3", False)`, `"s42_currency_slices.xlsx": Expect("outline", 2025, "Q3", False)`, `"s43_no_data_type_header.xlsx": Expect("outline", 2025, "Q3", False, data_type=None)`; `EXPECTED_NAMES` — четыре имени; докстринг `test_synthetic_set_is_complete` — «s01…s43»; + - `EXPECTED` — `"s33_indicator_column_bu_nu.xlsx": Expect("outline", 2025, "Q3", False, data_type=None)`, `"s34_indicator_column_qty_val_diff.xlsx": Expect("outline", 2025, "Q3", False)`, `"s35_currency_slices.xlsx": Expect("outline", 2025, "Q3", False)`, `"s36_no_data_type_header.xlsx": Expect("outline", 2025, "Q3", False, data_type=None)`; `EXPECTED_NAMES` — четыре имени; докстринг `test_synthetic_set_is_complete` — «s01…s36»; - сценарии (по образцу `test_s30_…`, хелперы `one_document`, `parse_named`, `warnings_of`): ```python -def test_s40_indicator_column_bu_nu(fixtures_dir: Path) -> None: +def test_s33_indicator_column_bu_nu(fixtures_dir: Path) -> None: """AURORA-1613: строки «НУ» колонки «Показатели» — показатели строки БУ; две «Итого»; проверки сходятся.""" - outcome = parse_named(fixtures_dir, "s40_indicator_column_bu_nu.xlsx") + outcome = parse_named(fixtures_dir, "s33_indicator_column_bu_nu.xlsx") doc = one_document(outcome) by_row = {row.row_number: row for row in doc.rows} nu = [row for row in doc.rows if row.data_type == "NU"] @@ -294,9 +294,9 @@ def test_s40_indicator_column_bu_nu(fixtures_dir: Path) -> None: assert outcome.status is ResultStatus.DONE -def test_s41_indicator_column_quantity_currency_differences(fixtures_dir: Path) -> None: +def test_s34_indicator_column_quantity_currency_differences(fixtures_dir: Path) -> None: """«Кол.» — QUANTITY, «Вал.» — CURRENCY, «ПР»/«ВР»/неизвестная метка — null; одно предупреждение о метке.""" - outcome = parse_named(fixtures_dir, "s41_indicator_column_qty_val_diff.xlsx") + outcome = parse_named(fixtures_dir, "s34_indicator_column_qty_val_diff.xlsx") doc = one_document(outcome) types = {row.row_value: row.data_type for row in doc.rows if row.row_value in {"Вал.", "Кол.", "ПР", "ВР", "Ед."}} assert types == {"Вал.": "CURRENCY", "Кол.": "QUANTITY", "ПР": None, "ВР": None, "Ед.": None} @@ -305,9 +305,9 @@ def test_s41_indicator_column_quantity_currency_differences(fixtures_dir: Path) assert outcome.status is ResultStatus.DONE -def test_s42_v_valyute_is_currency_of_previous_row(fixtures_dir: Path) -> None: +def test_s35_v_valyute_is_currency_of_previous_row(fixtures_dir: Path) -> None: """AURORA-1661: «В валюте» — CURRENCY, родитель — «Валюта …» над ней; «Валюта …» — обычные строки в рублях.""" - outcome = parse_named(fixtures_dir, "s42_currency_slices.xlsx") + outcome = parse_named(fixtures_dir, "s35_currency_slices.xlsx") doc = one_document(outcome) by_row = {row.row_number: row for row in doc.rows} in_currency = [row for row in doc.rows if row.row_value == "В валюте"] @@ -318,9 +318,9 @@ def test_s42_v_valyute_is_currency_of_previous_row(fixtures_dir: Path) -> None: assert outcome.status is ResultStatus.DONE -def test_s43_no_data_type_in_header_rows_are_bu(fixtures_dir: Path) -> None: +def test_s36_no_data_type_in_header_rows_are_bu(fixtures_dir: Path) -> None: """Шапка без «Выводимые данные»: строки — BU, предупреждение одно, `header.data_type` — null.""" - outcome = parse_named(fixtures_dir, "s43_no_data_type_header.xlsx") + outcome = parse_named(fixtures_dir, "s36_no_data_type_header.xlsx") doc = one_document(outcome) assert doc.header.data_type is None assert {row.data_type for row in doc.rows} == {"BU"} @@ -330,8 +330,8 @@ def test_s43_no_data_type_in_header_rows_are_bu(fixtures_dir: Path) -> None: Если имена хелперов в модуле другие — взять существующие (`one_document`, `parse_named`, `warnings_of`, `ResultStatus` уже используются в s30/s31). -- [ ] **Step 5: Запустить — сценарии s40–s43 красные** (это и есть воспроизведение багов): `ENV_FILE=.env.test .venv/bin/python -m pytest tests/synthetic -q -k "s40 or s41 or s42 or s43"`. Записать в ledger, как именно падает каждый (до исправления). -- [ ] **Step 6: Commit** в tabular-parser (`generate.py`, тесты; `make check` красный только на s40–s43 и покрытии словарей — допустимо с пометкой в ledger) и отдельный commit в fixtures (`git -C $WT/fixtures add osv/synthetic/s4*.xlsx`). +- [ ] **Step 5: Запустить — сценарии s33–s36 красные** (это и есть воспроизведение багов): `ENV_FILE=.env.test .venv/bin/python -m pytest tests/synthetic -q -k "s33 or s34 or s35 or s36"`. Записать в ledger, как именно падает каждый (до исправления). +- [ ] **Step 6: Commit** в tabular-parser (`generate.py`, тесты; `make check` красный только на s33–s36 и покрытии словарей — допустимо с пометкой в ledger) и отдельный commit в fixtures (`git -C $WT/fixtures add osv/synthetic/s3[3-6]*.xlsx`). --- @@ -430,7 +430,7 @@ def is_indicator_total(sheet: Sheet, row: int, header: TableHeader, rules: Rules - `_trailing_totals`: строка продолжает серию, если `_is_secondary_total(...)` **или** `is_indicator_total(sheet, row, header, rules)`; докстринг — «и итоговые строки-показатели («Итого» с меткой «НУ», AURORA-1613)»; - `collect_body_rows` передаёт `rules` в `_body_row`. - [ ] **Step 5: Тест в `test_classify.py`** — сетка с колонкой «Показатели» (строки БУ/НУ, объединённое название, «Итого» БУ+НУ): `collect_body_rows` — строки «НУ» с `indicator True`, `text == "НУ"`, `label_data_type == "NU"`; вторая «Итого» в `body`, предупреждения «ниже таблицы» нет. -- [ ] **Step 6: `make check`** (сценарии s40–s43 ещё могут быть красными — отметить в ledger), **commit** «Строки-показатели: метка колонки «Показатели» при сборе строк (#58)». +- [ ] **Step 6: `make check`** (сценарии s33–s36 ещё могут быть красными — отметить в ledger), **commit** «Строки-показатели: метка колонки «Показатели» при сборе строк (#58)». --- @@ -515,7 +515,7 @@ def levels_with_indicators(rows: Sequence[BodyRow], total_row: int | None, deadl ``` `classify_rows(..., data_type, ...)`; после классификации, если `defaulted`, — `notes.append(OsvNote(OSV_HEADER, DEFAULT_DATA_TYPE_WARNING))` сразу после заметок шапки; константы в `osv.py`: `DEFAULT_DATA_TYPE: DataType = "BU"`, `DEFAULT_DATA_TYPE_WARNING = "вид данных в шапке не указан — строки без метки приняты как БУ"`. `header.data_type` (`_header(doc)`) не трогать. -- [ ] **Step 3: Синтетика s40–s43 зелёная:** `ENV_FILE=.env.test .venv/bin/python -m pytest tests/synthetic -q`. +- [ ] **Step 3: Синтетика s33–s36 зелёная:** `ENV_FILE=.env.test .venv/bin/python -m pytest tests/synthetic -q`. - [ ] **Step 4: `make check`, commit** «Классификация и проверки по признаку строки-показателя, BU по умолчанию (#58)». --- @@ -523,11 +523,11 @@ def levels_with_indicators(rows: Sequence[BodyRow], total_row: int | None, deadl ### Task 7: Регрессия, golden, файлы контура (модель: sonnet) **Files:** -- Modify: `$WT/fixtures/golden/expected_osv_parse/synthetic/s40…s43.json` (новые, `make golden-update`) +- Modify: `$WT/fixtures/golden/expected_osv_parse/synthetic/s33…s36.json` (новые, `make golden-update`) -- [ ] **Step 1: `make golden-check`** из `$WT/tabular-parser`. Ожидание: diff только «нет снимка» для s40–s43. **Любой diff по реальным файлам или s01–s32 — стоп**: записать в ledger (файл, строки, что изменилось) и вернуть контроллеру; не перегенерировать. -- [ ] **Step 2: `make golden-update`**, проверить `git -C $WT/fixtures status` — только четыре новых снимка; просмотреть их глазами (строки НУ/«В валюте» — показатели с верными родителями, две TOTAL в s40). Commit в fixtures «Golden s40–s43: колонка «Показатели», «В валюте» (#58)». -- [ ] **Step 3: Покрытие словарей** — `ENV_FILE=.env.test .venv/bin/python -m pytest tests/fixtures/test_rules_coverage.py -q` зелёный (каждая новая запись срабатывает на s40–s42). +- [ ] **Step 1: `make golden-check`** из `$WT/tabular-parser`. Ожидание: diff только «нет снимка» для s33–s36. **Любой diff по реальным файлам или s01–s32 — стоп**: записать в ledger (файл, строки, что изменилось) и вернуть контроллеру; не перегенерировать. +- [ ] **Step 2: `make golden-update`**, проверить `git -C $WT/fixtures status` — только четыре новых снимка; просмотреть их глазами (строки НУ/«В валюте» — показатели с верными родителями, две TOTAL в s33). Commit в fixtures «Golden s33–s36: колонка «Показатели», «В валюте» (#58)». +- [ ] **Step 3: Покрытие словарей** — `ENV_FILE=.env.test .venv/bin/python -m pytest tests/fixtures/test_rules_coverage.py -q` зелёный (каждая новая запись срабатывает на s33–s35). - [ ] **Step 4: Файлы контура (не в git).** `TMP=$(mktemp -d)`; извлечь из `/Users/andrey.epifancev/projects/awp-ca/result_dir.zip` файлы `files/3da66219-*.xlsx`, `files/86353387-*.xls` и все прочие файлы, где в заголовке таблицы есть «Показа» (найти перебором через `python -I`, без записи в репозитории), а также `files/270b41da-*.xlsx`, `files/738bfcf5-*.xlsx`. Для каждого: `cd $WT/tabular-parser/api && .venv/bin/python -m src.parser.cli "$TMP/<файл>"` на ветке и на `origin/main` (второй worktree не создавать: сравнить с выдачей `admin/1639-contour-run/parser-out/*.json`, если она есть). Свести в ledger таблицу: файл, статус до/после, `parent_sum_violations` до/после, число строк NU/QUANTITY/CURRENCY, оборот Дт корня по BU. Ожидание по AURORA-1613: оборот по дебету БУ без удвоения. Для 270b41da/738bfcf5 (плоская форма, трек B) — только что строки «В валюте» стали CURRENCY; структура плоской формы — не цель этого плана. `rm -rf "$TMP"` в конце. - [ ] **Step 5:** если на файлах контура найден случай, который план не покрывает (новая метка, иная раскладка), — не чинить, записать находкой `O-n` в ledger и вернуть контроллеру. @@ -538,7 +538,7 @@ def levels_with_indicators(rows: Sequence[BodyRow], total_row: int | None, deadl **Files:** - Modify: `README.md` (раздел «Парсер ОСВ»: строки-показатели, колонка «Показатели», BU по умолчанию) - Modify: `openspec/changes/osv-indicator-column/tasks.md` (отметить выполненное) -- Modify: `$WT/docs/context/06-test-data.md` (§7 синтетики: s40–s43 одной строкой каждый) +- Modify: `$WT/docs/context/06-test-data.md` (§7 синтетики: s33–s36 одной строкой каждый) - Modify: `CLAUDE.md` tabular-parser (одна строка в «Модули»: `indicators.py` — строки-показатели) - [ ] **Step 1:** README и CLAUDE.md — коротко, по образцу соседних абзацев; `06-test-data.md` — commit в docs (ветка `feat/58-osv-indicators`, там уже правка §1.3/§1.4). diff --git a/openspec/changes/osv-indicator-column/design.md b/openspec/changes/osv-indicator-column/design.md index fb5954a..c097322 100644 --- a/openspec/changes/osv-indicator-column/design.md +++ b/openspec/changes/osv-indicator-column/design.md @@ -99,7 +99,7 @@ r31 (продолжение) | НУ | … | 19.10.2026 | Колонка «Показатели» остаётся в `extra` | Первичка не теряется, ядро `extra` хранит как есть | Дублирование метки в `extra` и `data_type` | | 19.10.2026 | Родитель показателя — предыдущая строка данных для всех показателей, включая «Вал.»/«Кол.» в колонке текста | Один механизм для колонки, «В валюте» и старых меток; каскад не видит строк, которые ломают дерево | Если показатель стоит не сразу под своей строкой, родитель будет неверным; ловит golden | | 19.10.2026 | Умолчание BU — только строкам без собственного вида; `header.data_type` остаётся `null` | Шапка действительно молчит; ядру нужен вид строки, не шапки | Предупреждение на листах без «Выводимые данные» (были без него) | -| 19.10.2026 | Синтетика s40–s43 (s33–s39 оставлены треку B) | Параллельные треки не должны конфликтовать по именам файлов набора | Пропуск номеров в наборе | +| 19.10.2026 | Синтетика s33–s36 (R-1: s40–s44 заняты треком B #59, s37–s39 резерв) | Рулинг владельца R-1: параллельные треки не конфликтуют по именам файлов набора | Пропуск номеров в наборе | | 19.10.2026 | Новый модуль `indicators.py` вместо правки `hierarchy.resolve_levels` | Трек B меняет каскад иерархии параллельно | Ещё один модуль конвейера | Решения владельца 19.10.2026 (чат): п. 1 колонка «Показатели» как метки §1.3, НУ без своих проверок; п. 2 «В валюте» → diff --git a/openspec/changes/osv-indicator-column/proposal.md b/openspec/changes/osv-indicator-column/proposal.md index 891f737..1068e54 100644 --- a/openspec/changes/osv-indicator-column/proposal.md +++ b/openspec/changes/osv-indicator-column/proposal.md @@ -35,7 +35,7 @@ AURORA-1534 показали два дефекта одного механизм остаётся `null` (шапка его не называет). - «Валюта <код>» — обычная строка (OTHER, рубли): поведение не меняется, закрепляется тестом. - §1.3/§1.4 `05-domain-rules.md` — отдельным PR в arm-ka-docs (ветка `feat/58-osv-indicators`). -- Синтетика s40–s43 и golden — PR в arm-ka-fixtures. +- Синтетика s33–s36 и golden — PR в arm-ka-fixtures. Затронутые репозитории: arm-tabular-parser (код, словари, тесты, спека `osv-parsing`), arm-ka-docs (§1.3, §1.4), arm-ka-fixtures (синтетика, golden). Таблицы DBML v5.19 не меняются (`osv_entry.data_type` уже включает NU, CURRENCY, diff --git a/openspec/changes/osv-indicator-column/tasks.md b/openspec/changes/osv-indicator-column/tasks.md index 8b31a91..c8a1224 100644 --- a/openspec/changes/osv-indicator-column/tasks.md +++ b/openspec/changes/osv-indicator-column/tasks.md @@ -7,7 +7,7 @@ `indicator_column_untyped`, `row: «В валюте»`; `src/parser/rules.py` — поля `DataTypeRules`; тесты `test_rules.py` ## 2. Синтетика -- [ ] 2.1 `tests/synthetic/generate.py` — s40–s43 (`_grid_osv`); `tests/synthetic/test_synthetic_files.py` — ожидания +- [ ] 2.1 `tests/synthetic/generate.py` — s33–s36 (`_grid_osv`); `tests/synthetic/test_synthetic_files.py` — ожидания и сценарии (сначала красные); файлы в `../fixtures/osv/synthetic/` ## 3. Колонка «Показатели» в заголовке @@ -26,7 +26,7 @@ ## 7. Регрессия и реальные файлы - [ ] 7.1 Синтетика зелёная; `make golden-check` — снимки реальных файлов и s01–s32 без изменений; `make golden-update` - только для s40–s43; локальная сверка файлов контура (не в git) + только для s33–s36; локальная сверка файлов контура (не в git) ## 8. Документация и проверки -- [ ] 8.1 README (раздел «Парсер ОСВ»), `../docs/context/06-test-data.md` §7 (s40–s43), `make check-full` +- [ ] 8.1 README (раздел «Парсер ОСВ»), `../docs/context/06-test-data.md` §7 (s33–s36), `make check-full`