원문 주소는 그대로인데 무료 제공 조건이 바뀌었습니다. 본문 한 문장만 고치면 끝날까요? 같은 주장을 제목과 요약에서도 썼다면 세 위치를 함께 확인해야 합니다. 이번 글은 출처 두 개·주장 다섯 개·표시 위치 다섯 개를 연결한 가상 근거표에서, 원문 버전 변경이 어느 주장과 원고 위치에 영향을 주는지 추적합니다. 사람이 내린 지지 판정과 코드가 확인하는 참조·버전·인용문 일치를 나누며, 변경된 사실을 자동으로 추측해 다시 쓰지는 않습니다.

문장 하나의 근거보다 변경이 퍼지는 경로를 기록합니다.

원문을 열어 한 문장을 확인하는 일과, 그 원문이 바뀐 뒤 원고의 수정 범위를 찾는 일은 다릅니다. 주장에 출처 링크 하나만 붙여 두면 원고 안의 같은 주장이 어디에 다시 등장하는지 알기 어렵습니다. 제목의 “무료”, 요약의 “비용 없이”, 본문의 “무료 다운로드”가 같은 근거를 쓴다면 표현이 달라도 연결할 식별자가 필요합니다. 이 글의 claim ID는 그런 연결점이며 문장 자체를 바꿀 때도 같은 사실을 말한다면 유지합니다.

근거표를 주소 목록으로 만들지 않고 출처 기록, 주장 기록, 표시 위치 기록으로 나눕니다. 출처 기록에는 내용과 버전, 주장은 어떤 출처의 어느 구절을 읽었는지, 위치 기록에는 원고의 제목·요약·본문 자리를 둡니다. 이 세 층을 연결하면 출처 하나의 변경에서 재검토할 행과 화면 위치를 좁힐 수 있습니다. W3C PROV가 설명하는 기원 관계를 참고한 작은 표이며 PROV의 전체 규격을 구현하거나 사실을 자동 판정하는 지식 그래프는 아닙니다.

일단 연결이 만들어지면 원고 전체를 무작정 다시 읽는 대신 영향을 받은 주장부터 확인할 수 있습니다. 반대로 ID 없이 문장 문자열만 검색하면 “무료”를 “비용 없음”으로 고친 순간 연결을 잃을 수 있습니다. 이 실험은 동의어를 자동으로 이해하지 않습니다. 사람이 같은 주장임을 정해 위치에 ID를 붙였다는 조건을 명시합니다. 의미 분류를 코드가 한 것처럼 소개하지 않습니다.

출처 두 개와 주장 다섯 개를 고정했습니다.

합성 S1 v1은 “테스트 도구는 텍스트 파일을 읽는다. 이미지 인식은 시험하지 않았다”입니다. S2 v2에는 “이 예제는 무료로 내려받을 수 있다. 재배포 권한은 별도다”를 넣었습니다. 실제 제품·가격·라이선스 문서가 아니며 주소도 example.test의 가상 값입니다. 원문 내용은 코드에 직접 들어 있어 외부 사이트에 요청하지 않습니다. 각 출처의 URL, excerpt, version을 따로 저장해 주소와 내용의 변화를 구분했습니다.

C1은 텍스트 파일을 읽는다는 좁은 주장으로 S1의 구절을 인용합니다. C2는 모든 이미지 정확도로 범위를 넓혀 보류했고, C3는 무료와 자유로운 재배포를 묶어 부분 근거로 표시했습니다. C4는 처리 시간이 절반이라는 숫자이지만 근거 필드가 비었습니다. C5는 S2의 무료 다운로드 부분만 분리한 좁은 주장입니다. 이 supports·unsupported·partial·unknown 표시는 작성자가 합성 원문을 읽고 정한 주석입니다.

초기 구조 검사 결과는 C1과 C5 두 행의 retain-narrow, 나머지 세 행의 hold입니다. 유지가 두 개라는 수치를 글의 진실성 점수로 쓰지 않습니다. 원문을 잘못 해석해 supports를 붙이면 칸이 다 채워져도 잘못된 문장이 남을 수 있습니다. 이 첫 단계는 이후 버전 변경 실험의 출발 상태이며, 실제 사용자 작업이나 새로운 AI 응답을 평가한 결과가 아닙니다.

원문·버전·구절·시각이 맞는지 따로 검사합니다.

각 주장 행에는 source, source_version, quote, locator, checked_at, scope를 둡니다. 코드는 이 여섯 칸의 누락을 먼저 모읍니다. 출처 ID가 실제 기록에 있는지, 저장한 버전과 현재 출처 버전이 같은지, 인용 구절이 기록된 원문에 문자열로 존재하는지 확인합니다. 확인 시각은 Python으로 파싱하고 시간대 오프셋이 있는지도 봅니다. 위치 이름 자체가 실제 문서의 정확한 단락인지 자동 검증하는 기능은 아닙니다.

구절의 존재와 주장 지지는 다른 검사입니다. S1에 “이미지 인식은 시험하지 않았다”가 실제로 있으므로 C2의 인용문 존재 검사는 통과할 수 있습니다. 그렇다고 “모든 이미지도 정확하다”를 지지하지는 않습니다. 그 의미 판정은 수동 주석이 hold로 남깁니다. 인용 문자열이 들어 있다는 사실만으로 사실 자동 검증을 약속하지 않는 것이 중요합니다. 원문이 긴 경우 구절이 여러 곳에서 나오는 문제도 이번 작은 검사로 해결하지 않았습니다.

확인 시각은 조사한 때이며 원문의 시행일이 아닙니다. 이번 checked_at 값은 가상 표를 설명하기 위한 고정 입력이고, 실행 파일 자체를 다시 돌린 실제 UTC 시각은 executedAt에 따로 기록됩니다. 원문 버전도 사람이 부여한 기록 키입니다. 외부 문서가 v3라고 표시하지 않는다면 내용 해시나 저장 사본을 이용해 자체 식별자를 만들어야 합니다. 어떤 자료를 보고 판단했는지 재현할 수 있어야 다음 변경을 설명할 수 있습니다.

S2만 바꾸자 제목·요약을 포함한 네 위치가 영향 목록에 올랐습니다.

다음 합성 버전에서는 S2를 v3로 바꾸고 무료 문장에 “7일 체험 기간에만”이라는 조건을 넣었습니다. S1은 건드리지 않았습니다. UTF-8 원문 excerpt의 SHA-256을 대조해 내용이 달라진 출처 S2를 찾은 뒤, rows에서 S2에 의존하는 C3와 C5를 모았습니다. 그다음 occurrences에서 두 주장과 연결된 원고 위치를 찾았습니다. 문자열 차이가 사실 변화인지 판단한 것이 아니라 변경된 출처의 의존 범위를 따라간 것입니다.

실행 결과의 affectedOccurrences 네 행을 원고 수정 목록으로 읽으면 다음과 같습니다. 세 번째 열은 코드가 생성한 정답이 아니라 결과를 받은 편집자의 확인 과업입니다.

실행에서 찾은 위치연결된 주장사람이 확인할 일
titleC5제목의 무료 약속에 새 체험 기간 조건이 빠졌는지 검토
summaryC5요약도 제목과 같은 새 조건을 전달하는지 대조
body:5C5본문의 인용 구절·버전·적용 조건을 원문과 다시 확인
draft-note:1C3보류한 내부 메모를 유지하며 권한 근거와 버전을 재검토

C3의 draft-note:1은 공개 문장이 아니라 이미 보류한 내부 메모입니다. S1에 연결된 C1의 body:2는 이번 영향 목록에 없었습니다. 따라서 네 위치를 모두 자동 수정하지 않고 공개 문구와 내부 기록을 나눠 검토합니다.

다시 구조 검사를 실행하면 C5에는 stale-source-version과 quote-not-in-recorded-source가 생겨 hold로 바뀝니다. 오래된 무료 구절이 새 원문에 그대로 존재하지 않기 때문입니다. C3의 권한 구절은 여전히 남지만 출처 버전이 달라져 재검토 대상입니다. 코드는 “무료를 유료로 고쳐라” 같은 새 문장을 생성하지 않습니다. 새 조건을 읽고 제목·요약·본문의 약속을 사람이 다시 정하도록 작업 목록만 만듭니다.

주소만 이동한 경우는 사실 변경과 구분합니다.

별도 사례에서는 S1의 URL을 example.test/tool에서 docs.example.test/tool로 바꾸고 내용과 버전은 그대로 뒀습니다. 원문 내용 해시는 같아 changedSources는 비었고 urlOnlySources에 S1이 들어갔습니다. 이 결과는 가상 기록의 주소 필드만 달라졌다는 확인입니다. 새 주소가 실제로 열리거나 원문과 같은 서비스를 제공하는지 네트워크로 검사한 것은 아닙니다.

주소 이동이 관찰되면 근거표의 URL을 갱신할 근거와 리디렉션·최종 페이지를 따로 확인합니다. 내용이 같다는 기록을 유지하더라도 새 경로의 접근 조건이나 장기 인용 가능성은 달라질 수 있습니다. 반대로 URL이 같아도 이번 S2처럼 중요한 조건이 바뀔 수 있습니다. 주소 변화 감지와 내용 버전 감지를 서로 대신 쓰지 않는 이유입니다. 원문 제목·확인일·저장 사본도 같은 판단의 문맥을 보존하는 데 필요할 수 있습니다.

내용 해시 차이를 사실 수정 명령으로 직접 연결하지 않습니다. 띄어쓰기나 문단 배치만 바뀌어도 원시 excerpt 해시는 달라질 수 있습니다. 이번 정책은 보수적으로 재확인 목록을 만드는 것입니다. 실제 문서에서 잡음을 줄이려면 비교할 영역과 정규화 규칙을 별도로 정하고, 중요한 조건을 지우지 않는지 시험해야 합니다. 변경이 있다고 알리는 단계와 무엇이 달라졌다고 결론 내리는 단계를 분리합니다.

겉으로 채워진 표가 실패해야 하는 입력도 실행했습니다.

네 개의 반례를 C1의 복사본에 각각 넣었습니다. S404라는 없는 출처 ID, 실제 원문에 없는 인용 구절, v99라는 맞지 않는 버전, 오프셋 없는 확인 시각입니다. 모든 행은 수동 supports 표시를 그대로 갖지만 구조 검사에서 hold로 돌아갔습니다. supports라는 단어 하나가 참조·버전 오류까지 무시하는 통과권이 되지 않는지 확인한 것입니다. 입력과 오류 이름을 negativeCases에 함께 남겼습니다.

C1 행을 한 번 더 붙인 별도 목록도 만들었습니다. unique_rows는 같은 claim ID를 발견해 ValueError로 멈췄습니다. 같은 문장을 두 곳에 표시하는 것은 occurrences의 두 행으로 표현할 수 있지만, 주장 본체를 같은 ID 두 개로 저장하면 어느 버전이 맞는지 모호해집니다. 주장 고유성과 표시 위치의 반복을 다른 자료로 나눈 이유입니다. 이 검사는 원고 안에 ID가 빠진 모든 문장을 찾아내는 기능은 아닙니다.

원문 위치가 틀렸지만 quote가 다른 단락에 우연히 존재하는 경우, 원문과 주장이 반대 의미인 경우는 문자열 검사만으로 판별하기 어렵습니다. 반례가 통과했다고 의미 검수까지 끝난 것으로 표시하지 않습니다. 더 깊은 위치 검증을 추가하려면 저장 사본의 단락 ID와 구절 위치를 함께 기록하고 정상·실패 문서를 별도로 만들어야 합니다. 필요한 보존 범위를 정한 뒤 검사를 늘려야, 칸만 많고 실제로는 읽지 않는 근거표가 되지 않습니다.

고칠 문장을 확정하기 전에 변경 원장을 남깁니다.

영향 목록을 받은 편집자는 먼저 S2 v2와 v3의 원문을 나란히 읽습니다. 다음으로 C5를 “무료”만 남겨도 되는지, 체험 기간 조건을 문장 가까이에 붙여야 하는지 판단합니다. 제목에 무료라는 말이 있다면 본문만 고치지 않고 title과 summary도 함께 수정합니다. C3는 재배포 허용을 아직 확인하지 못했으므로 가격 조건의 변화와 별개로 계속 보류할 수 있습니다. 이 과정의 결과를 코드가 미리 정답으로 넣지는 않았습니다.

인계 기록에는 source ID, 이전·현재 버전, 영향받은 claim ID, 원고 위치, 검토 판정, 수정된 문장 버전과 이유를 적습니다. “업데이트 완료”만 남기면 새 출처를 읽었는지 링크만 바꿨는지 구분되지 않습니다. 수정하지 않은 영향 행에도 유지 이유를 남기면 나중에 같은 변경을 다시 봤을 때 판단을 이어갈 수 있습니다. 출처 사본과 원고 버전은 접근 범위에 맞게 보관하며 실제 인증 토큰이나 개인정보를 공개 기록에 넣지 않습니다.

새 버전 확인이 끝나기 전에 기존 source_version을 현재 값으로 조용히 덮어쓰면 오래된 판단이 새 원문에서 확인된 것처럼 보입니다. 먼저 재검토 대상으로 남기고, 사람이 읽은 뒤 확인 시각·버전·구절과 판정을 함께 갱신합니다. 이 예제는 그런 승인 작업을 실제 문서에 적용하지 않았습니다. 영향 범위를 찾는 실행과 새 결론을 확정하는 편집 단계를 따로 두었습니다.

완료 기준은 표가 찼는지가 아니라 변경을 설명할 수 있는지입니다.

이번 실행에서 최초 판정 두 유지·세 보류, S2 변경의 영향 주장 두 개·표시 위치 네 개, 주소만 바뀐 S1의 별도 기록, 잘못된 참조 네 사례의 보류와 중복 ID 차단을 확인했습니다. 원문을 자동 검색하거나 가격을 실시간 확인하는 기능은 없습니다. 가상 문서의 버전과 사람이 만든 연결을 코드로 추적한 결과이며 새로운 AI 응답·제품 성능·실제 절약 시간을 입증하지 않습니다.

이 과업의 시작점은 기존 원고의 중요한 주장 하나를 고르고, 어느 출처 버전을 봤는지와 제목·요약·본문의 어디에 같은 주장이 있는지 연결하는 것입니다. 한 번 연결한 뒤에는 가상 원문 조건을 바꿔 어느 위치가 재검토 목록에 나오는지 확인할 수 있습니다. 표현을 바꿀 때 claim ID를 새로 만들어 끊지 않고, 사실 자체가 달라진 경우에는 이전 주장과 새 주장의 관계를 남깁니다. 문자열 유사도보다 이런 의존 관계가 수정 범위를 설명하는 데 직접적입니다.

근거의 원문·실행·반복·사용자 결과 층위를 먼저 나누고 싶다면 기존 증거 단계 글을 읽어 보세요. 이번 글의 좁은 목적은 그 판단을 원고의 여러 표시 위치와 출처 버전 사이에 연결해 다음 수정에 사용할 작업 목록을 만드는 것입니다. 한 번 참조를 연결했다고 이후 모든 변화가 자동으로 안전해지는 것은 아닙니다. 공개 문장이 새 원문을 여전히 지지하는지는 마지막에 사람이 확인해야 합니다.

이 글의 입력·실행 자료

합성 자료의 실제 검증일은 2026-10-15입니다. 글의 예약 발행일과 구분합니다. 코드의 fixtureCreatedOn은 예제 작성일이고 executedAt은 재실행할 때의 실제 UTC 시각입니다. Python 3 표준 라이브러리를 사용합니다. 실제 고객정보나 새 Gemini 응답을 입력하지 않았습니다.

python3 claim-source-evidence-ledger-lab.py

확인한 공식 원문

2026-10-15에 열어 확인했습니다. 제공 예제의 규칙과 공식 문서의 일반 기능 설명을 구분해 읽습니다.

함께 대조할 기존 기록