Community연구 & 데이터 분석github.com

alanchoi00/출처와 인용문 인용하기

마크다운 파일(스펙, 디자인 노트, RFC, README)이나 채팅 답변에서 웹 페이지를 증거로 인용할 때, 사용자가 출처, 참조, 인용, 인용문, 또는 확인 가능한 증거를 요구하거나, 독자가 링크된 출처의 실제 내용을 확인해야 할 때 사용합니다.

출처와 인용문 인용하기란 무엇인가요?

이 스킬은 웹 페이지를 인용할 때 인용문(inline evidence)을 함께 제공하여, 독자가 링크를 열지 않고도 주장을 확인할 수 있도록 하는 기술적 인용 워크플로우를 제공합니다. `snap.mjs` 스크립트를 사용하여 페이지의 실제 렌더링된 텍스트에서 정확한 인용문을 추출하고, `#:~:text=` 프래그먼트로 정확한 위치를 가리키는 링크를 생성하며, 선택적으로 스크린샷을 생성합니다. 이 스킬은 특히 부재(absence) 주장(페이지에 특정 내용이 없다고 주장할 때)과 불일치(disagreement) 주장(기억, 검색 요약, 초안 등이 서로 상충될 때)을 검증하는 데 중요합니다. 이 스킬은 Claude Code, Cursor, Codex 등 markdown 파일과 채팅 인터페이스를 지원하는 모든 AI 에이전트 플랫폼에서 사용할 수 있습니다. 주요 특징으로는 일괄 처리(batch processing)를 통한 효율적인 검증, 다양한 스크린샷 옵션(프레임, 컨텍스트, 크기, 강조 등), 마크다운 파일과 채팅 답변에 맞춘 두 가지 출력 형식을 제공합니다.

지원 대상✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/alanchoi00/receipts/tree/HEAD/skills/citing-sources-with-excerpts

Installed? Explore more 연구 & 데이터 분석 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

미리보기

스킬 README에서

RFC 6585: 429는 캐시되어서는 안 됨

문서

인용문과 함께 출처 인용하기

개요

모든 인용된 주장은 그 증거를 함께 제시합니다: 원문 그대로의 구절, 해당 구절로 이동하여 강조 표시하는 링크, 그리고 선택적으로 스크린샷을 포함합니다. 독자는 클릭하지 않고도 확인할 수 있으며, 클릭하면 정확히 그 텍스트로 이동합니다. 마크다운 파일과 채팅 답변 모두에서 작동합니다.

모든 인용문은 반드시 snap.mjs 출력에서 가져와야 하며, 절대 기억, 검색 결과 요약, 또는 요약형 fetch 도구에서 가져오지 않습니다. 검색 요약과 WebFetch 스타일 도구는 페이지를 의역합니다. 스크립트만이 렌더링된 텍스트를 있는 그대로 확인합니다.

인용문뿐만 아니라 주장도 확인하십시오. 일치하는 인용문은 페이지가 그것을 말한다는 것을 증명합니다. 페이지가 말하지 않는 것에 대해서는 아무것도 증명하지 않습니다. 두 가지 유형의 주장은 항상 스크립트를 통해 별도의 배치 항목으로 처리해야 하며, 단순히 "초안을 확인"하는 경우에도 마찬가지입니다.

  • 부재: 페이지가 어떤 내용을 말하지 않거나, 언급하지 않거나, 요구하지 않는다고 작성하기 전에, 만약 그 내용이 있었다면 있을 문장을 추가하십시오 (예: 429 상태 코드가 있는 응답은 캐시에 저장되어서는 안 됩니다(MUST NOT).). 오직 match: none 결과만이 부재를 뒷받침하며, 그런 다음 "<페이지>에서 찾을 수 없음"이라고 쓰고, "스펙이 X에 대해 아무것도 말하지 않는다"라고 절대 쓰지 마십시오.
  • 불일치: 기억, 검색 요약, 이미 작성한 초안, 또는 이 스킬의 예시가 페이지 내용에 대해 서로 다르게 말할 때, 논쟁이 되는 문장을 추가하십시오. 스크립트 결과가 어느 쪽을 지지하든 이를 확정합니다. (이 스킬 예시의 모든 인용문은 스크립트로 검증되었습니다.)

설정 (머신당 한 번)

npm install --prefix <skill-dir>/scripts && npx --prefix <skill-dir>/scripts playwright install chromium

<skill-dir>는 이 SKILL.md가 포함된 디렉토리입니다.

스크립트

먼저 문서나 답변을 작성하고, 모든 인용을 수집한 다음, 모든 것을 한 번의 배치 호출로 검증하십시오:

node <skill-dir>/scripts/snap.mjs --batch - <<'EOF'
[
  {"url": "https://www.rfc-editor.org/rfc/rfc6585.html", "quote": "Responses with the 429 status code MUST NOT be stored by a cache."},
  {"url": "https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Headers/Retry-After", "quote": "A non-negative decimal integer", "out": "/abs/path/docs/refs/delay.png"}
]
EOF

배치 전체에 대해 하나의 브라우저를 사용하며, 동일한 URL의 인용문은 한 번의 페이지 로드를 공유합니다. out에는 절대 경로를 사용하십시오. 입력은 {"defaults": {...}, "cites": [...]} 형식으로도 가능하며, 모든 항목에 스크린샷 옵션을 적용할 수 있습니다. 배치 출력은 입력 순서대로 JSON 배열입니다 (단일 모드, snap.mjs "<url>" --quote "..."는 하나의 객체를 출력합니다). 각 항목:

필드용도
ok / matchexact/loose = 원문 그대로. fuzzy = 인용문이 틀렸습니다. 대신 quote_on_page를 사용하고 주장이 여전히 유효한지 다시 확인하십시오. none = 페이지에 없음.
quote_on_page인용 블록에 넣을 텍스트입니다. 절대 원래의 --quote를 사용하지 마십시오.
fragment_url사용할 링크입니다 (#:~:text= 포함, Chrome/Safari/Firefox에서 강조 표시).
excerpt주변 단락으로, 문맥(부정, 주의사항, "다음의 경우는 제외…")을 확인하는 데 사용합니다. 더 많은 부분을 인용하고 싶다면? 해당 긴 구절을 --quote로 다시 실행하여 링크와 스크린샷이 일치하도록 하십시오.
title, section, retrieved속성 줄: [<title> — <section>](fragment_url) · retrieved <date>, 또는 section이 없을 때 [<title>](fragment_url). 이 필드들을 사용하고, 기억에서 섹션 번호를 추가하지 마십시오.
occurrences / occurrence인용문이 두 번 이상 나타날 때 제공됩니다. excerpt가 의도한 것인지 확인하고, 그렇지 않으면 prefix/suffix(페이지에서 바로 앞/뒤에 있는 단어)를 사용하여 다시 실행하십시오.
hidden인용문이 페이지에서 숨겨진 콘텐츠(예: 비활성 탭)에 있음: 확인되었지만 스크린샷은 없음.
note알아둘 가치가 있는 기타 정보 (fuzzy 일치, 확장된 접힌 섹션, 프레임 대체). 반드시 읽으십시오.
internal페이지가 내부 네트워크에 있음. 내용이 기밀일 수 있으므로 주장에 필요한 만큼만 인용하십시오.

종료 코드 0 = 모두 찾음, 1 = 일부 찾지 못함, 2 = 일부 오류 발생 (PDF, 4xx, 로그인 장벽, 봇 체크, 시간 초과). 후속 배치를 예상하십시오: 재처리가 필요한 모든 항목(실패, fuzzy, 잘못된 occurrence, 또는 더 긴 구절 필요)을 함께 넣으십시오.

스크린샷 옵션

모든 항목(또는 defaults 내)의 선택적 필드입니다. 사용자의 표현에 매핑하고, 표현이 없으면 생략하십시오.

사용자 표현필드
"타이트한 스크린샷", "인용문만""frame": "quote" (기본값 paragraph)
"전체 섹션 보여줘""frame": "section" (높이 제한이 자동으로 1200으로 상승)
"전체 화면", "주변 페이지 보여줘""frame": "viewport"
"주변에 몇 줄""context": 2 (위아래 전체 텍스트 줄)
"모바일 크기""width": 390 (기본값 1100)
"짧게 유지""max_height": 150 (기본값 500; 자르기는 인용문을 중심으로)
"노란색 강조", "강조 없음""highlight": "#fff3a0" / "none"
"다크 모드""theme": "dark" (다크 테마가 있는 사이트만 해당, 그렇지 않으면 note에 표시)
"더 작은 이미지""scale": 1 (기본값 2)

이 옵션들은 스크린샷만 조정합니다. 텍스트 자체에 문맥이 필요하거나(또는 스크린샷이 필요 없는 경우) excerpt에서 가져온 더 긴 구절을 인용하고 후속 배치에서 다시 실행하십시오. 테이블 셀의 인용문은 자동으로 행과 헤더 행을 프레임으로 지정합니다. 모든 옵션과 해당 스크린샷은 리포지토리의 examples/README.md에 있습니다.

출력 형식

텍스트가 어디에 들어가는지에 따라 형식을 선택하십시오.

마크다운 파일: 본문에 주장, 각주에 증거:

클라이언트는 속도 제한 응답을 캐시해서는 안 됩니다.[^429-cache]

[^429-cache]: > 429 상태 코드가 있는 응답은 캐시에 저장되어서는 안 됩니다(MUST NOT).
    >
    > — [추가 HTTP 상태 코드 — 4. 429 Too Many Requests](https://www.rfc-editor.org/rfc/rfc6585.html#:~:text=Responses%20with%20the%20429%20status%20code%20MUST%20NOT%20be%20stored%20by%20a%20cache.) · retrieved 2026-11-08
    >
    > ![RFC 6585: 429는 캐시되어서는 안 됨](refs/429-cache.png)
  • 각주 ID는 숫자가 아닌 짧고 설명적인 슬러그를 사용하십시오. 동일한 구절이 두 주장을 뒷받침할 때 동일한 [^id]를 재사용하십시오.
  • 스크린샷은 마크다운 파일 옆의 refs/에 저장하고, 파일명은 각주 슬러그를 사용하십시오. 삭제된 인용의 PNG는 삭제하십시오.

채팅 답변: 각주 없음 (터미널에서는 원시 텍스트로 표시됨). 증거를 지지하는 주장 바로 아래에 배치하십시오:

클라이언트는 속도 제한 응답을 캐시해서는 안 됩니다:

> 429 상태 코드가 있는 응답은 캐시에 저장되어서는 안 됩니다(MUST NOT).
> — [추가 HTTP 상태 코드 — 4. 429 Too Many Requests](https://www.rfc-editor.org/rfc/rfc6585.html#:~:text=Responses%20with%20the%20429%20status%20code%20MUST%20NOT%20be%20stored%20by%20a%20cache.)
  • retrieved 날짜 없음 (답변이 검색 자체임).
  • 채팅 스크린샷은 시스템 임시 디렉토리(예: $TMPDIR/receipts/<slug>.png)에 저장하고, 절대 사용자 프로젝트에 저장하지 마십시오. 호스트에 사용자에게 파일이나 이미지를 보여주는 도구가 있다면 각 스크린샷을 그 도구로 보여주고, 그렇지 않으면 각 스크린샷의 전체 절대 경로를 인용문 아래 새 줄에 표시하십시오.
  • 스크린샷이 요청되지 않은 경우, 예를 들어 "이 구절들의 스크린샷을 원하십니까?"와 같은 한 줄 제안으로 답변을 끝내십시오.

공통:

  • 자신의 추론이나 권장 사항에는 인용문이 필요 없습니다. 그것이 자신(또는 팀)의 추론임을 밝히고, 출처의 추론이 아님을 명시하십시오. 외부 세계에 대한 사실적 주장(라이브러리, 브라우저, 또는 표준이 어떻게 동작하는지)에는 인용이 필요하거나 기대 사항으로 표현되어야 합니다.
  • 스크린샷은 옵트인입니다. 비용이 저렴하지만(페이지당 약 0.5초) 사용자가 유지하거나 삭제해야 하는 이미지 파일을 추가합니다. 사용자가 스크린샷을 요청한 경우에만, 또는 마크다운 파일에서 증거가 시각적(표, 그림, 코드 레이아웃)이어서 텍스트만으로 의미를 잃는 경우에만 "out"을 추가하십시오. 결과에 screenshot이 있는 항목에 대해서만 이미지나 경로를 포함하십시오.
  • 주장을 완전히 뒷받침하는 가장 짧은 구절을 인용하십시오 (일반적으로 한 문장).

스크립트 실패 시

결과조치
match: fuzzyquote_on_page를 사용하십시오 (스크린샷이 이미 이를 강조 표시함). 더 이상 주장을 뒷받침하지 않으면 주장을 변경하십시오.
match: none다른 방식으로 페이지를 검색하십시오 (다른 구절, 다른 섹션 URL). 여전히 없음 → 주장을 삭제하거나 일반 링크와 함께 **확인되지 않음:**으로 표시하십시오. 확인되지 않은 인용문을 인용 블록으로 제시하지 마십시오.
ok: false + 오류 (PDF, 로그인 장벽, 봇 체크, 403)일반 링크 + **확인되지 않음 (로드 불가: <error>)**. 기억이나 WebFetch에서 인용문을 조작하지 마십시오.
occurrences > 1이고 excerpt가 잘못된 경우의도한 것의 주변 단어로 "prefix" 또는 "suffix"를 설정하여 다시 실행하십시오.

흔한 실수

  • 페이지가 "기본적으로 말하는 것"을 인용 → 인용 블록은 원문 그대로만 가능하며, 의역은 본문에 넣습니다.
  • fragment_url 대신 섹션 앵커(#section-4) 사용 → 독자가 여전히 찾아야 합니다.
  • excerpt가 주장과 모순되는 구절 인용 (예: 다음 문장이 "이것은 다음의 경우에는 적용되지 않습니다…"라고 말하는 경우).
  • "확인"을 위해 WebFetch 실행 → 요약만 하며, 원문 텍스트를 확인할 수 없습니다. 스크립트를 사용하십시오.
  • 페이지가 말하거나 생략하는 내용에 대한 검색 도구의 답변 요약 신뢰 → WebFetch처럼 의역하며, 어떤 섹션이 무엇을 말하는지 종종 잘못 배치합니다. 논쟁이 되는 문장을 스크립트에 넣으십시오.
  • 이미 초안에 있는 인용문만 확인하여 초안 "검증" → 부재 주장과 불일치 주장이 테스트되지 않아, 거짓된 답변이 완전히 검증된 것처럼 보입니다.

관련 스킬