지난 글에서
/ingest 프롬프트가 한 달간 지침을 못 받고 있던 버그를 고쳤다. 여기서 끝내려다가,
프롬프트 전체를 체크하는 김에 “AI 판단이 진짜 필요한 것 vs 필요 없는데 시키고 있는 것”도
같이 훑어보기로 했다.
결과가 늘 하나로 정해져 있는데 AI한테 맡기고 있던 것
ingest/split/merge 세 작업 모두, 새로 만드는 문서의 frontmatter에 created: YYYY-MM-DD (오늘 날짜)를 쓰라고 AI한테 지시하고 있었다. 문서를 새로 만드는 바로
그 순간이니, 정답은 항상 ‘오늘’ 하나뿐이다 — AI가 판단할 게 없는 값인데도, 코드가
그 값을 검증하거나 되돌려쓰는 로직이 없어서 결과는 전적으로 AI가 쓴 그대로 믿는
구조였다. 결국 생성되는 그 순간 AI가 어제 날짜나 잘못된 연도를 써도, 그걸 걸러낼
지점이 파이프라인 어디에도 없었다.
회귀 테스트부터, 그다음 고쳤다
먼저 AI가 일부러 틀린 날짜(2020-01-01)를 쓴 상황을 가정한 테스트를 추가했다.
const input = `---\ntitle: "Test Note"\n...\ncreated: 2020-01-01\n...`;
const result = YamlBuilder.sortAndSanitizeFrontmatter(input, undefined, injectedDate);
// result에 "created: 2026-07-17"이 있어야 한다 — AI가 뭘 썼든 무시하고
예상대로 FAIL이었다. 그다음 sortAndSanitizeFrontmatter에 currentDate 파라미터를
추가하고, created 필드가 있으면 그 값을 무조건 실제 날짜로 덮어쓰도록 고쳤다.
테스트가 통과했고, 전체 테스트/빌드/린트도 클린했다. 여기서 끝난 줄 알았다.
”근데 그럼 왜 아직도 AI한테 시켜?”
고친 내용을 정리해서 끝내려는데, 문득 든 생각이 있었다 — 값을 무조건 덮어쓸 거면서, 왜 여전히 AI한테 “오늘 날짜를 써라”고 시키고 있냐는 거였다.
맞는 말이었다. 방금 고친 코드를 다시 보니:
if (frontmatterMap["created"] !== undefined) {
// ...실제 날짜로 강제...
}
값은 신뢰 안 하기로 해놓고, 필드가 있는지 없는지는 여전히 AI한테 의존하고
있었다. AI가 created 줄을 아예 안 쓰면 이 조건문 자체가 안 돌고, 필드는
그대로 비어있는 채로 남는다. “AI 출력을 안 믿는다”는 결정을 반만 따라간 셈이다.
값을 안 믿는 것과 필드 존재 여부를 안 믿는 것은 같은 문제인데, 하나만 고치고
멈추려 했던 거다.
그래서 두 가지를 마저 고쳤다
sortAndSanitizeFrontmatter:if (frontmatterMap["created"] !== undefined)조건 자체를 없애고, 프론트매터 블록이 유효하면 무조건created를 채워 넣도록 변경. AI가 그 줄을 썼든 안 썼든 상관없어짐.getFrontmatterGuideline(ingest/split/merge)에서 “오늘 날짜를 YYYY-MM-DD로 써라”는 지시 줄 자체를 삭제. 더 이상 AI가 신경 쓸 이유가 없어졌으니까.
2번은 조심스럽게 접근했다. 같은 프롬프트 안에 <tool_call> 형식 예시 블록이
있는데, 거기엔 created: YYYY-MM-DD라는 리터럴 예시가 남아 있다. 이건 지시문이
아니라 “이런 형태로 출력하라”는 형식 샘플이라 건드리지 않기로 했다 — 이제 어차피
값은 결과물에서 무조건 덮어써지니 남아있어도 무해하고, 괜히 손대다가 예시 블록
구조를 깨뜨릴 위험만 커진다. 삭제 범위를 규칙 문장 3줄로만 정확히 한정했다.
부수 효과로 기존 테스트가 깨졌다
무조건 주입으로 바꾸자, 전혀 관련 없어 보이던 기존 테스트 4개가 바로 깨졌다.
classification 자가 치유 로직을 검증하는 테스트들이었는데, 최소한의 프론트매터
(title + classification만)로 픽스처를 짜놓아서 created 필드가 원래
없었다. 거기에 새로 created: 줄이 생기니 정확 문자열 비교가 다 틀어졌다.
고치면서 또 하나 조심할 점이 보였다 — 테스트 기대값에 날짜를 그냥 하드코딩하면,
그 테스트는 오늘 딱 하루만 통과하고 내일부터 깨지는 시한폭탄이 된다. 그래서
테스트 헬퍼가 고정된 날짜(FIXED_TEST_DATE)를 명시적으로 주입하도록 고치고,
기대값도 그 고정 날짜에 맞췄다 — 실행하는 날짜와 무관하게 항상 같은 결과가
나오도록.
남는 생각
“이 값은 이제 안 믿는다”고 결정했으면, 그 결정을 끝까지 따라가야 한다. 값만 고치고 존재 여부는 여전히 AI한테 맡겨두는 건, 결정을 반만 실행한 것과 같다. 테스트가 통과하고 빌드가 클린하다는 것만 보고 “다 됐다”고 판단했는데, 그건 “코드가 지금 하는 일이 틀리지 않았다”는 확인이었지 “이 결정이 논리적으로 일관된가”에 대한 확인은 아니었다. 그 둘은 다른 질문이고, 후자는 한 번 더 혹은 더 많은 고민을 해야 드러나는 경우가 많다는 걸 다시 느꼈다.