5.6 KiB
5.6 KiB
id, status, discovery, criteria
| id | status | discovery | criteria | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| req-0009 | approved | dcy-0009 |
|
Persistent strategy-instance state lifecycle and identity
Objective
trex-core의 opaque strategy state를 slot occupancy lifecycle과 strategy_id namespace에서 분리한다. 상태를 슬롯별 strategy_instance_id entry로 영속화하여 close와 재점유 뒤에도 같은 instance가 기존 state와 version을 이어 쓰게 하고, 서로 다른 instance의 state와 CAS를 격리한다. 전략용 slots.req에는 요청한 instance의 state 하나만 제공하고 operator spy=true 조회에는 슬롯의 전체 instance map을 제공하되, 각 경로의 identity 검증·watchdog·가시성 계약을 명확히 유지한다.
Scope
- 어떤 경로로 slot이
INACTIVE가 되어도 일반 lifecycle hook이 해당 슬롯의 strategy-state map이나 entry를 자동 삭제하지 않으며, inactive 및 재점유 뒤에도 state와 version을 보존한다. - Strategy-state persistence, application model, store protocol, read filtering, write RPC와 CAS에서
occupancy_seq및expected_occupancy_seq를 제거한다. Slot 자체의occupancy_seq와 증가 규칙은 유지한다. - 슬롯별 strategy-state를
data[strategy_instance_id] = {version, data, updated_at}형태의 map으로 저장한다. Entry에는strategy_id를 중복 저장하지 않으며 innerdata만 core가 해석하지 않는 opaque string이다. strategy_state.set입력을{slot_id, strategy_instance_id, expected_version, data}로 정의한다. 해당 instance entry의 version만 CAS하고, 서로 다른 instance의 성공한 동시 write를 모두 보존한다.spy=false전략용slots.req는 required non-empty stringstrategy_instance_id를 받고, 각 slot에서 요청 ID와 정확히 일치하는 entry 하나만strategy_state: {version, data, updated_at}로 반환한다. 해당 entry가 없으면strategy_state를 생략한다.- 누락·비문자열·빈
strategy_instance_id를 받은 전략용slots.req는 기존 response envelope에서slots=[],available_slots=null,degraded=false,reason="bad_request:strategy_instance_id",message="strategy_instance_id must be a non-empty string"을 반환한다. 같은 malformed ID의 state write는 저장 없이 non-retryablebad_request로 거부한다. spy=trueoperatorslots.req는strategy_instance_id를 요구하지 않고 기존 filter·slot 조회와 watchdog 비갱신 동작을 유지한다. 각 slot row에는 전체 strategy-state map을strategy_instance_id별 entry로 반환하며, 요청에 ID가 있어도 특정 entry로 제한하지 않는다.- Persistence와 RPC 변경을 InMemory/PostgreSQL parity, production daemon wiring 및 repository-local automated tests로 검증한다.
Constraints
- State write는 active slot 검사, inner opaque data size limit 및 해당 entry의
expected_versionCAS를 모두 통과해야 한다. Entry가 없을 때만expected_version=0이며 성공할 때 해당 entry의 version만 1 증가한다. version_conflict는 write를 적용하지 않으며 다른 entry를 변경하지 않는다. Consumer는 추정 version으로 재전송하지 않고 다음slots.req에서 자기 state를 다시 읽어 재계산한다.occupancy_changed는 strategy-state reject reason에서 제거한다.slot_inactive,state_too_large,bad_request:*는 write를 적용하지 않고 RPCcorrelation_id를 저장 멱등성 key로 사용하지 않는다.- Core는 opaque state의 session 의미, 만료, 초기화 또는 merge를 판단하지 않으며 core-side strategy-instance registry,
instance_key ↔ strategy_instance_id목록 및 caller 인증을 도입하지 않는다. - 기존 state에 대한
strategy_id → strategy_instance_idmapping, backfill 또는 instance 귀속 정책을 도입하지 않고 신규 persistence contract를 그대로 적용한다. - 같은
strategy_instance_id는 재시작 뒤에도 같은 논리적 전략 instance가 사용하는 안정적 identity다. Consumer 통합은 각 consumer repository가 소유하며 required non-empty string 설정, startup fail-closed, 불변 사용 및 요청별 override 금지를 전제한다. - AC-0023의 reconciliation warning 판정·slot 제외·intent blocking·clear 권한과 AC-0022의 strategy-facing broker quantity 계약을 변경하지 않는다.
- Legacy Discovery와 REQ는 업데이트하지 않는다. 새 AC 승인 뒤 현재
docs/runtime-flows.md와docs/interface-contract.md의 strategy-state baseline 문구만 approved change에 맞게 정합화한다. - Normative Design Documents: 없음. 이 REQ와 AC-0026~AC-0028이 이번 specification의 normative behavior를 소유한다.
Non-Goals
profit_buffer, portfolio 공통 모델, slot occupancy state machine 또는 Slot 자체의occupancy_seq와 증가 규칙 변경- TVR-v2 reserve·cost basis·processed execution, TSL peak/session 또는 다른 전략의 opaque
dataschema 정의 - Core가 strategy state의 session 만료·occupancy 귀속·초기화 여부를 판단하는 기능
- Core-side instance registry, strategy 목록 저장, caller 인증, AMQP producer 권한 또는 queue topology 변경
- 별도 operator/diagnostic strategy-state API 신설
- Strategy-state history, audit/event store, exactly-once write 또는 multi-writer merge
- Strategy consumer repository의 구현·배포 및 production rollout
- 기존 파괴적 전체 DB reset 제거 또는 변경
- Legacy Discovery·REQ 및 AC-0023~AC-0025의 lifecycle·본문 변경