diff --git a/openspec/changes/nats-env-config/.openspec.yaml b/openspec/changes/archive/2026-10-13-nats-env-config/.openspec.yaml similarity index 100% rename from openspec/changes/nats-env-config/.openspec.yaml rename to openspec/changes/archive/2026-10-13-nats-env-config/.openspec.yaml diff --git a/openspec/changes/nats-env-config/design.md b/openspec/changes/archive/2026-10-13-nats-env-config/design.md similarity index 100% rename from openspec/changes/nats-env-config/design.md rename to openspec/changes/archive/2026-10-13-nats-env-config/design.md diff --git a/openspec/changes/nats-env-config/proposal.md b/openspec/changes/archive/2026-10-13-nats-env-config/proposal.md similarity index 100% rename from openspec/changes/nats-env-config/proposal.md rename to openspec/changes/archive/2026-10-13-nats-env-config/proposal.md diff --git a/openspec/changes/nats-env-config/specs/recognition-job-exchange/spec.md b/openspec/changes/archive/2026-10-13-nats-env-config/specs/recognition-job-exchange/spec.md similarity index 100% rename from openspec/changes/nats-env-config/specs/recognition-job-exchange/spec.md rename to openspec/changes/archive/2026-10-13-nats-env-config/specs/recognition-job-exchange/spec.md diff --git a/openspec/changes/nats-env-config/tasks.md b/openspec/changes/archive/2026-10-13-nats-env-config/tasks.md similarity index 100% rename from openspec/changes/nats-env-config/tasks.md rename to openspec/changes/archive/2026-10-13-nats-env-config/tasks.md diff --git a/openspec/specs/recognition-job-exchange/spec.md b/openspec/specs/recognition-job-exchange/spec.md index 5f6d20f..1b3c408 100644 --- a/openspec/specs/recognition-job-exchange/spec.md +++ b/openspec/specs/recognition-job-exchange/spec.md @@ -91,7 +91,7 @@ ### Requirement: Соединение с NATS по шаблону, без JetStream Ядро SHALL подключаться к NATS с nkeys-seed и JWT, если заданы `OPENBAO__NATS__NATS_SEED/NATS_JWT`, и без учётных данных, -если они пусты; подписываться на `files.tabular_parsed` в queue group `arm-core`; переподключаться автоматически. +если они пусты; подписываться на subject ответа `NATS_RESULT_SUBJECT` (по умолчанию `files.tabular_parsed`) в queue group `arm-core`; переподключаться автоматически. Stream'ы и consumer'ы JetStream MUST NOT требоваться. Фоновые задачи SHALL запускаться при `NATS_ENABLED=true`. #### Scenario: Dev-окружение compose @@ -105,3 +105,29 @@ Stream'ы и consumer'ы JetStream MUST NOT требоваться. Фоновы #### Scenario: NATS выключен - **WHEN** `NATS_ENABLED=false` - **THEN** приложение стартует, фоновые задачи не запускаются, `/healthcheck` отвечает 200 с `nats = off` + +### Requirement: Subject'ы и учётные данные NATS из настроек окружения +Ядро SHALL брать subject'ы обмена из `OPENBAO__NATS__NATS_TABULAR_REQUEST_SUBJECT`, `NATS_IMAGE_REQUEST_SUBJECT`, +`NATS_RESULT_SUBJECT` (умолчания `files.tabular_uploaded`, `files.img_uploaded`, `files.tabular_parsed`): публикует запросы в `tabular_request` и `image_request`, подписан на `result` (queue group `arm-core`). +При старте SHALL проверяться все три имени (непустое, без пробельных символов, без `*` и `>`, без пустых токенов, +попарно различны); при нарушении приложение MUST NOT стартовать. Значения `NATS_JWT` и `NATS_SEED` MUST NOT попадать в +логи, `repr` настроек и тексты ошибок валидации. Используемые subject'ы SHALL писаться в лог при старте и отдаваться в +`/healthcheck` объектом `subjects` с ключами `tabular_request`, `image_request`, `result` при любом значении `nats` (`ok | down | off`). + +#### Scenario: Умолчания +- **WHEN** приложение стартует без ключей `OPENBAO__NATS__NATS_*_SUBJECT` +- **THEN** `/healthcheck.subjects` содержит имена `files.*` по умолчанию, обмен идёт по ним + +#### Scenario: Subject'ы окружения +- **WHEN** заданы `OPENBAO__NATS__NATS_TABULAR_REQUEST_SUBJECT=test.files.tabular_uploaded`, + `OPENBAO__NATS__NATS_IMAGE_REQUEST_SUBJECT=test.files.img_uploaded`, + `OPENBAO__NATS__NATS_RESULT_SUBJECT=test.files.tabular_parsed` +- **THEN** подписки и публикации идут только по этим subject'ам, `/healthcheck.subjects` их показывает + +#### Scenario: Недопустимый subject +- **WHEN** `OPENBAO__NATS__NATS_RESULT_SUBJECT` совпадает с subject'ом запроса или содержит `>` +- **THEN** приложение не стартует, ошибка называет ключ + +#### Scenario: JWT не раскрывается +- **WHEN** заданы `NATS_JWT` и `NATS_SEED`, а валидация настроек падает на другом поле +- **THEN** текст ошибки и лог не содержат значений JWT и seed; `repr` настроек показывает их скрытыми