Files
KArtSell.Aegis/docs/CURRENT/AEG-VS-00-05_JOBRUN_SCHEMA_DECISION.md
T
kjh2064 b82ba2c861 Complete all 8 DECISION_REQUIRED approval documents for WBS unblocking
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>
2026-08-14 13:15:14 +09:00

5.2 KiB
Raw Blame History

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 (정책 논쟁 시)