From afe40c70dabfb8a96f6f46f11c5b71e3a36799ef Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Thu, 8 Oct 2026 23:50:10 +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(#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Change слит PR #77; спеки обновлены (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/recognition-contract/spec.md | 0 .../2026-10-08-nats-files-subjects}/tasks.md | 0 openspec/specs/recognition-contract/spec.md | 8 ++++---- 6 files changed, 4 insertions(+), 4 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/recognition-contract/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/recognition-contract/spec.md b/openspec/changes/archive/2026-10-08-nats-files-subjects/specs/recognition-contract/spec.md similarity index 100% rename from openspec/changes/nats-files-subjects/specs/recognition-contract/spec.md rename to openspec/changes/archive/2026-10-08-nats-files-subjects/specs/recognition-contract/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/recognition-contract/spec.md b/openspec/specs/recognition-contract/spec.md index 9fa5769..ce6c7a3 100644 --- a/openspec/specs/recognition-contract/spec.md +++ b/openspec/specs/recognition-contract/spec.md @@ -8,7 +8,7 @@ ## Requirements ### Requirement: Сообщение запроса распознавания -Тело сообщения на subject `recognition.tabular.request` или `recognition.image.request` SHALL соответствовать +Тело сообщения на subject `files.tabular_uploaded` или `files.img_uploaded` SHALL соответствовать `docs/contracts/recognition-request.schema.json` v1.0: обязательные поля `schema_version` (`"1.0"`), `job_id` (uuid = `recognition_job.id`), `file_id` (uuid = `stored_file.id`), `pipeline` (`tabular` | `image`), `file_type` (`XLS` | `XLSX` | `XLSB` | `PDF` | `PNG` | `JPG`), `original_name`, `s3 {bucket, key}` исходника в роли `uploads`, @@ -46,7 +46,7 @@ сервиса (`scan-gateway` отвечает `error TIMEOUT`, если `reply_deadline` истёк до отправки файла в ИС Сканирование) ### Requirement: Подтверждение взятия в работу (ack без JetStream) -Получив корректный запрос (прошедший проверку схемы и `MAJOR`), сервис SHALL немедленно, до чтения файла из S3, опубликовать в `recognition.result` конверт со +Получив корректный запрос (прошедший проверку схемы и `MAJOR`), сервис SHALL немедленно, до чтения файла из S3, опубликовать в `files.tabular_parsed` конверт со `status = processing`, `job_id`, `file_id`, `service {name, version}` и заголовком `Nats-Msg-Id = ack::`. Ядро SHALL перевести задание `published → processing` и записать `started_at`, `service_name`, `service_version`. Если ack не получен за `ACK_TIMEOUT_SECONDS` (по умолчанию 30), ядро SHALL опубликовать запрос повторно с тем же @@ -54,7 +54,7 @@ ack не получен за `ACK_TIMEOUT_SECONDS` (по умолчанию 30), #### Scenario: Сервис жив - **WHEN** запрос опубликован и сервис подписан -- **THEN** в течение `ACK_TIMEOUT_SECONDS` в `recognition.result` появляется конверт `processing`, задание получает +- **THEN** в течение `ACK_TIMEOUT_SECONDS` в `files.tabular_parsed` появляется конверт `processing`, задание получает `status = processing` и `started_at` #### Scenario: Сервис недоступен @@ -67,7 +67,7 @@ ack не получен за `ACK_TIMEOUT_SECONDS` (по умолчанию 30), - **THEN** сервис публикует ack повторно и не начинает вторую обработку ### Requirement: Сообщение результата распознавания -Тело сообщения на subject `recognition.result` SHALL соответствовать `docs/contracts/recognition-result-message.schema.json` +Тело сообщения на subject `files.tabular_parsed` SHALL соответствовать `docs/contracts/recognition-result-message.schema.json` v1.0: обязательные поля `schema_version` (`"1.0"`), `job_id`, `file_id`, `status` (`processing` | `done` | `needs_check` | `error`), `service {name, version}`; при `status ∈ {done, needs_check}` обязательны `result_s3 {bucket, key}` и `result_schema_version`; при `status = error` обязателен `error {code, message}`; опциональны `raw_s3_key`