설계로그 목록
ADR-0041 공통 설계중

매번 다시 묻지 않는다 — 확인된 인용의 캐시와 게이트의 망 의존

작성 2026-08-10 · 최종 갱신 2026-08-10

설계로그 인용 게이트는 실행마다 법령 22건 × 3왕복 + 행정규칙 10건 × 2왕복 = 86회를 두드렸다. 캐시가 없어 이미 백 번 확인한 조문도 매번 다시 받았고, 러너에서 전건 timeout 으로 끝나는 날이 최근 3일 중 2일이었다. 이 저장소는 같은 문제를 이미 세 곳에서 확인 캐시로 풀고 있으며 이 게이트만 빠져 있었다. DRF 본문으로 확인된 것만 적립하는 확인전용 캐시를 두고, 망에 닿으면 시행일자만 확인해 같은 판이면 본문 재조회를 생략하며, 망에 닿지 못하면 수명 14일 안의 항목만 캐시 통과로 인정하고 그 사실을 요약에 적는다. 드리프트 점검에는 캐시 단독 통과를 적용하지 않는다 — 그 잡의 목적이 캐시가 낡았는지 보는 것이기 때문이다.

이 문서는 연구·설계 기록이며, 현재 제공 중인 서비스가 아닙니다. 각 항목의 상태 표기를 함께 확인해 주세요.

맥락

이 게이트는 실행마다 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 은 확인 불가를 검증 실패와 구분했다. 그러나 확인 불가가 일어나는 빈도 자체는 줄이지 않는다. 이 기록이 그 부분이다.

검토한 대안

대안 A기각

재실행으로 버틴다.

최근 3일 중 2일 실패했다. 매번 사람이 눌러야 하고, 이 저장소의 자동화 토큰에는 actions:write 가 없어 재실행을 자동화할 수도 없다.

대안 B기각

실행 예산과 재시도를 올린다.

성공한 조회가 0건이므로 시간 문제가 아니다. 왕복 수가 원인이라면 재시도 상향은 오히려 역효과다. ADR-0040 선택지 A 와 같은 이유다.

대안 C채택

확인 캐시를 두고, 캐시에 없거나 시행일자가 바뀐 것만 라이브로 받는다.

이 저장소가 이미 세 곳에서 쓰는 계약이다. 새 인용과 개정된 법령은 여전히 망을 타므로 fail-closed 가 낮아지지 않는다. 왕복이 줄고, 망에 닿지 못하는 날에도 이미 확인된 것은 통과시킬 수 있다.

대안 D보류

게이트를 배포에서 떼어 사후 탐지로만 돌린다.

ADR-0040 선택지 D 와 같은 이유다. 2026-07-27 이 이 게이트를 배포 스텝 앞에 인라인으로 둔 판단을 이 사고를 계기로 뒤집지 않는다.

대안 E기각

배포 게이트를 없앤다.

예방 게이트를 없애면 미검증 인용이 게시된 뒤에야 발견된다. 탐지는 이미 드리프트 점검이 하고 있고, 둘은 답하는 질문이 다르다.

결정

  1. 확인 캐시를 둔다. DRF 본문으로 확인된 것만 적립한다 — 법령명·MST(또는 행정규칙 일련번호)·시행일자·조문키·문언 해시·확인일자. 확인전용이며 창작이 없다. data/law_article_index.json 의 계약(성공분만 누적, 빈 결과 미저장)을 그대로 따른다. 문언이 갈린 법령과 조문을 찾지 못한 행정규칙은 적립하지 않는다.
  2. 적중 판정을 두 층으로 나눈다. 망에 닿으면 현행 시행일자만 확인하고 캐시와 같으면 본문 재조회를 생략한다 — 시행일자가 같으면 같은 판이므로 문언이 다를 수 없다. 망에 닿지 못하면 수명 안의 캐시 항목만 캐시 통과로 인정한다.
  3. 캐시 단독 통과의 수명은 14일로 한다. 값의 출처는 ADR-0039 결정 1 의 ③(이 로그가 명시적으로 정한 값)이며 관측에서 나오지 않았다. 드리프트 점검이 매일 돌므로 14일은 그 점검이 2주 연속 실패해야 도달하는 값이다.
  4. 두 잡의 역할을 나눈다. 배포 게이트는 이 변경이 새로 넣은 인용을 검사한다. 이미 게시된 인용이 낡았는지는 드리프트 점검이 맡는다. 새 인용은 캐시에 없으므로 자동으로 망을 타고, 변경분이 없으면 배포 게이트는 망 없이 통과할 수 있다.
  5. 캐시 통과를 라이브 통과와 같이 적지 않는다. 요약에 캐시 통과 건수와 가장 오래된 확인일자를 적고, 각 줄에 '라이브 대조 아님' 을 표시한다. ADR-0016 이 검증 등급을 나눈 것과 같은 취지다.
  6. 드리프트 점검에는 캐시 단독 통과를 적용하지 않는다. 그 잡의 목적이 캐시가 낡았는지 보는 것이므로, 캐시로 통과시키면 목적이 사라지고 캐시가 자기 자신을 검증하는 순환이 된다.

근거

이 결정이 만드는 한계

폐기 조건

근거자료

인용 법령

인용한 법령이 없습니다.

참고자료

외부 참고자료를 부착하지 않았다. 이 결정의 근거는 전부 이 프로젝트 자신의 산출물과 실측이다 — 2026-08-08·08-09·08-10 의 실행 로그, scripts/verify_design_log_statutes.py 의 왕복 구조, data/law_article_index.json 의 캐시 계약, 도입 직후 측정한 왕복 수와 소요 시간. ADR-0016 결정 1 의 등급으로는 자체자료에 해당한다.

산출물·측정 기록

작성 기록

이 기록의 조사·실측·선택지 정리와 문장 초안은 사람이 지시하고 LLM(Claude)이 작성했다. 채택안(선택지 C)과 결정 1~6 의 문장은 운영자가 2026-08-10 에 검토해 채택했다. 수명 14일과 결정 4 의 범위도 초안에서 판단 지점으로 제시해 운영자가 확정했다. 작성 주체를 적는 형식은 ADR-0035 에서 신설했다.

담당 리더

마디 리더

마디L60

시스템 총괄 · Master API Gateway

사람의 자격이나 직위에 대응하지 않는 시스템 역할 표기다. 이 로그의 설계 결정은 사람이 작성하고 사람이 책임진다(ADR-0004·ADR-0016).

설계로그는 특정 법률 분야가 아니라 시스템 전체의 설계 결정을 다룬다. 개별 도메인 리더가 아니라 60명 리더 시스템의 운영·품질을 총괄하는 리더가 담당한다.

리더 프로필 보기

관련 기록

ADR-0040ADR-0016ADR-0039