테스트 전략 · 수용기준 · 추적성 매트릭스
03-quality/acceptance-traceability.html · LogiNippon · TRD · 2026-06-13 · 신뢰도 라벨 확인 추정 설계
이 페이지는 LogiNippon TRD의 검증(verification) 척추를 고정한다. ① 무엇을 어느 계층에서 어떻게 검증하는가(unit / integration(workerd) / e2e 테스트 전략), ② 출시 전 반드시 통과해야 하는 필수 회귀셋, ③ 측정 가능한 단계 게이트(GATE-P0/P1/P2) Definition-of-Done, ④ 모든 주요 FR/NFR/DM/IR/SR/RR ID를 요구사항 → 근거 → 구현상태 → 검증으로 잇는 마스터 추적성 매트릭스를 담는다. 이 페이지는 새 요구사항 ID를 정의하지 않는다 — 타 페이지가 소유한 ID를 참조·집계하고 검증 수단으로 매핑할 뿐이다. 모든 목표 수치는 운영 데이터 없는 진입 단계의 초기 확정치(설계)이며, 운영 베이스라인으로 분기별 조정한다 — 달성치가 아니다. 구현상태(DONE/STUB/ABSENT)는 현재 server as-built(마스터 §7)를 인용한다.
~50
server 테스트 (현행, skip 없음)
3
테스트 계층 (unit·integration·e2e)
1. 테스트 전략 — unit / integration(workerd) / e2e
검증은 3계층 피라미드로 구성한다. 각 계층은 책임이 다르고, 하위 계층이 빠르고 결정적일수록 상위 계층(느린 e2e)에 부담이 줄어든다. 전면 Cloudflare·TypeScript 스택이므로 테스트 러너는 Vitest, 통합 계층은 @cloudflare/vitest-pool-workers로 실제 workerd 런타임 위에서 실행한다(delivery-pipeline.md 테스트 §, server README). 확인 as-built: 현재 약 50개 테스트, 11개 파일, skip 없음(test/ — health·h3·webhook·테넌트 격리 회귀 등; 마스터 §7). 이는 검증 인프라가 갖춰져 있다는 증거이며, STUB/ABSENT 영역(아래 매트릭스)은 구현과 함께 테스트가 추가되어야 게이트를 통과한다.
| 계층 | 검증 대상 (무엇을) | 도구·실행 환경 | 판정 기준 |
| Unit T |
순수 로직: 이벤트 정규화·dedup_key 산출, ETA 룰 계산, dwell(荷待ち) 산출, H3 셀/링 계산(gridDisk), 웹훅 서명 생성/검증, 정밀도 매트릭스 충돌 해소. I/O는 모킹. |
Vitest, 인메모리, I/O 모킹. 바인딩 없이 결정적. |
입력→출력 등식이 §4 정규 규칙과 일치. 경계값(분단위 내림, ±300s 윈도) 포함. |
| Integration T |
Worker + 바인딩(D1/KV/Queues/DO) 결합 경로: ingest/positions→DO→Queue→consumer→event INSERT, 지오펜스 enter/exit/dwell 히스테리시스, 테넌트 스코프 repo, ShipmentDO 복원, CSV 리포트 end-to-end. |
workerd / Miniflare (@cloudflare/vitest-pool-workers) — 로컬 Cloudflare 런타임 재현. 로컬 D1/KV/R2/Queues. |
실제 런타임에서 바인딩 간 계약·트랜잭션·UNIQUE 제약·DO 라이프사이클이 성립. dedup·격리·서명 회귀가 여기서 고정. |
| E2E D T |
사용자 경로: 案件 배정→위치 배치→자동 도착 이벤트→대시보드(console FleetMap) 반영→웹훅 수신→규제 리포트(荷待ち/NIMACHI CSV) 생성. 합성 클라이언트로 시나리오 재생. |
staging에 wrangler deploy --env staging 후 합성 시나리오 실행. prod 동형(同型) 스키마. |
전 마이그레이션 적용 후 스키마가 model.md와 일치, 핵심 경로가 환경 전반에서 동작. |
현행 테스트 자산을 회귀 기반으로 승격. as-built ~50 테스트(11파일)는 인증(JWT HS256·PBKDF2 100k·refresh 로테이션·ingest-token), jobs CRUD, 테넌트 격리 404, 지오펜스 enter/exit/dwell 풀 엔진, ShipmentDO, 荷待ち/NIMACHI CSV end-to-end, ingest→DO→queue→R2를 이미 커버한다(마스터 §7). 이들을 아래 필수 회귀셋으로 동결하고, STUB(웹훅 전달·ETA·실운송체제관리부·shipments 등록·웹훅 CRUD)·ABSENT(차량 위치·지오펜스 CRUD·운송사 분석·드라이버 admin·레이트리밋) 영역은 구현 시 동시에 테스트를 추가한다.
2. 필수 회귀셋 (Mandatory Regression Suite)
다음 5개 시나리오는 릴리스 차단(blocking) 회귀다 — 하나라도 실패하면 staging→prod 프로모션을 막는다(delivery-pipeline.md 테스트 §). 각 항목은 측정 가능한 Given/When/Then이며, 보안·법정 계산·데이터 무결성에 직접 닿는다. 이 페이지는 게이트를 집계할 뿐, 근거 요구사항 ID는 소유 페이지에 있다.
| # | 회귀 시나리오 | Given / When / Then | 근거 요구사항 (소유 페이지) | 계층 |
| R1 |
테넌트 격리 404 |
Given 테넌트 A의 리소스(shipment/job/report), When 테넌트 B 토큰으로 접근, Then 404(존재 누설 금지, 403 아님). 모든 스코프 라우트에 적용. |
SR-TENANT-001, SR-AUTHZ-001 |
T int |
| R2 |
dedup 멱등 (at-least-once) |
Given 동일 이벤트(같은 dedup_key)를 큐가 중복 전달, When consumer가 처리, Then event는 정확히 1회만 반영(D1 UNIQUE). 분단위 내림·OUTSIDE→INSIDE last_seen_at 단조 가드 정합. |
DM-DEDUP-001 |
T int |
| R3 |
웹훅 서명 라운드트립 |
Given 발신 페이로드, When HMAC-SHA256({timestamp}.{raw_body}) 서명 생성→수신 검증, Then 일치 시 통과·타임스탬프 윈도(±300s) 밖이면 거부(replay 방어). |
FR-DLV-WH-001, IR-WH-001 |
T unit+int |
| R4 |
지오펜스 enter/exit/dwell |
Given 거점 폴리곤 H3 덮개, When 위치 시퀀스가 경계 통과·플래핑, Then ENTER는 단일 핑 즉시(PIP 오탐 제거)·EXIT는 gridDisk(+1) 이탈링 통과 필요·spurious ENTER/EXIT 0·dwell >120min 시 荷待ち 초과 이벤트. |
FR-GEO-DEBOUNCE-001, FR-ENG-EXC-002 |
T int |
| R5 |
마이그레이션 전진(forward-only) |
Given 빈 DB, When 전체 마이그레이션(0001_init→0002_auth→0003_geofence_membership→웹훅 0004 신설 권고)을 순차 적용, Then 스키마가 model.md와 일치. down 의존 없음, 교정은 새 전진 마이그레이션. |
OPS-* 마이그레이션, DM-SCHEMA-001 |
T int+e2e |
추가 권장 회귀(SHOULD). 타임스탬프 +09:00 강제·'Z' 리터럴 거부(DM-TS-001); 인제스트 하드캡 500 초과 413(FR-ACQ-API-001); 추적 손실 45min sweep(FR-ENG-EXC-003) — 단, cron sweepActive는 현재 빈 구현(STUB)이라 구현 동반 시 회귀 추가. 荷待ち 법정 계산이 타임스탬프 규칙에 의존하므로 DM-TS-001 회귀를 R5 직후로 격상 권장.
3. 단계 게이트 수용기준 (GATE-P0 / P1 / P2 DoD)
각 단계 게이트의 Definition-of-Done을 측정 가능한 체크리스트로 고정한다. 게이트 자체(진입·종료 DoD)의 단일 진실원은 phase-gates-roadmap(GATE-P0/P1/P2 소유)이며, 이 페이지는 수용 판정용 체크리스트로 집계한다. 모든 수치는 §4 정규표에서 인용.
3.1 GATE-P0 — cold-start 해소(하드 게이트) 종료 DoD
Phase 0은 "해자는 네트워크"(Research H3 강검증) 전제 하에 cold-start를 제휴로 푸는 하드 게이트다. 다음을 모두 충족해야 P1 진입.
3.2 GATE-P1 — MVP exit DoD (측정 가능 종료 기준)
| 체크 | 측정 가능 기준 (초기 확정 목표, 운영 조정) | 검증 | 근거 |
| Tracking Rate floor | ≥ 85% (MVP exit floor; 정상상태 지향 ≥92%) — 28일 롤링, received/expected pings | A 분석 | SLO-S4 / KPI-TRACK-001 |
| 荷待ち 리포트 협상 사용 | 荷待ち(NIMACHI) CSV 리포트가 실제 화주↔운송사 협상에 사용됨(데모 가능 증거) | D 데모 | FR-RPT-NIMACHI-001 |
| 규제 출력 수기 대체 | 実運送体制管理簿·荷待ち 출력이 수기 작업을 대체(자동 생성물로 제출 가능). 단 法정 포맷 미확정은 RR-LEGAL-001 법무 서명 플래그. | D 데모 | RR-JITSUUNSO-001, RR-NIMACHI-001 |
| 인프라 무료 티어 내 | 운영 부하가 Cloudflare 무료 티어(추정: Workers ~10만 req/일, D1 쓰기 10만행·5GB, R2 10GB) 내에서 동작 | A 분석 | NFR-COST-001 |
| 핵심 스텁 해소 | 웹훅 전달(handleNotifyBatch ack-only→실전달), POST /v1/shipments(500 stub→실등록), 実運送体制管理簿 GET /v1/reports/jitsuunso(501→구현), consentGate ingest 경로 호출(APPI 갭 해소) — 해소 + 테스트 동반 | T int+e2e | 마스터 §7, FR-DLV-WH-001 |
3.3 GATE-P2 — 확장·심화 DoD
4. 마스터 추적성 매트릭스
모든 주요 요구사항 ID(타 페이지 소유)를 요약 · 우선순위 · 단계 · 근거 · 구현상태 · 검증으로 잇는다. 각 ID는 소유 페이지로 상대링크한다(이 페이지는 정의하지 않음). 구현상태는 현행 server as-built(마스터 §7) — DONE(구현+테스트), STUB(껍데기/501/ack-only), ABSENT(미존재). 검증은 테스트명·SLO 쿼리·수용기준 중 하나를 가리킨다. 모든 SLO/KPI 수치는 §4 정규표 인용이며 초기 확정 목표(설계)다.
4.1 Functional — 인증·수집 (FR-AUTH / FR-ACQ / FR-INGEST)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| FR-AUTH-001 | 토큰 TTL: access 3600s·refresh 2592000s·ingest 604800s | P0 | P1 | 07-security | DONE | auth.test.ts (JWT·PBKDF2·refresh 로테이션) |
| FR-AUTH-002 | refresh 로테이션-only + 재사용 탐지 | P0 | P1 | 07-security | DONE | auth 재사용탐지 테스트 |
| FR-AUTH-003 | ingest-token (positions:write 한정) | P0 | P1 | 07-security | DONE | scope 검증 테스트 |
| FR-AUTH-004 | KV revocation 전파 ≤60s | P1 | P1 | 07-security | PARTIAL | AC: revoke→≤60s 거부 (int) |
| FR-AUTH-005 | PBKDF2 ≥100k 해싱 | P0 | P1 | 07-security | DONE | auth.test.ts |
| FR-ACQ-GPS-001 | 적응형 GPS 샘플링 30/60/180s·배터리 ≤6%/h | P0 | P1 | 03-data-acquisition | ABSENT | AC (app TransistorLocationService 주석처리) |
| FR-ACQ-API-001 | 인제스트 배치 하드캡 500/req(초과 413) | P0 | P1 | 03-data-acquisition | DONE | ingest 413 회귀 (int) |
| FR-ACQ-CONSENT-001 | 동의 게이트 (consentGate) | P0 | P1 | 07-security (APPI) | STUB | consentGate 존재하나 ingest 경로 미호출 (갭) |
| FR-ACQ-OFFLINE-001 | 오프라인 버퍼 ≤100 청크 | P1 | P1 | 03-data-acquisition | ABSENT | AC (app stub) |
| FR-ACQ-AUTOSHARE-001 | 자동 위치 공유 | P1 | P1 | 03-data-acquisition | ABSENT | AC (app stub) |
| FR-INGEST-001 | 인제스트 검증→202 accept | P0 | P1 | 03-data-acquisition | DONE | ingest→DO→queue 경로 (int) / S1 |
| FR-INGEST-002 | DO 라우팅·라이브 상태 업데이트 | P0 | P1 | 03-data-acquisition | DONE | ShipmentDO 복원 테스트 |
| FR-INGEST-003 | Queue enqueue→R2 아카이브 | P0 | P1 | 03-data-acquisition | DONE | ingest→queue→R2 (int) |
4.2 Functional — 지오펜스·엔진 (FR-GEO / FR-ENG)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| FR-GEO-001 | H3 셀 멤버십 평가 (KV 역인덱스 O(1)) | P0 | P1 | 04-tracking-engine | DONE | h3.test.ts / geofence 엔진 테스트 |
| FR-GEO-002 | enter/exit/dwell 히스테리시스 엔진 | P0 | P1 | 04-tracking-engine | DONE | geofence-engine 풀 테스트 (R4) |
| FR-GEO-003 | geofence-type→canonical 이벤트 파생 | P0 | P1 | 04-tracking-engine | DONE | 파생 매핑 테스트 |
| FR-GEO-CRUD-001 | 지오펜스 CRUD API (/v1/geofences) | P1 | P1 | 04-tracking-engine | ABSENT | AC (엔드포인트 부재) |
| FR-GEO-DEBOUNCE-001 | ENTER 단일핑 즉시·EXIT gridDisk(+1)·플래핑 0 | P0 | P1 | 04-tracking-engine | DONE | 디바운스 회귀 R4 (int) |
| FR-GEO-H3RES-001 | H3 해상도 정책 res8/9/10/11·분석 h3_r10 고정 | P0 | P1 | 04-tracking-engine | DONE | h3.test.ts (다해상도 lookupCell) |
| FR-ENG-ETA-001 | 룰 ETA 시드속도 80/30/50·dwell 30min | P1 | P1 | 04-tracking-engine | STUB | handleEtaBatch ack-only·KV CONFIG 미read |
| FR-ENG-ETA-002 | 룰→ML 전환 ≥3,000 운행 AND MAPE>20% | P2 | P2 | 04-tracking-engine | ABSENT | AC / KPI-ETA-001 |
| FR-ENG-EXC-001 | 배달 지연 = 약속 ETA +30min | P1 | P1 | 04-tracking-engine | PARTIAL | AC (ETA 스텁 의존) |
| FR-ENG-EXC-002 | 荷待ち 초과 dwell >120min (법정 2h) | P0 | P1 | 04-tracking-engine | DONE | dwell 임계 테스트 (D1 geofence.dwell_threshold_min) |
| FR-ENG-EXC-003 | 추적 손실 45min→TRACKING_LOST (Cron 5min) | P1 | P1 | 04-tracking-engine | STUB | cron sweepActive 빈 구현 |
| FR-ENG-EXC-004 | 경로 이탈 = 계획경로 2km | P2 | P2 | 04-tracking-engine | ABSENT | AC |
| FR-ENG-EXC-005 | 비정상 정차 = 계획외 15min | P2 | P2 | 04-tracking-engine | ABSENT | AC |
| FR-ENG-EXC-006 | 픽업 실패 = planned_pickup +30min | P1 | P1 | 04-tracking-engine | PARTIAL | AC |
4.3 Functional — 전달·리포트·프로비저닝 (FR-DLV / FR-RPT / FR-PROV)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| FR-DLV-WH-001 | 웹훅 재시도 래더 8회·HMAC-SHA256·24h 수명 | P1 | P1 | 05-delivery-layer | STUB | 서명 라운드트립 R3 (unit) / handleNotifyBatch ack-only |
| FR-DLV-WS-001 | WebSocket 단일-shipment 실시간 push | P1 | P1 | 05-delivery-layer | PARTIAL | ShipmentDO fan-out (DONE) / app 클라 stub / S6 |
| FR-DLV-NOTIFY-001 | 알림 전달 (LINE 등) | P2 | P2 | 05-delivery-layer | STUB | LINE_CHANNEL_TOKEN 시크릿만 |
| FR-DLV-TRACK-001 | 화주 추적 링크 (CustomerTrack) | P1 | P1 | 05-delivery-layer | PARTIAL | console CustomerTrack 컴포넌트 (ADR-0010) |
| FR-RPT-NIMACHI-001 | 荷待ち(NIMACHI) CSV 리포트 | P0 | P1 | 06-product / regulatory | DONE | NIMACHI CSV end-to-end 테스트 |
| FR-RPT-JITSUUNSO-001 | 実運送体制管理簿 리포트 | P0 | P1 | regulatory | STUB | GET /v1/reports/jitsuunso 501 |
| FR-RPT-KOSOKU-001 | 구속시간(拘束時間) 리포트 | P1 | P1 | regulatory | ABSENT | AC / RR-KOSOKU-001 |
| FR-RPT-RANGE-001 | 리포트 범위 from<to AND ≤92일·서명URL 300s | P1 | P1 | 06-product | DONE | 422 초과 거부 회귀 (int) |
| FR-RPT-ANALYTICS-001 | 운송사 분석 (/v1/analytics/carriers) | P2 | P2 | 06-product | ABSENT | AC (엔드포인트 부재) |
| FR-PROV-001 | 테넌트/운송사 프로비저닝 | P1 | P0 | 06-product / ops | PARTIAL | console Provisioning / 시드 멱등 (int) |
| FR-PROV-002 | 드라이버 admin (POST /v1/admin/drivers) | P1 | P1 | 06-product / ops | ABSENT | AC (엔드포인트 부재) |
4.4 Data Model (DM)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| DM-SCHEMA-001 | Shipment→Stop→Event 3계층 스키마 | P0 | P1 | 02-data-model | DONE | 마이그레이션 R5 / model.md 일치 |
| DM-TS-001 | 타임스탬프 ISO 8601 +09:00 강제·'Z' 거부 | P0 | P1 | 02-data-model | PARTIAL | 잘못된 형식 거부 수용테스트 (DDL 'Z' 모순 교정) |
| DM-ID-001 | 도메인 ID 체계·테넌트 스코프 키 | P0 | P1 | 02-data-model | DONE | db.ts 테넌트 스코프 (R1) |
| DM-DEDUP-001 | dedup_key sha256·분단위 내림·D1 UNIQUE | P0 | P1 | 02-data-model | DONE | 멱등 회귀 R2 (int) |
| DM-EVT-PREC-001 | 소스 정밀도 EDI>CARRIER>…>APP_GPS | P1 | P1 | 02-data-model | PARTIAL | 정밀도 매트릭스 단위 테스트 (동률 received_at) |
| DM-EVT-ENUM-001 | canonical 이벤트 enum (CREATED…CANCELLED) | P0 | P1 | 02-data-model | DONE | 정규화 단위 테스트 (PORT/BORDER PARTIAL) |
| DM-STATE-001 | shipment 상태 머신 | P0 | P1 | 02-data-model | DONE | ShipmentDO 상태 전이 테스트 |
| DM-KV-001 | KV 역인덱스 cell→geofence_id[] | P0 | P0 | 02-data-model | DONE | 시드 + 멤버십 조회 (int) |
| DM-ISO-001 | ISO 코드/단위 표준화 | P1 | P1 | 02-data-model | PARTIAL | AC |
| DM-CAP-001 | 배치/페이로드 용량 제약 | P0 | P1 | 02-data-model | DONE | 413 회귀 (int) |
| DM-NORM-001 | event_code_map 정규화·≥99% canonical 해결 | P0 | P0 | 02-data-model | DONE | 시드 + 정규화 테스트 / S8 |
4.5 API·인터페이스 계약 (IR)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| IR-API-001 | OpenAPI 단일원 + @loginippon/contract + CI drift gate | P0 | P1 | 05-delivery / ops | PARTIAL | console types 수동중복 → contract 추출 TODO (CI drift gate) |
| IR-REST-catalog | 전 REST 엔드포인트 카탈로그 | P0 | P1 | 05-delivery | PARTIAL | routes 존재·일부 STUB/ABSENT (매트릭스 4.1~4.3) |
| IR-WS-001 | WebSocket AsyncAPI 계약 | P1 | P1 | 05-delivery | PARTIAL | DO fan-out DONE / app 클라 stub / S6 |
| IR-WH-001 | 웹훅 카탈로그·서명 스킴 | P1 | P1 | 05-delivery | STUB | 서명 R3 (unit) / 구독·전달 미구현 (0004 신설 권고) |
| IR-EDI-001 | EDI(X12/EDIFACT) 인입 IF | P2 | P2 | 05-delivery | ABSENT | AC (P2) |
| IR-TELE-001 | 텔레매틱스 인입 IF | P2 | P2 | 05-delivery | ABSENT | AC (P2) |
| IR-EXT-001 | 외부 시스템 인터페이스(TMS 등) | P2 | P2 | 05-delivery | ABSENT | AC (P2) |
4.6 비기능 (NFR) — SLO는 slo-catalog 소유, 여기선 검증 매핑
| ID | 요약 (확정치) | 우선 | 단계 | 근거 | 구현상태 | 검증 (SLO 쿼리/AC) |
| NFR-PERF-001 | 인제스트 accept p95 ≤200ms·p99 ≤400ms | P0 | P1 | 08-operations | STUB | SLO-S1 Analytics Engine 28일 (METRICS writeDataPoint TODO → 미측정) |
| NFR-PERF-002 | 지오펜스 평가 lag p95 ≤5s·p99 ≤15s | P0 | P1 | 08-operations | STUB | SLO-S2 (큐 max_batch_timeout=5s 정합) |
| NFR-PERF-003 | WebSocket 반영 p95 ≤1.5s·p99 ≤3s | P1 | P1 | 08-operations | STUB | SLO-S6 (Flutter 단일-shipment) |
| NFR-PERF-003b | console 폴링 staleness >60s stale·>300s drop | P1 | P1 | 08-operations | PARTIAL | console FleetMap 6s 폴링 (/v1/shipments/tracking as-built) |
| NFR-AVAIL-001 | 가용성 ≥99.9%/역월·에러버짓 0.1%≈43분 | P0 | P1 | 08-operations | STUB | SLO-S5 버짓 소진→prod 승격 차단(릴리스 게이트) |
| NFR-RELY-001 | 웹훅 전달 성공률 ≥99.0%/28일 | P1 | P1 | 08-operations | STUB | SLO-S3 (웹훅 전달 미구현) |
| NFR-SEC-RL-001 | 레이트리밋 API 600/min·인제스트 1200/min·429 | P1 | P1 | 07-security | ABSENT | AC (에러맵엔 RATE_LIMITED/429 존재하나 미구현) |
| NFR-SCALE-001 | 활성 DO >5,000 → D1 60s 폴링 분할 | P2 | P2 | 01-architecture | ABSENT | AC (부하 시나리오) |
| NFR-SCALE-002 | DO active-wall-time 월 임계 가드 | P2 | P2 | 01-architecture | ABSENT | AC |
| NFR-COST-001 | 비용 가드: D1쓰기 ≥70%·R2 ≥80%·DO cap 알람 | P1 | P1 | cost-model | ABSENT | AC (대시보드 알람) |
| NFR-MAINT-001 | 유지보수성·전진전용 마이그레이션 거버넌스 | P1 | P1 | 08-operations | DONE | 마이그레이션 R5 / pipeline-ops |
| NFR-OBS-001 | 관측성 (METRICS.writeDataPoint 방출) | P0 | P1 | 08-operations | STUB | OBS-METRICS-001 (바인딩됨·writeDataPoint TODO → SLI 미측정) |
4.7 보안·프라이버시 (SR) · 보존 (RET)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| SR-THREAT-001 | 위협 모델·STRIDE 카탈로그 | P0 | P1 | 07-security | ABSENT | I 검사 (문서·완화 매핑) |
| SR-AUTHZ-001 | scope→endpoint→role 인가 매트릭스 | P0 | P1 | 07-security | DONE | middleware/auth scope 테스트 |
| SR-TENANT-001 | 테넌트 격리 (타 테넌트 404) | P0 | P1 | 07-security | DONE | 격리 회귀 R1 (int, db.ts 스코프) |
| SR-PII-001 | PII 마스킹 함수 | P1 | P1 | 07-security | ABSENT | AC |
| SR-APPI-CONSENT-001 | APPI 동의 수집·검증 (consentGate) | P0 | P1 | 07-security | STUB | consentGate ingest 경로 미호출 (APPI 갭) |
| SR-APPI-PURPOSE-001 | APPI 이용목적 명시·제한 | P1 | P1 | 07-security | ABSENT | I 검사 |
| SR-APPI-RETENTION-001 | 보존정책 (RET-* 표) | P1 | P1 | 07-security | ABSENT | I 검사 (RET-DO/EVENT/GPS/REG) |
| SR-APPI-DELETE-001 | 삭제·정정 요청 처리 | P1 | P2 | 07-security | ABSENT | AC |
| SR-CRYPTO-001 | 키 로테이션·revocation 전파 | P1 | P1 | 07-security | PARTIAL | KV revocation ≤60s AC (시크릿 환경별) |
| SR-AUDIT-001 | 감사 로그 (request_id 추적) | P1 | P1 | 07-security | PARTIAL | middleware/error request_id 엔벨로프 |
| SR-TOKEN-STORE-001 | 토큰 저장 하드닝 (httpOnly 쿠키) | P1 | P1 | 07-security | STUB | console localStorage 저장(XSS) → OD-003 |
| RET-DO-001 | DO 라이브 상태 운행+hibernation 후 1h | P1 | P1 | 07-security | DONE | DO hibernation 테스트 |
| RET-EVENT-001 | D1 의미 이벤트 5년 (분쟁/규제) | P1 | P2 | 07-security | ABSENT | AC (보존 잡) |
| RET-GPS-001 | R2 원시 GPS 365일 후 purge | P1 | P2 | 07-security | ABSENT | AC (purge 잡) |
| RET-REG-001 | R2 규제 산출물 7년 (법정 최소) | P1 | P2 | 07-security | ABSENT | AC 추정 법무 서명 필요 |
4.8 규제 (RR)
| ID | 요약 | 우선 | 단계 | 근거 | 구현상태 | 검증 |
| RR-JITSUUNSO-001 | 実運送体制管理簿 컬럼 정의 (2025.4 의무) | P0 | P1 | regulatory | STUB | /v1/reports/jitsuunso 501 추정 법무 |
| RR-NIMACHI-001 | 荷待ち 기록 집계 (2026.4 법정 2h) | P0 | P1 | regulatory | DONE | NIMACHI CSV end-to-end |
| RR-KOSOKU-001 | 구속시간 필드 (2024 문제·960h 상한) | P1 | P1 | regulatory | ABSENT | AC 추정 법무 |
| RR-CSV-001 | CSV 인코딩 (Shift_JIS/UTF-8 BOM) | P1 | P1 | regulatory | PARTIAL | 인코딩 테스트 → OD-004 법무 |
| RR-LIFECYCLE-001 | 리포트 라이프사이클 PENDING→READY→FAILED | P1 | P1 | regulatory | PARTIAL | 리포트 상태 전이 테스트 |
| RR-PROV-001 | provenance FK (산출물→원천 이벤트) | P1 | P1 | regulatory | PARTIAL | AC (FK 무결성) |
| RR-LEGAL-001 | 공식 포맷 법무 확인 플래그 | P0 | P0 | regulatory | ABSENT 추정 | I 검사 — 공식 포맷 미확정, 법무 서명 대기 (전 RR에 종속) |
4.9 SLO 카탈로그 (SLO-S1..S8 + OBS) — 검증 쿼리는 slo-catalog 소유
| ID | SLI (확정 목표) | 측정·쿼리 소스 | 구현상태 |
| SLO-S1 | 인제스트 accept p95 ≤200ms·p99 ≤400ms | Analytics Engine 28일 롤링 | STUB (writeDataPoint TODO) |
| SLO-S2 | 지오펜스 lag p95 ≤5s·p99 ≤15s | 큐 max_batch_timeout=5s | STUB |
| SLO-S3 | 웹훅 성공률 ≥99.0%/28일 | 발신 타임아웃 5s hard | STUB |
| SLO-S4 | Tracking Rate exit floor ≥85% (지향 ≥92%) | received/expected pings, 28일 | STUB |
| SLO-S5 | 가용성 ≥99.9%·에러버짓 43분/월 | 릴리스 게이트 연동 | STUB |
| SLO-S6 | WebSocket 반영 p95 ≤1.5s·p99 ≤3s | DO 단일 shipment 뷰 | STUB |
| SLO-S7 | ETA MAPE ≤25%(룰)·≤15%(ML) | eta_is_estimate 표기 | ABSENT (ETA STUB) |
| SLO-S8 | 이벤트 정규화 ≥99% canonical·미매핑 <1%/일 | 미매핑 알람 >50/시간 | PARTIAL (정규화 DONE·알람 미배선) |
| OBS-METRICS-001 | METRICS.writeDataPoint 방출 요구 | Analytics Engine loginippon_metrics | STUB (바인딩됨·TODO → SLI 미측정) |
관측성 갭이 SLO 검증의 단일 차단점. 위 SLO-S1..S6과 NFR-PERF/AVAIL/RELY는 모두 METRICS(Analytics Engine loginippon_metrics) 바인딩에 의존하지만, 현재 writeDataPoint가 TODO라 SLI가 방출되지 않는다(마스터 §7). 따라서 이들 SLO는 코드상 구현 여부와 무관하게 현재 측정 불가(STUB)이며, OBS-METRICS-001 해소가 GATE-P1 종료의 사실상 선결 조건이다. 에러버짓 릴리스 게이트(S5)도 동일 의존.
5. 검증 방법 범례 (T / D / A / I)
| 코드 | 방법 | 의미 | 이 TRD에서의 적용 |
| T | Test (테스트) | 자동화 테스트(unit/integration/e2e)로 통과/실패 판정 | 대부분의 FR/DM·필수 회귀셋 R1~R5. workerd 통합 테스트 우선. |
| D | Demonstration (시연) | 실제 시나리오·사용 맥락에서 동작을 보여 판정 | 荷待ち 리포트 협상 사용·규제 출력 수기 대체(GATE-P1) 등 운영 증거. |
| A | Analysis (분석) | 측정·계산·모델로 충족 판정(SLO 쿼리·KPI 공식·용량 모델) | NFR/SLO·KPI(Tracking Rate·ETA MAPE)·비용 가드레일·스케일 트리거. |
| I | Inspection (검사) | 코드·문서·산출물을 검토해 충족 확인 | 규제 컬럼 정의·법무 서명(RR-LEGAL-001)·리소스 프로비저닝·위협 모델·보존 정책. |
검증 방법 선택 원칙. 가능하면 T(테스트)로 자동 회귀화한다(결정적·반복가능). 외부 협상·운영 맥락이 본질이면 D, 통계·임계 충족은 A(SLO 쿼리/KPI 공식), 법령 포맷·존재 여부는 I를 쓴다. 법령 포맷처럼 우리가 단정할 수 없는 사실은 추정 라벨 + RR-LEGAL-001 법무 서명 플래그로 명시한다 — 본 TRD는 이를 달성된 것으로 제시하지 않는다.