Files
trex-core/.proofline/criteria/ac-0039.md
T

2.3 KiB

id, status
id status
ac-0039 active

owner 없는 SELL event의 명시적 unroutable 처리와 전달 분리

Criterion

SELL terminal 처리에서 sell_strategy_id와 strategy_id가 모두 없거나 공백이면 정상 trex.events strategy event 또는 DLQ synthetic-owner message를 publish하지 않고 reason code sell_event_owner_missing으로 처리해야 한다. 해당 execution tick 결과의 dedicated counter를 증가시키고, instance·slot identity·symbol·event type·reason을 포함하되 secret, credential, raw broker payload나 raw exception text가 없는 structured ERROR log와 best-effort alarm을 남겨야 한다. 이 전달 실패와 정상 owner event의 transport publish 실패는 이미 완료된 broker fill, durable slot 전이, ledger outbox enqueue 및 dispatch 정리를 rollback하지 않아야 한다. 정상 owner event의 기존 payload slot_id, event_type, sequence_at은 publish/retry 경계에서 바꾸지 않아야 하며, consumer 구현 또는 새로운 replay·exactly-once 보장은 요구하지 않는다.

Verification

  • 성공 조건: owner 없는 full fill 및 partial fill 후 external cancel에서 trex.events publish 호출과 _ strategy routing key가 모두 0회이고 counter·stable reason ERROR·alarm이 각각 관측된다. 동시에 slot/ledger/dispatch 결과는 owner가 있는 동일 체결과 같게 완료된다. owner가 있는 event의 최초 publish가 실패하고 transport가 재시도하는 경우 payload identity와 sequence_at이 변하지 않는다.
  • 실패·경계 조건: slot_filled_sell._.<symbol> 또는 다른 sentinel owner가 정상 exchange에 발행되거나, owner 미확정 또는 publish exception이 금융 state/outbox를 rollback하거나, 관측 reason이 동적 exception 문자열이면 FAIL이다. alarm transport 실패는 금융 결과를 변경하지 않아야 한다.
  • 검사 방법: fake emitter/transport와 caplog·alarm recorder를 사용한 application/runtime 테스트로 publish call count, counter, reason, sanitized fields 및 금융 비변경을 검증한다. 기존 messaging retry/DLQ 테스트와 disposable RabbitMQ integration으로 mandatory publish·confirm·동일 payload retry·전략 queue 격리를 확인한다. RabbitMQ fixture가 없으면 integration은 SKIP으로 명시하고 단위 검증을 통과로 대체 주장하지 않는다.