b82ba2c861
Completed remaining 4 decision documents (total 7/8 created this session): 4. AEG-X-005: Reconciliation Endpoint Authorization - Decision owner: Security Lead, Compliance - Required: 4 decisions (endpoint perms, approval workflow, audit trail, compliance rules) - Deadline: 2026-08-21 - Blocks: VS-29 (Portfolio Reconciliation) production registration 5. AEG-X-008: OpenAPI Baseline & Release Signing - Decision owner: API Architect, DevOps - Required: 4 decisions (baseline snapshot, compatibility policy, CI/CD gate, client generation) - Deadline: 2026-08-21 - Blocks: FE OpenAPI client generation, CI/CD automation 6. AEG-VS-00-05: Job Run Schema & Operational Policy - Decision owner: SRE/DBA, Architecture - Required: 4 decisions (state machine, replay semantics, retention, monitoring SLA) - Deadline: 2026-08-21 - Blocks: Event/Job/Inbox completion, VS-26/28/29 production 7. AEG-VS-06-01: Cost/Tax/FX Schedule Contract - Decision owner: PM, Architecture, Compliance/Owner - Required: 5 decisions (scope clarification, data contract, Job 4C, cost basis integration, compliance) - Deadline: 2026-08-21 - Blocks: MaintainFeeTaxFxSchedule implementation, Cost Basis, G1 gate Summary of all 8 DECISION_REQUIRED items (ready for stakeholder review): 1. AEG-X-038: Fee/Tax/FX valid-time schedules (Ops/Tax/Compliance/Owner) 2. AEG-VS-05-01: Fundamentals PIT contract (PM/Architect/Compliance) 3. V13-FE-038: DataGrid performance budget (FE/SRE/QA) 4. AEG-X-005: Reconciliation auth policies (Security/Compliance) 5. AEG-X-008: OpenAPI baseline & signing (API Architect/DevOps) 6. AEG-VS-00-05: Job run schema & ops (SRE/DBA/Architecture) 7. AEG-VS-06-01: Cost/tax/FX schedule (PM/Architect/Compliance/CFO) 8. [TBD: Research remaining 1 item from initial analysis] Each document: - Clearly states the problem/uncertainty - Enumerates 3-5 specific decisions needed - Provides structured submission format - Links to blocking WBS items & dependent slices - Sets consistent deadline: 2026-08-21 (1 week) - Identifies decision owner & escalation path AGENTS.md compliance: Necessity-driven (blocks major features), Traceability (links to WBS/requirements), Right Way (formal approval process), No speculation (all decisions grounded in actual code/gaps). Status: All unblocked work completed; external approvals/infrastructure needed for remaining items. Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
5.2 KiB
5.2 KiB
AEG-VS-00-05: Job Run 스키마 & 운영 정책 승인 요청
WBS Item: AEG-VS-00-05
Status: ⏳ IN_PROGRESS → DECISION_REQUIRED
Decision Owner: SRE/DBA, Architecture
Blocks: Event/Job/Inbox 계약 완료, 재처리 정책 확정
Impact: Job 실행 추적 미완료, 재시도 정책 불명확, 감시 불완전
현재 상태
구현 완료:
- ✅ db/migrations/0000_building_blocks.sql (building_blocks.job_run 생성)
- ✅ DapperJobRunRepository.cs (CRUD 구현)
- ✅ OutboxPollerJob (이벤트 폴링)
- ✅ DownstreamConsumerJob (Inbox 처리)
- ✅ Architecture tests 6/6 PASS
검증 대기:
- ⏳ Fresh/upgrade/re-run/failure 리허설 증거 (DB 필요)
- ⏳ 보존 정책 (retention policy)
- ⏳ 인덱싱 전략
- ⏳ 운영 SLA 계약
필요한 4가지 결정
1️⃣ Job Run 상태 모델 (State Machine Contract)
결정: Job 실행의 허용된 상태 전이 정의
Current schema (building_blocks.job_run):
- id: UUID
- job_type: enum (ShadowRun, OutboxPoller, TradeStatusPolling, etc.)
- status: enum (Queued, Running, Completed, Failed, ???)
- created_at: timestamp
- completed_at: timestamp (nullable)
- duration_ms: integer
- error_message: text
- result_summary: JSONB
- retry_count: integer
- idempotency_key: UUID (unique, for replay safety)
Questions:
✅ 허용 상태: [ ] (Queued → Running → Completed/Failed/BusinessHold?)
✅ 중간 상태 필요: [ ] (Retrying? Paused?)
✅ 상태별 재시도 정책: [ ] (transient/permanent/dq/business-hold 분류?)
✅ 최대 재시도: [ ] (count)
Linked Items:
- Hangfire job status (how to map?)
- DEBT-024 (retry classification)
- Exponential backoff policy
2️⃣ Job 실행 재처리 정책 (Replay Semantics)
결정: 실패 Job의 재처리 조건과 안전성
Idempotency guarantee:
- Current: idempotency_key (UUID unique constraint)
- Goal: Same key → Same result (deterministic)
Questions:
✅ Determinism 범위: [ ] (모든 Job? 일부만?)
✅ 외부 API 호출: [ ] (재시도 시 replay 가능?)
✅ 부분 실패: [ ] (일부 성공 + 일부 실패 → 어떻게?)
✅ 재처리 기한: [ ] (24h? 7일? 무제한?)
Linked Items:
- OutboxPollerJob (exactly-once semantics)
- DapperInboxStore (deduplication)
- Distributed transaction boundaries
3️⃣ 보존 정책 & 정리 (Retention & Archival)
결정: Job 실행 기록을 얼마나 오래 보관할 것인가
Current state:
- No archival or cleanup defined
- Table growth: unbounded (2-3 jobs/second × 365 days = ~60M rows/year)
Questions:
✅ 보존 기간: [ ] (30일? 90일? 1년? 영구?)
✅ 정리 정책: [ ] (DELETE? Archive to S3? Summarize?)
✅ 감사 대상: [ ] (특정 job_type만? 모두?)
✅ GDPR 대응: [ ] (actor/IP/data redaction?)
Linked Items:
- GDPR retention (docs/CURRENT/AEG-X-007_*)
- Compliance retention periods
- Database archival strategy
- Grafana metric retention
4️⃣ 운영 모니터링 & SLA (Operational Contract)
결정: Job 성능과 SLA 목표
Metrics needed:
- P95/P99 job duration (by job_type)
- Failure rate (% per hour)
- Retry rate (successful retries vs give-up)
- Queue depth (pending jobs)
Questions:
✅ SLA 목표: [ ] (e.g., P95 < 5s, failure rate < 0.1%)
✅ Alert 임계값: [ ] (error rate > 5%? retry rate > 10%?)
✅ 주간 보고: [ ] (job success rate, avg duration, anomalies)
✅ 에스컬레이션: [ ] (SRE pager? on-call runbook?)
Linked Items:
- Serilog structured logging (job_run_id in logs)
- OpenTelemetry spans (job execution tracing)
- Grafana dashboards (job health)
- Runbook (failure scenarios & recovery)
제출 형식
승인자는 다음 정보 제공:
1. Job Run State Machine
Allowed States:
[x] Queued → Running → Completed
[ ] Queued → Running → Retrying → Running → Completed
[ ] Queued → Running → Failed → [terminal]
Max Retries: [ ] (count)
Retry Classification:
- Transient: [ ] (e.g., timeout, 503)
- Permanent: [ ] (e.g., 400, bad input)
- DQ (Data Quality): [ ] (e.g., missing field)
- BusinessHold: [ ] (e.g., awaiting approval)
2. Replay Semantics
Idempotency Guarantee:
Applies to all jobs: [ ] (Yes/No)
External API retry policy:
Retry on 5xx: [ ] (Yes/No)
Retry on timeout: [ ] (Yes/No)
Partial failure handling:
Strategy: [ ] (all-or-nothing / partial-OK)
Replay deadline: [ ] (hours)
3. Retention Policy
Retention Period:
All jobs: [ ] (days)
Failed/Retry jobs: [ ] (days, if different)
Archived jobs: [ ] (S3 path or delete)
GDPR Compliance:
Redact actor/IP: [ ] (Yes/No)
Retention audit: [ ] (Yes/No)
4. Operational SLA
Performance Target:
P95 duration: [ ] (ms)
P99 duration: [ ] (ms)
Availability:
Target failure rate: [ ] (%)
Alert threshold: [ ] (%)
Monitoring:
Dashboard link: [ ] (Grafana path)
Runbook: [ ] (ops/runbook link)
의존성
- Blocks: Event/Job/Inbox 완전 구현, VS-26/28/29 프로덕션 등록
- Related: Hangfire 스케줄링, Outbox/Inbox 패턴, 감시
- Prerequisite: SRE/DBA/Architecture 팀 협력
제출 기한: 2026-08-21 (1주)
승인자: SRE Lead, DBA Lead, Architecture
Escalation: CTO (정책 논쟁 시)