plan: контрольный набор синтетики — позитивы и негативы (#81)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
bb9eb29659
commit
79aff91b88
@ -51,12 +51,15 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
|
||||
---
|
||||
|
||||
### Task 1: Окружение и базовый прогон банка первички
|
||||
### Task 1: Базовая линия: банк первички, образцы, контрольный набор синтетики
|
||||
|
||||
**Files:**
|
||||
- Create: `/Users/andrey.epifancev/projects/awp-ca/admin/osv-other-systems-regress/regress.py`
|
||||
- Create: `/Users/andrey.epifancev/projects/awp-ca/admin/osv-other-systems-regress/headers.md`
|
||||
- Create (вывод): `.../osv-other-systems-regress/base.csv`
|
||||
- Create (вывод): `.../osv-other-systems-regress/base.csv`, `control-base.md`
|
||||
- Modify: `api/tests/synthetic/generate.py` (`OsvSpec`, `_header_v1`, `_header_rows`, `build_osv`, `table_sheet`,
|
||||
`_s48…_s57`, `FILE_NAMES`, docstring модуля), `api/tests/synthetic/test_synthetic_files.py`
|
||||
- Create (генерация): `W/fixtures/osv/synthetic/s48…s57`; Modify: `W/fixtures/osv/synthetic/README.md`
|
||||
|
||||
**Interfaces:**
|
||||
- Produces: `regress.py run <out.csv>` и `regress.py diff <base.csv> <new.csv>`; `headers.md` — точные тексты шапок и
|
||||
@ -83,55 +86,82 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
дословно: строку названия, строку(и) групп и подзаголовков (ячейка за ячейкой), подпись итога. Особо: как у Navision
|
||||
подписан оборот («ОборотДт»? «Оборот Дт»?), как у SAP НМЖК — «Оборот» со стороной.
|
||||
|
||||
Коммита нет (каталог `admin/` не репозиторий).
|
||||
- [ ] **Step 6: генератор.** В `api/tests/synthetic/generate.py` поля `OsvSpec` (см. Interfaces ниже) и их поддержка в
|
||||
`_header_v1`/`_header_rows`/`build_osv`; существующие s01–s47 побайтно не меняются (`test_generate.py` и повторная
|
||||
генерация в `W/fixtures/osv/synthetic` — `git -C W/fixtures status` чистый по старым файлам).
|
||||
|
||||
---
|
||||
- [ ] **Step 7: контрольный набор синтетики** — файлы и тесты по таблице ниже, тексты подписей — из `headers.md`, где
|
||||
есть реальный образец. Набор пишется до правок словаря и кода и должен уметь опровергнуть успех: позитивы проверяют
|
||||
не только «лист — ОСВ», но и точные суммы по сторонам (перепутанные Дебет/Кредит ломают тождество строки и суммы);
|
||||
негативы проверяют, что вид листа и результат не изменились.
|
||||
|
||||
### Task 2: Словари и синтетика написаний (1717 названия, 1719 группы и стороны, 1732 «ВСЕГО»)
|
||||
Позитивы (на базе падают, после Task 2–3 проходят):
|
||||
|
||||
**Files:**
|
||||
- Modify: `api/rules/osv_headers.yaml` (`sheet_markers`, `groups.opening`, `groups.closing`, `groups.turnover` — если
|
||||
нужно для «ОборотДт», `debit`, `credit`, `total_row_exact`)
|
||||
- Modify: `api/tests/synthetic/generate.py` (`OsvSpec`, `_header_v1`, `_header_rows`, `build_osv`, новые `_s48…_s50`,
|
||||
`FILE_NAMES`, docstring модуля)
|
||||
- Modify: `api/tests/synthetic/test_synthetic_files.py` (`EXPECTED`, список файлов, новые тесты)
|
||||
- Modify: `api/tests/unit/parser/test_detect.py`
|
||||
- Create (генерация): `W/fixtures/osv/synthetic/s48_*.xlsx`, `s49_*.xlsx`, `s50_*.xlsx`; Modify:
|
||||
`W/fixtures/osv/synthetic/README.md`
|
||||
| Файл | Что в нём | Тест и проверки |
|
||||
|---|---|---|
|
||||
| `s48_other_system_titles.xlsx` | листы `build_osv` с `title`: «Оборотная ведомость по счету 60 за 1 квартал 2025 г.», «ОСВ по сч. 60 …», «Оборотный баланс …», «Фин. Обороты Листок» (+ строка «Период: …»), «Отчет по Главной книге …»; ещё два листа — название во второй колонке и «ОБОРОТНАЯ\nВЕДОМОСТЬ по счету 60» (верхний регистр, перенос); у одного листа `total_text="ВСЕГО"`, у другого `"Всего "` | `test_s48_other_system_titles_are_osv`: 7 `osvDocument` по листам, `SHEET_OTHER` нет; у листов «ВСЕГО» итог — `TOTAL`, предупреждения «строка «Итого» не найдена» нет; суммы `base_tree()` |
|
||||
| `s49_balance_and_turnover_by_side.xlsx` | «Остаток на начало периода» / «Остаток на конец периода» с «Дебет/Кредит» под ними, `split_groups={"turnover": ("Оборот по дебету", "Оборот по кредиту")}`; над таблицей преамбула «Остаток на начало: 0 \| Остаток на конец: 0» (Review Focus 2) | шесть колонок, суммы дерева, статус `done` |
|
||||
| `s50_sap_in_out_glued_side.xlsx` | лист SAP «Сальдо вх Дт \| Сальдо вх Кт \| Оборот Дт \| Оборот Кт \| Сальдо исх Дт \| Сальдо исх Кт»; лист НМЖК «Сальдо НачальноеДТВВ \| … \| Сальдо КонечноеКТВВ»; контрагент «ООО Дтвв-Сервис» (Review Focus 3) | оба листа — шесть колонок с верными сторонами, суммы дерева, «ООО Дтвв-Сервис» — строка контрагента, `done` |
|
||||
| `s51_untitled_navision.xlsx` | `untitled=True`, три `split_groups` «НачалоДт/НачалоКт», «Оборот…», «КонецДт/КонецКт» (по `headers.md`), первая колонка «ФинСчет» | один `osvDocument`, `SHEET_OTHER` нет, суммы дерева; статус — фактический (без шапки ожидаемо `needs_check` по периоду/организации), зафиксировать в `EXPECTED` с комментарием |
|
||||
| `s52_mixed_book.xlsx` | `statement_sheet()` (форма ББ) → лист как в s51 → `reference_sheet()` | документ формы тот же, что у книги без Navision-листа; Navision — `osvDocument`; «Справка» — `SHEET_OTHER` |
|
||||
| `s53_balance_by_side.xls`, `s54_untitled_navision.xlsb` | s49 через `to_xls`, s51 через `to_xlsb` | те же проверки, что у s49 / s51 (читатели xls и xlsb) |
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: `headers.md` из Task 1.
|
||||
- Produces: поля `OsvSpec` (используются в Task 3):
|
||||
Негативы (проходят и на базе, и после — иначе успех опровергнут):
|
||||
|
||||
| Файл | Что в нём | Тест и проверки |
|
||||
|---|---|---|
|
||||
| `s55_not_osv_titles.xlsx` | обычная ОСВ 1С (чтобы книга не была ошибкой) + листы с таблицей без групп ОСВ: «Справка: оборотная ведомость прилагается», «Оборотный капитал и его структура», отчёт 1С «Обороты счета 60» с колонками корр. счетов внутри «Оборот Дт/Кт» (R-1) | 1 `osvDocument`; три листа — `SHEET_OTHER` |
|
||||
| `s56_almost_osv_tables.xlsx` | обычная ОСВ 1С + безымянные листы: (а) «Наименование \| Остаток на начало \| Поступило \| Выбыло \| Остаток на конец»; (б) «Оборот Дт \| Оборот Кт \| Сальдо на конец Дт \| Кт» без начала; (в) свёрнутое начало «Сальдо на начало» одной колонкой + обороты и конец с Дт/Кт; (г) полный заголовок Navision с 31-й строки | 1 `osvDocument`; (а)–(г) — `SHEET_OTHER` (D1, R-2, R-3, Review Focus 1) |
|
||||
| `s57_form_mentions_osv.xlsx` | форма ББ (`statement_sheet()`) с ячейкой примечания «см. оборотную ведомость по сч. 60» и строкой «Остаток на начало периода» в тексте пояснения; следом лист слабого продолжения формы (1–2 кода, как в существующих тестах `is_weak_continuation`) | документы формы те же, что на базе (вид, `locator`, число строк); `osvDocument` нет; продолжение присоединено (Review Focus 4) |
|
||||
|
||||
`EXPECTED`, список файлов, `FILE_NAMES` — для всех. Негативам — отдельный тест-маркер в имени (`test_neg_…`), чтобы
|
||||
их прогон читался отдельно.
|
||||
|
||||
- [ ] **Step 8: прогон набора на базе.** Сгенерировать в `W/fixtures/osv/synthetic`, `make golden-update` (снимки
|
||||
негативов — регрессия базового поведения; позитивам снимки появятся после Task 2–3), затем
|
||||
`.venv/bin/pytest tests/synthetic -k "s48 or s49 or s50 or s51 or s52 or s53 or s54 or s55 or s56 or s57" -rA`.
|
||||
Ожидаемо: все `test_neg_…` — PASS, все позитивы — FAIL. Иначе стоп: позитив, проходящий на базе, ничего не
|
||||
доказывает (переписать), негатив, падающий на базе, неверно описывает текущее поведение (разобрать). Итог — таблица
|
||||
«тест → результат на базе» в `admin/osv-other-systems-regress/control-base.md`.
|
||||
|
||||
- [ ] **Step 9: коммиты.** tabular-parser: генератор и тесты контрольного набора — «Контрольный набор синтетики ОСВ
|
||||
других систем (#81)» (позитивы падают — допустимо в ветке до Task 3: пометить их `pytest.mark.xfail(strict=True,
|
||||
reason="tp#81: до Task 2–3")`, снимать `xfail` по мере реализации). fixtures: файлы s48–s57 и README — «Синтетика
|
||||
s48–s57 под tp#81»; снимки негативов — отдельным коммитом.
|
||||
|
||||
**Interfaces (генератор, Step 6):**
|
||||
- Поля `OsvSpec`:
|
||||
- `title: str | None = None` — строка названия вместо «Оборотно-сальдовая ведомость по счету {account} за {period}»
|
||||
(`None` — как сейчас);
|
||||
- `title_col: int = 1` — колонка строки названия;
|
||||
- `untitled: bool = False` — без строк организации, названия, параметров: заголовок таблицы с первой строки;
|
||||
- `top_padding: int = 0` — пустых строк над заголовком таблицы при `untitled` (для s56 (г): 30);
|
||||
- `split_groups: dict[str, tuple[str, str]] = {}` — группы, у которых вместо слитого названия + «Дебет/Кредит» две
|
||||
ячейки в строке групп со своими текстами (сторона в ячейке группы); если разделены все три группы, строки
|
||||
подзаголовков нет;
|
||||
- `total_text: str = TOTAL_TEXT`.
|
||||
- Листы-негативы без дерева ОСВ — функцией по образцу `reference_sheet`/`_flat_sheet`: `table_sheet(name: str,
|
||||
rows: Sequence[Sequence[str | D | None]], *, start_row: int = 1) -> SheetSpec`.
|
||||
|
||||
- [ ] **Step 1: падающие тесты синтетики.** Тексты брать из `headers.md`; ниже — ориентир:
|
||||
- `s48_other_system_titles.xlsx` — пять листов `build_osv` с `title`: «Оборотная ведомость по счету 60 за 1 квартал
|
||||
2025 г.», «ОСВ по сч. 60 за 1 квартал 2025 г.», «Оборотный баланс …», «Фин. Обороты Листок», «Отчет по Главной
|
||||
книге …»; у последнего листа `total_text="ВСЕГО"`. Тест `test_s48_other_system_titles_are_osv`: 5 документов
|
||||
`osvDocument` с локаторами листов, `SHEET_OTHER` нет; у листа «ВСЕГО» строка итога `TOTAL`, предупреждения
|
||||
«строка «Итого» не найдена» нет.
|
||||
- `s49_balance_and_turnover_by_side.xlsx` — `group_titles` «Остаток на начало периода» / «Остаток на конец периода»,
|
||||
`split_groups={"turnover": ("Оборот по дебету", "Оборот по кредиту")}`; над таблицей преамбула «Остаток на
|
||||
начало: 0 | Остаток на конец: 0» (Review Focus 2). Тест: шесть колонок сумм, суммы `base_tree()` верны, статус
|
||||
`done`.
|
||||
- `s50_sap_in_out_glued_side.xlsx` — два листа: SAP «Сальдо вх Дт | Сальдо вх Кт | Оборот Дт | Оборот Кт | Сальдо
|
||||
исх Дт | Сальдо исх Кт» (все три `split_groups`), SAP НМЖК «Сальдо НачальноеДТВВ | Сальдо НачальноеКТВВ | … |
|
||||
Сальдо КонечноеКТВВ»; у контрагента имя «ООО Дтвв-Сервис» (Review Focus 3). Тест: оба листа — шесть колонок с
|
||||
верными сторонами, суммы как у дерева, «ООО Дтвв-Сервис» — строка контрагента.
|
||||
- `test_detect.py::test_side_without_word_boundary_only_in_group_cell` — сетка `sheet_from_rows`: заголовок «Сальдо
|
||||
НачальноеДТВВ | …», ниже строка с текстом «Дтвв» в колонке сумм → `find_table_header` берёт колонки только из
|
||||
строки групп.
|
||||
Добавить имена в `EXPECTED` (s48 — `documents=5`), в список файлов и `FILE_NAMES`.
|
||||
---
|
||||
|
||||
- [ ] **Step 2: генерация и прогон — тесты падают.** `cd api && .venv/bin/python -m tests.synthetic.generate
|
||||
W/fixtures/osv/synthetic` → `.venv/bin/pytest tests/synthetic tests/unit/parser/test_detect.py -k "s48 or s49 or s50
|
||||
or word_boundary"` — FAIL (`INVALID_DOCUMENT`/`INVALID_FORMAT`).
|
||||
### Task 2: Словари (1717 названия, 1719 группы и стороны, 1732 «ВСЕГО»)
|
||||
|
||||
**Files:**
|
||||
- Modify: `api/rules/osv_headers.yaml` (`sheet_markers`, `groups.opening`, `groups.closing`, `groups.turnover` — если
|
||||
нужно для «ОборотДт», `debit`, `credit`, `total_row_exact`)
|
||||
- Modify: `api/tests/synthetic/test_synthetic_files.py` (снять `xfail` у s48–s50, s53)
|
||||
- Modify: `api/tests/unit/parser/test_detect.py`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: контрольный набор и `headers.md` из Task 1.
|
||||
|
||||
- [ ] **Step 1: падающий unit-тест.** `test_detect.py::test_side_without_word_boundary_only_in_group_cell` — сетка
|
||||
`sheet_from_rows`: заголовок «Сальдо НачальноеДТВВ | …», ниже строка с текстом «Дтвв» в колонке сумм →
|
||||
`find_table_header` берёт колонки только из строки групп. Снять `xfail` у тестов s48, s49, s50, s53.
|
||||
|
||||
- [ ] **Step 2: тесты падают.** `.venv/bin/pytest tests/synthetic tests/unit/parser/test_detect.py -k "s48 or s49 or
|
||||
s50 or s53 or word_boundary"` — FAIL (`INVALID_DOCUMENT`/`INVALID_FORMAT`).
|
||||
|
||||
- [ ] **Step 3: записи словаря.** Ориентир (уточнить по `headers.md`; ловушки: `\w*` жадно съест приклеенную сторону —
|
||||
«сальдо\s+начальн\w*» оставит пустой остаток вместо «дтвв»; `\bоборот(ы)?\b` не матчит «оборотдт»):
|
||||
@ -146,14 +176,14 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
записью (остаток ячейки не начинается со стороны), правка `_side`/`_group_cells` общая, без упоминания системы
|
||||
(design D2), и тест на неё.
|
||||
|
||||
- [ ] **Step 4: тесты зелёные.** Тот же `pytest` → PASS. `tests/fixtures/test_golden.py` требует снимок на каждый
|
||||
синтетический файл: `make golden-update`, в diff — только новые снимки s48–s50 (изменился старый — стоп, разобрать).
|
||||
Затем `make check` → PASS (покрытие словарей видит новые записи на s48–s50).
|
||||
- [ ] **Step 4: тесты зелёные.** Тот же `pytest` → PASS; все `test_neg_…` контрольного набора → PASS (негатив упал —
|
||||
запись словаря слишком широкая: сузить, не ослаблять тест). `make golden-update`: новые снимки s48–s50, s53; снимки
|
||||
негативов s55–s57 и всех старых файлов не изменились (изменились — стоп, разобрать). `make check` → PASS (покрытие
|
||||
словарей видит новые записи).
|
||||
|
||||
- [ ] **Step 5: коммиты.** tabular-parser: `rules/osv_headers.yaml`, `tests/synthetic/*`, `tests/unit/parser/test_detect.py`
|
||||
— «ОСВ: названия ведомостей, группы и стороны других систем, «ВСЕГО» (#81)». fixtures (`git -C W/fixtures`):
|
||||
`osv/synthetic/s48…s50`, README — «Синтетика s48–s50 под tp#81»; снимки `golden/expected_osv_parse/s48…s50` —
|
||||
отдельным коммитом «Golden синтетики s48–s50 под tp#81».
|
||||
- [ ] **Step 5: коммиты.** tabular-parser: `rules/osv_headers.yaml`, `tests/synthetic/test_synthetic_files.py`,
|
||||
`tests/unit/parser/test_detect.py` — «ОСВ: названия ведомостей, группы и стороны других систем, «ВСЕГО» (#81)».
|
||||
fixtures (`git -C W/fixtures`): снимки s48–s50, s53 — «Golden синтетики s48–s50, s53 под tp#81».
|
||||
|
||||
---
|
||||
|
||||
@ -163,11 +193,11 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
- Modify: `api/src/parser/detect.py` (новая `has_osv_table`, `classify_sheet`, `__all__`)
|
||||
- Modify: `api/src/parser/statements/adapter.py:56-83` (`plan_sheets`)
|
||||
- Modify: `api/src/parser/book.py:146`
|
||||
- Modify: `api/tests/synthetic/generate.py` (`_s51`), `api/tests/synthetic/test_synthetic_files.py`
|
||||
- Modify: `api/tests/synthetic/test_synthetic_files.py` (снять `xfail` у s51, s52, s54)
|
||||
- Test: `api/tests/unit/parser/test_detect.py`, `api/tests/unit/parser/statements/test_adapter.py` (тесты `plan_sheets`), `api/tests/unit/parser/test_book_parser.py`
|
||||
|
||||
**Interfaces:**
|
||||
- Consumes: поля `OsvSpec` из Task 2 (`untitled`, `split_groups`).
|
||||
- Consumes: контрольный набор из Task 1 (s51, s52, s54 — позитивы; s55–s57 — негативы).
|
||||
- Produces:
|
||||
- `detect.has_osv_table(sheet: Sheet, rules: Rules) -> bool` — в первых `SHEET_MARKER_ROWS` строках есть строка, где
|
||||
`_group_cells` даёт все три группы, и `_columns_of_group` для каждой возвращает `debit` и `credit` (не `collapsed`);
|
||||
@ -196,25 +226,21 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
- `test_plan_sheets_weak_continuation_not_taken` — лист формы, затем лист из 1–2 кодов (слабое продолжение,
|
||||
образец — существующие тесты `is_weak_continuation`) → остаётся `STATEMENT_CONTINUATION`, `osv_by_table` не
|
||||
вызван (Review Focus 4).
|
||||
- синтетика `s51_untitled_navision.xlsx` (`build_osv` с `untitled=True`, `split_groups` для трёх групп по
|
||||
`headers.md`) и `test_s51_untitled_sheet_is_osv_by_table`: один `osvDocument`, `SHEET_OTHER` нет, суммы дерева
|
||||
верны; `EXPECTED` — статус по факту разбора шапки без периода (ожидаемо `needs_check` из-за ненайденного
|
||||
периода/организации; если иначе — зафиксировать фактический и объяснить в комментарии).
|
||||
- снять `xfail` у тестов s51, s52, s54 контрольного набора.
|
||||
- `test_book_parser.py::test_statement_book_sheets_unchanged_by_fallback` — книга s14 (формы + ОСВ): виды листов те же,
|
||||
что без запасного признака.
|
||||
|
||||
- [ ] **Step 2: тесты падают.** `make venv` уже есть; `cd api && .venv/bin/python -m tests.synthetic.generate
|
||||
W/fixtures/osv/synthetic && .venv/bin/pytest tests/unit/parser tests/synthetic -k "osv_table or plan_sheets or
|
||||
s51 or fallback"` → FAIL (`ImportError: has_osv_table`, `INVALID_DOCUMENT`).
|
||||
- [ ] **Step 2: тесты падают.** `cd api && .venv/bin/pytest tests/unit/parser tests/synthetic -k "osv_table or
|
||||
plan_sheets or s51 or s52 or s54 or fallback"` → FAIL (`ImportError: has_osv_table`, `INVALID_DOCUMENT`).
|
||||
|
||||
- [ ] **Step 3: реализация** по Interfaces. `has_osv_table` переиспользует `_group_cells` и `_columns_of_group` (R-6),
|
||||
отдельного разбора сторон нет.
|
||||
|
||||
- [ ] **Step 4: тесты зелёные.** Тот же `pytest` → PASS; `make golden-update` — в diff только новый снимок s51;
|
||||
`make check` → PASS.
|
||||
- [ ] **Step 4: тесты зелёные.** Тот же `pytest` → PASS; все `test_neg_…` → PASS; `make golden-update` — в diff
|
||||
только новые снимки s51, s52, s54, снимки негативов s55–s57 не изменились; `make check` → PASS.
|
||||
|
||||
- [ ] **Step 5: коммиты.** tabular-parser: «ОСВ: запасной признак листа по заголовку таблицы (#81, AURORA-1717)».
|
||||
fixtures: `osv/synthetic/s51…`, README — «Синтетика s51 под tp#81»; снимок s51 — отдельным коммитом.
|
||||
fixtures: снимки s51, s52, s54 — отдельным коммитом.
|
||||
|
||||
---
|
||||
|
||||
@ -225,7 +251,10 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
- Create (вывод): `/Users/andrey.epifancev/projects/awp-ca/admin/osv-other-systems-regress/new.csv`, `report.md`
|
||||
|
||||
- [ ] **Step 1: golden.** `make golden-check` → код 0; `git -C W/fixtures diff --stat f1f7f83 -- golden/` — только
|
||||
добавленные снимки s48–s51, ни одного изменённого (изменённый — стоп, разобрать с объяснением в design.md).
|
||||
добавленные снимки s48–s57, ни одного изменённого (изменённый — стоп, разобрать с объяснением в design.md).
|
||||
Контрольный набор целиком: `.venv/bin/pytest tests/synthetic -k "s48 or s49 or s50 or s51 or s52 or s53 or s54 or
|
||||
s55 or s56 or s57" -rA` → все PASS, `xfail` не осталось; таблица «тест → база → ветка» дописывается в
|
||||
`control-base.md`.
|
||||
|
||||
- [ ] **Step 2: прогон ветки.** `regress.py run new.csv`; `regress.py diff base.csv new.csv > report.md`.
|
||||
|
||||
@ -246,7 +275,7 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
- Modify: `W/docs/context/05-domain-rules.md` §1.1 (поиск листа), §1.2 (написания групп и сторон); строка «Итого» —
|
||||
где перечислены итоговые подписи (§1.3 или §1.4)
|
||||
- Modify: `W/tabular-parser/README.md` (раздел «Парсер ОСВ»: признаки листа, запасной признак), `W/tabular-parser/CLAUDE.md`
|
||||
(перечень синтетики s48–s51 в абзаце golden), docstring `generate.py` (s48–s51)
|
||||
(перечень синтетики s48–s57 в абзаце golden), docstring `generate.py` (s48–s57)
|
||||
- Modify: `W/tabular-parser/openspec/changes/osv-other-systems/design.md` — решения, принятые по ходу (R-9…), и
|
||||
сводка регрессии из `report.md`
|
||||
|
||||
@ -259,4 +288,4 @@ AURORA-1717, AURORA-1719, AURORA-1732. Ветка `feat/81-osv-other-systems` в
|
||||
README не ломают линтеры).
|
||||
|
||||
- [ ] **Step 3: коммиты.** docs (`git -C W/docs`): «05 §1.1–§1.2: ОСВ других учётных систем (tp#81)»; tabular-parser:
|
||||
«Документация: признаки листа ОСВ, синтетика s48–s51 (#81)».
|
||||
«Документация: признаки листа ОСВ, синтетика s48–s57 (#81)».
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user