docs(openspec): спека recognition-contract — ack только на корректный запрос, источник attempt
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
f928982058
commit
172d30a8b1
@ -22,7 +22,8 @@
|
|||||||
|
|
||||||
#### Scenario: Сообщение не по схеме
|
#### Scenario: Сообщение не по схеме
|
||||||
- **WHEN** сервис получает запрос, не проходящий схему (нет `s3.key`, неизвестный `file_type`), но из тела извлекаются
|
- **WHEN** сервис получает запрос, не проходящий схему (нет `s3.key`, неизвестный `file_type`), но из тела извлекаются
|
||||||
корректные `job_id` и `file_id` (и `attempt` для `Nats-Msg-Id`)
|
корректные `job_id` и `file_id`; `attempt` для `Nats-Msg-Id` берётся из тела или из заголовка `Nats-Msg-Id` запроса,
|
||||||
|
а если его нет ни там, ни там — `scan-gateway` подставляет 1, `tabular-parser` не отвечает
|
||||||
- **THEN** сервис публикует результат со `status = error`, `error.code = SCHEMA_MISMATCH` **без предшествующего ack
|
- **THEN** сервис публикует результат со `status = error`, `error.code = SCHEMA_MISMATCH` **без предшествующего ack
|
||||||
`processing`** и не падает
|
`processing`** и не падает
|
||||||
|
|
||||||
@ -45,7 +46,7 @@
|
|||||||
сервиса (`scan-gateway` отвечает `error TIMEOUT`, если `reply_deadline` истёк до отправки файла в ИС Сканирование)
|
сервиса (`scan-gateway` отвечает `error TIMEOUT`, если `reply_deadline` истёк до отправки файла в ИС Сканирование)
|
||||||
|
|
||||||
### Requirement: Подтверждение взятия в работу (ack без JetStream)
|
### Requirement: Подтверждение взятия в работу (ack без JetStream)
|
||||||
Получив запрос, сервис SHALL немедленно, до чтения файла из S3, опубликовать в `recognition.result` конверт со
|
Получив корректный запрос (прошедший проверку схемы и `MAJOR`), сервис SHALL немедленно, до чтения файла из S3, опубликовать в `recognition.result` конверт со
|
||||||
`status = processing`, `job_id`, `file_id`, `service {name, version}` и заголовком `Nats-Msg-Id = ack:<job_id>:<attempt>`.
|
`status = processing`, `job_id`, `file_id`, `service {name, version}` и заголовком `Nats-Msg-Id = ack:<job_id>:<attempt>`.
|
||||||
Ядро SHALL перевести задание `published → processing` и записать `started_at`, `service_name`, `service_version`. Если
|
Ядро SHALL перевести задание `published → processing` и записать `started_at`, `service_name`, `service_version`. Если
|
||||||
ack не получен за `ACK_TIMEOUT_SECONDS` (по умолчанию 30), ядро SHALL опубликовать запрос повторно с тем же
|
ack не получен за `ACK_TIMEOUT_SECONDS` (по умолчанию 30), ядро SHALL опубликовать запрос повторно с тем же
|
||||||
@ -105,7 +106,8 @@ v1.0: обязательные поля `schema_version` (`"1.0"`), `job_id`, `f
|
|||||||
- **THEN** публикуется результат `status = error`, `error.code = SCHEMA_MISMATCH` **без ack `processing`**: ответом на
|
- **THEN** публикуется результат `status = error`, `error.code = SCHEMA_MISMATCH` **без ack `processing`**: ответом на
|
||||||
запрос служит сам финальный конверт, ядро закрывает им задание (`published → error`), и повторной доставки запроса не
|
запрос служит сам финальный конверт, ядро закрывает им задание (`published → error`), и повторной доставки запроса не
|
||||||
будет. Конверт публикуется только если из тела извлекаются корректные `job_id` и `file_id`; иначе — как для нечитаемого
|
будет. Конверт публикуется только если из тела извлекаются корректные `job_id` и `file_id`; иначе — как для нечитаемого
|
||||||
запроса (ответа нет, ядро закроет задание по `NO_ACK` / `dlq`)
|
запроса (ответа нет, ядро закроет задание по `NO_ACK` / `dlq`). `attempt` для `Nats-Msg-Id` берётся из тела или из
|
||||||
|
заголовка `Nats-Msg-Id` запроса; если его нет — `scan-gateway` подставляет 1, `tabular-parser` не отвечает
|
||||||
|
|
||||||
### Requirement: Идемпотентность результатов без брокера
|
### Requirement: Идемпотентность результатов без брокера
|
||||||
Публикующий SHALL ставить заголовок `Nats-Msg-Id` на каждое сообщение (запрос `<job_id>:<attempt>`, ack
|
Публикующий SHALL ставить заголовок `Nats-Msg-Id` на каждое сообщение (запрос `<job_id>:<attempt>`, ack
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user