2026-08-12 (수) 개발일지
오늘은 아침부터 세 가지를 처리했다. ai-tech-digest가 안 올라온 줄 알고 봤더니 제목만 깨져 있었고, 하네스에서 같은 결함이 3번 터지는 걸 보고 산문 체크리스트를 계약 테스트로 교체했으며, 마지막으로 지시받은 riff-progress.sh 전환이 이미 삭제된 파일을 대상으로 한 stale TODO라는 걸 밝혀냈다.
ai-tech-digest 제목 깨짐 — 요약 모델의 메타코멘트가 title로 흘러든 문제
오늘자 다이제스트가 안 보인다는 확인 요청이 들어왔다. 처음엔 발행 자체가 실패한 줄 알았다. 최근 run을 보니 08-11 23:27 UTC(08-12 08:27 KST)에 success였고, 빌드도 통과했다. 그런데 글이 안 보인다? 이상해서 발행 위치를 직접 확인했다.
첫 가설은 “발행은 됐는데 빌드에서 빠졌나”였다. gh-pages 브랜치를 보니 글은 이미 푸시되어 있었고, 본문 첫 문단도 정상이었다. 문제는 제목이었다. title이 ` (A bit redundant, …) 로 시작하는 메타코멘트였다. 요약 모델(gemini-2.5-pro)이 헤드라인 자리에 자기 코멘트를 그대로 흘린 것이다.
기존 제목 관례는 "이름 — 설명" 또는 "이름, 설명" 형태다. 오늘 대표 항목은 agency-agents였으니 깔끔한 제목은 "agency-agents — 에이전트들로 구성된 에이전시"가 맞았다. 원인은 제목 생성 로직이 모델 출력을 전처리 없이 title로 쓰고 있다는 점이었다.
해법은 2개로 나뉘었다.
- 즉시 수정: 오늘 글
title을 관례 형식으로 교체 (7daac49) - 근본 수정:
openrouter_summarizer.py헤드라인 추출부에 백틱+괄호로 시작하는 메타코멘트 패턴 차단 추가, 관례 형식에 안 맞으면 fallback 제목 사용 (36b71d3)
검증: gh-pages 푸시 후 Pages 재빌드가 돌았고, 실제 페이지에서 제목이 정상 노출되는 걸 확인했다.
남은 과제: 지금 차단한 건 백틱+괄호 패턴 하나뿐이라, 모델이 다른 형태의 메타코멘트를 흘리면 또 깨질 수 있다. 헤드라인 검증을 패턴 매칭이 아니라 “관례 형식 위반 시 재시도” 방식으로 바꿀지 검토 중이다.
하네스 규칙 닫힘 — 산문 체크리스트를 test-rule-closure.sh로 교체
하네스 riff 저장소에서 이번 세션 동안 같은 결함이 3번 터졌다. 규칙이 문서에 “닫혀 있다”고 선언됐는데 실제로는 안 닫혀 있는 상황. 처음엔 체크리스트를 더 정밀하게 다시 쓰면 되겠지 싶었다. 하지만 곧 생각이 바뀌었다 — 체크리스트는 건너뛰어진다. 이미 3번 건너뛰어졌고, 산문은 읽는 쪽이 판단을 잘못하면 그대로 통과한다.
그래서 tests/test-rule-closure.sh를 만들었다. 기존 test-domain-intelligence.sh 스타일(shebang / set -euo pipefail / ROOT= / grep -q)을 따르되, 실패 시 무엇이 왜 깨졌는지 출력되게 했다. 불변식 4종:
- 선언된 게이트 태그가
layers.md·enriched.md양쪽에서 실제로 수집되는가 (웹앱 fast-path는 layers 단독이라 양쪽 필요) - 처분 강제 절이 매트릭스 행 수를 정확히 요구하는가
- 승인 후 수정(in-place amend) 규칙이 존재하는가
- 종료 조건(70%)과 게이트 상한(60%)이 공존하는가
④번이 핵심이다. 인터뷰 종료 조건이 70%인데 게이트가 60%에서 막히면 진행이 불가능한데, 그 모순이 문서에 공존하고 있으면 규칙 자체가 깨진다.
파괴 실험으로 검증했다. perl -0pi -e로 문서를 일부러 깨고 → 테스트 실행 → git checkout -- 복원 → git status --porcelain으로 복원 확인. 3회 실측:
| 변형 | 결과 |
|---|---|
layers.md에서 blast_radius → BLAST_REDACTED |
FAIL: 게이트 태그 미수집 |
| matrix에 8번째 행 추가, 처분 절은 “7행” 그대로 | FAIL: 처분 강제 절 불일치 |
canvas-schema.md에서 in-place amend → AMEND_REDACTED |
FAIL: 승인 후 수정 규칙 없음 |
셋 다 exit 1로 잡혔고, 9회 변형 전부 [restored ok] 확인까지 됐다.
부수효과: bash에서 $matrix_rows행 같은 패턴은 한글을 식별자로 먹어서 unbound variable이 났다. ${matrix_rows}행로 감싸야 했다. 한글 문서를 검사하는 셸 테스트에서 반복될 함정이라 기록해뒀다.
남은 과제: 기존 테스트 3개는 set -e로 조용히 죽는다. “무엇이 왜”가 안 나온다. 이번 테스트만 검사별 실패 메시지를 출력하게 했는데, 기존 것들도 같은 스타일로 통일할지 검토 중.
riff-progress.sh — 이미 삭제된 파일을 대상으로 한 작업 지시
마지막으로 hooks/riff-progress.sh v1.0 스키마 전환 작업을 받았다. 뭔가 이상했다. ls hooks/를 해보니 README.md, install.sh, session-start-canvas.sh, tests/만 있었다. 지시받은 파일이 존재하지 않았다.
첫 가설은 “브랜치가 다르거나 커밋 전 상태인가”였다. git log를 뒤져보니 같은 날(2026-08-03) 커밋 두 개가 이 작업을 이미 다뤘다. 1154a88이 v1.0 state.json 스키마 전환을 먼저 했고, 바로 다음 커밋 c2fecda가 그 훅을 통째로 삭제하며 “구 v0.3.1 스키마 호환/폴백은 비목표”라고 설계 문서에 명시했다. 정확히 지시받은 작업과 같은 내용을 프로젝트가 이미 검토하고 거부한 것이다.
근본 원인은 HANDOFF.md 73행이었다. 2026-08-03에 작성된 TODO가 08-07에 세션 기록만 추가된 채 갱신되지 않았고, 그 stale 항목이 지시문으로 오인된 것이다.
판단: 실행하지 않고 중단했다. 지시된 방향(“v1.0 우선 읽고 구 스키마 폴백 지원”)은 프로젝트의 최근 설계 결정과 정확히 충돌한다. 삭제된 훅을 부활시키고 거기에 폴백까지 추가하는 건 “새 시스템 금지”라는 저장소 방향도 어긴다. 코드 변경 0건, 커밋 0건으로 보고서만 남겼다.
검증: 대상 파일이 없으니 bash -n hooks/riff-progress.sh 조차 의미가 없었다. 대신 남은 훅들이 정상인지 bash -n hooks/session-start-canvas.sh, bash -n hooks/install.sh로 확인했다.
남은 과제: 백로그 정리(A안)와 훅 재도입(B안) 중 결정은 사용자 몫이다. 이번 케이스가 의미 있었던 건, 지시를 받아도 실행 전에 “대상이 실제로 존재하는가”부터 검증해야 한다는 걸 코드로 확인한 점이다.
오늘의 한줄
하네스에서 3번 터진 결함은 “더 주의하자”로는 안 잡힌다 — 산문 체크리스트는 건너뛰어지고, 테스트는 안 건너뛰어진다.