ํ๋ค์ค ์์ง๋์ด๋ง์ ํต์ฌ์ โ๋ชจ๋ธ์ ๋ ๋๋ํ๊ฒ ์ฐ๋ ๋ฒโ๋ณด๋ค ํ์ด ํ๋ค๋ฆฌ์ง ์๊ฒ ์ด์ ๊ตฌ์กฐ๋ฅผ ์ค๊ณํ๋ ๋ฒ์ ์์ต๋๋ค. OpenAI๊ฐ ๊ณต๊ฐํ Codex ์ด์ ์ฌ๋ก๋ฅผ ๋ณด๋ฉด, ์ฌ๋์ด ์ง์ ์ฝ๋๋ฅผ ๋ ์ฐ๋ ๋์ ์ ์ฅ์ ๊ตฌ์กฐยท๊ฐ๋๋ ์ผยทํผ๋๋ฐฑ ๋ฃจํ์ ๋ ๋ง์ ์๊ฐ์ ํฌ์ํ์ ๋ ์๋์ ์์ ์ฑ์ด ํจ๊ป ์ฌ๋ผ๊ฐ๋๋ค.
์ค๋ฌด์์๋ ์ญํ ์ ํ, ์ ์ฅ์ ์ง์๊ตฌ์กฐ, ์๋ ๊ฒ์ดํธ, ์ฃผ๊ฐ GC ๋ฃจํ์ฒ๋ผ ๋ฐ๋ก ์ด์์ ๋ถ์ผ ์ ์๋ ์ถ๋ถํฐ ์ ์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ ๋๋ค.
์๋ด: ์ด ๋ฌธ์๋ ์์ฑํ AI๋ฅผ ํ์ฉํด ์ด์์ ์์ฑํ๊ณ , ๊ณต๊ฐ ๊ทผ๊ฑฐ ๋ฌธ์๋ฅผ ๋ฐํ์ผ๋ก ์ฌ๋์ด ๊ฒํ ยท๋ณด์ ํ์ต๋๋ค.
์ด ๊ธ์ ๊ทผ๊ฑฐ ์๋ฃ
- OpenAI Harness engineering (ํต์ฌ ์ฌ๋ก)
- Codex execution plans (๊ณํ ์ํฐํฉํธ ์ด์)
- Prompt engineering guide (์ง์ ๋ช ํ์ฑ)
- GitHub Actions (๊ฒ์ดํธ ์๋ํ)
ํต์ฌ ์์ฝ
- ํ๋ค์ค์ ๋ชฉ์ ์ 1ํ ์ฑ๊ณต์ด ์๋๋ผ ๋ฐ๋ณต ๊ฐ๋ฅํ ์ฑ๊ณต๋ฅ ์ ๋์ด๋ ๊ฒ์ด๋ค.
- ์ ์ฅ์๋ ์ฝ๋ ์ฐฝ๊ณ ๊ฐ ์๋๋ผ ์ด์ ์ง์์ ์์คํ ์ค๋ธ ๋ ์ฝ๋๊ฐ ๋์ด์ผ ํ๋ค.
- ๊ท์น์ ๋ฌธ์ฅ์ผ๋ก ๊ถ๊ณ ํ์ง ๋ง๊ณ , ๋ฆฐํธ/ํ ์คํธ/๊ฒ์ดํธ๋ก ๊ฐ์ ํด์ผ ์ค๋ ๊ฐ๋ค.
- ์์จ์ฑ์ ๋์ผ์๋ก โ๊ธฐ๋ฅโ๋ณด๋ค โ๊ด์ธกยท๋ณต๊ตฌยทGCโ๊ฐ ๋ ์ค์ํด์ง๋ค.
flowchart LR A["๋ชฉํยท๋ฒ์ ๊ณ ์ "] --> B["๊ฐ๋๋ ์ผ ์ ์\n(๊ธ์ง/ํ์ฉ/์น์ธ)"] B --> C["์์ด์ ํธ ์คํ"] C --> D["๊ด์ธก ๋ก๊ทธ ์์ง"] D --> E["์๋ ๊ฒ์ดํธ ํ์ "] E --> F["ํผ๋๋ฐฑ ๋ฐ์\n(ํ๋กฌํํธ/ํ ์คํธ)"] F --> A
์๊ฐํ (Excalidraw)
!
- ์๋ณธ ํธ์ง ํ์ผ:
Agent/Archive/OpenAI ๋น์ฆ๋์ค ํ์ฉ/images/openai-biz-14-harness-loop.excalidraw
๐ง ์น ํ ์นํธ์ํธ
- ์ฌ๋์ ๋ฐฉํฅ์ ์ ํ๊ณ , ํ๋ค์ค๋ ๋ฐ๋ณต ํ์ง์ ์งํจ๋ค
- AGENTS๋ ๋ฐฑ๊ณผ์ฌ์ ์ด ์๋๋ผ โ๋ชฉ์ฐจโ์ฌ์ผ ํ๋ค
- ๋ก๊ทธ ์์ด ๋ณต๊ตฌ๋ ์๋ค, ๊ฒ์ดํธ ์์ด ์ผ๊ด์ฑ์ ์๋ค
- ์ฃผ๊ฐ GC๋ ๋์ฒญ์๊ฐ ์๋๋ผ โ๋งค์ผ ์์ ๋ถ์ฑ ์ํโ์ด๋ค
OpenAI ์ฌ๋ก์์ ๋ฐ๋์ ๊ฐ์ ธ์์ผ ํ 6๊ฐ์ง
1) ์์ง๋์ด ์ญํ ์ ํ: ์ฝ๋ ์์ฑ์ โ ํ๊ฒฝ ์ค๊ณ์
OpenAI ์ฌ๋ก์ ํต์ฌ ๋ฉ์์ง๋ ๋ช ํํฉ๋๋ค. ์๋์ ๋ณ๋ชฉ์ ๋ชจ๋ธ ์ฑ๋ฅ๋ณด๋ค ํ๊ฒฝ์ ๋ช ํ์ฑ์์ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์์ด์ ํธ๊ฐ ์คํจํ ๋ ์ฌ๋์ โ๋ ์ข์ ํ๋กฌํํธโ๋ฅผ ๊ณ ๋ฏผํ๊ธฐ๋ณด๋ค, ์ด๋ค ๋ฅ๋ ฅ์ด ์ ์ฅ์์ ๋น ์ก๋์ง(๋๊ตฌ/๋ฌธ์/๊ฒ์ฆ)๋ฅผ ๋จผ์ ์ฑ์์ผ ํฉ๋๋ค.
์ค๋ฌด ์ ์ฉ:
- ์์ ์คํจ๋ฅผ โ๊ฐ์ธ ์ค์โ๊ฐ ์๋๋ผ โ์์คํ ๋๋ฝ ์ ํธโ๋ก ๋ถ๋ฅ
- ์คํจ ํฐ์ผ๋ง๋ค
๋๋ฝ ๋ฅ๋ ฅ1๊ฐ๋ฅผ ๋ฌธ์ ๋๋ ๋๊ตฌ๋ก ํ์ - ๊ฐ์ ์คํจ๊ฐ 2ํ ๋ฐ๋ณต๋๋ฉด ์๋ ๊ฒ์ดํธ ํ๋ณด๋ก ์น๊ฒฉ
์ฐธ๊ณ : https://openai.com/index/harness-engineering/
2) AGENTS๋ ๋ชฉ์ฐจ, ์ ์ฅ์๊ฐ ์์คํ ์ค๋ธ ๋ ์ฝ๋
๊ธด AGENTS 1๊ฐ์ ๋ค ๋ฃ๋ ๋ฐฉ์์ ๊ธ๋ฐฉ ๋ก์ต๋๋ค. OpenAI ์ฌ๋ก์ฒ๋ผ AGENTS๋ฅผ ์งง์ ๋ชฉ์ฐจ๋ก ๋๊ณ , ์์ธ ๊ธฐ์ค์ docs/๋ก ๋ถ๋ฆฌํ๋ฉด ์์ด์ ํธ์ ์ฌ๋ ๋ชจ๋ ํ์ ๋น์ฉ์ด ์ค์ด๋ญ๋๋ค.
์ค๋ฌด ์ ์ฉ:
AGENTS.md: 80~120์ค ์ด๋ด(์์น/๋งํฌ/๊ธ์ง/์น์ธ)docs/ops/: runbook, error-codes, execution-plans ๋ถ๋ฆฌ- ๋ฌธ์ ์ ์ ๋ ์ฒดํฌ๋ฅผ CI๋ก ๊ฐ์
์ฐธ๊ณ : https://cookbook.openai.com/articles/codex_exec_plans
3) ์ ํ๋ฆฌ์ผ์ด์ ์์ฒด๋ฅผ ์์ด์ ํธ๊ฐ ์ฝ์ ์ ์๊ฒ ๋ง๋ค๊ธฐ
OpenAI ์ฌ๋ก์์ ์ธ์์ ์ธ ๋ถ๋ถ์ UI/๋ก๊ทธ/๋ฉํธ๋ฆญ์ ์์ด์ ํธ๊ฐ ์ง์ ๋ค๋ฃจ๊ฒ ๋ง๋ ์ ์ ๋๋ค. ์ฆ โ์ฝ๋๋ง ์ฝ๋ ์์ด์ ํธโ๊ฐ ์๋๋ผ โ์คํ ์ํ๋ฅผ ๋ณด๋ ์์ด์ ํธโ๋ก ํ์ฅํ ๊ฒ์ ๋๋ค.
์ค๋ฌด ์ ์ฉ:
- ์์ ๋จ์ ํ๊ฒฝ(worktree/dev env) ๋ถ๋ฆฌ
- DOM ์ค๋ ์ท/์คํฌ๋ฆฐ์ท/๋ก๊ทธ ์ฟผ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ํ์คํ
- PR ํ ํ๋ฆฟ์ ์ฌํ ์ฆ๊ฑฐ(์คํฌ๋ฆฐ์ท/๋ก๊ทธ) ์ฒจ๋ถ ๊ฐ์
์ฐธ๊ณ : https://openai.com/index/harness-engineering/
4) ์ํคํ ์ฒ์ ์ทจํฅ์ โ๋ถ๋ณ์โ์ผ๋ก ๊ฐ์
๋ฌธ์๋ง์ผ๋ก ๊ตฌ์กฐ๋ฅผ ์งํค๊ธด ์ด๋ ต์ต๋๋ค. OpenAI ์ฌ๋ก์ฒ๋ผ ๊ฒฝ๊ณ/์์กด ๋ฐฉํฅ/๋ก๊น ๊ท์น์ ๋ฆฐํธ์ ๊ตฌ์กฐ ํ ์คํธ๋ก ์๋ ํ์ ํด์ผ, ์๋๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ตฌ์กฐ๊ฐ ๋ฌด๋์ง์ง ์์ต๋๋ค.
์ค๋ฌด ์ ์ฉ:
- ์์กด ๋ฐฉํฅ ์๋ฐ์ CI ์ฆ์ ์คํจ
- ๊ฒฝ๊ณ ์ ๋ ฅ ํ์ฑ(typed schema) ๊ฐ์
- ํ์ผ ํฌ๊ธฐ/๋ค์ด๋ฐ/๋ก๊ทธ ํ์ ๊ฐ์ ์ทจํฅ ๊ท์น๋ ์ฝ๋ํ
์ฐธ๊ณ : https://platform.openai.com/docs/guides/prompt-engineering
5) ์ฒ๋ฆฌ๋์ด ๋ฐ๋๋ฉด ๋ณํฉ ์ฒ ํ๋ ๋ฐ๋๋ค
์์ด์ ํธ ์ฒ๋ฆฌ๋์ด ์ฌ๋ ๋ฆฌ๋ทฐ ์ฒ๋ฆฌ๋์ ๋๊ธฐ๋ฉด, ์ ํต์ ์ธ โ๋ฌด๊ฑฐ์ด ์ ์ฐจ๋จโ ๋ฐฉ์์ ๋ณ๋ชฉ์ด ๋ฉ๋๋ค. ํต์ฌ์ ๋ฌด์กฐ๊ฑด ๋์จํ๊ฒ ๊ฐ๋ ๊ฒ ์๋๋ผ, ์งง์ PR + ์๋ ๋ณต๊ตฌ ๊ฐ๋ฅํ ๊ฒ์ดํธ๋ก ๋ฆฌ์คํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ๋๋ค.
์ค๋ฌด ์ ์ฉ:
- PR ํฌ๊ธฐ ์ ํ(์๊ฒ ์ชผ๊ฐ๊ธฐ)
- flaky ํ ์คํธ๋ ์ฅ๊ธฐ ๋ธ๋กํน ๋์ ํ์ ๋ณต๊ตฌ ๋ฃจํ๋ก ์ฒ๋ฆฌ
- ์น๋ช ๊ฒ์ดํธ์ ๊ถ์ฅ ๊ฒ์ดํธ๋ฅผ ๋ถ๋ฆฌํด ์ด์
์ฐธ๊ณ : https://docs.github.com/en/actions
6) ์ํธ๋กํผ๋ ์ฃผ๊ฐ GC๋ก ๊ด๋ฆฌ
OpenAI ์ฌ๋ก์์ โ๊ธ์์ผ๋ง๋ค AI slop ์ ๋ฆฌโ๊ฐ ํ์ฅ ๋ถ๊ฐ๋ฅํ๋ค๊ณ ๋ฐํ ๋ถ๋ถ์ด ์ค์ํฉ๋๋ค. ํด๋ฒ์ ํ๊ณ ๊ฐ ์๋๋ผ ์ง์ GC ์๋ํ์ ๋๋ค.
์ค๋ฌด ์ ์ฉ:
- golden principles 5๊ฐ ๋ด์ธ๋ก ๋ช ์
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ ๋ฆฌ ์์ด์ ํธ(์ค๋ณต/์ฃฝ์ ์ฝ๋/๊ท์น ์๋ฐ) ์ด์
- ์ ์ํ ๋ฆฌํฉํ ๋ง์ ์๋๋จธ์ง ํ๋ณด๋ก ๋ถ๋ฆฌ
์ฐธ๊ณ : https://openai.com/index/harness-engineering/
๋ฐ๋ก ์ฐ๋ ์ฝ๋ 2์ข
A) AGENTS๋ฅผ โ๋ชฉ์ฐจโ๋ก ์ ์งํ๋ ์ต์ ํ ํ๋ฆฟ
# AGENTS.md (์์ฝ๋ณธ)
- ๋ชฉํ: ๋ฐ๋ณต์
๋ฌด ์๋ํ ์์ ์ด์
- ์ฐ์ ์์: ์ ํ์ฑ > ์์ ์ฑ > ์๋
- ๊ธ์ง: ์น์ธ ์๋ ์ธ๋ถ ๋ฐ์ก / ์๋ณธ ๋ฐ์ดํฐ ์ง์ ๋ณํ
- ํ์ ๋ก๊ทธ: error_code, failed_step, next_action, owner
- ์์ธ ์ด์ ๊ธฐ์ค: docs/ops/runbook.md
- ์ฅ์ ์ฝ๋ ์ฌ์ : docs/ops/error-codes.md
- ์คํ ๊ณํ: docs/ops/execution-plans/B) Harness ๋ก๊ทธ ์คํค๋ง ๊ฒ์ฌ๊ธฐ
# scripts/harness_check.py
import json
import sys
from pathlib import Path
REQUIRED = {"error_code", "failed_step", "next_action", "owner"}
def main(path: str) -> int:
p = Path(path)
if not p.exists():
print(f"[FAIL] log file not found: {path}")
return 1
missing_count = 0
for i, line in enumerate(p.read_text(encoding="utf-8").splitlines(), start=1):
if not line.strip():
continue
row = json.loads(line)
missing = [k for k in REQUIRED if not row.get(k)]
if missing:
missing_count += 1
print(f"[FAIL] line {i}: missing {missing}")
if missing_count:
print(f"[RESULT] failed rows: {missing_count}")
return 1
print("[PASS] harness log schema ok")
return 0
if __name__ == "__main__":
sys.exit(main(sys.argv[1]))30๋ถ ๋์ ๋ฃจํด (์ค๋ ๋ฐ๋ก ์ ์ฉ)
- 8๋ถ: AGENTS๋ฅผ ๋ชฉ์ฐจํ์ผ๋ก ์ค์ด๊ณ ์์ธ ๊ท์น์ docs๋ก ๋ถ๋ฆฌ
- 7๋ถ: ๋ก๊ทธ 4ํ๋(
error_code,failed_step,next_action,owner) ๊ณ ์ - 10๋ถ: CI์
harness_check.py + ํ ์คํธ์ฐ๊ฒฐ - 5๋ถ: GC ํ 1๊ฑด ๋ฑ๋ก(์ค๋ณต/๋ฏธ์ฌ์ฉ/๊ท์น์๋ฐ ์ค ํ1)
์๋ฃ ๊ธฐ์ค:
- ์ฅ์ ์ฌํ ์๊ฐ ๋จ์ถ
- ๋์ผ ์์ธ ์ฅ์ ์ฌ๋ฐ ๊ฐ์
- PR ํธ์ฐจ(ํ์ง/ํ์) ๊ฐ์
๋ฏธ๋ ์ฌ๋ก 2๊ฐ
์ฌ๋ก A) ์๋๋ ๋น ๋ฅธ๋ฐ QA๊ฐ ๋ณ๋ชฉ์ธ ํ
์ด๊ธฐ์ PR์ด ๋น ๋ฅด๊ฒ ๋์์ง๋ง ์ฌ๋ QA๊ฐ ๋ฐ๋ผ๊ฐ์ง ๋ชปํ์ต๋๋ค. ์ดํ ๋ก๊ทธ/๊ฒ์ดํธ/์ฆ๊ฑฐ ์ฒจ๋ถ๋ฅผ ํ์คํํ์, QA๊ฐ โํ์ โ์ด ์๋๋ผ โํ์ ์โ ์ญํ ๋ก ๋ฐ๋์ด ์ฒ๋ฆฌ๋์ด ์์ ํ๋์ต๋๋ค.
์ฌ๋ก B) ๋ฌธ์๋ ๋ง์๋ฐ ์คํ์ด ํ๋ค๋ฆฌ๋ ํ
AGENTS ์ฅ๋ฌธ ๋ฌธ์๋ฅผ ์์๋ ์ค์ ํ๋์ ์ผ๊ด๋์ง ์์์ต๋๋ค. AGENTS๋ฅผ ๋ชฉ์ฐจํ์ผ๋ก ์ค์ด๊ณ docs๋ฅผ ๋ฆฐํธ๋ก ๊ด๋ฆฌํ์, ๋ฌธ์ ์ต์ ์ฑ์ด ์ ์ง๋๊ณ ์์ด์ ํธ์ ์ฌํ์ฑ์ด ์ฌ๋ผ๊ฐ์ต๋๋ค.
๋ค์ ์ฝ๊ธฐ
- ๐งฉ 11. ์ด์: ๋ฐ๋ณต์ ๋ฌด ์๋ํ ์ค์
- ๐งฉ 12. ์ด์: 11ํธ ๋ค์ ์๋ํ ๊ฟํ
- ๐งฉ 13. ์ด์: ์๋ํ ์คํจ๋ณต๊ตฌยท์น์ธํ๋ฆ ๊ฟํ
- ๐งฉ15-์ด์-ํ๋กฌํํธ-์บ์ฑ-์ค์