하위 에이전트
ChatGPT와 Codex에서 하위 에이전트를 사용하고 사용자 지정 Codex 에이전트를 구성하세요
- ChatGPT 데스크톱 앱 데스크톱에서 프로젝트, 파일, 장시간 작업을 처리합니다.
- ChatGPT 웹 브라우저에서 채팅, 프로젝트, Work를 사용합니다.
- Codex CLI 터미널에서 Codex를 사용합니다.
- Codex IDE 확장 프로그램 편집기에서 Codex를 사용합니다.
ChatGPT Work와 Codex는 특화된 에이전트를 병렬로 생성한 다음 그 결과를 하나의 응답으로 취합하여 하위 에이전트 워크플로를 실행할 수 있습니다. 이는 코드베이스 탐색이나 여러 단계로 구성된 기능 계획 구현처럼 병렬화 수준이 높은 복잡한 작업에 특히 유용할 수 있습니다.
로컬 Codex 클라이언트에서는 작업별로 서로 다른 모델 구성과 지침을 사용하는 사용자 지정 에이전트도 정의할 수 있습니다.
사용 가능 여부
ChatGPT Work는 자격 요건을 충족하는 계정에 하위 에이전트 워크플로와 활동을 제공합니다.
현재 Codex 릴리스에서는 하위 에이전트 워크플로가 기본적으로 활성화됩니다. 하위 에이전트 활동은 ChatGPT 데스크톱 앱, Codex CLI, IDE 확장 프로그램에 표시됩니다.
각 하위 에이전트가 자체적으로 모델 및 도구 작업을 수행하므로, 하위 에이전트 워크플로는 비슷한 단일 에이전트 실행보다 더 많은 토큰을 사용합니다.
ChatGPT Work에서는 ChatGPT에 독립적인 작업을 하위 에이전트에 위임하도록 요청하세요. 에이전트는 ChatGPT의 호스팅 환경에서 실행되며, 채팅에서 에이전트의 활동과 결과를 확인할 수 있습니다. 대부분의 지능 수준에서는 위임을 명시적으로 요청해야 합니다. Ultra에서는 병렬 에이전트가 속도나 품질을 실질적으로 개선할 수 있을 때 ChatGPT가 선제적으로 작업을 위임할 수 있습니다.
앱 채팅에서 작업의 독립적인 부분을 하위 에이전트에게 위임하도록 Codex에
요청하세요. 현재 로컬 Codex 릴리스는 직접 요청하거나 적용 가능한 AGENTS.md 또는
스킬 지침에서 위임을 요청할 때 작업을 위임합니다. 앱에는 각 하위 에이전트 스레드가 표시되므로
해당 작업과 기본 채팅에 반환된 요약을 검토할 수 있습니다.
대화형 CLI 세션에서 Codex에 하위 에이전트를 사용하도록 요청하세요. Codex는 위임을 요청하는
해당 AGENTS.md 또는 스킬 지침을 따를 수도 있습니다.
/subagents를 사용하면 에이전트가 실행되는 동안 스레드를 확인하고 전환할 수 있습니다. 기본
스레드는 하위 에이전트의 결과를 모아 최종 응답에 반영합니다.
IDE 채팅에서 작업의 독립적인 부분을 하위 에이전트에게 위임하도록 Codex에 요청하세요.
Codex는 위임을 요청하는 적용 가능한 AGENTS.md 또는 스킬 지침을 따를 수도 있습니다.
백그라운드 에이전트 UI를 사용할 수 있으면 활성 하위 에이전트가
작성기 위에 표시됩니다. 패널을 펼치면 상태를 확인하거나 활성 상태인 모든
하위 에이전트를 중지하거나 개별 하위 에이전트 스레드를 열 수 있습니다.
하위 에이전트 워크플로가 유용한 이유
컨텍스트 창이 크더라도 모델에는 한계가 있습니다. 요구 사항, 제약 조건, 의사 결정을 정의하는 기본 채팅에 탐색 메모, 테스트 로그, 스택 트레이스, 명령 출력과 같은 잡음이 많은 중간 출력을 쏟아 넣으면 시간이 지날수록 세션의 신뢰성이 낮아질 수 있습니다.
이는 흔히 다음과 같이 설명됩니다.
- 컨텍스트 오염: 유용한 정보가 잡음이 많은 중간 출력에 묻힙니다.
- 컨텍스트 부패: 관련성이 낮은 세부 정보가 채팅에 쌓이면서 성능이 저하됩니다.
배경 정보는 Chroma의 컨텍스트 부패 관련 글을 참조하세요.
하위 에이전트 워크플로는 잡음이 많은 작업을 기본 스레드 밖으로 옮겨 다음과 같은 도움을 줍니다.
- 기본 에이전트 가 요구 사항, 의사 결정, 최종 출력에 집중하도록 합니다.
- 탐색, 테스트 또는 로그 분석을 위해 특화된 하위 에이전트 를 병렬로 실행합니다.
- 원시 중간 출력 대신 하위 에이전트의 요약 을 반환합니다.
또한 작업을 독립적으로 병렬 실행할 수 있을 때 시간을 절약할 수 있으며, 규모가 큰 작업을 범위가 명확한 단위로 나누어 더 쉽게 처리할 수 있습니다. 예를 들어 Codex는 수백만 토큰 규모의 문서 분석을 더 작은 문제로 나누고 정제된 핵심 내용을 기본 스레드에 반환할 수 있습니다.
우선 탐색, 테스트, 분류, 요약과 같이 읽기 작업의 비중이 높은 작업에는 병렬 에이전트를 사용하세요. 여러 에이전트가 동시에 코드를 편집하면 충돌이 발생하고 조율 비용이 증가할 수 있으므로 쓰기 작업의 비중이 높은 병렬 워크플로에는 더 신중하게 접근하세요.
핵심 용어
Codex는 하위 에이전트 워크플로에서 서로 관련된 몇 가지 용어를 사용합니다.
- 하위 에이전트 워크플로: Codex가 병렬 에이전트를 실행하고 그 결과를 결합하는 워크플로입니다.
- 하위 에이전트: Codex가 특정 작업을 처리하도록 시작하는 위임된 에이전트입니다.
- 에이전트 스레드: 하위 에이전트가 작업을 수행하는 스레드입니다. 지원되는 클라이언트에서는 이 스레드를 열어 진행 상황이나 결과를 검토할 수 있습니다.
하위 에이전트 워크플로 시작하기
대부분의 지능 수준에서는 하위 에이전트 사용이나 에이전트의 병렬 작업을 직접 요청하세요. Ultra에서는 선제적 위임이 활성화되므로 ChatGPT가 적합한 독립 작업을 별도 요청 없이 위임할 수 있습니다.
하위 에이전트 또는 병렬 에이전트 작업을 직접 요청하세요. Codex는 적용 가능한 프로젝트 또는 스킬 지침에서 요청할 때도 작업을 위임할 수 있습니다.
실제로 수동 시작은 "에이전트 두 개를 생성해 줘", "이 작업을 병렬로 위임해 줘", 또는 "항목마다 에이전트 하나를 사용해 줘"와 같은 직접적인 지침을 사용하는 것을 의미합니다. 각 하위 에이전트가 자체적으로 모델 및 도구 작업을 수행하므로 하위 에이전트 워크플로는 비슷한 단일 에이전트 실행보다 더 많은 토큰을 사용합니다.
좋은 하위 에이전트 프롬프트는 작업을 나누는 방법, Codex가 계속 진행하기 전에 모든 에이전트를 기다려야 하는지 여부, 반환할 요약 또는 출력의 형태를 설명해야 합니다.
Review this branch with parallel subagents. Spawn one subagent for security risks, one for test gaps, and one for maintainability. Wait for all three, then summarize the findings by category with file references.모델 및 추론 선택하기
에이전트마다 필요한 모델 및 추론 설정이 다릅니다.
ChatGPT Work에서는 작성기에서 모델과 지능 수준을 선택하세요. 선택한 모델에 따라 사용할 수 있는 지능 수준에는 Light, Medium, High, Extra High, Max 가 포함될 수 있습니다. Ultra 는 자격 요건을 충족하는 계정과 지원되는 모델에서만 사용할 수 있습니다. 최대 수준의 추론을 사용하며 ChatGPT가 적합한 작업을 하위 에이전트에게 선제적으로 위임할 수 있게 합니다.
다른 지능 수준에서는 작업을 병렬로 위임하려면 하위 에이전트를 명시적으로 요청하세요.
하위 에이전트 모델이나 model_reasoning_effort를 구성하지 않으면
하위 에이전트는 상위 에이전트의 모델과 추론 수준을 상속합니다. 명시적인
생성 요청이나 [agents] 기본값으로 모델을 선택했지만
추론 수준을 명시하거나 구성하지 않았다면, 하위 에이전트는 해당 모델의 기본
추론 수준을 사용합니다. 각 작업에 맞게 지능, 속도, 비용의 균형을 조절하려면
프롬프트에서 특정 모델이나 추론 수준을 요청하거나,
[agents] 기본값을 config.toml에 구성하거나, model 및
model_reasoning_effort를 사용자 지정 에이전트 파일에 직접 설정하세요.
예를 들어 빠른 탐색에는 gpt-6-luna를 사용하고, 더 까다로운 추론에는 추론 수준을 높인 gpt-6.1-sol 구성을 사용하세요.
모델 선택
gpt-6.1-sol: 까다로운 작업을 수행하는 에이전트에는 이 모델부터 사용하세요. 더 넓은 맥락에서 계획, 도구 사용, 검증, 끝까지 이어지는 실행이 필요한 모호한 다단계 작업에 사용하세요.gpt-6-luna: 명확하거나 반복적이거나 처리량이 많은 작업을 빠르게 수행하는, 범위가 좁은 에이전트에 사용하세요.
추론 강도(model_reasoning_effort)
GPT-6.1 Sol에서는 클라이언트와 선택한 모델이 지원하는 추론 수준을
사용하세요. 모델을 명시적으로 설정할 때는 GPT-6 Luna의 경우 high, GPT-6 Astra의 경우 low로
시작하세요. 선택한 모델이 지원하는 수준 내에서 작업에 맞게 조정하세요.
ultra: 선택한 모델이 지원하는 경우 가장 깊이 있는 추론에 사용하세요.max및xhigh: 선택한 모델이 이 수준을 지원하는 경우 특히 까다로운 추론에 사용하세요.high: 에이전트가 복잡한 논리를 추적하거나, 가정을 확인하거나, 예외적인 경우를 처리해야 할 때 사용하세요(예: 검토 에이전트나 보안 중심 에이전트).medium: 속도와 깊이의 균형을 맞춥니다.low: 작업이 단순하고 속도가 가장 중요할 때 사용하세요.
추론 강도이 높을수록 응답 시간과 토큰 사용량이 늘어나지만 복잡한 작업의 품질을 개선할 수 있습니다. 자세한 내용은 모델, 구성 기본 사항, 구성 참조를 참조하세요.
오케스트레이션 및 스레드 제어
ChatGPT 또는 Codex는 새 하위 에이전트 생성, 후속 지침 전달, 결과 대기, 에이전트 스레드 종료를 포함하여 에이전트 간 오케스트레이션을 처리합니다.
많은 에이전트가 실행 중이면 Codex는 요청된 모든 결과를 사용할 수 있을 때까지 기다린 다음 통합된 응답을 반환합니다.
대부분의 지능 수준에서는 직접 요청한 후 ChatGPT가 에이전트를 생성합니다. Ultra를 사용하면 병렬 작업이 유용할 때 ChatGPT가 선제적으로 작업을 위임할 수도 있습니다.
현재 로컬 Codex 릴리스는 직접 요청하거나 적용 가능한 프로젝트 또는 스킬 지침이 있을 때 에이전트를 생성합니다.
프로젝트에서 실제 작동 방식을 확인하려면 다음 프롬프트를 사용해 보세요.
I would like to review the following points on the current PR (this branch vs main). Spawn one agent per point, wait for all of them, and summarize the result for each point.
1. Security issue
2. Code quality
3. Bugs
4. Race
5. Test flakiness
6. Maintainability of the code하위 에이전트 관리하기
하위 에이전트 를 열어 읽기 전용 활성 및 완료 목록을 확인하세요. 완료된 하위 에이전트를 선택하여 세부 정보와 결과를 검토하세요. 웹 사이드바에는 하위 에이전트 활동이 표시되지만, 개별 하위 에이전트를 중지하거나 지시를 변경하는 제어 기능은 제공되지 않습니다.
- 기본 스레드에 표시된 활동에서 하위 에이전트 스레드를 열어 작업 내용을 검토하세요.
- 실행 중인 하위 에이전트의 지시를 변경하거나 중지하거나 완료된 하위 에이전트 스레드를 닫도록 Codex에 직접 요청하세요.
- CLI에서
/subagents를 사용하여 활성 에이전트 스레드 간에 전환하고 진행 중인 스레드를 확인하세요. - 실행 중인 하위 에이전트에 지시하거나, 중지하거나, 완료된 에이전트 스레드를 닫도록 Codex에 직접 요청하세요.
- 백그라운드 에이전트 패널을 사용할 수 있다면 펼쳐서 상태를 확인하거나, 활성 하위 에이전트를 중지하거나, 하위 에이전트 스레드를 여세요.
- 실행 중인 하위 에이전트에 지시를 내리거나, 중지하거나, 완료된 하위 에이전트 스레드를 닫도록 Codex에 직접 요청하세요.
승인 및 샌드박스 제어
하위 에이전트는 현재 샌드박스 정책을 상속합니다.
ChatGPT Work는 호스팅 환경에서 하위 에이전트를 실행하며, 로컬 Codex 샌드박스나 승인 모드 제어 기능을 제공하지 않습니다. 하위 에이전트는 상위 채팅에서 사용할 수 있는 도구를 사용합니다. 웹사이트와 커넥터 권한은 각 도구별로 적용됩니다.
하위 에이전트는 작성기 아래에서 선택한 권한 모드를 상속합니다. Codex에 작업 위임을 요청하기 전에 상위 턴의 권한 모드를 선택하세요.
대화형 CLI 세션에서는 기본 스레드를 보고 있는 동안에도 비활성 에이전트
스레드에서 승인 요청이 표시될 수 있습니다. 승인 오버레이에는
소스 스레드 레이블이 표시되며, 요청을 승인하거나 거부하거나 응답하기 전에 o를 눌러 해당 스레드를 열 수 있습니다.
비대화형 흐름이나 실행에서 새 승인 요청을 표시할 수 없는 경우에는 새 승인이 필요한 작업이 실패하고 Codex가 오류를 상위 워크플로에 반환합니다.
하위 에이전트는 부모 턴의 현재 샌드박스 및 승인 설정을 상속하며,
여기에는 /permissions 또는 --yolo로 변경한 내용도 포함됩니다. 사용자 지정 에이전트 파일은
이 설정을 대체할 수 없습니다.
하위 에이전트는 입력창 아래에서 선택한 권한 모드를 상속합니다. Codex에 작업 위임을 요청하기 전에 상위 턴의 권한 모드를 선택하세요.
샌드박스 및 승인 제어는 부모 세션에서 설정하세요. 사용자 지정 에이전트 지침으로 에이전트에게 편집을 피하도록 요청할 수는 있지만, 별도의 읽기 전용 샌드박스가 생성되지는 않습니다.
사용자 지정 에이전트
Codex에는 다음과 같은 기본 제공 에이전트가 포함되어 있습니다.
default: 범용 대체 에이전트입니다.worker: 구현 및 수정에 중점을 둔 실행형 에이전트입니다.explorer: 읽기 작업의 비중이 높은 코드베이스 탐색 에이전트입니다.
직접 사용자 지정 에이전트를 정의하려면 개인 에이전트의 경우
~/.codex/agents/ 아래에, 프로젝트 범위 에이전트의 경우 .codex/agents/ 아래에 독립형 TOML 파일을
추가하세요.
각 파일은 사용자 지정 에이전트 하나를 정의합니다. 사용자 지정 에이전트는 모델 설정과 지침을 변경하거나 지원되는 기능을 비활성화할 수 있습니다. 부모의 권한, 공급자, MCP server를 상속하며, 사용자 지정 에이전트 파일에서 이러한 설정을 재정의할 수는 없습니다.
모든 독립형 사용자 지정 에이전트 파일은 다음을 정의해야 합니다.
namedescriptiondeveloper_instructions
사용자 지정 에이전트 파일에 model 또는 model_reasoning_effort를 설정하면
파일의 값이 우선합니다. 파일을 적용하기 전에 Codex는 각 설정을 결정할 때
명시적인 생성 요청 값, 해당 [agents] 기본값,
부모의 값 순서로 확인합니다. 명시적인 생성 요청이나 [agents] 기본값에서
모델을 선택하고 어느 쪽에서도 추론 강도를 지정하지 않으면 Codex는
해당 모델의 기본 추론 강도를 사용합니다. model만 설정한 사용자 지정 에이전트 파일은
앞서 결정된 추론 강도를 유지합니다. 선택한 모델이 해당 추론 강도를 지원하지 않거나
다른 추론 강도를 사용하려면 파일에 model_reasoning_effort도
설정하세요. 스킬은 부모에서 상속되며, 사용자 지정 에이전트는
skills.config로 개별 스킬을 비활성화할 수 있습니다.
전역 설정
전역 하위 에이전트 설정은 여전히 구성의 [agents] 아래에 있습니다.
| 필드 | 유형 | 필수 여부 | 용도 |
|---|---|---|---|
agents.enabled |
boolean | 아니요 | 멀티 에이전트 도구를 활성화하거나 비활성화합니다. |
agents.max_concurrent_threads_per_session |
number | 아니요 | 기본 에이전트를 제외하고 동시에 열 수 있는 생성된 에이전트 스레드 수를 제한합니다. |
agents.default_subagent_model |
string | 아니요 | 생성된 에이전트의 기본 모델을 설정합니다. |
agents.default_subagent_reasoning_effort |
string | 아니요 | 생성된 에이전트의 기본 추론 강도를 설정합니다. |
agents.interrupt_message |
boolean | 아니요 | 에이전트 턴이 중단되면 모델에 표시되는 메시지를 기록합니다. |
참고:
agents.enabled의 기본값은true입니다. 멀티 에이전트 도구를 비활성화하려면false로 설정하세요.agents.max_concurrent_threads_per_session을 설정하지 않으면 Codex가 기본값을 선택합니다. 기존 구성에서는agents.max_threads를 레거시 별칭으로 계속 사용할 수 있습니다.- 명시적 생성 값은
agents.default_subagent_model및agents.default_subagent_reasoning_effort보다 우선합니다. agents.interrupt_message의 기본값은true입니다. 에이전트 컨텍스트에서 모델에 표시되는 중단 메시지를 생략하려면false로 설정하세요.- 사용자 지정 에이전트 이름이
explorer같은 기본 제공 에이전트와 일치하면 사용자 지정 에이전트가 우선합니다.
사용자 지정 에이전트 파일 스키마
| 필드 | 유형 | 필수 여부 | 용도 |
|---|---|---|---|
name |
string | 예 | Codex가 이 에이전트를 생성하거나 참조할 때 사용하는 에이전트 이름입니다. |
description |
string | 예 | Codex가 이 에이전트를 사용해야 하는 경우를 설명하는 사용자용 지침입니다. |
developer_instructions |
string | 예 | 에이전트의 동작을 정의하는 핵심 지침입니다. |
model, model_reasoning_effort, model_reasoning_summary,
model_verbosity로 모델 동작을 사용자 지정하세요.
허용되는 값은 구성 참조에서
확인하세요.
사용자 지정 에이전트의 기능을 제한하려면 지원되는 기능 키를 false로 설정하세요:
features.shell_tool, features.apps, features.plugins,
features.memories 또는 features.request_permissions_tool. 개별 스킬은
skills.config로, 번들 스킬은
skills.bundled.enabled = false로 비활성화하세요. skills.include_instructions = false를 설정하면
자동으로 포함되는 스킬 지침 블록을 생략할 수 있습니다. 관리형 요구 사항은 계속 적용됩니다.
sandbox_mode, approval_policy,
model_provider, mcp_servers를 비롯한 다른 세션 설정은
사용자 지정 에이전트 파일에 넣어도 부모 구성을 재정의하지 않습니다. 서비스 등급도 루트
세션의 기본 설정을 따릅니다. 에이전트가 MCP server를 사용할 수 있도록 부모 세션에서
구성하세요.
Codex는 name 필드로 사용자 지정 에이전트를 식별합니다. 파일 이름을
에이전트 이름과 일치시키는 것이 가장 간단한 규칙이지만, name 필드가 최종
기준입니다.
사용자 지정 에이전트 예시
가장 효과적인 사용자 지정 에이전트는 범위가 좁고 명확한 관점을 가집니다. 각 에이전트에 분명한 역할과 그 역할에 맞는 도구 범위, 그리고 인접한 작업으로 벗어나지 않도록 하는 지침을 제공하세요.
예제에서는 로그인한 계정이나 워크스페이스에 액세스 권한이 있을 때 GPT-6.1 Sol을 사용합니다. 사용할 수 없다면 사용 가능한 모델을 선택하세요.
예시 1: PR 검토
이 패턴은 검토 작업을 세 개의 전문 사용자 지정 에이전트로 나눕니다.
pr_explorer는 코드베이스를 파악하고 근거를 수집합니다.reviewer는 정확성, 보안 및 테스트 위험을 찾습니다.docs_researcher는 전용 MCP server를 통해 프레임워크 또는 API 문서를 확인합니다.
프로젝트 구성(.codex/config.toml):
[agents]
max_concurrent_threads_per_session = 8
[mcp_servers.openaiDeveloperDocs]
url = "https://developers.openai.com/mcp".codex/agents/pr-explorer.toml:
name = "pr_explorer"
description = "Read-only codebase explorer for gathering evidence before changes are proposed."
model = "gpt-6-luna"
model_reasoning_effort = "high"
developer_instructions = """
Stay in exploration mode.
Do not edit files.
Trace the real execution path, cite files and symbols, and avoid proposing fixes unless the parent agent asks for them.
Prefer fast search and targeted file reads over broad scans.
""".codex/agents/reviewer.toml:
name = "reviewer"
description = "PR reviewer focused on correctness, security, and missing tests."
model = "gpt-6.1-sol"
model_reasoning_effort = "medium"
developer_instructions = """
Review code like an owner.
Do not edit files.
Prioritize correctness, security, behavior regressions, and missing test coverage.
Lead with concrete findings, include reproduction steps when possible, and avoid style-only comments unless they hide a real bug.
""".codex/agents/docs-researcher.toml:
name = "docs_researcher"
description = "Documentation specialist that uses the docs MCP server to verify APIs and framework behavior."
model = "gpt-6-luna"
model_reasoning_effort = "high"
developer_instructions = """
Use the docs MCP server to confirm APIs, options, and version-specific behavior.
Return concise answers with links or exact references when available.
Do not make code changes.
"""
이 설정은 다음과 같은 프롬프트에 적합합니다.
Review this branch against main. Have pr_explorer map the affected code paths, reviewer find real risks, and docs_researcher verify the framework APIs that the patch relies on.예시 2: 프런트엔드 통합 디버깅
이 패턴은 UI 회귀, 불안정한 브라우저 흐름 또는 애플리케이션 코드와 실행 중인 제품에 걸친 통합 버그를 처리할 때 유용합니다.
프로젝트 구성(.codex/config.toml):
[agents]
max_concurrent_threads_per_session = 6
[mcp_servers.chrome_devtools]
url = "http://localhost:3000/mcp"
startup_timeout_sec = 20.codex/agents/code-mapper.toml:
name = "code_mapper"
description = "Read-only codebase explorer for locating the relevant frontend and backend code paths."
model = "gpt-6-luna"
model_reasoning_effort = "high"
developer_instructions = """
Map the code that owns the failing UI flow.
Do not edit files.
Identify entry points, state transitions, and likely files before the worker starts editing.
""".codex/agents/browser-debugger.toml:
name = "browser_debugger"
description = "UI debugger that uses browser tooling to reproduce issues and capture evidence."
model = "gpt-6.1-sol"
model_reasoning_effort = "medium"
developer_instructions = """
Reproduce the issue in the browser, capture exact steps, and report what the UI actually does.
Use browser tooling for screenshots, console output, and network evidence.
Do not edit application code.
""".codex/agents/ui-fixer.toml:
name = "ui_fixer"
description = "Implementation-focused agent for small, targeted fixes after the issue is understood."
model = "gpt-6-luna"
model_reasoning_effort = "high"
developer_instructions = """
Own the fix once the issue is reproduced.
Make the smallest defensible change, keep unrelated files untouched, and validate only the behavior you changed.
"""
[[skills.config]]
path = "/Users/me/.agents/skills/docs-editor/SKILL.md"
enabled = false이 설정은 다음과 같은 프롬프트에 적합합니다.
Investigate why the settings modal fails to save. Have browser_debugger reproduce it, code_mapper trace the responsible code path, and ui_fixer implement the smallest fix once the failure mode is clear.