본문으로 건너뛰기

© 2026 Molayo

Dev.to헤드라인2026. 05. 23. 09:29

Codex CLI가 어떻게 48시간 만에 3개의 릴리스를 배포하도록 도왔는지, 그리고 무엇이 잘못되었는지

요약

Codex CLI(gpt-5.5 기반)를 활용하여 3개의 오픈 소스 3D 프린팅 프로젝트에서 15개의 버그를 수정하고 86개의 테스트를 추가한 사례를 분석합니다. 워크플로우의 효율성과 OpenCV 충돌, JSON 오류 등 실제 해결된 기술적 문제들을 다룹니다.

핵심 포인트

  • Codex CLI를 통한 대규모 버그 수정 및 테스트 자동화 성공
  • OpenCV 버전 충돌 및 0으로 나누기 등 에지 케이스 해결
  • 상세한 프롬프트와 diff 검토를 포함한 효율적인 워크플로우
  • JSON 데이터 손상 및 재귀 호출 위험 등 안정성 개선

저는 세 가지 오픈 소스 3D 프린팅 도구를 관리하고 있습니다: SupportSage (AI 최적화 서포트 구조), Printsight (사진 기반 품질 검사), 그리고 FilamentDB (필라멘트 파라미터 데이터베이스)입니다. 이틀 동안, Codex CLI (gpt-5.5)는 세 프로젝트 모두에 걸쳐 15개의 버그를 수정하고, 86개의 새로운 테스트를 추가하며, 통합된 CLI를 배포하는 것을 도왔습니다. 무엇이 잘 작동했는지, 무엇이 망가졌는지, 그리고 제가 다르게 했을 방식은 무엇인지 소개합니다.

세 가지 프로젝트
이 세 가지 도구는 하나의 폐쇄 루프(closed loop)를 형성합니다:

FilamentDB ──→ SupportSage ──→ 3D Print ──→ Printsight ↑ │ └─────────── Feedback loop ←───────────────┘

  • FilamentDB는 선택된 필라멘트에 대한 최적의 프린트 설정을 SupportSage에 알려줍니다.
  • SupportSage는 최적화된 서포트 구조를 생성합니다.
  • Printsight는 결과를 검사하고 품질 데이터를 학습 엔진으로 다시 피드백합니다.

각 도구는 pip를 통해 독립적으로 설치할 수 있었습니다. 목표는 이들을 하나의 CLI 아래로 통합하고 누적된 버그를 수정하는 것이었습니다.

Codex CLI: 제가 사용한 워크플로우
ChatGPT Plus를 통해 gpt-5.5를 사용하는 Codex CLI v0.133.0을 사용했습니다. 패턴은 다음과 같았습니다:

  1. 수정할 모든 버그를 설명하는 상세한 프롬프트(prompt) 작성
  2. 프로젝트 루트에서 codex exec "$(cat prompt.txt)" 실행
  3. 차이점(diff) 검토
  4. 누락된 테스트 추가
  5. 커밋(Commit) 및 푸시(Push)

이 방식은 세 프로젝트 모두에서 잘 작동했습니다. 프롬프트에는 정확한 파일 경로, 줄 번호, 예상 동작 및 검증 명령어가 포함되었습니다.

Codex가 잘 해낸 것
Printsight: 버그 5개, 테스트 16개
이전 상태: 테스트가 저장소에 존재하지 않는 이미지 파일에 대해 서브프로세스(subprocess) 호출을 실행했습니다. 모든 테스트가 소리 없이 멈춰버렸습니다(hung).
Codex가 수정한 사항:

  • 버전 간 OpenCV 충돌: cv2.fitLine()은 OpenCV 버전에 따라 다른 타입을 반환합니다. 기존 코드는 float에 인덱싱을 시도했는데, 이는 최신 OpenCV에서 충돌을 일으킵니다.
  • 0으로 나누기(Division by zero): 방향 벡터가 0일 때 워핑(Warping) 감지 과정에서 0으로 나누기가 발생할 수 있었습니다.
  • 확인되지 않은 반환 값: cv2.imencode()의 반환 값이 무시되어 쓰레기 데이터(garbage data)가 들어갈 위험이 있었습니다.
  • 에지 케이스(Edge cases): 완전한 검은색 또는 완전한 흰색 이미지가 감지기를 충돌시켰습니다.
  • 더 나은 테스트: 합성 numpy 배열을 사용하여 전체 테스트 스위트를 16개의 적절한 단위 테스트(unit tests)로 다시 작성했습니다 (외부 이미지가 필요하지 않음).

FilamentDB: 버그 4개, 테스트 42개
이전 상태: 테스트가 전혀 없었습니다.

Codex가 수정한 사항:

  • 손상된 JSON 충돌 (Corrupted JSON crash): try/except 없이 json.load()를 사용하여 손상된 데이터베이스 파일이 있을 경우 CLI가 충돌함
  • 재귀 위험 (Recursion risk): 브랜드 기본값으로 폴백(fallback)할 때 recommend()가 재귀적으로 자기 자신을 호출하여 스택 오버플로(stack overflow) 위험이 있음
  • 빈 쿼리가 모든 항목과 일치함 (Empty query matched everything): search("")가 모든 항목을 반환함. 문자열 내에서 "" in string은 항상 True이기 때문
  • 테스트 누락 (Missing tests): search, recommend, compare, alternatives, list, 빈 데이터베이스, 손상된 JSON을 다루는 42개의 테스트 추가

SupportSage: 버그 6개, 테스트 84개
이전 상태: 테스트 77개
Codex가 수정한 사항:

  • 업데이트되지 않는 파라미터 (Unupdated parameter): borderline_angle이 학습 루프(learning loop)에서 업데이트되지 않아 항상 기본값만 반환함
  • 너무 느린 학습 (Too-slow learning): 각도 업데이트에 0.1 감쇠(damping)를 곱하여, 20개 이상의 레코드가 있어도 변화가 거의 없음
  • 검증 누락 (Missing validation): quality_score가 음수 값이나 100을 초과하는 값을 허용함
  • 부분적 파일 해시 (Partial file hash): 해시 폴백(fallback) 시 STL 파일의 처음 64KB만 읽어 해시 충돌(collision)이 발생함
  • 취약한 JSON 로딩 (Fragile JSON loading): 손상된 JSON 발생 시 프린터/재료 프로필 로딩이 충돌함
  • 품질 점수 무시 (Ignored quality score): 캘리브레이션(Calibration) 업데이트 시 출력 품질을 완전히 무시함

위의 모든 사항은 예상대로 작동했습니다. Codex가 버그를 찾아내고, 수정 코드를 작성했으며, 제가 이를 승인했습니다.

Codex가 틀린 부분
승인 함정 (The approval trap)
첫 번째 Codex 실행 시도 시 21분 동안 아무런 출력 없이 실행되었습니다. 저는 단순히 속도가 느린 것이라고 생각했지만, 알고 보니 승인을 기다리며 멈춰(hung) 있었던 것이었습니다.
Codex의 설정에 approval = OnRequest로 되어 있었습니다. exec 모드에서 파일을 작성해야 할 때, 승인을 위한 TTY가 없었기 때문에 영원히 차단(block)되었습니다.
해결책: codex exec --sandbox workspace-write를 사용하면 승인 프롬프트를 우회할 수 있습니다. 다시는 잊지 않도록 cxe 별칭(alias)을 추가했습니다.

하드코딩된 --json 버그
제가 작성한 CLI 통합 코드에 미묘한 버그가 있었습니다. inspect 서브커맨드가 사용자의 요청 여부와 상관없이 항상 Printsight--json 플래그를 전달하는 것이었습니다.
이로 인해 다음과 같은 문제가 발생했습니다:

  • 래퍼(wrapper)의 --json 플래그가 무의미해짐 — JSON 출력이 항상 활성화됨
  • 기본 출력이 사람이 읽을 수 있는 형식이 아닌 JSON으로 설정됨
    Codex는 리뷰 과정에서 이를 포착하여 CRITICAL(심각) 등급으로 표시했습니다. 단 두 줄의 수정으로 해결되었습니다.

Python 3.10 → 3.11 호환성: 저는 TOML 설정 파싱을 위해 Python 3.11의 tomllib을 사용했습니다. Codex는 pyproject.toml이 여전히 >=3.10 지원을 명시하고 있다는 점을 정확히 지적했습니다. 해결책: 이전 Python 버전을 위한 tomli 폴백 (fallback) 임포트를 추가합니다.

stdin 파이프 프롬프트 혼동: codex exec "$(cat prompt.txt)"와 같이 여러 줄의 프롬프트를 전달하는 방식은 신뢰성이 떨어집니다. $(cat ...) 확장은 특수 문자에 의해 깨질 수 있으며, 셸(shell)이 이를 다르게 해석할 경우 프롬프트가 조용히 실패할 수 있습니다. 견고한 패턴: cat prompt.txt | codex exec --sandbox workspace-write "" — 프롬프트를 명령행 인자(command argument) 대신 stdin을 통해 전달합니다.

결과: Phase 1 통합 CLI 작업과 세 차례의 Codex 리뷰를 거친 후:

프로젝트테스트 전테스트 후버그 수정새로운 기능
SupportSage771316CLI 통합, 공유 설정
Printsight0 (깨짐)165
FilamentDB0424
합계7718915CLI, 설정, 로드맵

새로운 CLI 명령:
supportsage inspect photo.jpg # → Printsight로 위임
supportsage filament search PLA # → FilamentDB로 위임
supportsage filament recommend -b "Bambu Lab" -m "PLA Basic"
supportsage filament compare "eSun PLA+" "Overture PETG"

~/.supportsage/config.toml에 저장된 공유 설정:

[printsight]
annotate_default = true # 검사 사진 자동 주석 달기

[filamentdb]
data_dir = "~/.supportsage/data"

다르게 했을 점:

  • Codex exec를 먼저 간단한 프롬프트로 테스트할 것 — 3,700자짜리 프롬프트를 던지기 전에 말입니다. 두 단어짜리 테스트만 했어도 승인 대기(approval hang) 현상을 몇 초 만에 발견했을 것입니다.
  • 프롬프트를 stdin을 통해 파이프(pipe)로 전달할 것 — cat prompt.txt | codex exec ... "" 방식은 셸 이스케이프(shell escaping) 문제를 완전히 방지합니다.
  • 위임된 argv(인자)를 검증하는 CLI 위임 테스트를 작성할 것 — 저의 첫 번째 테스트들은 위임이 일어났는지만 확인했을 뿐, 어떤 인자가 전달되었는지는 확인하지 않았습니다. Codex의 리뷰가 이 부분을 잡아냈습니다.
  • Codex가 모든 것을 작성할 수 있다고 추측하지 말 것 — Phase 1의 경우, Codex가 멈춘 후 결국 제가 직접 코드를 작성해야 했습니다. 버그 수정 작업은 효과적이었지만, 기능 구현 작업은 그렇지 않았습니다.

릴리스 (Releases) 수정 사항이 포함된 패치 릴리스 (patch releases)가 세 프로젝트 모두에 적용되었으며, 통합 CLI (unified CLI)가 포함된 SupportSage v0.7.0이 추가되었습니다:

  • SupportSage v0.7.0
  • Printsight v0.3.0
  • FilamentDB v0.2.0

전체 로드맵 (Full roadmap): docs/ROADMAP.md

AI 자동 생성 콘텐츠

본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.

원문 바로가기
0

댓글

0