νλ€μ€ μμ§λμ΄λ§μ ν΅μ¬μ βλͺ¨λΈμ λ λλνκ² μ°λ λ²βλ³΄λ€ νμ΄ νλ€λ¦¬μ§ μκ² μ΄μ ꡬ쑰λ₯Ό μ€κ³νλ λ²μ μμ΅λλ€. 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/OpenAI λΉμ¦λμ€ νμ©/images/openai-biz-14-harness-loop.png
- μλ³Έ νΈμ§ νμΌ:
Agent/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λ₯Ό λ¦°νΈλ‘ κ΄λ¦¬νμ, λ¬Έμ μ΅μ μ±μ΄ μ μ§λκ³ μμ΄μ νΈμ μ¬νμ±μ΄ μ¬λΌκ°μ΅λλ€.