게시 전에 '출처 격차(Source Gap)'를 확인하세요
요약
본 글은 기술적 주장을 공개적으로 발표하기 전에 '출처 격차(Source Gap)'를 확인하는 중요성을 강조합니다. 단순히 매끄러운 문장이나 멋진 디자인에 의존하지 않고, 모든 주장에는 반드시 검증 가능한 출처와 근거가 필요함을 역설합니다. 이를 위해 로컬 스크립트와 워크스루 과정을 통해 안전한 리허설 습관을 들이는 방법을 제시합니다.
핵심 포인트
- 모든 주장은 '출처 격차'를 확인해야 합니다.
- 주장에는 반드시 검증 가능한 출처(Source)가 필요합니다.
- 모델의 결과물보다 사람이 작성한 근거 자료(Card)가 중요합니다.
- 로컬 스크립트를 활용하여 주장과 증거 간의 공백을 테스트하세요.
지난 화요일에 한 디자이너가 'Publish' 버튼 위에서 머뭇거리는 것을 지켜봤습니다. 포트폴리오 라인은 깔끔하고, 차분하며, 자신감 있어 보였습니다. 그 라인은 체크아웃 플로우(checkout flow)를 개선했다고 주장했습니다. 하지만 아래에는 연구 자료도, 날짜도, 소유자 정보도 없었습니다. 당신은 여전히 이 라인을 공개 웹에 게시할 건가요?
이 장면은 클라이언트의 지표가 아니라 종합적인 리허설입니다. 저는 팀원들이 매끄러운 문장을 증거로 취급하는 경우에 이것을 사용합니다. 결정권자는 모델(model)이 아니라 게시를 진행하는 디자이너입니다. 그 결과는 낯선 사람이 인용할 수 있는 공개적 주장입니다. 되돌릴 수 있다는 점(reversibility)의 핵심은 'publish' 컨트롤이 작동하기 직전 순간입니다.
그 라인을 영수증 없는 코트라고 생각해 보세요. 당신은 여전히 그 코트의 재단은 마음에 들 수 있습니다. 하지만 그것을 위해 돈을 지불했다고 맹세해서는 안 됩니다. 빠진 영수증이 바로 제가 신경 쓰는 '출처 격차(source gap)'입니다. 직물에 대한 과도한 칭찬은 단지 잡음일 뿐입니다.
이번 워크스루는 하나의 주장에 대한 제로 베이스 리서치 게이트입니다. 당신은 한 라인을 고정하고, 카드를 작성하며, 실패를 통해 시스템을 안전하게 만드는(fail closed) 연습을 할 것입니다. 저는 포트폴리오 전체를 재디자인하라고 요구하는 것이 아닙니다. 위험한 라인 하나만으로도 이 습관을 배울 수 있습니다.
위험한 라인 하나 고정하기
자신만의 기기에서 빈 폴더로 시작하세요. 리허설을 위한 공간을 만들고, 거기서 멈추세요. 만약 그 폴더가 비어있지 않다면, 당신은 지저분한 책상을 고른 것입니다. 잡동사니 서랍 속의 주장을 검토할 건가요?
mkdir -p source-gap-rehearsal
cd source-gap-rehearsal
git init
...
검증: wc를 실행했을 때 오류 대신 작은 단어 수가 출력되어야 합니다. 문구를 건드리기 전에 line.txt를 소리 내어 읽어보세요. 만약 연구 자료를 가리킬 수 없다면, 그 격차는 실제입니다. 티켓이나 날짜가 적힌 메모도 지표가 될 수 있습니다. 아직 그 라인을 더 안전한 것으로 수정하지 마세요. 테스트를 위해서는 위험한 버전이 필요합니다.
모델이 말하기 전에 카드를 작성하기
카드는 신뢰 에세이가 아니라 영수증 전표입니다. 인간이 방어할 수 있는 필드만 채우세요. 이 전표가 존재할 때까지는 모델을 배제하세요. 매력적인 재작성은 홀에 기다리게 두어도 됩니다.
{
해당 객체를 폴더 내의 `card.json`으로 저장하세요. 검증은 스크립트가 실행되기 전에 시각적으로 이루어집니다. 파일을 열고 `owner` 필드가 빈 문자열인지 확인하세요. 또한 `source_pointer`도 빈 문자열인지 확인하세요. 만약 이 값들을 기억에 의존하여 채웠다면, 핵심을 놓친 것입니다. 그 비어 있는 필드들은 고의로 누락된 증거입니다.
## 공백일 경우 실패(Fail closed on blanks)
이 검사기를 해당 폴더의 `check-source-gap.mjs`에 붙여넣으세요. 이것은 제품 기능이 아닌 제안된 로컬 스크립트입니다. 이 스크립트는 주장의 진실성보다는 필드의 존재 여부를 테스트합니다. 완전한 포인터 역시 거짓일 수 있습니다. 실행하는 동안 그 한계를 염두에 두세요.
import { readFileSync } from "node:fs";
const card = JSON.parse(readFileSync(process.argv[2], "utf8"));
...
지금 이 여전히 비어 있는 `card`를 대상으로 검사기를 실행하세요.
node check-source-gap.mjs card.json
echo "exit:$?"
당신은 STOP 메시지와 종료 코드 1을 원합니다. PASS가 보인다면, 카드가 이미 채워졌다는 의미입니다. 그것은 성공적인 리허설이 아니라 실패한 리허설입니다. 카드를 다시 공백 상태로 되돌리고 재실행하세요.
이제 인간이 직접 가리킬 수 있는 필드만 채우세요. 로컬 노트 경로와 같은, 당신이 통제하는 실제 포인터를 사용하세요. 그리고 동일한 명령을 실행하고 종료 코드를 읽어보세요. PASS가 출력되고 종료 코드 0이면 성공입니다. 만약 종료 코드가 2 또는 3이라면, 멈추고 `owner`를 다시 읽어보세요. 모델이 마치 소유자나 증거인 것처럼 가장하게 두지 마세요. 되돌아가서 그 문장을 누가 서명하는지 물어보세요.
## 초안을 말하게 하고, 그것을 격하시키기(Let a draft speak, then demote it)
이것이 이 리허설에서 유일한 제품 노트입니다. 고지: 본 기사는 MonkeyCode의 제품 홍보 활동의 일환으로 준비되었습니다. 제가 이것을 언급하는 이유는 무료 모델이 해당 문장을 초안할 수 있기 때문입니다. 무료 서버도 임시 검토를 호스팅할 수 있습니다. 저는 특정 모델, 할당량(quota), 또는 기간을 명시하지 않습니다. 장치 형태(machine shape) 역시 명시하지 않습니다. 이러한 세부 사항들은 이 글에 대해 검증되지 않았습니다. 따라서 이 노트에서는 그것들을 지어내지 않겠습니다.
무료 모델에게 `line.txt`의 두 가지 표현 방식을 요청하세요. 근거를 제시할 수 없는 숫자는 모두 표시하도록 지시하세요. 그 답변을 디스크에 `draft.md`로 저장하세요. 그 답변을 소스 포인터에 붙여넣지 마세요.
printf '%s
' "HYPOTHESIS ONLY" | cat - draft.md > labeled.md
grep -n "HYPOTHESIS ONLY" labeled.md
검증: `grep`은 라벨에 대한 줄 번호를 출력해야 합니다. 만약 라벨이 누락되었다면, 초안과 영수증을 혼합한 것입니다. 지출 보고서에 추측을 스테이플할 건가요?
모델은 숫자에 대해 확신하는 것처럼 들릴 수 있습니다. 확신하는 어조는 출처 유형이 아닙니다. 신뢰 배지는 노이즈일 뿐, 게이트(gate)가 아닙니다. 더 예쁜 동사 역시 이 게이트에서는 노이즈입니다. 포인터, 소유자, 그리고 날짜 범위가 당신을 멈추게 할 수 있습니다. 되돌릴 수 있는 라인도 클릭을 막을 수 있습니다. 그중 어느 하나라도 비어 있다면, 승인이 중단됩니다. 추가적인 형용사는 게시 버튼을 누르게 하지 못합니다.
이러한 중지 규칙을 뒷받침하는 것은 무엇일까요? 빈 필드를 관찰할 수 있고, 스크립트는 종료될 수 있습니다. 그것을 뒷받침하지 않는 것은 무엇일까요? 이 카드가 게시율을 변경한다는 것을 보여주는 연구는 없습니다. 행동에 대한 희망은 설계 가설로 취급하세요. PASS 라인에서 멀리 두세요.
## 검토를 보류하고 호스트를 왕관화하지 마라
이미 무료 서버 옵션이 있다면, 그것을 가볍게 사용하세요. 그 호스트는 스크래치 패드(scratch pad)로만 취급하세요. `labeled.md`와 체커 출력물을 팀원이 읽을 수 있는 곳에 두세요. 그런 다음 업로드 후에는 그 호스트를 그대로 두세요. 진실의 기록은 diff 할 수 있는 폴더에 남아 있어야 합니다.
여기서 벤더 명령어를 알려드리지는 않겠습니다. 저는 검증된 설정 순서를 가지고 있지 않습니다. 지어낸 플래그는 잘못된 매뉴얼이 될 것입니다. 무료 옵션이 불분명하다면, 이미 신뢰하는 평범한 호스트를 사용하세요. 게이트는 주소창이 아니라 스크립트입니다.
mkdir -p review-export
cp card.json labeled.md review-export/
node check-source-gap.mjs card.json > review-export/check.txt
...
검증: `export ok`는 체크 텍스트가 존재한다는 것을 의미합니다. 또한 그 파일이 비어있지 않다는 것도 의미합니다. 팀원 중 누구라도 읽기 전에 `check.txt`를 여세요. 만약 STOP이라고 되어 있다면, 게시 가능한 페이지를 업로드하지 마십시오. 스톱 텍스트를 업로드하거나, 아예 아무것도 업로드하지 마십시오.
flowchart LR
A[Risky line] --> B[Source card]
B --> C{Checker pass?}
...
흐름을 분위기처럼 읽지 말고 복도처럼 읽으세요. 모델은 절대 통과 상자(pass box)에 앉아있지 않습니다. 서명하는 사람은 포인터와 함께 그곳에 앉아 있습니다. 손으로 되돌리는 화살표를 제거하면 슬라이드를 만든 것입니다. 슬라이드는 방어할 수 있는 검토 내용이 아닙니다.
멈춤을 들리게 하라
빨간색 테두리만으로는 설명이 될 수 없습니다. 저는 게시 제어(publish control)가 왜 차단되었는지 말해주기를 원합니다. 그 이유는 색조(hue)가 아닌 텍스트에 존재해야 합니다. 접근성 이름(accessible name)은 publish_name 필드가 될 수 있습니다. 키보드 순서(Keyboard order)는 버튼보다 누락된 필드를 먼저 건너뛰어야 합니다. 색상은 멈춤을 지원할 수는 있지만, 멈춤 그 자체가 될 수는 없습니다.
node --input-type=module -e '
import { readFileSync } from "node:fs";
const card = JSON.parse(readFileSync("card.json", "utf8"));
...
터미널에서 A11Y PASS 문장을 확인해야 합니다. Exit 4는 버튼이 격차를 숨긴다는 의미입니다. 이는 서두르는 스크린 리더 사용자에게 실패합니다. 또한 색조를 전혀 볼 수 없는 키보드 사용자에게도 실패합니다. 접근성 이름을 수정하고, 다시 검사를 실행하세요. 모의(mock)가 명백해 보여서 이 단계를 건너뛰지 마세요.
이미 배포된 경우 복구하기
때로는 그 호버(hover)가 실제 공개 클릭이 됩니다. 저는 웹에 되돌리기 버튼이 없다는 것을 꾸미지 않습니다. 복구는 줄 옆의 수정 메모입니다. 이름이 지정된 소유자(named owner)가 모델이 아닌 사람이 작성합니다. 그것은 평범한 단어로 누락된 출처를 명시합니다. 그리고 조용히 형용사를 바꾸고 사라지지 않습니다.
STOP 텍스트를 붙여서 줄을 돌려주세요. 작가가 포인터를 채우거나 주장을 잘라냅니다. 잘린 주장은 검토 기록에 남습니다. 주장을 삭제하는 것이 침묵이 돌아오는 방식입니다. 미소만 간직하는 역사를 신뢰하시겠습니까?
나중에 포인터가 깨지면, 체커(checker)를 다시 실행하세요. 산문(prose)을 다듬고 그것을 복구라고 부르지 마세요. 출처 포인터를 교체하거나 줄을 비게 게시하세요. 사라지는 무료 호스팅은 거짓된 줄을 유지할 이유가 아닙니다. 그 줄의 본거지는 스크래치 서버가 아니라 주장(claim)입니다.
이것이 증명하지 않는 것
체커는 해당 필드가 귀하의 기기에서 비어있지 않음을 증명할 뿐입니다. 이 연구가 실제로 일어났음을 증명하지 않습니다. 그 숫자가 공정함을 증명하지도 않습니다. 다음 주에 디자이너들이 더 잘 행동하는지 측정하지도 않습니다. 그러한 행동 주장은 단지 디자인 가설일 뿐입니다. 저는 실제 팀을 대상으로 해당 연구를 수행한 적이 없습니다. 따라서 여기에 백분율로 장식할 수는 없을 것입니다.
의료 또는 법적 주장에는 이 게이트를 사용하지 마십시오. 안전에 중요한 공공 주장에도 사용하지 마십시오. 에이전트가 자신의 클릭을 승인하도록 하는 데 사용하지 마십시오. 인간 소유자를 명시할 수 없다면 사용하지 마십시오. 포트폴리오로 개인 데이터를 가져오는 허가로도 사용하지 마십시오. 존재 확인(Presence checks)은 현관등이지 법원 건물이 아닙니다.
무료 모델 접근 및 무료 서버는 변경될 수 있습니다. 나중에 스크립트가 여전히 중요하도록 습관을 만드세요. 임시 도구들은 더 이상 이용 가능하지 않을 수도 있습니다. 현재 문서에 할당량(quota)이 없다면, 그것은 제외하세요. 기간이나 하드웨어 약속 역시 해당 문서에 포함되어야 합니다. 만약 누락되었다면, 카드에서도 제외해야 합니다.
실제로 멈춰야 하는 지점들
소유자가 비어 있거나, 가상의 이름이거나, 모델인 경우 멈추세요. 출처 포인터가 단지 메모일 때 멈추세요. 다른 모델의 문장이 유일한 포인터일 때 멈추세요. 날짜 범위(date window)가 여전히 누락되었을 때 멈추세요. 되돌릴 수 있는 것(reversibility)이 이미 클릭 뒤에 있을 때 멈추세요. 또한 아무도 수정 계획을 가지고 있지 않을 때도 멈추세요. 출판 이름(publish name)이 격차를 숨길 때 멈추세요.
여분의 노이즈는 카드에 그대로 노이즈로 두세요. 어조 노트나 동의어 목록은 파일 안에 있을 수 있습니다. 신뢰 배지(Confidence badges)도 그 파일 안에 있을 수 있습니다. 하지만 이들이 종료 코드를 성공으로 바꾸게 해서는 안 됩니다. 저는 매력적인 단락보다는 명확한 격차를 보는 편이 낫습니다.
'출판' 버튼에서 손을 떼게 만드는 누락된 필드는 무엇일까요? 카드를 더 시끄럽게 만들 추가 문장은 무엇일까요? 이 두 가지 답을 형제 노트(sibling note)에 작성하세요. 그런 다음 노트북을 닫기 전에 체커를 다시 한 번 실행하세요.
무료 옵션은 임시 연습용으로만 사용하세요. 리허설이 끝나면 호스트는 버리세요. 카드는 유지하세요. 왜냐하면 패스는 로컬이기 때문입니다. 팀 동료가 이 '멈춤'을 들을 수 있어야 합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기