
사이트맵 lastmod가 전부 같은 날짜였다: 본문 해시로 수정일 정하기
lastmod는 손으로 쓰거나 커밋 날짜에서 가져오지 않고, 본문 해시가 달라진 날로 계산합니다. 계산 입력에 날짜 자신은 넣지 않습니다.
커밋 12ed443 시점의 sitemap.xml을 꺼내 lastmod를 세어 보면 URL 51개가 모두 2026-10-18이고, 바로 앞 커밋까지는 날짜가 다섯 가지였습니다. 지금은 본문 해시가 달라진 페이지만 수정일이 움직이고, 10월 19일 HTML 99개를 고친 커밋에서도 수정일이 달라진 기존 페이지는 6개였습니다.
출처: 이 사이트 저장소의 git 기록과 tools/dates.py, tools/indexnow.py. 기준일은 2026년 10월 20일입니다.
같은 날짜의 원인은 커밋 날짜였습니다
예전 빌드는 파일을 마지막으로 건드린 git 커밋 날짜를 lastmod로 썼습니다. 이 함수(git_date)가 들어간 10월 5일 커밋 bdbbe97에는 AI 코딩 에이전트 공동 작성 표기가 있습니다. 에이전트가 짠 기준은 "파일이 달라진 날"이었습니다.
터진 것은 사이트 전체 작업 12ed443이었습니다. HTML 52개가 한 커밋에 들어갔고, 모두 head에 RSS 링크 한 줄이 늘었습니다. 같은 52개를 지금의 해시 규칙(<main> 기준)으로 다시 재면 본문이 달라진 페이지는 한글뷰어 슈가독 앱 페이지 ko·en 2개뿐입니다. 42개는 그대로였고, 8개는 "최종 업데이트" 줄 하나만 늘었습니다. (head의 구조화 데이터까지 세도 바뀐 페이지는 11개입니다.)

Google 사이트맵 문서는 lastmod가 "consistently and verifiably accurate"할 때만 쓴다고 적습니다.
수정일은 본문 해시가 달라진 날에만 움직입니다
10월 18일 b82faac에서 날짜를 data/content-dates.json 한 파일로 모았습니다. 이 커밋도 에이전트와 함께 만들었습니다. 새 tools/dates.py는 첫 줄에 날짜 규칙을 적은 명세 절(IA spec 4.1)을 달고, 손으로 쓴 페이지는 이렇게 해시합니다.
def hand_input(page_html):
inner = main_html(page_html) # <main> 안쪽만
inner = _CRUMBS_RE.sub("", inner) # 이동 경로 제외
inner = strip_build_blocks(inner) # <!-- build:* --> 블록 제외
return _WS_RE.sub(" ", inner).strip()
# 해시가 같으면 날짜 유지, 다르면 modified = 오늘
# 새 페이지면 published = modified = 오늘
빠뜨리기 쉬운 것은 날짜 자신입니다. 12ed443은 "최종 업데이트" 줄을 <main> 안에 일반 HTML로 넣었습니다. 이 줄까지 해시하면 날짜 변경이 곧 본문 변경이 되어, 다음 날 빌드에서 날짜가 또 움직입니다. 지금 이 줄은 build:meta 블록에 있고, 그 8개 앱 페이지는 data/apps.json의 입력 데이터를 해시하는 생성 페이지가 됐습니다. 테스트 test_every_marker_block_is_removed와 test_idempotent_next_day가 이 두 가지를 확인합니다.
lastmod를 커밋 날짜나 빌드 날짜에서 가져오지 마십시오. 사람이 고치게 두지도 않습니다. 이 저장소의 AGENTS.md에 "never edit dates by hand"라고 적었습니다(AGENTS.md 작성법 참고).
HTML 99개를 고친 날, 수정일은 6개만
10월 19일 커밋 b79f2d1은 HTML 파일 99개를 건드렸습니다. 대부분은 스타일시트 주소 뒤 ?v= 값 하나였습니다. 새 페이지 14개를 빼면 수정일이 달라진 기존 페이지는 6개였고, 모두 새 페이지를 목록으로 보여 주는 홈·앱 목록·개인정보처리방침 목록의 ko·en이었습니다.

IndexNow 전송도 이 날짜를 따릅니다. tools/indexnow.py는 modified가 오늘인 페이지만 고르고, 기본값이 dry run이라 --send를 붙여야 실제로 보냅니다.
다음에 확인할 것
관련 글 목록(build:extra)은 해시에서 빠집니다. Google 문서는 링크 변경도 중요한 수정으로 보는데, 지금 규칙은 관련 글 목록이 바뀌어도 기존 노트 날짜를 그대로 둡니다. 이 차이는 Search Console 크롤링 기록을 보고 정합니다(측정 예정 2026-11).
자주 묻는 질문
Google은 사이트맵 lastmod를 실제로 쓰나요?
값이 일관되고 검증 가능하게 정확할 때만 씁니다. Google 사이트맵 문서(2026-07-08 갱신본)는 실제 수정 시점과 비교해 맞을 때 쓴다고 적고, priority와 changefreq는 무시한다고 밝힙니다.
IndexNow로 매번 전체 URL을 보내나요?
보내지 않습니다. 수정일이 오늘인 페이지만 보내고, 전체 전송(--all)은 네이버 서치어드바이저에 사이트를 등록한 직후 한 번만 쓰도록 스크립트 설명에 적어 두었습니다.
이 글은 SugarMount가 직접 측정한 값으로 쓰고, 초안 작성에 AI 코딩 에이전트를 썼습니다.
다른 AX 노트
- FAQ 리치 결과가 끝난 뒤의 구조화 데이터: GEO용으로 무엇을 남겼나
- 여러 에이전트 세션이 고치는 정적 사이트: 커밋 전 --check 게이트 하나
- 개인정보처리방침 AI 처리 위치(국외 이전): 하루에 두 번 고친 고지를 코드에 묶기
- Android assets를 미리 gzip한 실측: APK 이득은 0, .pack.gz는 .pack이 되어 FileNotFoundException
- SKT 판매 삼성 폰에서 market://을 열면 스토어 선택 창이 뜬다: Play 패키지부터 지정하기
- addOnCompleteListener(this)가 onStop에서 지운 리스너 때문에 스플래시에 멈춘 버그