From fc9d6d490286bfc47bc71268080b0b4678749d06 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 8 Oct 2026 23:50:24 +0400 Subject: [PATCH] =?UTF-8?q?openspec:=20=D0=B0=D1=80=D1=85=D0=B8=D0=B2=20na?= =?UTF-8?q?ts-files-subjects=20(#28)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change слит PR #29; спеки обновлены (subject'ы files.tabular_uploaded, files.img_uploaded, files.tabular_parsed). Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- .../2026-10-08-nats-files-subjects}/.openspec.yaml | 0 .../2026-10-08-nats-files-subjects}/design.md | 0 .../2026-10-08-nats-files-subjects}/proposal.md | 0 .../specs/tabular-recognition-service/spec.md | 0 .../2026-10-08-nats-files-subjects}/tasks.md | 0 openspec/specs/tabular-recognition-service/spec.md | 10 +++++----- 6 files changed, 5 insertions(+), 5 deletions(-) rename openspec/changes/{nats-files-subjects => archive/2026-10-08-nats-files-subjects}/.openspec.yaml (100%) rename openspec/changes/{nats-files-subjects => archive/2026-10-08-nats-files-subjects}/design.md (100%) rename openspec/changes/{nats-files-subjects => archive/2026-10-08-nats-files-subjects}/proposal.md (100%) rename openspec/changes/{nats-files-subjects => archive/2026-10-08-nats-files-subjects}/specs/tabular-recognition-service/spec.md (100%) rename openspec/changes/{nats-files-subjects => archive/2026-10-08-nats-files-subjects}/tasks.md (100%) diff --git a/openspec/changes/nats-files-subjects/.openspec.yaml b/openspec/changes/archive/2026-10-08-nats-files-subjects/.openspec.yaml similarity index 100% rename from openspec/changes/nats-files-subjects/.openspec.yaml rename to openspec/changes/archive/2026-10-08-nats-files-subjects/.openspec.yaml diff --git a/openspec/changes/nats-files-subjects/design.md b/openspec/changes/archive/2026-10-08-nats-files-subjects/design.md similarity index 100% rename from openspec/changes/nats-files-subjects/design.md rename to openspec/changes/archive/2026-10-08-nats-files-subjects/design.md diff --git a/openspec/changes/nats-files-subjects/proposal.md b/openspec/changes/archive/2026-10-08-nats-files-subjects/proposal.md similarity index 100% rename from openspec/changes/nats-files-subjects/proposal.md rename to openspec/changes/archive/2026-10-08-nats-files-subjects/proposal.md diff --git a/openspec/changes/nats-files-subjects/specs/tabular-recognition-service/spec.md b/openspec/changes/archive/2026-10-08-nats-files-subjects/specs/tabular-recognition-service/spec.md similarity index 100% rename from openspec/changes/nats-files-subjects/specs/tabular-recognition-service/spec.md rename to openspec/changes/archive/2026-10-08-nats-files-subjects/specs/tabular-recognition-service/spec.md diff --git a/openspec/changes/nats-files-subjects/tasks.md b/openspec/changes/archive/2026-10-08-nats-files-subjects/tasks.md similarity index 100% rename from openspec/changes/nats-files-subjects/tasks.md rename to openspec/changes/archive/2026-10-08-nats-files-subjects/tasks.md diff --git a/openspec/specs/tabular-recognition-service/spec.md b/openspec/specs/tabular-recognition-service/spec.md index f16389d..2254973 100644 --- a/openspec/specs/tabular-recognition-service/spec.md +++ b/openspec/specs/tabular-recognition-service/spec.md @@ -17,15 +17,15 @@ Stateless-сервис разбора табличных файлов (XLS/XLSX/ - **THEN** `GET /healthcheck` отвечает 200 с полями `uptime`, `version`, `nats` ### Requirement: Подтверждение запроса до обработки -Сервис SHALL быть подписан на `recognition.tabular.request` в queue group `tabular-parser`. Получив запрос, проходящий -`recognition-request.schema.json`, сервис SHALL до чтения файла из S3 опубликовать в `recognition.result` конверт +Сервис SHALL быть подписан на `files.tabular_uploaded` в queue group `tabular-parser`. Получив запрос, проходящий +`recognition-request.schema.json`, сервис SHALL до чтения файла из S3 опубликовать в `files.tabular_parsed` конверт `status = processing` с `job_id`, `file_id`, `service {name: "tabular-parser", version}` и заголовком `Nats-Msg-Id = ack::`. Повторный запрос с `job_id`, который уже обрабатывается или обработан этим процессом, SHALL получить повторный ack и MUST NOT обрабатываться второй раз. #### Scenario: Ack раньше результата - **WHEN** опубликован запрос из `docs/contracts/examples/request-tabular.json` -- **THEN** первым сообщением сервиса в `recognition.result` является конверт `processing`, и только затем — результат +- **THEN** первым сообщением сервиса в `files.tabular_parsed` является конверт `processing`, и только затем — результат #### Scenario: Повторный запрос во время обработки - **WHEN** тот же запрос доставлен второй раз, пока первый обрабатывается @@ -40,12 +40,12 @@ Stateless-сервис разбора табличных файлов (XLS/XLSX/ #### Scenario: Запрос с заглушкой парсера (Срез 0) - **WHEN** воркеру явно передана заглушка `NullParser` (только тесты воркера; реализация по умолчанию — реальный парсер), запрос подтверждён и объект существует в `uploads/` -- **THEN** в `recognition.result` появляется конверт `status = error`, `error.code = NOT_IMPLEMENTED`, `job_id`/`file_id` +- **THEN** в `files.tabular_parsed` появляется конверт `status = error`, `error.code = NOT_IMPLEMENTED`, `job_id`/`file_id` из запроса, `metrics.duration_ms ≥ 0`; файл результата может отсутствовать #### Scenario: Запрос с реальным парсером - **WHEN** запрос подтверждён и объект в `uploads/` существует, но не является книгой Excel (сигнатура не XLS/XLSX/XLSB) -- **THEN** в `recognition.result` появляется конверт `status = error`, `error.code = UNSUPPORTED_FORMAT` (повреждённая +- **THEN** в `files.tabular_parsed` появляется конверт `status = error`, `error.code = UNSUPPORTED_FORMAT` (повреждённая книга — `UNREADABLE`), `job_id`/`file_id` из запроса, `metrics.duration_ms ≥ 0`; файл результата может отсутствовать; корректная ОСВ в том же потоке даёт `done` (см. «Парсер — заменяемый интерфейс»)