Skip to content

feat: 실행기 명령 표와 기억 유지 재시작 kadan restart - #159

Merged
fwkyle merged 7 commits into
mainfrom
kyle/feat/runner-table-restart
Oct 15, 2026
Merged

fwkyle merged 7 commits into
mainfrom
kyle/feat/runner-table-restart

Conversation

@fwkyle

@fwkyle fwkyle commented Oct 14, 2026

Copy link
Copy Markdown
Owner

Why

실행기(codex·claude·agy 등)를 업데이트하거나 설정을 바꾼 뒤, 역할의 대화 기억은 그대로 두고 프로그램만 다시 띄우고 싶다. 실행기마다 다른 "같은 대화 다시 열기·대화 ID 찾기" 지식을 코드 곳곳이 아니라 데이터 표 한 곳(runner-settings.json의 runners.<실행기>)에 두고, 그 위에서 kadan restart <역할>이 동작한다.

변경

  • 실행기 명령 표: spawn 옆에 선택 칸 resume·fork·exec·version·update·conversation. 칸이 없는 옛 설정은 그대로 읽히고, 빈 칸은 "이 실행기는 … 미지원"으로 거절. kadan runners runner <실행기> --table <JSON>으로 채운다. (src/runner-table.mjs, src/runner-settings.mjs)
  • 대화 ID 찾기 일반 함수 둘: open-file(열린 파일 이름 정규식)·pid-json(PID별 JSON 필드 + match 일치 + stored 저장 확인). 0개·여러 개·불일치·미저장은 거절, "가장 최근" 추측 없음.
  • kadan restart <역할> [--force] (src/restart.mjs, src/commands/restart.mjs): 거절 가능한 확인(대화 확정·저장 확인·명령 재조립·끝나지 않은 카드)을 모두 끄기 전에. 이후 stop(restart 표시) → 같은 작업 폴더·옵션·대화 resume으로 start(restartOf). 비서는 kadan up과 같은 체크포인트 경로.
  • 세대 연속: restartOf를 mail-generation.mjs(우편·책임 공용)와 watch-roles.mjs(감시 발령 맵)에서 이어감으로 처리.
  • agy 정식 등록: AI_HARNESS_NAMES, conversationOf(agy --conversation·devin --resume = 같은 대화), 문서의 정체 목록.
  • 공용 src/process-tree.mjs(자손 PID·열린 파일)를 비서 복원과 공유.

어댑터 금지와의 경계

CLAUDE.md의 다중 provider 어댑터 금지는 실행기별 코드 분기·능력 심사 계층이다. 이 표는 spawn과 같은 수준의 명령 문자열 데이터이고, 새 코드에는 실행기 이름으로 갈라지는 분기가 없다(시험이 코드 검색으로 확인). 코드는 틀 채우기 한 곳과 대화 ID 찾기 일반 함수 둘만 안다. 출력 해석은 표에 넣지 않는다. 예외 하나: conversationOf는 원장에 이미 쌓인 옛 start를 다시 해석하므로(append-only) 설정이 아니라 코드에 옵션 읽기를 둔다. 남는 위험은 pid-json을 지금 claude만 쓴다는 점(경로·필드·match가 데이터라 재사용 가능).

결정·한계

  • codex는 lock이 아니라 rollout 파일로 찾는다: 첫 입력 전엔 lock만 열려 있고 그 ID로 resume이 되는지 미실측이라, restart가 끄기 전에 거절한다. claude도 stored(jsonl 존재)로 같은 보호.
  • devin·omo의 conversation 칸은 비웠다(devin: 첫 입력 전 resume 미실측, omo: ID가 폴더 이름이라 두 방식에 안 맞음).
  • 감시 AI·시니어는 codex만 유지. exec는 틀만(설명 AI 연결은 후속). 대시보드 버튼·실행 모델 화면 표 보이기는 후속.
  • stop→start 사이 몇 초는 감시가 죽음으로 볼 수 있다(표시 없음, docs/commands.md에 한계 기록).
  • 끝나지 않은 카드 판정은 kadan stop이 알리는 것과 같은 pendingCardsFor다(새 판정 없음).

검증

  • 신규 시험 tests/runner-table.test.mjs·tests/restart.test.mjs(세대 회귀: 우편·책임·감시 발령, 거절 시 stop 0회, --force, 비서 up과 start 사건 비교).
  • 격리 소켓·빈 폴더에서 claude·codex·agy 실제 왕복: 띄우기 → 한 마디 → restart → 같은 대화 확인. omo는 resume·exec 실측.
  • 전체 시험 1594건 중 1건(discord-chat N3, 부하 간헐)이 병렬 실행에서 실패, 단독 실행 30/30 통과.

🤖 Generated with Claude Code

@fwkyle
fwkyle merged commit 7cbcbd8 into main Oct 15, 2026
4 checks passed
@fwkyle
fwkyle deleted the kyle/feat/runner-table-restart branch October 15, 2026 00:50
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