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>
203 lines
5.2 KiB
Markdown
203 lines
5.2 KiB
Markdown
# 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 (정책 논쟁 시)
|