에이전트 점수가 기계를 떠나기 전에 피규어 해시를 고정해야 하는 이유
요약
이 글은 에이전트 워크플로우의 신뢰성을 높이기 위한 기술적 원칙을 설명합니다. 특히, 테스트 환경에서 '피규어 해시(fixture hash)'를 고정하는 것이 중요하며, 이는 모델 호출이나 서버 실행 간의 일관성 있는 비교 기준을 제공하기 위함입니다. 다양한 용어집과 결정 트리를 통해 에이전트 작업 카드, 오라클 종류, 변이 범위 등 핵심 개념들을 정의하고 있습니다.
핵심 포인트
- 에이전트 워크플로우는 '피규어 해시' 고정을 통해 일관성을 확보해야 합니다.
- 테스트 환경에서 로컬 브랜치 논리를 사용하여 신뢰도를 높여야 합니다.
- 작업 카드(Task card)와 피규어 번들(Fixture bundle) 등 핵심 용어를 명확히 정의합니다.
- 결정 트리는 에이전트 리프의 검사 순서 및 처리 방식을 안내합니다.
목요일의 페이지네이션 카드(pagination card)는 완료된 것처럼 보였다. 에이전트 요약은 테스트가 통과했다고 말했고, diff는 list_users.py와 하나의 피규어만 건드렸다. 월요일의 깨끗한 작업 트리(clean worktree)는 같은 카드를 통과하지 못했다. 프롬프트는 동일했지만, 샘플 페이로드(sample payload)가 달랐다.
바로 이 격차가 이 워크플로우가 분류하는 것입니다. 무료 모델 호출은 한 번도 고정되지 않은 피규어를 복구할 수 없습니다. 무료 서버는 서로 다른 파일을 본 두 번의 실행을 비교할 수 없습니다.
이 설명(walkthrough)은 측정된 사건이 아니라 구성된 예시입니다. 통과율에 대한 주장은 없습니다. 호스팅되는 좌석(hosted seat)이 관여하기 전에 로컬에서 브랜치 논리를 사용하십시오.
용어집 (Glossary)
작업 카드(task card)에 쓰인 대로 다음 용어를 사용하십시오. 필드를 채울 수 없다면, 트리는 그것을 누락된 것으로 취급하며, 누락은 추측하라는 프롬프트가 아니라 결과입니다.
작업 카드 (Task card). 목표, 입력 및 읽을 수 있는 파일이 포함된 하나의 에이전트 작업. 채팅 기록(chat transcript)은 작업 카드가 아닙니다.
피규어 번들 (Fixture bundle). 고정된 입력과 결과를 판단하는 오라클(oracle)입니다. 오늘 아침 리포지토리(repo)에 있던 것이 무엇이든 상관없는 폴더는 번들이 아닙니다.
오라클 종류 (Oracle kind). 정확성이 판단되는 방식입니다. 이 워크플로우는 pytest, schema 또는 human을 허용합니다. 빈 값은 오라클이 없다는 것을 의미합니다.
변이 범위 (Mutation scope). 실행이 변경할 수 있는 내용입니다. 허용되는 값은 read_only, workspace, network, 그리고 secrets입니다.
쓰기 가능 루트 (Writable root). workspace 실행이 쓸 수 있는 단일 디렉토리입니다. 이것이 설정되지 않았다면, 쓰기 표면(write surface)은 이름이 없습니다.
누수 플래그 (Leak flag). 번들이 자격 증명(credentials), 고객 행(customer rows) 또는 공유 러너에 붙여넣지 않을 모든 것을 포함할 때 True입니다.
오래된 창 (Stale window). 피규어 해시가 점수 산정을 위해 더 이상 허용되지 않는 시간 간격입니다. 사용자님의 스위트(suite)를 위해 숫자를 선택하십시오. 이 텍스트는 공급업체 기본값을 설정하지 않습니다.
러너 좌석 (Runner seat). 모델 호출과 도구 호스트가 실행되는 곳입니다. 운영자가 채운 레이블을 저장하십시오. 가격 등급에서 좌석을 추론하지 마십시오.
점수 영수증 (Score receipt). leaf, hash, oracle kind, mutation scope, 그리고 runner seat에 대한 작은 JSON 기록입니다. 모델 요약은 영수증이 아닙니다.
네 잎의 결정 트리 (The four-leaf decision tree)
순서대로 검사를 수행합니다. 첫 번째 일치하는 지점에서 중단합니다. 나중에 수행되는 검사는 이전 실패를 만회하지 못합니다.
oracle_kind가 누락되었거나,leak_flag가 true인 경우, 해당 리프(leaf)는 **거부(refuse)**됩니다.- 그렇지 않고 스코프(scope)가
network또는secrets이거나, 스코프가writable root가 없는workspace인 경우, 해당 리프는 **격리(quarantine)**됩니다. - 그렇지 않고
fixture_sha256이 누락되었거나,age_hours가stale_after_hours를 초과하는 경우, 해당 리프는 **새로고침(refresh)**됩니다. - 그렇지 않으면 해당 리프는 **점수화(score)**됩니다.
| 순서 | 조건 | 리프 | 다음 조치 |
|---|---|---|---|
| 1 | 오라클 없음, 또는 누출 플래그 설정 | 거부 (refuse) | 모델 호출 안 함 |
| ... |
A 무료 좌석이 테이블의 순서를 재정렬하지는 않습니다. 이는 행 4 이후에만 후보가 됩니다.
번호가 매겨진 워크플로우
- 태스크 카드를 하나의 파일에 작성합니다. 모델 세션을 열기 전에 오라클 종류를 명시하세요.
- 로컬 머신에서 피처(fixture) 번들을 해싱합니다. 생성된 다이제스트(digest)는 카드 안에 넣지 말고, 옆에 저장하세요.
- 변이 스코프(mutation scope)를 설정합니다. 만약 스코프가
workspace라면, 정확히 하나의 쓰기 가능한 루트(writable root)를 지정해야 합니다.
첫 번째 명령어는 runner_seat을 null로 설정한 점수 영수증(score receipt)을 출력해야 합니다. 두 번째 명령어는 계산된 다이제스트(digests)를 출력합니다. 이 다이제스트를 카드에 붙여넣으세요. 모델에게 임의로 만들어내라고 요청하지 마십시오.
python3 - <<'PY'
import hashlib
import pathlib
...
로컬 테스트 계획 (Local test plan)
| 케이스 (Case) | 고유 입력 (Distinct input) | 예상 리프 (Expected leaf) |
|---|---|---|
| empty oracle | oracle_kind가 null임 | refuse |
| ... | ||
모든 7개의 __main__ 어설트(asserts)는 좌석을 바인딩하기 전에 통과해야 합니다. 리프 순서를 변경했다면, 동일한 편집에서 어설트를 수정하십시오. 녹색 모델 데모가 그 확인 절차를 대체하지 않습니다. |
작동하는 리프: refuse
카드 텍스트: "사용자 페이지를 더 빠르게 느끼게 만드세요." 오라클 종류(Oracle kind)는 비어 있습니다. 누출 플래그(Leak flag)는 false입니다. 범위(Scope)는 read_only입니다. 해시가 존재할 수도 있습니다. 상관없습니다.
분류기(classifier)는 refuse를 반환합니다. 중단하십시오. 기록할 판단이 없으므로, 모델 단락은 단순히 점수처럼 보일 것입니다. 영수증을 작성하고 오라클이 존재할 때까지 카드를 닫으십시오.
{"leaf":"refuse","oracle_kind":null,"mutation_scope":"read_only","fixture_sha256":null,"runner_seat":null}
페이지 크기에 대한 schema 확인만으로 나중에 이 리프를 남기기에 충분합니다. 페이지가 더 좋아 보인다는 요약은 오라클 종류가 아닙니다.
작동하는 리프: quarantine
카드 텍스트: "스테이징(staging)에 접속하여 페이지네이션을 확인하세요." 오라클 종류는 pytest입니다. .env 파일에 스테이징 토큰이 들어있기 때문에 범위(Scope)는 secrets입니다. 실수로 leak_flag를 false로 설정했을 수도 있습니다. 범위만으로도 충분히 중단할 수 있습니다.
이 리프는 quarantine입니다. 번들(bundle)을 공유 서버에 업로드하지 마십시오. 무료든 아니든 상관없습니다. 단계를 줄이기 위해 토큰을 프롬프트에 붙여넣지 마십시오. 시크릿(secret)을 삭제하고 재분류하거나, 이 트리 외부에서 이미 제어하는 머신에서만 도구를 실행하십시오.
Quarantine는 더 부드러운 점수가 아니라 차단(block)입니다. 유휴 용량(Idle capacity)이 이를 재분류하지 않습니다.
작동하는 리프: refresh
카드: 페이지네이션 회귀(pagination regression). 오라클 종류는 pytest입니다. 범위(Scope)는 workspace입니다. 쓰기 가능한 루트(Writable root)는 /tmp/eval/pagination입니다. 샘플 파일은 90시간 전 것입니다. 카드에 표시된 오래된 기간(stale window)은 24시간입니다. 해시 필드는 비어 있습니다.
잎(The leaf)은 refresh입니다. 커밋했던 스펙으로부터 예상되는 본문(body)을 재구축한 다음, 번들(bundle)에 해시를 적용하세요. 이전 파일에 대해 모델 점수(model score)를 기록하지 마세요. 서로 다른 페이로드(payloads)에서 나온 두 개의 녹색 표시가 비교가 될 수는 없습니다.
다이제스트(digest)가 저장되고 재구축을 통해 나이가 초기화되면, classify를 다시 실행하세요. 새로운 score 결과만 계속됩니다. 간극(gap)이 보이도록 리프레시 영수증(refresh receipt)은 보관해 두세요.
{"leaf":"refresh","oracle_kind":"pytest","mutation_scope":"workspace","fixture_sha256":null,"runner_seat":null}
작업된 잎: score
동일한 페이지네이션 카드(pagination card)가 이제 고정되었습니다. 오라클 종류(Oracle kind)는 pytest입니다. 범위(Scope)는 workspace입니다. 쓰기 가능한 루트(Writable root)가 설정되었습니다. 해시(Hash)가 존재합니다. 나이(Age)는 3시간입니다. 만료 기간(Stale window)은 24입니다. 누수 플래그(Leak flag)는 거짓입니다.
잎은 score입니다. 호출 전에 영수증에 러너 좌석(runner seat)을 바인딩하세요. 모델 호출은 프로덕션 자격 증명(production credentials)을 읽을 수 있는 어떤 호스트에서도 멀리 유지하세요.
공개 정보: 본 문서는 MonkeyCode의 제품 아웃리치(product outreach)의 일환으로 준비되었습니다. 귀하의 제약 조건과 일치할 경우 채울 수 있는 좌석 하나는 MonkeyCode가 무료 서버 옵션에서 제공하는 무료 모델 접근입니다. 이 문서는 모델, 토큰 할당량, 하드웨어 또는 해당 옵션이 이용 가능한 기간에 대해 언급하지 않습니다. 의존하기 전에 현재 제품 약관을 확인하세요.
{
"leaf": "score",
"oracle_kind": "pytest",
...
만약 좌석 레이블(seat label)이 여전히 알려지지 않았다면, null로 두고 실행하지 마세요. 누락된 좌석은 불완전한 영수증입니다. 우연히 비어 있는 어떤 좌석에 기본값으로 설정되는 것이 아닙니다.
실패한 영수증 읽는 방법
실패한 영수증도 여전히 결과물입니다. 다음 실행이 채팅 메모리(chat memory)에서 시작하지 않도록 카드 옆에 보관하세요.
만약 leaf가 refuse라면, 누락된 조각은 오라클 또는 발생한 누수 플래그입니다. 카드를 수정하세요. 간극을 넘어서 말하도록 프롬프트를 조정하지 마세요.
만약 leaf가 quarantine라면, 번들은 공유 좌석(shared seat)에 적격하지 않습니다. 비밀 정보(secret)를 제거하는 것은 피처 편집(fixture edit)입니다. 그 편집은 새로운 해시와 새로운 분류(classification)를 필요로 합니다. 이전 다이제스트를 재사용하지 마세요.
만약 leaf가 refresh라면, 점수 필드는 비어 있게 유지됩니다. 모델은 해시가 존재하는 후에만 사용될 수 있습니다. 리프레시 중에 호출하면 초안 파일이 기준선에 섞입니다.
만약 leaf가 score이고 runner_seat이 null이라면, 실행이 시작되지 않은 것입니다. 같은 날 확인한 문서를 통해 좌석을 채우세요. 이전 게시물에서 복사된 좌석 이름은 증거가 아닙니다.
이것이 증명하지 않는 것들
score 리프는 해당 장치가 실행하기에 충분히 비교 가능하다는 것을 의미합니다. 패치가 정확하거나, 안전하거나, 로컬 모델보다 저렴하다는 것을 의미하지 않습니다. 이 어설션(asserts)은 단지 이 스크립트의 브랜치 순서만을 증명할 뿐입니다.
무료 모델 접근 및 무료 서버 옵션은 이 초안에 제공된 가용성 주장일 뿐입니다. 이것들은 벤치마크가 아니며, 용량 약속도 아니고, 거부(refuse) 및 격리(quarantine)를 건너뛸 이유도 아닙니다. 공급업체 페이지의 내용이 본문과 다르다면, 공급업체 페이지를 신뢰하세요.
해시는 파일 드리프트(file drift)를 잡아냅니다. 잘못된 사양을 잡지는 못합니다. 고정된 오라클(oracle)이 버그를 예상한다면, 모든 모델은 그것을 보존함으로써 통과할 수 있습니다. 영수증을 품질 신호로 취급하기 전에 오라클을 검토하세요.
이 워크플로우를 건너뛰어야 하는 경우
규제 데이터, 프로덕션 비밀(production secrets), 또는 무한 네트워크 쓰기가 필요한 경우에는 건너뛰세요. 격리(Quarantine)는 이 트리의 상한선이며, 해당 카드들을 위한 호스팅 가이드가 아닙니다.
업타임 약속이 필요한 경우에도 건너뛰세요. 여기에는 신뢰성, 지연 시간 또는 보존을 위해 무료 좌석을 선택하는 것이 없습니다.
사람들이 데모를 진행하기 위해 거부(refuse) 결과를 점수(score)로 편집할 계획이라면 건너뛰세요. 리프가 나중에 다시 작성되면 영수증은 쓸모없게 됩니다.
이미 score로 분류되는 카드에 대해서는 오늘 확인한 MonkeyCode 문서에서 좌석을 바인딩하고, 그 영수증을 diff 옆에 보관하세요. 만약 해당 문서와 이 트리가 불일치한다면, 문서의 지침을 따르고 카드가 여전히 score에 도달할 때까지 좌석을 비워두세요.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기