Co-authored-by: genichin <4282227+genichin@users.noreply.github.com>
2.5 KiB
2.5 KiB
id, status
| id | status |
|---|---|
| ac-0025 | active |
최초 reconcile_warned strategy intent 거부 알림
Criterion
재조정 경고가 설정된 slot에서 외부 전략 buy/sell intent가 rejected/reconcile_warned로 최종 확정되면, IntentStore.finalize() 이후에만 trex.alerts로 strategy_intent_rejected/warn 알림을 intent_id 기준 최초 1회 발행해야 한다. 같은 intent_id 재요청과 처리 중 중복(duplicate_in_flight)은 추가 알림을 만들지 않으며, 같은 slot의 서로 다른 intent_id는 각각 독립 발행한다. 알림 payload는 필수 allowlist fields를 항상 포함하고 optional fields는 신뢰 가능한 값이 있을 때만 포함해야 하며, 비허용 필드·민감정보·raw exception body를 alarm/log에 포함해서는 안 된다. emitter 부재/전송 실패/optional context 조회 실패는 저장된 거부 결과와 RPC 응답, broker·slot·warning·ledger·portfolio-hub 동작을 바꾸지 않는 best-effort 경계여야 한다. daemon은 기존 공용 AlarmEmitter를 IntentService에 주입하고, emitter 없이 IntentService를 생성하는 기존 경로는 계속 호환되어야 한다.
Verification
- 성공 조건: warned slot의 새 buy/sell intent 각각에서 finalize 후
strategy_intent_rejected/warn알림이 한 건 발행된다. - dedup 조건: 같은
intent_id재시도(동일 process 및 durable-store 재구성 후)에서 추가 알림이 없고, 같은 slot의 다른intent_id는 각각 한 건 발행한다. - 예외 경계:
duplicate_in_flight, admitted,reconcile_warning_unavailable,capacity_full, validation rejection, 그 밖의 non-reconcile_warnedrejection에서는 알림이 없어야 한다. - 순서/실패 조건: finalize 실패 시 알림이 없어야 하며 finalize 완료 전에 publish가 실행되면 FAIL이다. optional context 조회 실패·publisher false·publisher exception·emitter 부재에서도 RPC 응답은
rejected/reconcile_warned를 유지해야 한다. - payload/보안 조건: 필수 fields와
broker_submitted=false가 포함되고, optional fields는 확인 가능 시에만 포함된다. buy/sell strategy id는 공통strategy_id로 정규화되며 비허용 필드와 민감정보·raw exception body가 alarm/log에 없어야 한다. - wiring/회귀 조건: daemon이 공용
AlarmEmitter를IntentService에 전달하고, emitter 없는 직접 생성 경로 및 기존 intent dedup/alarm 관련 회귀가 유지되어야 한다.