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

3.5 KiB

id, status
id status
ac-0028 active

전략·operator slots RPC의 strategy state 가시성

Criterion

trex-core의 slots.req는 전략 요청과 operator 조회의 strategy-state 가시성을 구분해야 한다. spy=false인 전략용 요청은 required non-empty string strategy_instance_id를 받아 각 반환 slot에서 data[request.strategy_instance_id]와 정확히 일치하는 entry 하나만 strategy_state: {version, data, updated_at} 단일 object로 제공해야 한다. 요청 ID에 해당하는 entry가 없으면 strategy_state field를 생략하고 다른 instance의 ID·state 또는 전체 map을 대신 반환해서는 안 된다. 누락·비문자열·빈 ID는 RPC-level error나 새 envelope 없이 slots=[], available_slots=null, degraded=false, reason="bad_request:strategy_instance_id", message="strategy_instance_id must be a non-empty string"인 non-retryable response를 반환해야 한다. spy=true인 operator 요청은 strategy_instance_id를 요구하지 않고 기존 filter·slot 조회와 watchdog 비갱신 동작을 유지하며, 각 반환 slot의 strategy_state에 전체 strategy_instance_id → {version, data, updated_at} map을 제공해야 한다. Operator 요청에 strategy_instance_id가 포함되어도 map을 특정 entry로 제한해서는 안 된다.

Verification

  • 전략 조회: 같은 slot map에 A와 B가 있을 때 spy=false, strategy_instance_id=A 요청은 strategy_state에 A의 {version, data, updated_at}만 반환하고 B의 ID·data와 outer map을 serialized payload 어디에도 포함하지 않는다. B 요청은 B만 반환하며 존재하지 않는 C 요청은 slot row의 strategy_state를 생략한다.
  • 잘못된 전략 요청: 누락, null, boolean, number, collection 및 빈 문자열 ID 각각에서 exact 기존 envelope인 slots=[], available_slots=null, degraded=false, reason="bad_request:strategy_instance_id", message="strategy_instance_id must be a non-empty string"을 반환한다. Slot, state 또는 다른 instance ID가 노출되거나 watchdog이 갱신되면 FAIL이다.
  • Operator 조회: strategy_instance_id 없이 spy=true로 기존 universe와 slots CLI가 성공하고 filter 결과와 watchdog 비갱신을 유지한다. A·B state가 있는 slot row의 strategy_state는 A와 B를 각각 {version, data, updated_at} entry로 포함한 전체 map이어야 한다. 같은 operator 요청에 A ID를 추가해도 B가 제거되지 않아야 한다.
  • 기존 계약 조합: AC-0023에 따라 제외된 slot은 strategy-state 가시성 형식을 적용하기 전에 계속 제외되고 warn-store failure는 기존 fail-closed 결과를 유지한다. 포함되는 holding slot의 broker-authoritative quantity와 unavailable metadata는 AC-0022를 유지하며 state 선택 때문에 바뀌지 않는다.
  • Wire 경계: 전략 응답의 단일 strategy_state object 안에는 strategy_instance_id key나 collection을 두지 않는다. Operator map의 key만 instance ID를 나타내며 각 value에는 identity metadata를 중복 저장하지 않는다. 별도 operator/diagnostic API, core-side instance registry 또는 caller 인증을 새로 요구하지 않는다.
  • 검사 방법: slots handler contract tests에서 전략 A/B/absent/malformed 요청과 operator no-ID/ID-present 요청을 serialized response 기준으로 검증한다. Operator CLI, watchdog, reconciliation exclusion, broker quantity, InMemory/PostgreSQL read parity와 production daemon handler wiring 회귀 테스트를 함께 실행한다.