Срез 3b: формы ББ/ОФР в ядре и API до сводной ОСВ #39
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/36-slice-3b-statements-api"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #36
Что сделано
Срез 3b: формы ББ/ОФР в ядре и API до сводной ОСВ.
маппинг форм ББ/ОФР в
map_file(шапка, колонки, строки, значения, статус документа, повтор формы в файле);проверки §7 в ядре (
domain/statement_checks.py, словарьapi/rules/statement_checks.yaml— копия словаря tabular-parser);GET /documents/{id}/statement, правка формы и акцепт проверок (аудитRECOGNIZED_DATA_EDIT), подтверждение формы (период и проверки §7);комментарии к документу,
GET /files/{id}/content(поток из S3, RFC 5987),GET /users/brief,documents_countу ЮЛ, CSV чек-листа;удаление файла чистит формы и комментарии документов (C-1 финального ревью).
OpenSpec change:
openspec/changes/slice-3b-statements-api/(openspec validate slice-3b-statements-api --strict— valid)Документация и контракт для фронта: arm-ka-docs PR #49 (RSHB/arm-ka-docs#49), issue docs #48
Решения без обсуждения:
design.md, раздел «Decisions made without discussion» (№1–25)make check-full
Выход 0. Лог —
check-full-4.log.make check: ruff + mypy чисто, 1194 passed (unit)dbml-check: ORM совпадает с DBML v5.16test-integration: 783 passed (386 s)e2e: 1 skipped (нужен профильservices, не ошибка)docker build -t arm-core .: успешноweb-check: biome, tsc, rsbuild build — чистоНаходки и статусы
Маркеры:
T<n>.<k>— minor ревью задачи n;T<n>.I<k>— Important ревью задачи n (маркер введён контроллером, O-4);PA.*/PB.*— ревью пакетов доработок;C-n/I-n/M-n/N-n— финальное ревью ветки (opus);R-n (design #N)— рулинги;O-n— наблюдения.SHA — текущие (после переписи трейлеров, O-6).
Ревью задач
statement_checks.py)4126a44234e830rule not in sublines— линейный скан234e830test_value_outside_columns_skippedизбыточен (требование плана)f9500d3(предупреждение)values_okзатеняет функцию;inn_verified=Noneпри пустом ИННif data.get("error")пропускает пустой{}234e830ocr_result234e830result_buildertest_form_without_codes234e830234e830job needs_check234e830mapping_warnings234e830234e830numeric(5,2)округляет 99.996 до 100code or ""_pair_documentне требует meta у пары38a6a1border_by(line_code)без tie-break38a6a1btest_cross_form_check38a6a1b234e83038a6a1b6c00a876c00a87units=nullмолча игнорируется, пробельный проходитfb457fcNOTHING_TO_ACCEPTfb457fc(comment); ключиvalue:<uuid>— deferredlock_cellsблокирует лишние строкиDOCUMENT_NOT_CONFIRMABLEпри правке в иных статусах3f744b7234e830period_year is None234e830DocumentServiceстроитStatementServiceрадиhard_failuresbefore_valueFILE_DELETE содержитcomments_countdd7f7cccomments_countdefault=0234e830""для автораe45502boriginal_namee45502btype: ignore[attr-defined]наaclosee45502be45502b/users/brief234e830UserBriefOutвadmin.py,idsбез лимита, комментарии_out(entity, ...)без аннотацииd807380d807380documents_count234e830listvsSequencetext/csvв OpenAPId807380version_titleповторяет запросы234e830checklist_csvd8073807578b5f7578b5f7578b5f7578b5fsendбез типа308fbc4acloseне сбрасывает_first308fbc4acloseпод shield без таймаута_chainкак обёртка,dispositionпослеanext, приватный_CELL_STATUS_LABELSв тесте, nosniff только inlineФинальное ревью ветки (opus) и перепроверка
DELETE /files/{id}с формой ББ/ОФР падает по FKdd7f7cccolumn_indexв результате роняет маппинг всего файлаf9500d3None= 0; повторное opus-ревью подтвердило; код откатан, тест51d322c, R-11 отозван)has_linesffc0183e851445,51d322cCounterpartyIndex.loadцеликом при правке ИННheader.inn = nullобходит MISMATCHffc0183(422INVALID_INN)4a5cb87/files/{id}/contentбезCache-Control: private, no-store, inline без CSP sandboxffc0183ffc0183HeaderPatch.innnullable в OpenAPI при 422 на null51d322c_clear_fileне удаляет комментарии документов при повторном маппингеРулинги и наблюдения
make venvне был выполнен, venv отсутствовалAcceptedOutпереименована вChecksAcceptedOut(коллизия имён OpenAPI)T<n>.I<k>введён контроллеромEXPORTRulings I made
duplicated, предупреждение вstatement_status; фрагмент плана соstartswithне реализованRECOGNIZEDtest_per_column_and_null_as_zeroпротиворечил спеке — заменён тестами «отсутствующий код = 0 → нарушение»OSVBALANCE/INCOMEбез meta подтверждается без условий D-9;…/statement— 409CHECKS_NOT_PASSEDотдаёт нарушения вdetail.failuresdd7f7cc)NULL= 0PATCH header.inn = null→ 422INVALID_INNcolumn_index/пары (строка, колонка): первое значение + предупреждениеe851445)Решения №1–10 — дизайн-решения, принятые на этапе спеки (см. design.md).
Deferred
rule not in sublinesvalue:<uuid>без кода строки/колонкиDocumentService→StatementServiceacloseпод shield без таймаутаCounterpartyIndex.loadцеликом при правке ИННВопросы владельцу
🤖 Generated with Claude Code
https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
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_012vJkmBGKKqMoEMzvsXG3y2POST/GET /documents/{id}/comments, счётчик комментариев в карточке файла и документа одним запросом на пачку документов. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2