같은 요청이라도 시스템 프롬프트는 모드에 따라 다르게 조립됩니다. core/agent/system_prompt.py의 build_system_prompt가 기본 본문을 만들고, core/agent/loop/_context.py가 명시적 에이전트 override, 스킬 메타데이터와 세션 지침을 결합합니다.
기본 모드: persona 주입(기본 ON)
기본값에서 GEODE는 자신의 persona를 주입합니다. GEODE.md의 Identity, Voice & Conduct, Operating Principles, RUNTIME CANNOT 섹션을 추려 <agent_identity> 레이어로 기본 프롬프트에 싣습니다. 전체 파일 주입과는 구별됩니다. GEODE_PERSONA=off는 이 G1 레이어만 생략하며 공유 베이스와 도구 사용 규칙은 유지합니다. audit-mode가 켜져 있으면 이 플래그와 무관하게 강제 OFF입니다.
static prefix 턴 사이 불변, 캐시 적중 router/wrapper base + math-output rules selected style/heuristic policies <agent_identity> 기본 ON; GEODE_PERSONA=off로 제외 AGENTIC_SUFFIX <dynamic_context> 턴마다 변함, 캐시 제외 <model_card> 모델 인자가 있을 때 model-family guidance + platform hint <current_date> OpenAI GPT 계열에서는 생략 <project_memory> <agent_learning> <runtime_rules> <user_context> </dynamic_context>
audit-mode: GEODE 맥락 strip
GEODE_AUDIT_UNRESTRICTED=1이면 G1, 메모리와 사용자 컨텍스트를 생략합니다. wrapper 또는 generic 베이스, 수식 출력 규칙과 AGENTIC_SUFFIX는 유지합니다. 동적 영역에는 모델 인자가 있으면 model_card, 프로바이더 정책에 따라 날짜, 호출자의 system_suffix가 들어갑니다. 근거는 측정 결과입니다. Petri의 auditor는 시나리오의 정체성을 끝까지 통제해야 하는데, GEODE 프리앰블이 트랜스크립트를 오염시켰습니다. 플래그는 geode-eval audit의--unrestricted가 inspect 서브프로세스 앞에서 설정합니다.
wrapper override: 변이된 스캐폴드 주입
자기개선 루프가 진화시키는 것이 바로 이 static 영역의 wrapper 스캐폴드입니다. 런타임 조립부는 core/config/runtime_policy_sources.py의 정책 후보를 빌더에 전달합니다. 기본 후보의 해석은 다음과 같습니다.
GEODE_WRAPPER_OVERRIDEenv가 가리키는 JSON 파일. 감사 서브프로세스 훅입니다. 설정되어 있으면 파일이 반드시 존재하고 파싱돼야 하며, 실패는 fatal입니다. 잘못된 wrapper로 쿼터를 조용히 태우는 것보다 감사가 중단되는 편이 낫기 때문입니다.- env가 없으면
core.paths.AUTORESEARCH_WRAPPER_SECTIONS_PATH의 정책 파일을 사용합니다. 소스 체크아웃과 설치 패키지의 참조 경로는core/paths.py가 결정합니다. 파일이 없으면 generic prefix를 사용하고, 읽기·스키마 오류는 WARNING 후 같은 기본값으로 복구합니다.
audit-mode에서도 override가 시스템 프롬프트의 베이스가 됩니다. override가 없으면 동일한 도메인 중립 베이스로 폴백해, 감사 타깃이 항상 GEODE 스캐폴드를 입도록 보장합니다. 스캐폴드가 실제로 프롬프트에 도달했는지는 빌드 때마다system_prompt.scaffold 진단으로 기록됩니다. 정책 후보 없이 빌더를 직접 호출하면 전역 경로를 탐색하지 않고 generic prefix를 사용합니다.
명시적 에이전트 override
AgenticLoopConfig.system_prompt_override는 wrapper 교체와 달리 기본 조립 본문 전체를 대체합니다. G1과 model_card가 없을 수 있지만 스킬 메타데이터, AGENTIC_SUFFIX, 호출자 suffix는 루프가 별도로 결합합니다. 모델 카드가 없으면 모델을 추측하지 않습니다. 카탈로그 정보와 계정 접근·실제 청구의 구분은 프롬프트 조립을 참고합니다.
program.md 계약: mutator의 프롬프트
변이를 제안하는 mutator 에이전트의 시스템 프롬프트는 패키지와 함께 출하되는 evolve/scaffold_search/program.md입니다. 러너 (evolve/scaffold_search/loop/mutate/runner.py)가 매 호출 디스크에서 읽고, 단일 변이로 범위를 좁히는 계약을 뒤에 붙입니다. 파일을 못 읽으면 크게 실패합니다. 교체가 필요하면 훅 핸들러가 program_md 본문을 공급하는 단일 제어 지점을 씁니다.
실패 모드
| 증상 | 원인 | 해법 |
|---|---|---|
| 감사가 시작 전에 중단 | GEODE_WRAPPER_OVERRIDE 경로가 없거나 스키마 불일치 | 의도된 fail-loud입니다. 파일 경로와 dict[str, str] 스키마를 고칩니다. |
| 승격했는데 일상 실행이 기본 프롬프트 | SoT 파일 손상으로 복구 폴백 | 로그의 WARNING을 확인하고 wrapper-sections.json을 복구합니다. |
| 얇은 래퍼를 원하는데 GEODE가 persona를 주입함 | persona 기본 ON | GEODE_PERSONA=off로 끕니다. |
다음
- 프롬프트 조립. 레이어 전체 구조.
- 프롬프트 캐싱. static/dynamic 경계의 비용 면.
- Closed-Loop. wrapper를 진화시키는 바깥 루프.