첫 번째 에이전트 풀 리퀘스트(pull request)를 무작정 열어서는 안 됩니다. 사람의 검토를 요청하기 전에 변경된 모든 hunk를 점수화해야 합니다. 유창한 모델 답변 자체가 안전성의 증거는 아닙니다.
당신은 첫 시간부터 이 레포지토리(repo)에 주니어로서 합류했습니다. 여전히 위험한 경로에 대한 지도가 부족합니다. 에이전트는 여전히 광범위한 패치(patch)를 빠르게 작성할 수 있습니다.
지금 이 시간은 시연을 위한 것이 아니라 게이트(gate, 관문)를 설정하는 시간입니다. 당신은 방어할 수 있는 패킷을 구축할 것입니다. 점수가 실패하면 풀 리퀘스트를 거부할 것입니다.
경계부터 지키세요 (Hold the boundary first)
에이전트 실행을 실제 풀 리퀘스트 브랜치에서 분리하여 유지하세요. diff, 테스트 노트(test note), 그리고 revert 라인을 가져오세요. 프롬프트에는 비밀 정보(secrets), 토큰, 프로덕션 설정 파일은 제외하세요.
이 단계에서는 CI 워크플로우 하에 편집을 허용하지 마세요. lockfile 편집이나 마이그레이션 파일도 마찬가지입니다. 그러한 경로는 첫 시간의 추측이 아니라 시니어 검토가 필요합니다.
공개: 이 글은 MonkeyCode의 제품 홍보의 일환으로 작성되었습니다.
MonkeyCode는 첫 번째 단계를 실행할 수 있는 한 곳으로 등장합니다. 운영자는 이 초안에 대해 두 가지 가용성 주장을 제공했습니다. 그 주장들은 무료 모델 접근과 무료 서버 옵션입니다.
이 초안은 특정 모델을 명시하지 않습니다. 토큰 할당량도 언급하지 않습니다. 또한 하드웨어, 지속 시간 또는 가동 시간(uptime)도 언급하지 않습니다.
도구를 실행하는 날 프로젝트 문서를 확인하세요. 문서가 이 글과 다르다면, 문서를 신뢰하세요. 검토 습관이 제품 사양처럼 행동해서는 안 됩니다.
무료 서버를 사용하여 노트북 클론을 건드리지 않게 하세요. 무료 모델 접근을 사용하여 제한된 재시도가 저렴하게 유지되도록 하세요. 그래도 패치는 복사하여 로컬에서 점수화하세요.
호출 전에 프롬프트를 구성하세요 (Shape the prompt before the call)
스토리가 아닌 네 가지 짧은 제약 조건으로 프롬프트를 작성하세요. 티켓 라인(ticket line), 허용되는 파일, 금지된 경로, 그리고 테스트 명령을 명시하세요. 이 네 가지 중 하나라도 건너뛰는 답변은 거부하세요.
Ticket: reject empty names in parseName.
Allowed: src/parseName.js src/parseName.test.js
Forbidden: .github migrations package-lock.json .env
...
패킷 옆의 임시 메모(scratch notes)에 해당 프롬프트를 유지하세요. 프롬프트를 변경했다면 메모도 함께 변경해야 합니다. 나중에 검토하는 사람이 정확한 요청 사항을 확인할 수 있도록 해야 합니다.
로컬 점수 스크립트 추가 (Add a local score script)
어떤 모델을 호출하기 전에 아래의 체커(checker)를 저장하세요. 이 스크립트는 실행된 벤치마크가 아니라 제안입니다. 차단 경로 목록(blocked path list)은 여러분의 리포지토리에 맞게 조정하세요.
#!/usr/bin/env bash
# proposal: unexecuted junior gate for an agent diff
set -euo pipefail
...
패치를 당긴(pull) 후 임시 브랜치(scratch branch)에서 체커를 실행하세요. 팀이 실제로 사용하는 기본 참조(base ref)를 전달하세요. 종료 코드가 0이 아니면 풀 리퀘스트(pull request)를 열지 마세요.
chmod +x scripts/score-agent-diff.sh
MAX_FILES=8 MAX_LINES=200 ./scripts/score-agent-diff.sh origin/main
git diff --stat origin/main...HEAD
스크립트가 통과하더라도 스테이트(stat) 출력을 읽으세요. 이름 변경만으로도 대규모 재작성(rewrite)이 숨겨질 수 있습니다. 여러분 자신의 눈이 여전히 게이트를 닫아야 합니다.
패킷 직접 작성하기 (Write the packet yourself)
검토 전에 임시 브랜치에 REVIEW_PACKET.md 파일을 생성하세요. 그 패킷의 모든 줄은 여러분 자신이 작성해야 합니다. 에이전트가 작성한 패킷을 자신의 메모로 받아들이지 마세요.
Ticket: ISSUE-123
Test: npm test -- workspace/foo.test.js
Revert: git revert <merge-sha>
...
테스트 줄은 실제로 실행한 명령어를 명시해야 합니다. 만약 실행하지 않았다면, 'Test not run'이라고 작성하고 중단하세요. 누락된 실행은 사소한 메모가 아니라 실패한 게이트입니다.
리버트(revert) 줄은 오늘날 여러분이 이해하는 명령어여야 합니다. 리버트를 하려면 데이터 백필(data backfill)이 필요하다면, 풀 리퀘스트를 중단하세요. 첫 시간은 그러한 종류의 변경을 처리하기에 잘못된 시간입니다.
다음 여덟 단계를 따르세요
- 티켓 승인 라인을 프롬프트 노트에 복사하세요.
- 풀 리퀘스트(pull request) 브랜치가 아닌 임시 브랜치(scratch branch)를 만드세요.
- 시크릿(secrets) 없이 무료 서버 옵션으로 에이전트를 시작하세요.
- 프롬프트를 티켓이 실제로 필요한 파일로 제한하세요.
- 패치(patch)를 가져와서 로컬에서 스코어 스크립트(score script)를 실행하세요.
- 테스트 명령어(test command)를 실행하고 실제 결과를 기록하세요.
- 알 수 없는 덩어리(unknown hunks)는 각 덩어리를 설명한 후에만 0으로 설정하세요.
- 스크립트가 0으로 종료될 때만 풀 리퀘스트를 여세요.
에이전트가 지정하지 않은 파일을 수정하면 실행을 중단하세요. 요약(summary)에서 디프(diff)에 없는 파일이 언급되면 다시 중단하세요. 이러한 불일치(mismatches)는 패킷(packet)이 준비되지 않았음을 의미합니다.
이 의사결정표를 사용하세요
첫 시간 동안 실패한 행(row)과 흥정하지 마세요. 지금 작업을 분할하거나 임시 브랜치를 폐기하세요. 해당 행이 당신의 지도를 벗어났다면 시니어에게 물어보세요.
| 신호 (Signal) | 점수 (Score) | 당신의 행동 (Your move) |
|---|
| 8개 파일 이하 | 통과 (Pass) | 테스트 라인으로 계속 진행 |
| ... | | |
통과하는 크기 점수(size score)가 곧 통과 의미 점수(meaning score)를 의미하지는 않습니다. 여전히 각 덩어리(hunk)를 순서대로 읽어야 합니다. 불투명한 코드(Opaque code)는 가르칠 수 있을 때까지 실패로 유지됩니다.
샘플 덩어리 하나 살펴보기
파서가 빈 이름(empty name)을 거부해야 한다고 티켓이 가정한다고 상상해 보세요. 에이전트는 parseName을 변경하고 README 파일을 재포맷하기도 합니다. 당신은 파서 덩어리를 티켓과 관련 있다고 점수를 매깁니다.
README 덩어리는 알 수 없다고 점수를 매긴 다음, 그것을 버립니다. 그 파서 덩어리는 티켓과 일치하므로 유지될 수 있습니다. 어떤 풀 리퀘스트를 열기 전에도 여전히 명명된 테스트(named test)를 실행합니다.
-
if (!name) return null;
+
if (!name || !name.trim()) throw new Error(
관련 없는 파일들에 퍼진 포매터 노이즈를 주의하세요. 티켓에서 요청하지 않은 새로운 헬퍼가 있는지 확인하세요. 동작 변경을 숨긴 주석이 있는지 살펴보세요.
에이전트 요약과 이름만 포함된 diff 출력을 비교하세요. 요약의 모든 파일은 그 목록에 나타나야 합니다. 목록의 모든 파일은 여러분의 메모에 나타나야 합니다.
## 무료 옵션은 제자리에 두기
무료 서버는 노이즈가 많은 첫 번째 시도만을 위한 것입니다. 비공개 fixture와 자격 증명(credentials)을 그 장치에서 멀리 두세요. 라이브 환경 전체를 복사하는 것이 아니라 패치(patch)를 되돌리세요.
무료 모델 접근은 두 번째 프롬프트를 저렴하게 만들 수 있습니다. 같은 요청을 다시 시도하기 전에 제약 조건(constraint)을 변경하세요. 새로운 제한 없이 재시도하는 것은 보통 노이즈입니다.
본문에서는 토큰 총량이나 만료 날짜에 대한 언급이 없습니다. 그러한 사실들은 검증된 숫자로 제공되지 않았습니다. 긴 세션을 계획하기 전에 현재 문서를 읽으세요.
만약 팀에서 외부 코딩 에이전트를 금지한다면, 여기서 멈추세요. 무료 등급을 정책 우회 수단으로 취급하지 마세요. 첫 번째 프롬프트를 보내기 전에 리드에게 문의하세요.
## 검사기(checker) 제한 사항 알기
블록 정규식(regex)은 시작점일 뿐, 완전한 위험 지도가 아닙니다. 통과를 신뢰하기 전에 실제 위험 경로들을 추가하세요. 녹색 스크립트라도 여전히 위험한 파일 이름을 놓칠 수 있습니다.
Numstat 합계는 바이너리 파일과 일부 리네임(renames)을 무시합니다. 그 숫자들이 너무 작아 보일 때는 git diff stat을 실행하세요. 화려한 요약보다 이상한 stat을 신뢰하는 것이 좋습니다.
무료 서버에는 여러분의 비공개 테스트 fixture가 부족할 수 있습니다. 해당 서버에서의 통과(pass)도 CI에서 실패할 수 있습니다. 가능하다면 고정된 CI 명령어를 사용하는 것을 선호하세요.
## 이러한 경우에는 이 흐름 건너뛰기
티켓이 프로덕션 데이터를 필요로 할 때는 이 흐름을 건너뛰세요. 아직 언어를 읽지 못하는 경우에도 건너뛰세요. 변경 사항이 릴리스(release)나 마이그레이션인 경우에도 건너뛰세요.
보장된 할당량(quota)이나 지원 계약이 필요한 경우에는 건너뛰세요. 이 초안은 그 어떤 약속도 확립하지 않습니다. 티켓이 급할 때는 승인된 내부 도구를 사용하세요.
diff가 이미 공유 브랜치에 있다면 건너뛰세요. Hour one은 다른 에이전트의 패스를 통해 공개된 실수를 고칠 필요가 없습니다. 먼저 되돌리고(Revert), 그 결과를 사람과 함께 검토하세요.
## 방어 가능한 풀 리퀘스트로 남기기
첫 번째 풀 리퀘스트는 소리 내어 설명할 수 있을 만큼 작아야 합니다. 스코어 스크립트가 당신이 보여줄 수 있는 방어 자료입니다. 모델은 당신이 점수 매긴 패치만 초안 작성했을 뿐입니다.
만약 첫 번째 패스에 MonkeyCode를 사용한다면, 현재 메모를 읽으세요. 실제로 실행할 날의 무료 액세스 조건을 확인하세요. 그런 다음 누군가에게 검토를 요청하기 전에 로컬 게이트(local gate)를 실행하세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41