487 Commits

Author SHA1 Message Date
Andrey Epifancev
d807380068 refactor(directories,consolidations): documents_count одним хелпером и описание CSV чек-листа (T11.1, T11.2, T12.2, T12.6)
- ЮЛ: service.documents_count(entity_id), _out с типом LegalEntity и обязательным documents_count;
- чек-лист: в OpenAPI описан ответ text/csv, BOM — константа, elif после return убраны,
  тест на полноту подписей CellStatus и на байты BOM.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:39:37 +04:00
Andrey Epifancev
fb457fc06b fix(statements): валидация units при правке шапки и comment в аудите сброса акцепта (T6.2, T6.4)
- HeaderPatch.units: обрезка пробелов и min_length=1, пробельная строка — 422; null — «не менять» (docstring);
- запись аудита сброса акцепта содержит comment сброшенного акцепта.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:37:01 +04:00
Andrey Epifancev
e45502b2ea fix(files): детерминированное освобождение S3-потока при отдаче исходного файла (T9.1, T9.2, T9.4, T9.5)
- ClosingStreamingResponse закрывает body_iterator в finally (под shield), ChainedStream закрывает
  исходный поток и до начала чтения; заголовок X-Content-Type-Options: nosniff;
- ASCII-имя в Content-Disposition строится из file_type, а не из расширения исходного имени;
- ObjectStorage.stream типизирован как AsyncGenerator, убраны два type: ignore.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:35:18 +04:00
Andrey Epifancev
77b76c076d docs(openspec): решение №19 Среза 3b; уточнение про аудит экспорта xlsx
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:31:50 +04:00
Andrey Epifancev
dea64c9f1d docs(arm-core): README, CLAUDE.md, tasks.md под Срез 3b
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:30:00 +04:00
Andrey Epifancev
0c203c1d91 feat(consolidations): чек-лист в CSV — подписи макета, BOM, «;» (D-13)
Добавлен экспорт чек-листа в CSV-формате при параметре ?format=csv:
- Реализована функция render_checklist_csv в src/domain/checklist_csv.py
- UTF-8 кодировка с BOM, разделитель «;», окончание строк CRLF
- Подписи статусов: CONFIRMED→«Загружен», PROCESSING→«Обработка»,
  NEEDS_CHECK/RECOGNIZED→«Требуется проверка», ERROR→«Ошибка загрузки»,
  MISSING→«Отсутствует»
- При missing_quarters добавляется подстрока « (нет: Q1, Q2)»
- Имя файла: checklist-<ГК>-<год>-<квартал>.csv с поддержкой RFC 5987
- Используется существующая функция content_disposition из filenames.py
- Добавлена функция version_title в ConsolidationService для получения
  названия ГК, года и квартала версии

Тесты:
- test_domain_checklist_csv.py: юнит-тесты функций render и filename
- test_api_consolidation_checklist.py: интеграционный тест CSV-ответа

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:23:44 +04:00
Andrey Epifancev
6078532982 feat(directories): documents_count в списке и карточке ЮЛ (D-13)
Добавлено поле documents_count в LegalEntityOut, содержащее число документов
файлов ЮЛ со статусом не SUPERSEDED. Функция documents_count_by_entity в
репозитории получает счётчики одним подзапросом для эффективности. Используется
в списке и карточке через сервис. Тест проверяет, что заменённые файлы не
учитываются в подсчёте.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:16:47 +04:00
Andrey Epifancev
58f039a91d feat(users): GET /users/brief — имена пользователей для всех аутентифицированных (D-12)
Добавлен эндпоинт GET /api/v1/users/brief для получения краткого справочника
пользователей (id, ФИО, статус активности) по списку id. Доступен любому
аутентифицированному пользователю без отдельного права. Максимум 200 id,
иначе 422 TOO_MANY_IDS; некорректный UUID — 422 INVALID_IDS.

- Создан api/src/api/endpoints/users.py с маршрутом /brief
- Добавлен метод users_brief в repositories/users.py
- Добавлена схема UserBriefOut в schemas/admin.py
- Подключён маршрут users в build_api_router ДО admin.router
- Обновлены тесты OpenAPI: добавлены маршрут и префикс /users/brief
- Написаны интеграционные тесты в test_api_users_brief.py

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 13:08:29 +04:00
Andrey Epifancev
310e63224d feat(files): GET /files/{id}/content — исходный файл потоком из S3, RFC 5987 (D-10)
Поток из S3 порциями без чтения в память; нет объекта — 404 FILE_CONTENT_NOT_FOUND до заголовков;
при обрыве потребителя ответ S3 закрывается и отпускается. Content-Disposition вынесен в common/filenames.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:55:00 +04:00
Andrey Epifancev
68b8a3d2f7 docs(openspec): решение №18 Среза 3b — комментарии удалённых документов
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:51:43 +04:00
Andrey Epifancev
c9bd620a18 feat(documents): комментарии к документу и comments_count в карточке (D-11)
POST/GET /documents/{id}/comments, счётчик комментариев в карточке файла
и документа одним запросом на пачку документов.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:46:43 +04:00
Andrey Epifancev
3f744b7eb9 docs(openspec): решения №16–17 Среза 3b — форма без meta при подтверждении, detail.failures
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:39:51 +04:00
Andrey Epifancev
167969c7c9 feat(statements): подтверждение формы — период и проверки §7, reviewed_by; форма в чек-листе и в переходе версии (D-9)
Для BALANCE/INCOME подтверждение требует определённого периода (PERIOD_REQUIRED) и пройденных либо акцептованных
жёстких проверок §7 (CHECKS_NOT_PASSED, нарушения в detail.failures); записывает financial_statement_meta.reviewed_by/at.
Шапка читается под блокировкой документа с refresh, чтобы не использовать устаревший акцепт.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:31:38 +04:00
Andrey Epifancev
6c00a8705f fix(statements): шапка формы перечитывается под блокировкой; тесты аудита и сброса акцепта (I-1, T6.1)
I-1: `_editable` брал шапку без перечитывания, и после ожидания блокировки видел устаревший акцепт и значения
шапки. `get_meta(..., refresh=True)` читает с populate_existing после lock_file и lock_document.

T6.1: тесты — содержимое аудита правки значения и акцепта, исходное значение даты отчёта, дата не на конце квартала,
сброс акцепта правкой только значения, неизменность формы после INVALID_INN, свежесть шапки под блокировкой.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:23:03 +04:00
Andrey Epifancev
38a6a1b0c2 feat(statements): правка формы (значения, ИНН, дата, единицы) и акцепт проверок — аудит, пересчёт статуса (D-7, D-8)
PATCH /documents/{id}/statement и POST /documents/{id}/statement/checks/accept: блокировки «файл → документ»,
409 FILE_SUPERSEDED/DOCUMENT_READONLY/DOCUMENT_NOT_STATEMENT, 422 INVALID_INN/UNKNOWN_CELL/DUPLICATE_CELL,
один audit_event на запрос, сброс акцепта правкой, пересчёт статуса D-6.

Замечания ревью Task 5: пара формы ищется только среди документов с шапкой формы (T5.1), строки формы упорядочены
по (line_code, id) (T5.3), слабый тест межформенной проверки удалён (T5.4), локальный импорт в тестах убран (T5.6).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 12:09:43 +04:00
Andrey Epifancev
2b5e70f7c3 feat(statements): GET /documents/{id}/statement — шапка, колонки, строки, проверки §7, редакция (D-5, D-14)
Схемы формы, StatementService (видимость, 409 DOCUMENT_NOT_STATEMENT, проверки §7 и межформенная),
репозиторий (get_meta, load_form, pair_amounts), маршрут GET с DOCUMENT_VIEW, тесты API и детерминированный
тест межформенной проверки.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:54:38 +04:00
Andrey Epifancev
729d4cb072 docs(openspec): решения №13–15 Среза 3b; уточнение «форма без строк» (колонки — если есть в результате)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:51:06 +04:00
Andrey Epifancev
1d821b4d3e feat(statements): маппинг форм ББ/ОФР в map_file — meta, колонки, строки, значения, статус (D-1…D-3, D-6)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:40:59 +04:00
Andrey Epifancev
29f516db3c test(statements): помощники golden — ocr_result, все документы файла в map_golden_snapshot
Добавлены:
- Константы GOLDEN_STATEMENTS и OCR_EXPECTED в fixtures_helpers
- Функция ocr_result для создания RecognitionResult из эталона нормализатора
- Тест test_ocr_result_wraps_normalizer_golden, проверяющий порядок документов

Изменены:
- map_golden_snapshot теперь принимает параметр result_builder для переопределения
  функции создания RecognitionResult (по умолчанию golden_result)
- Документы сортируются по (document_type, osv_account_code) вместо только
  osv_account_code

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:24:40 +04:00
Andrey Epifancev
3a72702c3d feat(statements): чистые функции маппинга формы — период, черновик, статус; counterparty_check общий (D-2, D-6)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:17:27 +04:00
Andrey Epifancev
4126a44e0e fix(statements): убрать лишний пропуск явных соотношений §7, тесты на «отсутствующий код = 0»
Удалён пропуск явных правил, когда в колонке нет членов правой части: спека statement-checks
требует считать отсутствующий код нулём, при ненулевой цели — жёсткое нарушение.
Тест плана test_per_column_and_null_as_zero противоречил спеке (1600 = 1700 без строки 1700 — нарушение)
и заменён двумя тестами по спеке.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:09:50 +04:00
Andrey Epifancev
6eb708f760 feat(statements): проверки §7 в ядре — перенос tabular-parser, словарь statement_checks.yaml (D-4, D-5)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 11:01:11 +04:00
Andrey Epifancev
590d4ebc09 docs(openspec): решения №11–12 Среза 3b — повтор формы при маппинге, статус после правки
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 10:57:25 +04:00
Andrey Epifancev
80b8635633 plan: Срез 3b — план реализации (16 задач): формы ББ/ОФР в ядре, API экрана проверки, мелкие дыры API
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 10:51:08 +04:00
Andrey Epifancev
dd454983e6 openspec: спека Среза 3b — формы ББ/ОФР в ядре и API до сводной ОСВ (#36)
proposal, design (D-1…D-14, решения без обсуждения №1–10), дельты osv-result-mapping (маппинг форм, статус),
statement-checks (новая: §7, межформенная, акцепт), documents-api (форма, правка, акцепт, подтверждение, комментарии,
исходный файл), consolidations-api (CSV чек-листа), directories-api (documents_count), users-admin (справочник имён).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 08:21:57 +04:00
aep
b89d7d9322 Merge pull request 'test(golden): тесты ядра под обновлённые golden fixtures (#33)' (#35) from fix/33-golden-tests into main
Reviewed-on: #35
2026-10-07 06:50:13 +03:00
Andrey Epifancev
cac81d0318 test(golden): тесты ядра под обновлённые golden fixtures (#33)
- test_mapping_golden: число снимков проверяется снизу (MIN_SNAPSHOTS = 113: rb 42, schastl 30, osv-dkb 22,
  synthetic 19), новые снимки fixtures проходят те же инварианты и не ломают тест; известные коды вне плана
  счетов — явный список KNOWN_OUT_OF_PLAN (60.АВ и 10 субсчетов 76 пакета ДКБ), новый код по-прежнему валит тест.
- test_consolidation_fixtures: UNMAPPED_TOTAL 1381 → 1379 — две строки свода РБ находят контрагента по ИНН из
  названия (tabular-parser #15).

Маппинг ядра без изменений: 113 снимков, 129 документов, 24 384 строки за ~7 с, все инварианты выполняются.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 05:18:54 +04:00
aep
a64dbabb16 Merge pull request 'chore(contract): копия docs/contracts после M-12 ($comment, примеры)' (#34) from fix/contract-v1-2-examples into main
Reviewed-on: #34
2026-10-06 22:21:33 +03:00
Andrey Epifancev
289a4e6426 chore(contract): копия docs/contracts — $comment без «1.1», пример Excel done, OCR-пример без checks, описание мягких нарушений (M-12, OQ-138)
Refs RSHB/arm-tabular-parser#20

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 23:17:29 +04:00
aep
049a45a402 Merge pull request 'chore(contract): копия схемы v1.2 (потребитель, без логики)' (#27) from chore/contract-v1-2 into main
Reviewed-on: #27
2026-10-06 21:37:07 +03:00
aep
ffeb26fa9e Merge pull request 'feat(seed): dev-ГК под документы fixtures (Русский Бисквит из ЕЦП, владельцы форм ДКБ)' (#32) from feat/31-dev-seed-company-groups into main
Reviewed-on: #32
2026-10-06 16:08:21 +03:00
Andrey Epifancev
93cd1f8aa0 feat(seed): dev-ГК под документы fixtures — «Русский Бисквит» из выгрузки ЕЦП и владельцы форм ДКБ
seed/dev/company_groups.yaml: ГК «Русский Бисквит» ровно как в fixtures/directories/ecp-export-russkiy-biskvit.xlsx
(20 ЮЛ/ИП, crm_id, филиал «Санкт-Петербургский РФ», ГСК из РБ и Счастливочной), ГК Унагранде/НПЗ/Межениновская по
ИНН из форм ББ/ОФР; алиасы под имена контрагентов и шапок ОСВ («Юг-Финанс / ПЕКАРНЯ СЧАСТЛИВОЧНАЯ», ...), чтобы
документы из fixtures ложились на «своих» ЮЛ и резолвились. Загрузчик проверяет ИНН, виды, ссылки членов и
уникальность «ЮЛ в одной ГСК/ГСЗ» до записи; apply — upsert по name/inn/(ГК, name), коды из последовательностей
API, без удалений. `--no-dev-groups` / `run_seed(dev_groups=False)` — dev-данные без ГК; фикстуры тестов API
используют его, чтобы начинать с пустых справочников.

make check: 1132 passed; интеграция seed/import: 23 passed. Два теста падают и на main из-за обновлённых golden
(test_mapping_golden 88 → 113, test_consolidation_fixtures UNMAPPED_TOTAL) — отдельная issue.

Closes #31

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:05:46 +04:00
aep
1d7f2c8176 Merge pull request 'fix(auth): схема bearerAuth в OpenAPI — кнопка Authorize в Swagger UI' (#30) from fix/29-swagger-bearer-scheme into main
Reviewed-on: #30
2026-10-06 14:44:51 +03:00
Andrey Epifancev
227ab67809 fix(auth): схема bearerAuth в OpenAPI — кнопка Authorize в Swagger UI
Токен читался зависимостью как Header(), поэтому в openapi.json не было securitySchemes и Swagger UI не показывал
Authorize (вопрос фронта 06.10.2026). Теперь HTTPBearer(auto_error=False) со scheme_name bearerAuth; значение
заголовка собирается обратно и идёт в parse_bearer — тексты 401/403 и правила («три части» → 401) не изменились.
Тесты: securitySchemes.bearerAuth есть, все маршруты кроме /dev/token и /healthcheck помечены security.
make check: 1126 passed; интеграция auth/me/dev-token: 53 passed.

Closes #29

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 15:43:33 +04:00
aep
4879fdca88 Merge pull request 'fix(aliases,consolidations): блокировка удаления алиаса, границы входов (T11.3, M-4, M-6)' (#26) from fix/21-aliases-bounds into main
Reviewed-on: #26
2026-10-06 14:01:19 +03:00
aep
dd8bae9952 Merge pull request 'feat(seed): полный план счетов 1С (488 строк)' (#25) from feat/23-chart-seed-1c into main
Reviewed-on: #25
2026-10-06 14:01:09 +03:00
Andrey Epifancev
46d17e6de7 chore(contract): копия схемы v1.2 и модели (DISCLOSURE, checks, границы периода), без изменения логики
Refs RSHB/arm-tabular-parser#14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 14:30:41 +04:00
Andrey Epifancev
5868b14c4d fix(consolidations): верхние границы входов и видимость до FOR UPDATE (M-6)
MembersIn.legal_entity_ids ≤ 500, StatusIn.comment ≤ 1000, OsvFilters.q ≤ 500 (422 со списком ошибок);
lock_visible_version проверяет видимость версии до FOR UPDATE. Спека consolidations-api: требование
«Границы входных данных».

Refs #21

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:06:11 +04:00
Andrey Epifancev
74be7d357a fix(aliases): удаление алиаса под advisory-блокировкой (T11.3, M-4)
aliases.remove берёт lock_alias_key по normalized_alias и перечитывает алиас под блокировкой:
при гонке с move_alias ручного сопоставления отвечает 404 без фантомного события об удалении.
Тесты: удаление ∥ перенос алиаса; ручное сопоставление ждёт блокировку алиаса (design №66).

Refs #21

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:06:11 +04:00
Andrey Epifancev
096d53b10c feat(seed): полный план счетов 1С в seed (488 строк)
Seed chart_of_accounts.csv заменён выгрузкой 1С: буквенные субсчета (01.К, 62.ОТ, 76.АВ),
забалансовые 001–012 и буквенные корни (МЦ, ГТД…), «Я…». Валидатор seed принимает буквенные
коды, 000 и 012, сирот выгрузки («Я68.01» без «Я68») с пустым parent_code; kind — из «Вида» 1С.
18 из 19 кодов реальных ОСВ теперь получают account_id (60.АВ — только в синтетике, в 1С нет).
ASSUMPTION(OQ-113): выгрузка считается полной.

Closes #23

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 12:57:20 +04:00
Andrey Epifancev
408dcaf3b0 feat(seed): конвертер плана счетов 1С в csv seed
Одноразовый скрипт api/scripts/convert_chart_1c.py: xlsx выгрузки 1С -> chart_of_accounts.csv
(иерархия по структуре кода, kind из «Вид», is_off_balance из «Заб.»).
ASSUMPTION(OQ-113): выгрузка считается полным планом счетов.

Refs #23

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 12:57:20 +04:00
aep
830c02ab7c Merge pull request 'test(golden): 88 снимков парсера после пакета ДКБ' (#24) from fix/22-golden-88 into main
Reviewed-on: #24
2026-10-06 11:29:49 +03:00
Andrey Epifancev
78004a4e89 test(golden): 88 снимков парсера — Счастливочная 1 кв 2025 (arm-ka-fixtures#7)
Closes #22

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 12:24:35 +04:00
aep
7665a8cf67 Merge pull request 'openspec: архив change slice-4-consolidation' (#20) from chore/archive-slice-4-consolidation into main
Reviewed-on: #20
2026-10-06 09:42:56 +03:00
Andrey Epifancev
483ce8523b openspec: архив change slice-4-consolidation (2026-10-06), спеки consolidations-api, consolidated-osv, дельты data-model/documents-api/primary-files/osv-result-mapping/directory-policy/audit-trail
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 10:39:30 +04:00
aep
4663d44ce8 Merge pull request 'feat(slice-4): консолидация — версии, периметр, блокировка, привязка документов, сводная ОСВ, экспорт xlsx' (#19) from feat/18-slice-4-consolidation into main
Reviewed-on: #19
2026-10-06 09:38:36 +03:00
Andrey Epifancev
5fd691a5f7 docs(slice-4): ledger SDD по плану Среза 4 (задачи, находки, рулинги, итоговые прогоны)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 08:35:32 +04:00
Andrey Epifancev
42c253146c test(consolidation): подходящесть неподтверждённых кандидатов чек-листа, правки spec и design по финальному ревью
I-1 (T8.2): тесты, что неподтверждённый документ даёт NEEDS_CHECK/RECOGNIZED только если подходит версии (fits):
нарастающий Q2 и квартальный Q4 при версии Q3, другой год и ЮЛ вне периметра не влияют; положительный контроль.
M-2: 404 `NOT_FOUND` с сообщением `…_NOT_FOUND`, ключ привязки с признаком нарастающего (R-1, R-14), порядок и
режимы блокировок подтверждения (R-3) в spec. M-3: в design #39 и #43 — окно коммита перехода после загрузки.
M-5: docstring lock_versions_for_entity про ЮЛ без ГК в периметре.

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 08:28:24 +04:00
Andrey Epifancev
98922cc75c docs(slice-4): правки README и design.md по ревью Task 14
Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 08:10:57 +04:00
Andrey Epifancev
2c6908a6e2 docs(slice-4): README и CLAUDE.md по консолидации
README: раздел «Консолидация (Срез 4)» (эндпоинты, статусы, блокировка, привязка, чек-лист, свод, сопоставление, экспорт,
порядок блокировок), коды ошибок Среза 4 в «Ошибки API», раскладка. CLAUDE.md: модули консолидации, правила
(`transition`, порядок блокировок «файл → документ → advisory ГК → версии», FOR NO KEY UPDATE, Q1-эквивалентность).
design.md: решения №82–85; tasks.md: 5.2 выполнена.

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 08:02:50 +04:00