arrow_back 설계로그 목록
ADR-0041
공통
설계중
매번 다시 묻지 않는다 — 확인된 인용의 캐시와 게이트의 망 의존
작성 2026-08-10 · 최종 갱신 2026-08-10
설계로그 인용 게이트는 실행마다 법령 22건 × 3왕복 + 행정규칙 10건 × 2왕복 = 86회를 두드렸다. 캐시가 없어 이미 백 번 확인한 조문도 매번 다시 받았고, 러너에서 전건 timeout 으로 끝나는 날이 최근 3일 중 2일이었다. 이 저장소는 같은 문제를 이미 세 곳에서 확인 캐시로 풀고 있으며 이 게이트만 빠져 있었다. DRF 본문으로 확인된 것만 적립하는 확인전용 캐시를 두고, 망에 닿으면 시행일자만 확인해 같은 판이면 본문 재조회를 생략하며, 망에 닿지 못하면 수명 14일 안의 항목만 캐시 통과로 인정하고 그 사실을 요약에 적는다. 드리프트 점검에는 캐시 단독 통과를 적용하지 않는다 — 그 잡의 목적이 캐시가 낡았는지 보는 것이기 때문이다.
info이 문서는 연구·설계 기록이며, 현재 제공 중인 서비스가 아닙니다. 각 항목의 상태 표기를 함께 확인해 주세요.
help맥락
이 게이트는 실행마다 86회 DRF 왕복을 한다. 법령은 lawSearch 로 현행 MST 를 잡고 lawService 를 law·eflaw 두 판으로 받아 3왕복, 행정규칙은 lawSearch + lawService 로 2왕복이다. 대상은 법령 22건·행정규칙 10건이다.
실측 실패율. 드리프트 점검은 2026-08-08 실패, 08-09 실패, 08-10 성공이다. 배포 게이트는 2026-08-10 하루에 4회 실행되어 1회 성공 3회 실패했다. 실패는 전부 전건 'urlopen error timed out' 이고 성공한 조회가 0건이다.
같은 러너에서 law-amendment-check(매일 03:57)와 daily-legal-tip(매일 20:17)은 매일 성공한다. 두 잡은 각각 .gz 베이스라인과 자산 폴백을 갖고 있어 매 실행 전량을 다시 받지 않는다.
이 저장소는 같은 계약을 이미 세 곳에서 쓴다. verified_legal_assets.json 은 '자산 1차 대조 → 자산에 없는 것만 라이브 DRF' 로 돌고, data/law_article_index.json 은 '확인전용 폴백. DRF 조회 성공분만 누적하며 창작 없음. 180일 지난 항목은 사용하지 않는다' 를 메타에 적어 두었으며, data/_drf_verify_cache/ 는 최소 30일 TTL 을 강제한다.
설계로그 게이트만 캐시가 없다.
ADR-0040 은 확인 불가를 검증 실패와 구분했다. 그러나 확인 불가가 일어나는 빈도 자체는 줄이지 않는다. 이 기록이 그 부분이다.
alt_route검토한 대안
대안 A기각
재실행으로 버틴다.
최근 3일 중 2일 실패했다. 매번 사람이 눌러야 하고, 이 저장소의 자동화 토큰에는 actions:write 가 없어 재실행을 자동화할 수도 없다.
대안 B기각
실행 예산과 재시도를 올린다.
성공한 조회가 0건이므로 시간 문제가 아니다. 왕복 수가 원인이라면 재시도 상향은 오히려 역효과다. ADR-0040 선택지 A 와 같은 이유다.
대안 C채택
확인 캐시를 두고, 캐시에 없거나 시행일자가 바뀐 것만 라이브로 받는다.
이 저장소가 이미 세 곳에서 쓰는 계약이다. 새 인용과 개정된 법령은 여전히 망을 타므로 fail-closed 가 낮아지지 않는다. 왕복이 줄고, 망에 닿지 못하는 날에도 이미 확인된 것은 통과시킬 수 있다.
대안 D보류
게이트를 배포에서 떼어 사후 탐지로만 돌린다.
ADR-0040 선택지 D 와 같은 이유다. 2026-07-27 이 이 게이트를 배포 스텝 앞에 인라인으로 둔 판단을 이 사고를 계기로 뒤집지 않는다.
대안 E기각
배포 게이트를 없앤다.
예방 게이트를 없애면 미검증 인용이 게시된 뒤에야 발견된다. 탐지는 이미 드리프트 점검이 하고 있고, 둘은 답하는 질문이 다르다.
gavel결정
- 확인 캐시를 둔다. DRF 본문으로 확인된 것만 적립한다 — 법령명·MST(또는 행정규칙 일련번호)·시행일자·조문키·문언 해시·확인일자. 확인전용이며 창작이 없다. data/law_article_index.json 의 계약(성공분만 누적, 빈 결과 미저장)을 그대로 따른다. 문언이 갈린 법령과 조문을 찾지 못한 행정규칙은 적립하지 않는다.
- 적중 판정을 두 층으로 나눈다. 망에 닿으면 현행 시행일자만 확인하고 캐시와 같으면 본문 재조회를 생략한다 — 시행일자가 같으면 같은 판이므로 문언이 다를 수 없다. 망에 닿지 못하면 수명 안의 캐시 항목만 캐시 통과로 인정한다.
- 캐시 단독 통과의 수명은 14일로 한다. 값의 출처는 ADR-0039 결정 1 의 ③(이 로그가 명시적으로 정한 값)이며 관측에서 나오지 않았다. 드리프트 점검이 매일 돌므로 14일은 그 점검이 2주 연속 실패해야 도달하는 값이다.
- 두 잡의 역할을 나눈다. 배포 게이트는 이 변경이 새로 넣은 인용을 검사한다. 이미 게시된 인용이 낡았는지는 드리프트 점검이 맡는다. 새 인용은 캐시에 없으므로 자동으로 망을 타고, 변경분이 없으면 배포 게이트는 망 없이 통과할 수 있다.
- 캐시 통과를 라이브 통과와 같이 적지 않는다. 요약에 캐시 통과 건수와 가장 오래된 확인일자를 적고, 각 줄에 '라이브 대조 아님' 을 표시한다. ADR-0016 이 검증 등급을 나눈 것과 같은 취지다.
- 드리프트 점검에는 캐시 단독 통과를 적용하지 않는다. 그 잡의 목적이 캐시가 낡았는지 보는 것이므로, 캐시로 통과시키면 목적이 사라지고 캐시가 자기 자신을 검증하는 순환이 된다.
menu_book근거
- 캐시는 fail-closed 를 낮추지 않는다. 적립되는 것은 DRF 본문으로 확인된 것뿐이고, 새 인용은 캐시에 조문키가 없어 반드시 망을 타며, 개정된 법령은 시행일자가 달라 반드시 다시 받는다. 못 닿으면 종전대로 확인 불가다.
- 결정 2 의 앞부분이 성립하는 이유는 시행일자가 판을 특정하기 때문이다. 같은 시행일자의 같은 법령이 다른 문언을 가질 수 없으므로, 시행일자 일치를 확인한 뒤 본문을 다시 받는 것은 같은 것을 두 번 묻는 일이다.
- 결정 4 는 각 잡이 답해야 할 질문이 다르다는 사실을 배선에 반영하는 것이다. 배포 시점에 이미 게시된 인용을 다시 묻는 것은 '이 변경이 나쁜 인용을 넣었는가' 에 대한 답이 아니다.
- 결정 6 이 없으면 캐시가 자기 자신을 검증하는 순환이 된다. 캐시를 만든 근거가 라이브 확인이었는데 그 라이브 확인을 다시 캐시로 대신하면 어느 시점에도 실제 대조가 일어나지 않는다.
- 결정 5 는 ADR-0016 결정 1 의 연장이다. 확인 등급이 다른 것을 같은 것으로 적으면 독자가 신뢰 수준을 정할 수 없다. 캐시 통과와 라이브 통과는 다른 등급이다.
warning이 결정이 만드는 한계
- 오프라인 통과는 라이브 통과보다 약하다. 법이 개정됐는데 망에 닿지 못하면 최대 14일 동안 낡은 문언으로 통과한다. 드리프트 점검이 그 창을 좁히지만 없애지 못한다.
- '왕복이 많아서 막힌다' 는 추정이다. 러너에서 도달이 막힌 원인을 우리가 확인한 것은 아니다. 다만 이 결정의 효과는 그 추정에 의존하지 않는다 — 오프라인 통과 경로가 생기는 것만으로 목적은 달성된다. 왕복 감소는 그 위에 얹히는 것이다.
- 캐시 파일이 git 에 들어가므로 잘못된 항목이 커밋될 수 있다. 이 파일은 게이트가 스스로 쓰며 손으로 고치지 않는다는 것을 파일 메타에 적어 두었다. 전량 재확인이 필요하면 --no-cache 로 돈다.
- 상태가 늘어난 만큼 조용히 죽는 경로도 늘어난다. 캐시 통과·라이브 통과·확인 불가·검증 실패 네 갈래가 되었고, 어느 한 갈래의 표시가 빠지면 그 상태가 다른 상태로 보인다. ADR-0040 결과 5 와 같은 대가다.
- 실측(2026-08-10 도입 직후). 라이브 전량 재확인은 종전과 같고, 캐시 적중 실행은 86왕복 → 32왕복으로 줄어 36초에서 10초가 되었다. 도달 불가를 강제한 재현에서는 32건 전부 캐시 통과로 0초에 끝났다.
event_repeat폐기 조건
- 러너에서 출처 도달이 안정적으로 회복될 때 — 캐시 단독 통과 수명을 줄이거나 없앤다. 도달이 안정적이면 오프라인 경로는 위험만 남는다.
- 캐시 통과 중에 실제 드리프트를 놓친 사례가 나올 때 — 결정 3 의 14일을 그 사례로 다시 정한다.
- DRF 가 조건부 요청(If-Modified-Since 등)이나 개정 알림을 제공하는 것이 확인될 때 — 적중 판정을 시행일자 비교에서 그 메커니즘으로 옮긴다.
- ADR-0040 결정 5(확인 불가 시 무관 산출물의 동반 차단)를 정할 때 — 이 기록의 결정 4 와 함께 본다.
balance근거자료
인용 법령
인용한 법령이 없습니다.
참고자료
외부 참고자료를 부착하지 않았다. 이 결정의 근거는 전부 이 프로젝트 자신의 산출물과 실측이다 — 2026-08-08·08-09·08-10 의 실행 로그, scripts/verify_design_log_statutes.py 의 왕복 구조, data/law_article_index.json 의 캐시 계약, 도입 직후 측정한 왕복 수와 소요 시간. ADR-0016 결정 1 의 등급으로는 자체자료에 해당한다.
edit_note작성 기록
이 기록의 조사·실측·선택지 정리와 문장 초안은 사람이 지시하고 LLM(Claude)이 작성했다. 채택안(선택지 C)과 결정 1~6 의 문장은 운영자가 2026-08-10 에 검토해 채택했다. 수명 14일과 결정 4 의 범위도 초안에서 판단 지점으로 제시해 운영자가 확정했다. 작성 주체를 적는 형식은 ADR-0035 에서 신설했다.
hub담당 리더
마디L60
시스템 총괄 · Master API Gateway
사람의 자격이나 직위에 대응하지 않는 시스템 역할 표기다. 이 로그의 설계 결정은 사람이 작성하고 사람이 책임진다(ADR-0004·ADR-0016).
설계로그는 특정 법률 분야가 아니라 시스템 전체의 설계 결정을 다룬다. 개별 도메인 리더가 아니라 60명 리더 시스템의 운영·품질을 총괄하는 리더가 담당한다.
리더 프로필 보기 arrow_forward