# TravelPlanner SQL round-trip evidence

2026년 8월 20일 수행한 로컬 Compose 실험을 2026년 9월 21일 글로 정리한 공개 근거입니다.

## 읽는 순서

1. `provenance.json`: 진단 단계의 집계, 원본 상대 경로와 SHA-256, 실험 날짜
2. `comparison.json`: 최종 PR 검증 campaign의 수치와 사전 고정 규칙, stage별 검증 및 소스 seal
3. `verdict.json`: `confirmed-round-trip-reduction` 최종 판정

소스 저장소는 현재 **공개**입니다. 개인 구현 근거는 protove 작성 [PR #366](https://github.com/protove/KDT_TravelPlanner/pull/366)입니다. 측정 대상 소스는 `1500d31294239f699923119a064b008300471800`입니다. 공개 수치는 해당 PR 최종 검증 campaign `scrum41-pr-full-20260820t1159`에서 가져왔습니다. 이전 r2의 15.5156ms를 최종 결과에 섞지 않았습니다.

## 측정 정의

- N200 reverse: 200개 타임라인 항목 전체의 순서를 뒤집는 요청
- UPDATE 300→1: 요청당 timeline UPDATE family 호출 수. 전체 SQL 호출 수가 아닙니다.
- API p95 83.106→24.330378949999975ms: 세 replicate의 p95를 구한 뒤 취한 중앙값
- DB execution/request 13.3254025→2.2868167666666666ms: 요청당 PostgreSQL 실행 시간 지표의 replicate 중앙값. JDBC·네트워크·애플리케이션 전체 시간과 다릅니다.
- 36 valid stages: 3 replicate × 2 mode × 6 item counts의 조합·순서를 검증했습니다.
- 두 번째 replicate의 reverse p95 200/3 비율은 2.337667676843457로 단독 기준 미달입니다. 전체 판정은 사전 고정한 최소 2/3 일치 규칙에 따라 통과했습니다.

## 출처와 공개 범위

`comparison.json`과 `verdict.json`은 공개 가능한 aggregate 원본을 그대로 복사했습니다. `provenance.json`은 진단 문서의 허용된 수치만 추출한 파생물입니다. 원본 문서 해시는 현재 로컬 증거 snapshot 식별자이며, 커밋에 그 문서가 포함됐다는 의미는 아닙니다. 코드의 정확한 소스 해시는 comparison의 `sourceDigests.optimized.sourceFiles`를 따릅니다.

로컬 사용자 절대 경로, 인프라 식별자, 계정·자격증명·사용자 데이터는 이 묶음에 넣지 않았습니다. 비교 프로필·이미지 digest와 코드 해시는 재현성 식별자로 보존했습니다. 포트폴리오 배포본은 `apps/portfolio/public/evidence/travelplanner-sql/`의 동일 파일입니다.

이번 수치는 합성 fixture와 로컬 PostgreSQL·Redis의 결과입니다. EC2 ASG/RDS/ElastiCache의 SLO 개선, 실제 사용자 트래픽의 결과 또는 production migration 실행을 주장하지 않습니다.
