Skip to content

fix: geny-executor 2.64.8~2.65.2 이식 — 턴이 멈추던 두 경로 포함 (2.69.0) - #1

Merged
CocoRoF merged 1 commit into
mainfrom
fix/port-geny-cli-and-memory-fixes
Aug 11, 2026
Merged

fix: geny-executor 2.64.8~2.65.2 이식 — 턴이 멈추던 두 경로 포함 (2.69.0)#1
CocoRoF merged 1 commit into
mainfrom
fix/port-geny-cli-and-memory-fixes

Conversation

@CocoRoF

@CocoRoF CocoRoF commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

XGEN 은 geny-executor 2.64.7 에서 갈라져 독자적으로 가지만, 같은 뿌리에서 온 결함은 여기에도 그대로 있다.

해당 파일들을 전수 대조했다 — 갈라진 이후의 차이는 포매팅뿐이었고, 아래 넷은 전부 미이식 상태였다. 버전 번호가 2.68.1 로 Geny(2.65.2)보다 커서 최신처럼 보이지만, 그 번호는 개명·CI·의존성 정리로 오른 것이다.

무엇 (앞의 둘은 프로덕션에서 턴이 멈춘다)

🔴 2.65.2 — 끝난 CLI 가 제 stdout 으로 턴을 붙잡는다

파이프의 EOF 는 마지막 writer 가 닫을 때 온다. CLI 는 MCP 서버를 자식으로 띄우고 그 자식들이 stdout 을 물려받으므로, 하나라도 CLI 보다 오래 살면 readline() 이 영영 오지 않을 바이트를 기다린다.

proc.wait() 로도 못 푼다 — asyncio 는 자식 종료 모든 파이프 해제를 둘 다 봐야 완료로 치는데, 누수된 FD 가 정확히 그 두 번째 조건을 막는다. 완전한 답을 만들어 놓고 턴이 멈춘다.

🔴 2.65.1 — 죽은 핫스페어가 이후 모든 턴을 세운다

returncode 는 장부일 뿐이다. 거둬지기 전까지 None 이라 죽은 프로세스가 영원히 "건강한 스페어" 로 읽히고, 턴은 죽은 파이프에 프롬프트를 건넨다. kill(pid, 0) 으로 커널에 직접 묻는다.

🟠 2.65.0 — 노트를 지워도 색인 행이 남는다

부팅 전방 스캔으로는 못 잡는다 — 존재하는 파일을 훑는 루프는 없는 파일을 방문하지 않아서 쌓이기만 한다. Geny 프로드 볼트 하나가 색인의 36% 가 고아였다.

🟡 2.64.8 — DocGuide(path=)

이쪽만 통째 복사가 맞지 않았다 (XGEN 은 edit2docs 패키지명과 토픽 목록이 갈라져 있다). 손으로 적용했고, fmt= 를 모르는 구버전 엔진에서는 조용히 예전 동작으로 돌아간다.

검증

  • pytest 4747 passed, 15 skipped
  • 재현 테스트 test_cli_leaked_stdout.py 이식 — 프로드 실패 형태를 정확히 재현한다(완전한 답, rc=0, FD 를 쥔 자식 하나). 이식 전 리비전에서 4건 중 3건이 실패하는 것을 확인했다
  • ruff check + ruff format --check 클린

🤖 Generated with Claude Code

XGEN 은 2.64.7 에서 갈라져 독자적으로 가지만, **같은 뿌리에서 온 결함은
여기에도 그대로 있다.** 해당 파일들을 전수 대조한 결과 갈라진 이후의 차이는
포매팅뿐이었고, 아래 넷은 전부 미이식이었다.

**2.65.2 — 끝난 CLI 가 제 stdout 으로 턴을 붙잡는다.** 파이프의 EOF 는 마지막
writer 가 닫을 때 온다. CLI 가 띄운 MCP 자식이 stdout 을 물려받아 살아남으면
readline() 은 아무도 다시 쓰지 않을 파이프에서 영원히 막힌다. proc.wait() 도
구조가 안 된다 — asyncio 는 자식 종료 + 모든 파이프 해제를 둘 다 봐야
완료시키는데, 누수된 FD 가 바로 그 두 번째 조건을 막는다. 완전한 답을 만들어
놓고 턴이 멈춘다.

**2.65.1 — 죽은 핫스페어가 이후 모든 턴을 세운다.** returncode 는 장부일
뿐이라 거둬지기 전까지 None 이고, 죽은 프로세스가 영원히 건강한 스페어로
읽힌다. kill(pid, 0) 으로 커널에 직접 묻는다.

**2.65.0 — 노트를 지워도 색인 행이 남는다.** 부팅 전방 스캔으로는 못 잡는다 —
존재하는 파일을 훑는 루프는 없는 파일을 방문하지 않아서 쌓이기만 한다.

**2.64.8 — DocGuide(path=)**. XGEN 의 토픽 집합에 맞춰 손으로 적용했다(이쪽은
edit2docs 패키지명과 토픽 목록이 갈라져 있어 통째 복사가 맞지 않았다).

재현 테스트를 함께 가져왔다. `test_cli_leaked_stdout.py` 는 프로드 실패 형태를
정확히 재현한다 — 완전한 답, 정상 종료(rc=0), FD 를 쥔 자식 하나. 이식 전
리비전에서 4건 중 3건이 실패하는 것을 확인했다.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@CocoRoF
CocoRoF merged commit fbad37e into main Aug 11, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant