GEODE의 공식 픽셀 캐릭터 Geodi
전시실로

GEODE

Autonomous Agent Harness

관측에서 다음 행동으로.

연구, 파일 작업, 예약 작업을 맡길 수 있는 로컬 자율 에이전트 하네스입니다.

2026.02.21 — present

설계·판단·검증 Author · 구현 Claude · 리뷰 Codex

  • CLI공개 배포 · PyPI
  • MCP 서버구현

모델의 종료 제안은 검증을 거쳐 완료가 됩니다.

전달 가능한 종료라면 모델이 멈추겠다고 해도 완료 검증을 거칩니다. 결과는 완료, 예산 안의 계속, 검토 대기로 나뉘고, 실행 한도·취소·오류는 별도의 중단 상태로 남습니다.

완료 판정 구성도 · 고정 커밋 9e2c041의 코드 경로로 그림
GEODE 완료 판정 구성도모델의 종료 제안이 완료가 되기까지의 경로입니다. 전달 가능한 종료(natural · forced_text · actionable_partial)만 PreVerify hook, 구조 검사와 선택된 판정 엔진(기본 LLM judge, 선택하면 Jev), PostVerify · Stop hook을 거칩니다. 통과하면 저장 후 completed가 되고, 고칠 수 있는 실패는 기본 2회 예산 안에서 같은 요청을 이어서 실행합니다. 판정을 쓸 수 없거나, 실패를 통과로 바꾸려 하거나, 예산이 다하면 후보를 숨기고 세션을 paused로 둡니다. 취소 · 한도 · 인프라 종료와 control workflow 실행은 검증 없이 저장만 합니다.IPC · CLI 호출자응답 · 세션 상태외부 검토 주체pending 후보 · 자동 연락 없음판정 모델LLM judge · Jev Choiceipc_server/poller.pycontrol workflow · 공개 검증 생략loop/agent_loop.pyarun · 모델 턴_arun_once · 이어서 수정loop/_guards.py · models.py전달 가능 종료 · natural 등실패 · 한도 · 취소 종료loop/_lifecycle.pyfinalize_and_return_asyncpolicy_action · 판정 해석continuation 예산 · 기본 2회core/hooks/public.pyPreVerify · STRENGTHENPostVerify · ACCEPT · REVISE · ESCALATEStop · CONTINUEmemory · observabilitycheckpoint · 세션 상태timeline · ledger 판정 행core/agent/verify.py구조 검사 · empty_turn의미 판정 · LLM 또는 Jevverification_error · 실패 닫힘GEODE 런타임 프로세스AgenticLoop 한 턴의 끝루프 · 종료 후보finalization · 판정1 종료 제안 · arun · 모델 턴 → 전달 가능 종료 · natural 등12완료 후보3 PreVerify · finalize_and_return_async → PreVerify · STRENGTHEN34verify_turn_async5판정 요청6passed · rubric_misses7 PostVerify 결정 · policy_action · 판정 해석 → PostVerify · ACCEPT · REVISE · ESCALATE78Stop · CONTINUE9completed · 저장10응답1passed · rubric_misses2 PostVerify 결정 · policy_action · 판정 해석 → PostVerify · ACCEPT · REVISE · ESCALATE23Stop · CONTINUE4수정 지시 · 시도 +11verification_error2 PostVerify 결정 · policy_action · 판정 해석 → PostVerify · ACCEPT · REVISE · ESCALATE23ESCALATE · pending4판정 · 근거 행1 가드 · 한도 · arun · 모델 턴 → 실패 · 한도 · 취소 종료12실패 · 취소 종료3공개 검증 생략4저장만 · 검증 없음5응답

검증 → 완료

전달 가능한 종료 후보만 PreVerify → 판정 → PostVerify → Stop을 거칩니다. 모델의 종료 제안이나 hook 지시는 그 자체로 완료가 아닙니다.

  1. arun · 모델 턴loop/agent_loop.py데이터: 종료 제안전달 가능 종료 · natural 등loop/_guards.py · models.py

    모델이 도구 호출 없이 텍스트로 답하면 natural(마지막 허용 라운드에서는 forced_text) 종료 후보가 됩니다. 모델의 종료 제안은 아직 완료가 아닙니다.

  2. 전달 가능 종료 · natural 등loop/_guards.py · models.py데이터: 완료 후보finalize_and_return_asyncloop/_lifecycle.py

    natural · forced_text · actionable_partial만 전달 가능한 종료이며, 이 경우에만 공개 검증으로 갑니다.

  3. finalize_and_return_asyncloop/_lifecycle.py실행 · 판정: PreVerifyPreVerify · STRENGTHENcore/hooks/public.py

    PreVerify hook은 STRENGTHEN으로 요구 사항과 누락 코드를 더할 수만 있습니다. 판정을 더 엄격하게 만들 뿐, 통과시키지는 못합니다.

  4. finalize_and_return_asyncloop/_lifecycle.py실행 · 판정: verify_turn_async구조 검사 · empty_turncore/agent/verify.py

    먼저 구조 검사(빈 턴 · model_action_required)를 하고, 고칠 수 없는 구조 실패면 의미 판정을 건너뜁니다. off · rule_based 같은 옛 설정값은 llm_judge로 해석되어 판정을 끄지 못합니다.

  5. 의미 판정 · LLM 또는 Jevcore/agent/verify.py데이터: 판정 요청판정 모델

    선택된 판정 엔진(기본 LLM judge, 고르면 Jev Choice)을 도구 없이 한 번 부릅니다. 최대 120초이며 남은 시간 예산을 넘지 않습니다. 개인 정보가 담길 수 있는 후보는 보조 판정 모델로 보내지 않습니다.

  6. 의미 판정 · LLM 또는 Jevcore/agent/verify.py데이터: passed · rubric_missespolicy_action · 판정 해석loop/_lifecycle.py

    판정 결과에는 통과 여부, 누락 코드, 다음 시도에 넣을 reflection과 재시도 가능 여부가 담깁니다. 구조 검사가 실패했다면 의미 판정의 통과가 그것을 덮지 못합니다.

  7. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: PostVerify 결정PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerify hook이 ACCEPT · REVISE · ESCALATE를 정합니다. 검증에 실패한 후보를 ACCEPT하려 하면 escalate로 바뀝니다. 결정이 없으면 런타임 기본값(통과 → accept, 재시도 가능 → revise, 그 밖 → escalate)을 씁니다.

  8. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    escalate가 아닐 때만 Stop hook의 CONTINUE 지시가 이어서 고치기를 요청할 수 있습니다. hook의 지시는 권한이 아니라 다음 시도의 입력입니다.

  9. policy_action · 판정 해석loop/_lifecycle.py데이터: completed · 저장checkpoint · 세션 상태memory · observability

    통과해 accept가 되면 이어서 고친 시도까지 합쳐 결과를 저장하고 세션을 completed로 기록합니다.

  10. finalize_and_return_asyncloop/_lifecycle.py데이터: 응답IPC · CLI 호출자

    완료면 최종 응답을, 검토 대기면 빈 응답과 EXTERNAL_VERIFICATION_REQUIRED를, 검증 없는 종료면 그 종료 사유를 돌려줍니다.

예산 안의 수정

실패했지만 고칠 수 있으면 같은 요청을 이어서 실행합니다. 기본 예산은 2회이며, 다하면 검토 대기로 갑니다.

  1. 의미 판정 · LLM 또는 Jevcore/agent/verify.py데이터: passed · rubric_missespolicy_action · 판정 해석loop/_lifecycle.py

    판정 결과에는 통과 여부, 누락 코드, 다음 시도에 넣을 reflection과 재시도 가능 여부가 담깁니다. 구조 검사가 실패했다면 의미 판정의 통과가 그것을 덮지 못합니다.

  2. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: PostVerify 결정PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerify hook이 ACCEPT · REVISE · ESCALATE를 정합니다. 검증에 실패한 후보를 ACCEPT하려 하면 escalate로 바뀝니다. 결정이 없으면 런타임 기본값(통과 → accept, 재시도 가능 → revise, 그 밖 → escalate)을 씁니다.

  3. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: Stop · CONTINUEStop · CONTINUEcore/hooks/public.py

    escalate가 아닐 때만 Stop hook의 CONTINUE 지시가 이어서 고치기를 요청할 수 있습니다. hook의 지시는 권한이 아니라 다음 시도의 입력입니다.

  4. continuation 예산 · 기본 2회loop/_lifecycle.py실행 · 판정: 수정 지시 · 시도 +1_arun_once · 이어서 수정loop/agent_loop.py

    수정 지시가 있고 이번 시도 번호가 예산(기본 2회)보다 작을 때만 같은 요청을 이어서 실행합니다. 예산에 닿으면 escalate_budget_exhausted로 검토 대기가 됩니다.

검토 대기

판정을 쓸 수 없거나, 실패를 통과로 바꾸려 하거나, 예산이 다하면 후보를 숨기고 세션을 멈춥니다.

  1. verification_error · 실패 닫힘core/agent/verify.py실패 · 판정 불가: verification_errorpolicy_action · 판정 해석loop/_lifecycle.py

    판정 모델이 없거나, 시간이 다하거나, 응답이 유효하지 않으면 통과도 수리 신호도 아닌 verification_error가 됩니다. 쓸 수 없는 판정은 성공을 대신하지 않습니다.

  2. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: PostVerify 결정PostVerify · ACCEPT · REVISE · ESCALATEcore/hooks/public.py

    PostVerify hook이 ACCEPT · REVISE · ESCALATE를 정합니다. 검증에 실패한 후보를 ACCEPT하려 하면 escalate로 바뀝니다. 결정이 없으면 런타임 기본값(통과 → accept, 재시도 가능 → revise, 그 밖 → escalate)을 씁니다.

  3. policy_action · 판정 해석loop/_lifecycle.py실행 · 판정: ESCALATE · pending외부 검토 주체

    후보를 pending_text로 남기고 일반 응답에서는 숨긴 뒤, checkpoint를 저장하고 세션을 paused로 둡니다. 외부 검토자에게 자동으로 연락하지는 않습니다.

  4. policy_action · 판정 해석loop/_lifecycle.py기록 · 관측: 판정 · 근거 행timeline · ledger 판정 행memory · observability

    timeline에 판정 결정 · 근거 · pending 행을, evidence ledger에 verification_policy 행을 남깁니다. 기록은 best-effort이며 바깥 효과의 증명이 아닙니다.

검증 없는 종료

취소 · 한도 · 인프라 종료와 control workflow 실행은 공개 검증 없이 저장만 합니다.

  1. arun · 모델 턴loop/agent_loop.py실행 · 판정: 가드 · 한도실패 · 한도 · 취소 종료loop/_guards.py · models.py

    라운드 · 시간 · 비용 · context 한도, 취소, 반복 실패 감지 같은 가드가 닫힌 TerminationReason 집합 가운데 하나로 턴을 끝냅니다. 설정에서 끈 한도까지 늘 강제한다는 뜻은 아닙니다.

  2. 실패 · 한도 · 취소 종료loop/_guards.py · models.py실패 · 판정 불가: 실패 · 취소 종료finalize_and_return_asyncloop/_lifecycle.py

    취소 · 인프라 · 한도 종료에는 검증할 후보가 없으므로 공개 검증 없이 저장만 합니다.

  3. control workflow · 공개 검증 생략ipc_server/poller.py실행 · 판정: 공개 검증 생략finalize_and_return_asyncloop/_lifecycle.py

    IPC 호출이 공개 검증 생략을 요청했거나 진행 중인 control workflow가 있으면, 그 실행 동안만 공개 검증을 끄고 끝나면 이전 값으로 되돌립니다.

  4. finalize_and_return_asyncloop/_lifecycle.py데이터: 저장만 · 검증 없음checkpoint · 세션 상태memory · observability

    검증 없는 종료도 결과와 checkpoint를 저장하고 세션 종료 이벤트를 냅니다.

  5. finalize_and_return_asyncloop/_lifecycle.py데이터: 응답IPC · CLI 호출자

    완료면 최종 응답을, 검토 대기면 빈 응답과 EXTERNAL_VERIFICATION_REQUIRED를, 검증 없는 종료면 그 종료 사유를 돌려줍니다.

모든 연결을 같은 굵기로 보여 줍니다. 흐름을 고르면 그 경로만 번호와 함께 강조됩니다.

  • 실선 · 요청 · 후보 · 결과가 흐르는 방향
  • 파선 · 실행 · 판정 · 권한 · 설정
  • 긴 점선 · 기록 · 관측, 판정과 별개
  • 짧은 파선 · 실패 · 쓸 수 없는 판정
  • 굵은 검은 선 · 고른 흐름, 번호는 순서
  • 상자 · 코드 · 기록 경계, 머리말에 경로
  • 안쪽 칩 · 그 경계의 구성 요소
  • 점선 상자 · 그 경계 밖
  • 루프 · finalization
  • 종료 · hook · 판정
  • 저장 · 기록
  • IPC 진입

고정 커밋 9e2c041의 호출 경로만 그렸습니다. 판정 모델의 통과는 외부 benchmark verifier의 성공과 별개이며, 완료 판정은 런타임 안의 결정입니다.

판정 엔진
기본은 LLM judge이고, judgment_engine을 jev로 고른 경우에만 Jev Choice로 판정합니다. 어느 쪽이든 쓸 수 없으면 verification_error이며 성공으로 바뀌지 않습니다.
hook의 권한
PreVerify는 판정을 엄격하게만, PostVerify는 실패한 후보를 통과시키지 못하게, Stop은 escalate가 아닐 때만 이어서 고치기를 요청할 수 있게 묶여 있습니다.
검토 대기
검토 대기는 외부 결정이 필요하다는 상태 기록입니다. 누군가에게 알림을 보내거나 결과를 승인받았다는 뜻이 아닙니다.