From bf893959dff453ec04b92538447afb8bf9b25946 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 4 Oct 2026 07:17:53 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20recognition-contract=20?= =?UTF-8?q?=E2=80=94=20=D0=B8=D1=81=D1=82=D0=BE=D1=87=D0=BD=D0=B8=D0=BA=20?= =?UTF-8?q?attempt=20=D1=82=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=B8=D0=B7?= =?UTF-8?q?=20=D1=82=D0=B5=D0=BB=D0=B0,=20=D1=80=D0=B0=D1=81=D1=85=D0=BE?= =?UTF-8?q?=D0=B6=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B8=D1=81=D0=BE=D0=B2=20=D0=B2=20THEN=20(OQ-71)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Sonnet 5.5 --- .../specs/recognition-contract/spec.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openspec/changes/slice-0-skeleton/specs/recognition-contract/spec.md b/openspec/changes/slice-0-skeleton/specs/recognition-contract/spec.md index cc90ead..c7c8b10 100644 --- a/openspec/changes/slice-0-skeleton/specs/recognition-contract/spec.md +++ b/openspec/changes/slice-0-skeleton/specs/recognition-contract/spec.md @@ -22,10 +22,11 @@ #### Scenario: Сообщение не по схеме - **WHEN** сервис получает запрос, не проходящий схему (нет `s3.key`, неизвестный `file_type`), но из тела извлекаются - корректные `job_id` и `file_id`; `attempt` для `Nats-Msg-Id` берётся из тела или из заголовка `Nats-Msg-Id` запроса, - а если его нет ни там, ни там — `scan-gateway` подставляет 1, `tabular-parser` не отвечает + корректные `job_id` и `file_id` - **THEN** сервис публикует результат со `status = error`, `error.code = SCHEMA_MISMATCH` **без предшествующего ack - `processing`** и не падает + `processing`** и не падает; `attempt` для `Nats-Msg-Id` результата берётся из тела запроса, при его отсутствии + реализации расходятся (`tabular-parser` берёт `attempt` из заголовка `Nats-Msg-Id` запроса или не отвечает, + `scan-gateway` подставляет 1) — см. OQ-71 #### Scenario: Нечитаемый запрос - **WHEN** сервис получает сообщение, из которого нельзя извлечь `job_id` (не JSON, не объект, `job_id` отсутствует или @@ -106,8 +107,9 @@ v1.0: обязательные поля `schema_version` (`"1.0"`), `job_id`, `f - **THEN** публикуется результат `status = error`, `error.code = SCHEMA_MISMATCH` **без ack `processing`**: ответом на запрос служит сам финальный конверт, ядро закрывает им задание (`published → error`), и повторной доставки запроса не будет. Конверт публикуется только если из тела извлекаются корректные `job_id` и `file_id`; иначе — как для нечитаемого - запроса (ответа нет, ядро закроет задание по `NO_ACK` / `dlq`). `attempt` для `Nats-Msg-Id` берётся из тела или из - заголовка `Nats-Msg-Id` запроса; если его нет — `scan-gateway` подставляет 1, `tabular-parser` не отвечает + запроса (ответа нет, ядро закроет задание по `NO_ACK` / `dlq`). `attempt` для `Nats-Msg-Id` берётся из тела запроса; при его + отсутствии реализации расходятся (`tabular-parser` берёт `attempt` из заголовка `Nats-Msg-Id` запроса или не отвечает, + `scan-gateway` подставляет 1) — см. OQ-71 ### Requirement: Идемпотентность результатов без брокера Публикующий SHALL ставить заголовок `Nats-Msg-Id` на каждое сообщение (запрос `:`, ack