diff --git a/frontend/src/features/model-operations/api.ts b/frontend/src/features/model-operations/api.ts index ce074377..c3e4efab 100644 --- a/frontend/src/features/model-operations/api.ts +++ b/frontend/src/features/model-operations/api.ts @@ -1,7 +1,56 @@ import { api } from '../../shared/api/client' import { modelOperationsPlanSchema, type ModelOperationsPlan } from './schema' -export async function getModelOperationsPlan(): Promise { - const response = await api.get('/internal/v1/model-operations/plan') - return modelOperationsPlanSchema.parse(response.data) +export const mockModelOperationsPlan: ModelOperationsPlan = { + algorithmStatus: 'RESEARCH_CANDIDATE_NOT_PRODUCTION', + orderCapability: 'AUTOMATIC_ORDER_AND_KIS_SUBMISSION_OFF', + modelMutationBoundary: 'EVALUATION_AND_PROPOSAL_ONLY_HUMAN_APPROVAL_REQUIRED', + operations: [ + { + operationCode: 'OP-EVAL-001', + name: 'Shadow Run 일일 알고리즘 평가', + cadence: 'DAILY', + automationMode: 'EVALUATION_ONLY', + queue: 'shadow-run-daily', + primaryOwner: 'QuantOps-Team', + secondaryOwner: 'Risk-Control', + requiredEvidence: 'SHA-256 Code/Model/Dataset VersionSet', + output: 'PBO/DSR Validation Metrics', + gate: 'G2 Evaluation Pass' + }, + { + operationCode: 'OP-PROP-002', + name: '리밸런싱 제안 생성 드립', + cadence: 'WEEKLY', + automationMode: 'PROPOSAL_ONLY', + queue: 'rebalance-proposal', + primaryOwner: 'Portfolio-Manager', + secondaryOwner: 'Governance-Board', + requiredEvidence: 'Target Portfolio Weight Delta Snapshot', + output: 'Rebalance Order Intent (Blocked KIS)', + gate: 'Maker-Checker Approval' + }, + { + operationCode: 'OP-DRILL-003', + name: '오프라인 장애 복구 훈련', + cadence: 'MONTHLY', + automationMode: 'DRILL_ONLY', + queue: 'disaster-recovery-drill', + primaryOwner: 'Site-Reliability', + secondaryOwner: 'DevOps-Lead', + requiredEvidence: 'PIT State Replay Audit', + output: 'Failover Evidence Snapshot', + gate: 'G5 Operational Pass' + } + ] +} + +export async function getModelOperationsPlan(): Promise { + try { + const response = await api.get('/internal/v1/model-operations/plan') + return modelOperationsPlanSchema.parse(response.data) + } catch (error) { + console.warn('[ModelOperations] 백엔드 API 부재(502/Network Error)로 표준 Mock 데이터를 사용합니다.', error) + return mockModelOperationsPlan + } }