{ "assetKey": "a-read-then-delete-race-on-the-upload-lease", "kind": "terminal", "command": "M=adapter/outbound/persistence-jpa/src/main/resources/db/migration/jpa/fileserver/V4__fileserver_upload_terminal_state.sql; R=adapter/outbound/persistence-jpa/src/main/java/dev/caskeleton/adapter/outbound/persistence/fileserver/repository/UploadLeaseRepository.java; C=application-core/src/main/java/dev/caskeleton/application/fileserver/cleanup/DefaultCleanupService.java; U=application-core/src/main/java/dev/caskeleton/application/fileserver/upload; echo '# V4 가 더한 상태 컬럼과 제약, 그리고 부분 인덱스'; sed -n '31,32p;37,39p;46,49p' $M; echo; echo '# 이 저장소의 쓰기·전이 문장 여섯'; grep -n 'int acquireLease\\|int renewLease\\|int commitOffset\\|int releaseLease\\|int terminate\\|int claimForCleanup' $R; echo '# 그중 활성 상태를 조건으로 거는 줄'; grep -n \"s.lifecycleState = 'ACTIVE'\" $R; echo '# 클래스 javadoc 은 이렇게 적는다'; sed -n '18,19p' $R; echo '# 그러나 리스 반납 문장의 조건은 이것뿐이다'; sed -n '95,96p' $R; echo; echo '# 최종화와 정리 청구가 요구하는 상태'; sed -n '113p;117p' $R; sed -n '147,148p' $R; echo; echo '# 취소 경로 — 트랜잭션 시작부터 끝까지 연속'; sed -n '250,263p' $U/DefaultUploadApplicationService.java; echo; echo '# 검증 실패 경로 — 같은 람다의 시작과 세 쓰기와 끝'; sed -n '237,241p' $U/DefaultFinalizeUploadService.java; echo ' ......'; sed -n '249,254p' $U/DefaultFinalizeUploadService.java; echo; echo '# 정리는 세션을 먼저 읽고, 있을 때만 청구한다'; sed -n '139,143p' $C", "cwd": "/shared/codebase/clean-architecture-backend-template/src", "exitCode": 0, "executedAt": "2026-09-02T01:40:45+00:00", "sourceRevision": "21234e38cdb9a926cbc92bb97a2aee2e4a7d2916", "raw": "evidence/raw/a-read-then-delete-race-on-the-upload-lease.txt", "svg": "evidence/rendered/a-read-then-delete-race-on-the-upload-lease.svg", "rawSha256": "ec6cb3a7e666605332de0e59876503d6ce0ce1d4aa1952f913ac325a20e15231", "lines": 72, "redaction": "none — 분석 문서 발췌" }