Skip to content

feat: 빈 입력창 화면 판정 제거, 사람 보호는 최근 키 입력(30초)으로 통일 - #182

Merged
fwkyle merged 7 commits into
mainfrom
kyle/feat/drop-screen-input-check
Oct 17, 2026
Merged

fwkyle merged 7 commits into
mainfrom
kyle/feat/drop-screen-input-check

Conversation

@fwkyle

@fwkyle fwkyle commented Oct 17, 2026 •

Copy link
Copy Markdown
Owner

Why

실행기 업데이트로 화면 모양이 바뀌면 checkEmptyInput(프롬프트·자리표시자·테두리·바닥글 모양 판정)이 빈 입력창을 "안 보낸 글"로 오판해 발령과 알림이 통째로 막혔다(devin·claude 9-23, herdr 폭 10-11, codex 0.163 10-17 #180). kyle 결정(슈퍼감독 우편 b01a931e): 사람 글에 우편이 가끔 붙는 것보다 발령이 막히는 쪽이 더 치명적이므로 화면 판정을 없애고, 사람 보호는 그 창에 붙은 사람이 30초 안에 키를 눌렀는가(tmux client_activity) 하나로 통일한다.

받아들인 손해 (분명히)

  • 사람이 글을 치다가 30초 넘게 손을 떼고 그대로 두면, 그 글 뒤에 우편이 붙어 제출될 수 있다.
  • 사람 입력은 client_activity > client_created(초 단위, 차이 1초 이상)로 센다. 붙기·크기 바꾸기·paste-buffer·send-keys는 활동 값을 바꾸지 않아(격리 tmux 실측) 붙기만 한 창은 입력이 아니다. 한계 둘: (1) 붙은 바로 그 초 안에 친 키는 놓친다. (2) 붙은 뒤 터미널 응답 같은 입력이 다음 초에 들어와 활동이 바뀌면 그 창은 30초 보류된다. 막히는 것은 start 첫 안내뿐이고 start는 성공하며 발령은 30초 뒤에 간다.
  • herdr는 사람 입력 시각을 얻을 수 없어 카드·일반 우편이 사람 보호 없이 간다(아래 방침 b).

변경

  • tmux: checkHumanIdle 하나를 카드(checkCardPane)·알림(checkNotificationPane)·일반 우편(sendTmux 기본 경로)이 같이 쓴다. 붙여넣기 전·후 두 번 본다. 숫자 아닌 값 KADAN_HUMAN_ACTIVITY_UNKNOWN(실패 닫힘), client 없음 통과, 우회는 force === true뿐. 일반 우편이 막히면 not-sent + KADAN_HUMAN_ACTIVE("사람이 이 창에서 최근 입력함 — 잠시 뒤 다시 보내라"), 새 대기열 없음(peer 우편의 peerStore() 보관은 그대로).
  • 남긴 안전장치: checkPaneMode, pane_dead, PID 대조, matchesAiProcess, sendTmuxEnter의 모드 검사. 화면 판정에만 쓰던 cursor_y·cursor_x·pane_width 조회 제거.
  • 지운 코드: checkEmptyInput(export 포함), PROMPT_LINE, EMPTY_INPUT_PLACEHOLDERS, CLAUDE_PLACEHOLDER, ANSI, allDimAfterPrompt, isInputRule, CODEX_HINT_PART·isCodexHintLine(fix: codex 0.163 두 줄 바닥글 빈 입력창 인식 #180), herdr의 inputFrame·herdrInputFrame·OBSERVE_FRAME. 입력 큐 배너 감지(watch-queued-input 등)는 건드리지 않았다. KADAN_PANE_INPUT_PENDING/UNKNOWN은 옛 기록 표시용으로 notification-guard.mjs·dashboard-band.mjs에 주석과 함께 남김.

herdr 방침: (b) 카드·일반 우편은 사람 검사 없이 보낸다

(a) "화면 30초 안정" 검사는 안정 기록을 프로세스 메모리 맵(herdrNotificationGuard의 quiet)에 둔다. 장수 프로세스인 감시기에서만 의미가 있고, kadan send·dispatch는 호출마다 새 프로세스라 이전 관측을 기억하지 못해 늘 처음 관측으로 보류된다(= 항상 막힘). 그래서 (b). 알림의 30초 안정 검사는 유지. 지문에서 frame.row는 뺐다(화면 글이 바뀌면 같이 바뀌어 정보가 늘지 않음). KADAN_HERDR_SCROLLED·agent_status·승인 대기·PID/AI 프로세스 검사는 그대로, 화면 truncated면 거절하는 완전성 검사도 유지(KADAN_HERDR_INPUT_UNKNOWN).

rottie (코드 읽기만, 실제 로티는 부르지 않음)

src/floor-rottie.mjs의 sendRottieText/send(session, text)는 cardIdentity·notificationGuard를 받지 않고 입력 보호가 전혀 없다(본문 파일 → terminal send --no-enter → 출력 대기 → Enter 파일 전송). 바닥에 notificationHold도 없어 감시기 보류도 지원하지 않는다. 이 코드가 쓰는 로티 CLI 동사는 status/workspace/terminal/recovery이고 terminal show/send/wait/read/close/create뿐이며 사람 입력 시각을 주는 호출은 쓰이지 않는다. 로티 CLI 전체 목록은 실제 로티를 부르지 않는 규칙 때문에 확인하지 않았다. 동작 변경 없음.

지우거나 다시 쓴 시험

파일 시험 처리 이유
herdr-input-width.test.mjs 파일 전체 삭제 checkEmptyInput 폭 판정 시험
herdr-input-scrollback.test.mjs 파일 전체 삭제 같은 함수의 행 좌표 시험
ai-identity-send-boundaries "붙여넣기 전 거부" 화면 표 약 45건(미제출 입력·세로 문자·가짜 프롬프트/구분선·claude/devin 화면·codex 0.163 바닥글·Try 예시·흐림 글씨·프롬프트 없는 화면·입력 상태 미확인·버퍼 준비 중 사용자 입력) 삭제 화면 모양 판정 자체가 없어짐
같은 파일 "실제 대기 화면(devin·claude·codex)의 빈 입력창에는 카드를 붙여넣는다", "과거 출력과 본문의 프롬프트·상태 줄…거부" 삭제 같은 이유
같은 파일 죽은 pane·cat 교체·AI 뒤에서만 남음·모델 불일치/미확인·프로세스 조회 실패·버퍼 준비 중 죽음 유지(상태 문자열만 `pid dead`로)
같은 파일 (신규) 9/23 사고 재현(5초 전 입력 → 알림·카드·일반 우편 모두 KADAN_HUMAN_ACTIVE·not-sent·붙여넣기 0), 60초 전/client 없음 통과, 여러 client, 값 숫자 아님, 화면에 쓰던 글 모양이어도 사람 활동 없으면 전송(capture-pane 0회), 알림 기준 시간, force 통과, 두 번 검사, notificationHold 추가 새 기준. 가짜 run은 paste가 client_activity를 바꾸지 않는다는 전제(실제 tmux도 키 입력만 셈)
herdr-floor "미제출 입력이면 본문 요청이 없다", "미제출 입력이 있으면 응답 중 여부와 무관하게 거절" 삭제→"카드·일반 우편은 화면에 미제출 글처럼 보이는 내용이 있어도 보낸다(방침 b)"로 교체 방침 b
같은 파일 "알림 유예 중…", "알림 전송 직전 입력이 생기면…" 기대 코드를 KADAN_PANE_INPUT_PENDING → KADAN_HUMAN_ACTIVE(화면이 바뀌면 30초 새로)로 모양 판정 제거
같은 파일 "입력 커서는 터미널의 실제 세로 줄 수로 관찰한다" 삭제 herdrInputFrame 삭제
같은 파일 (신규) 알림 경로도 truncated 화면은 거절 추가 완전성 검사 유지 확인
send-buffer 가짜 run 7곳 list-clients가 빈 값을 돌려주도록 일반 우편도 사람 입력 시각을 본다
watch-notify-hold 슈퍼 간 우편 실제 tmux 시험 "쓰다 만 글 입력" → 제어 모드 client를 붙여 보류 확인 모양 판정 제거
automatic-review-cli 자동 발령도 기존 미제출 입력 보존 제목·검증을 "사람이 붙어 최근 입력했으면 거부"로 같은 이유
ai-identity-boundaries-cli partial-input, 에디터 입력 버퍼(가짜 프롬프트·테두리·세로 문자 등) 구역, input-during-load 화면 구역 삭제, "쓰던 글만 있고 사람 없음 → 전송", "사람 client 붙음 → 거절", "버퍼 준비 중 사람 붙음 → 거절"로 교체 같은 이유

경로별 보호

경로 tmux herdr rottie
카드 pane 종료·PID·AI 프로세스·모드 + 사람 입력 30초(전·후 2회) PID·AI 프로세스·승인 대기·agent_status(idle/done)·스크롤·잘린 화면. 사람 검사 없음(b) 없음
알림(감시) 모드 + 사람 입력 30초(전·후 2회) 위 + 화면 30초 안정 없음(notificationHold 없음)
일반 우편 모드 + 사람 입력 30초(전·후 2회). 막히면 not-sent 위 카드와 같음, working 허용. 사람 검사 없음(b) 없음
peer(슈퍼 간) 일반 우편과 같고 막히면 peerStore() 보관 같음 없음
force(5번째 강제) 사람 검사 건너뜀, 복사모드 해제 후 재확인 안정 검사 건너뜀, PID·승인 대기·스크롤·잘린 화면은 유지 해당 없음

dispatch가 막히면

guardedSend는 floor.send가 던지면 send/dispatch 원장을 쓰기 전에 끝난다(전문 시도였다면 send-failed만 남음). 그래서 kadan dispatch·work execute --dispatch가 KADAN_HUMAN_ACTIVE로 막혀도 실행 카드는 assigned로 남고 발령 기록은 없다. 시험 근거: ai-identity-boundaries-cli(dispatch·send 증가 0), automatic-review-cli(auto-step → exception, 발령 0). 사람이 없는 시간에 send --task로 다시 보내면 된다.

검증

  • 격리 npm test: pass 1943 / fail 0 (env -u KADAN_ROLE -u KADAN_ROTTIE_BIN KADAN_HOME=$(mktemp -d) KADAN_SOCKET=t-$RANDOM KADAN_WINDOW=none KADAN_NOTIFY=off npm test)
  • npm run check:public: 0 issue
  • 문서: design.md·architecture.md·peer-super-mail.md·watch-overview.md·flows.md·automatic-review.md·kadan-guide.html·herdr-roundtrip.md 갱신

머지는 kyle 승인 뒤.

🤖 Generated with Claude Code

fwkyle and others added 7 commits October 17, 2026 17:50
실행기 업데이트로 화면 모양이 바뀌면 checkEmptyInput이 빈 입력창을 미제출 글로 오판해
발령과 알림이 통째로 막혔다(devin·claude 9-23, herdr 폭 10-11, codex 0.163 10-17).
tmux는 카드·알림·일반 우편이 같은 client_activity 30초 검사 하나를 쓰고, herdr는
화면 판정과 inputFrame을 지웠다. 받아들인 손해: 30초 넘게 손을 뗀 쓰던 글 뒤에 우편이 붙을 수 있다.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
tmux는 client가 붙는 순간 client_activity를 client_created와 같게 두고 키 입력으로만 갱신한다
(격리 소켓 실측). 활동이 붙은 시각보다 1초 넘게 뒤일 때만 사람 입력으로 센다.
로티 탭이 시작과 동시에 붙어도 첫 안내와 발령이 막히지 않는다.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
초 단위 값에서 activity - created > 1 규칙은 붙은 뒤 약 1.25초에 친 문장을 놓쳤다(검수 P2).
활동이 붙은 시각보다 뒤이면(차이 1초 이상) 사람 입력으로 센다.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fwkyle
fwkyle merged commit 01d3200 into main Oct 17, 2026
4 checks passed
@fwkyle
fwkyle deleted the kyle/feat/drop-screen-input-check branch October 17, 2026 11:15
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