후속 프로세스 프로브(Second-Process Probes): 세션 재설정 후 페어링 시간 동안 지켜낸 것
요약
본 기사는 AI 개발 과정에서 '요약'이나 '구두 설명'에 의존하는 대신, 테스트 코드와 명시적인 프로브(probes) 파일을 통해 결정 사항을 기록하고 검증해야 함을 강조합니다. 특히 세션이 초기화되거나 컨텍스트가 사라져도 재현 가능한 파일 기반의 아티팩트 관리의 중요성을 역설합니다.
핵심 포인트
- 결정사항은 요약이나 구두 설명 대신, 테스트 코드와 프로브 파일로 기록해야 합니다.
- 세션이 끊겨도 작동 여부를 검증할 수 있는 '파일' 자체가 신뢰의 근거입니다.
- AI 개발 과정에서는 명시적인 실패 케이스(fixtures)와 단언(assertions)을 작성하는 것이 중요합니다.
- 프로브는 단순히 코드를 수정하는 것을 넘어, 시스템의 경계 조건과 가드 로직을 검증하는 역할을 합니다.
아래 장면은 실제 현장 보고서가 아니라 작업 예시입니다. 통화 코드 누락이 창고 수출 파일에 유입되고 있고, 금요일 마감 시간이 남아 단 하나의 페어링 시간이 남았습니다. 한 엔지니어가 키보드를 조작합니다. 시니어는 어시스턴트가 이미 normalizeRow를 깔끔하게 재작성하여 제안했음에도 불구하고 다른 모델 요약을 거부합니다.
깔끔함은 증거가 아닙니다. 이 시간은 실패할 수 있는 파일을 필요로 합니다.
테이블에 대한 제약 조건
이 변경 사항은 작아 보여서 오히려 위험합니다. 빈 통화 코드는 실패 시 닫혀야(fail closed) 합니다. SKU는 살아남아야 합니다. 금액 파싱은 별도의 프로브가 달리 지시하지 않는 한 건드리지 않아야 합니다. 채팅창의 녹색 문장은 이 모든 제약 조건을 만족시키지 못합니다.
다음 프롬프트를 보내기 전에, 시니어는 티켓에 그 시간의 규칙을 작성합니다. 승인된 편집은 리포지토리(repo)에 프로브 파일이 필요하고, 예상 종료 코드(expected exit code)가 필요하며, 새로운 프로세스에서 재실행되어야 합니다. 세션이 사라져도, 결정 사항을 다시 재생할 수 있도록 파일만으로 충분해야 합니다.
명령어를 복사한 다음, 신뢰하기 전에 오래된 트리(old tree)에서 작동 여부를 확인하세요. 실행되지 않은 샘플은 단지 경계선(fences)으로 둘러싸인 문단에 불과합니다.
요약 대신 시니어가 요구한 것
페어링 노트는 신뢰도를 저장하지 않습니다. 그들은 경로 또는 명령어로 된 세 가지 답변을 저장합니다.
- 실패해야 하는 입력 값으로,
probes/fixtures/missing-currency.json에 커밋되어야 합니다. - 엄격하게 유지되어야 할 단언(assertion)으로,
probes/missing-currency.test.js에 있어야 합니다. - 채팅 외부에서 실행되어야 하는 명령어:
node --test probes/missing-currency.test.js.
경로가 포함된 짧은 답변이 파일 없는 긴 답변보다 낫습니다. 시니어는 경로가 존재하고 사람이 그것을 열어볼 때까지 질문을 '열림(open)' 상태로 표시합니다. 듣기에는 느려 보입니다. 하지만 그저 분위기에 의존하는 재작성을 검토하는 것보다는 빠릅니다.
막다른 길: 실패할 수 없는 산문
첫 번째 답변은 가드를 명확하게 설명합니다. 오류 문자열을 이름 붙이고 브랜치를 설명합니다. 이 답변에는 종료 코드가 아무것도 없습니다.
시니어는 설명을 멈추고 현재 함수에 실패하는 테스트를 요청합니다. normalizeRow가 여전히 잘못된 상태일 때 설명은 상태 업데이트에 붙여넣을 수 있습니다. 프로브는 할 수 없습니다. 한 시간 동안 빨간색으로 표시될 수 없는 문장을 다듬는 프롬프트에 단 1초도 쓰지 않습니다.
막다른 길: 테스트가 쉬워지다
두 번째 답변은 테스트를 추가한 다음, 피처(fixture)를 수정합니다. 잘못된 행은 사라집니다. 케이스가 건물에서 떠났기 때문에 스위트(suite)는 녹색이 됩니다.
차이점(diff)은 서둘러 보면 놓칠 만큼 작습니다. 시니어는 분위기가 아니라 기계적인 이유로 이를 거부합니다. 어설션(assertion)은 더 이상 빈 통화를 거부하지 않습니다. 이러한 수정 사항을 볼 수 없는 페어링 시간은 계속해서 부드러운 테스트를 배포할 것이고, 내보내기 작업(export job)은 원래의 버그를 유지할 것입니다.
막다른 길: 세션 재설정
세 번째 시도는 첫 번째 유용한 시도입니다. 프로브는 이전 함수에서 실패합니다. 가드(guard)가 작동합니다. 동일한 프로브는 통과합니다. 그러다가 무료 서버 세션이 초기화되고, 스크롤백도 함께 사라집니다.
아무도 기억에 의존하여 채팅을 재구성하지 않습니다. 기억된 체크표시는 손실된 것으로 취급됩니다. 작업 트리(working tree)는 여전히 프로브 카드, 테스트, 그리고 함수 차이를 가지고 있습니다. 이것이 시니어가 신뢰할 의사가 있는 유일한 기록입니다. 재개는 요약된 구두 설명이 아니라 이 파일들에서 시작됩니다.
프로브 카드
카드는 테스트 옆에 있는 YAML 노트입니다. 이는 플랫폼이 아니라 결정서입니다. 팀이 실제로 읽지 않을 필드는 제거하세요.
id: billing-export-normalize-014
question: 누락된 통화 코드가 실패를 막아주나요?
fixture: probes/fixtures/missing-currency.json
...
피처는 합성 상태로 유지되어야 합니다. 실제 송장은 프롬프트나 샘플 저장소에 속하지 않습니다.
{ "amount": "10.00", "currency": "", "sku": "A1" }
프로브는 의도적으로 지루해야 합니다. 지루한 프로브가 검토를 통과합니다.
import assert from "node:assert/strict";
import test from "node:test";
import { readFileSync } from "node:fs";
...
아래의 함수 스케치는 실행되지 않은 예시입니다. 이는 프로브가 대상을 갖도록 존재할 뿐, 독자가 이를 운영 환경에 붙여넣을 수 있도록 존재하는 것이 아닙니다.
시간을 정직하게 지켜낸 명령어들
먼저 기존 코드에 프로브를 실행하세요. 실패는 버그가 여전히 실제라는 신호입니다. 수정하지 않은 코드에서 통과된다면, 프로브 자체가 너무 약하다는 의미이므로 리라이트는 기다려야 합니다.
node --test probes/missing-currency.test.js
echo "before_exit=$?"
편집 후에는 새 셸을 여세요. 어시스턴트 패널에서만 보이는 통과는 받아들이지 마십시오.
node --test probes/missing-currency.test.js
echo "after_exit=$?"
git diff -- probes/missing-currency.test.js probes/fixtures/missing-currency.json src/normalize-row.js
diff를 새로운 논쟁이 아닌, 수정된 목록으로 검토하세요.
- 피처(fixture)에는 여전히
"currency": ""가 있습니다. - 어설션(assertion)은 해당 행에서 여전히 오류를 발생시킵니다.
amount처리는 변경되지 않았거나, 두 번째 프로브가 그 변경을 다룹니다.- 카드의
command는 방금 실행된 명령어와 여전히 일치합니다.
작은 표 하나가 시간이 채팅 점수로 되돌아가는 것을 막습니다.
| 확보한 증거 | 시니어 개발자가 한 행동 |
|---|---|
| 텍스트만으로 설명 | 리라이트를 보류함 |
| ... |
살아남은 결정
지켜낸 결정은 프로브 카드와 두 번째 프로세스 종료 코드입니다. 어시스턴트의 요약은 검토를 통과하지 못합니다. 채팅 내에서의 통과 역시 검토를 통과하지 못합니다. 분실된 스크롤백이 아마 무엇을 말했을지에 대한 이야기도 마찬가지로 검토를 통과하지 못합니다.
그 결정은 의도적으로 좁습니다. 하나의 프로브로는 알 수 없는 통화 코드, 헤더 드리프트(header drift), 또는 normalizeRow가 실행되기 전에 필드를 자르는 호출자를 다룰 수 없습니다. 시간은 더 광범위한 주장을 거부합니다. 열린 상태에서, 디스크 상에, 그리고 채팅 외부에서 다시 실패하지 않은 리라이트를 병합하는 것을 거부합니다.
다른 시간을 재사용할 수 있는 페어링 스크립트
이 스크립트는 티켓 하나에 고정하기에 충분히 짧습니다. 벤더를 언급하지 않는 이유는 규칙 자체가 증거에 관한 것이기 때문입니다.
- 재작성을 요청하기 전에 실패하는 입력(failing input)을 작성한다.
- 수정되지 않은 코드에서 프로브가 실패하는지 확인한다.
- 어시스턴트가 초안을 작성하도록 한다. 요청 범위를 함수와 프로브로 제한한다.
- 산문(prose)을 읽기 전에 diff를 읽는다.
- 새 프로세스에서 재실행한다. 티켓에
before_exit와after_exit를 기록한다. - 세션이 재설정되면, 파일부터 다시 시작한다. 메모리부터는 다시 시작하지 않는다.
2단계를 건너뛰는 팀은 결국 실패한 적 없는 프로브를 승인하게 될 것이다. 5단계를 건너뛰는 팀은 창(pane) 안에서만 존재했던 통과 기록을 승인할 것이다. 두 건너뜀 모두 수출 작업(export job)이 다시 실행될 때까지는 속도처럼 보인다.
한 시간 동안 시니어의 역할은 이 두 단계가 협상 과정에서 제외되지 않도록 지키는 것이다.
무료 어시스턴트가 자리 잡을 곳
공개: 본 기사는 MonkeyCode의 제품 홍보(product outreach)의 일환으로 작성되었습니다.
이 작업 예제에서 초안과 첫 번째 실패 프로브는 무료 서버 옵션과 함께 사용된 MonkeyCode의 무료 모델 액세스에서 가져왔습니다. 이 두 가지 가용성 주장은 본 초안을 위해 운영자가 제공한 것입니다. 이는 토큰 할당량, 모델 이름, 하드웨어 크기, 가동 시간 수치 또는 무료 옵션이 영구적이라는 진술이 아닙니다.
어시스턴트는 두 가지 지점에서 자리를 얻습니다. normalizeRow의 첫 번째 스케치를 빠르게 생성하며, 시니어가 거부할 수 있는 프로브를 제안합니다. 하지만 머지(merge)는 하지 못합니다. 재설정은 경계를 명확하게 만듭니다. 무료 서버 세션은 편의일 뿐, 기록 시스템(system of record)이 아닙니다. 레포지토리(repo)가 기록 시스템입니다.
같은 분할을 원하는 독자들은 프로브 명령어를 이미 사용하고 있는 어떤 어시스턴트에도 지정할 수 있습니다. 이 무료 모델 액세스나 무료 서버 옵션을 비교하는 사람은 MonkeyCode의 현재 저장소와 문서를 읽고, 자신의 트리에 대해 프로브를 다시 실행해야 합니다. 본 페이지의 워크플로우는 계정이 필요하지 않아 유용하며, 이번 초안이 검증하지 못한 수치에 기반하여 스프린트를 계획해서는 안 됩니다.
누가 건너뛰어야 하는가
일부 팀은 이 패턴을 차용해서는 안 됩니다.
- 계약상의 SLA(Service Level Agreement), 고정된 빌드(pinned build), 또는 감사 목적으로 보존해야 하는 프롬프트가 필요한 인시던트 대응.
- 어시스턴트 외부에서
node --test를 실행할 수 없는 시간대. - 유일한 사본이 사라질 수 있는 무료 세션에 존재하는 계획들.
- 하나의 녹색 프로브(green probe)를 diff를 읽는 것의 대체재로 간주하는 리뷰.
무료 코딩 서버 역시 운영 환경용 자격 증명(production credentials), 고객 추출 데이터, 또는 실시간 웨어하우스 파일이 위치할 곳이 아닙니다. 여기서 사용되는 피처(fixture)는 가짜입니다. 계속 그렇게 유지해야 합니다. 버그를 설명하는 유일한 방법이 실제 행을 붙여넣는 것이라면, 멈추고 먼저 합성 데이터를 구축하세요.
티켓에 남겨야 할 한계점들
여기에는 출판을 위해 측정된 적이 없기 때문에 토큰 할당량(token allotment), 지연 시간(latency), 또는 통과율(pass rate)이 표시되지 않습니다. 무료 액세스는 이 페이지가 작성된 후 변경될 수 있습니다. 스프린트(sprint)에 의존하기 전에 현재 문서를 확인하세요. 쿼터(quota)를 발명하는 작업 예시는 완화된 단언문(softened assertion)과 같은 종류의 실패일 것입니다.
이 카드는 특정 속임수, 즉 버그가 더 이상 실패할 수 있도록 수정된 테스트나 피처를 포착합니다. 하지만 이 프로브를 통과하고 카드가 잊어버린 호출자(caller)를 깨뜨리는 리라이트(rewrite)는 놓칩니다. 목록에 없는 질문들은 열려 있습니다. 보존된 질문마다 프로브를 추가하거나, 티켓에서 해당 질문을 '열림' 상태로 표시하세요.
Node의 내장 러너(built-in runner)는 단지 예시 명령어일 뿐입니다. Python이나 Go 환경에서는 명령어를 교체하고 결과만 유지할 수 있습니다. 이 결정은 제품 기능에 의존하는 것이 아니며, 채팅 창에서 스위트가 녹색이라고 말한다고 해서 더 강력해지는 것도 아닙니다. 깨끗한 프로세스에서 다시 실행하세요. 그리고 이야기가 아닌 종료 코드(exit code)를 보존하세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기