도는 세션에 말 걸기
턴이 끝나기를 기다리지 않으셔도 됩니다. 티켓 상세의 진행 기록 아래 입력칸에 한 줄 넣고 보내면 그 문장이 세션의 stdin으로 들어갑니다. 세션은 하던 일을 접고 그 말을 따릅니다. stdin은 실행 중인 프로그램이 바깥에서 글을 받는 통로입니다. 워커 화면의 스트림 다이얼로그에도 같은 칸이 있습니다.

실제 왕복을 찍은 것입니다. 세션이 notes/a.md를 읽은 참에 참견 한 줄이 들어갑니다.
"지금 읽은 것까지만 정리하고, summary.md는 한국어 한 줄로 줄여주세요." 13초 뒤 세션이 남긴
summary.md는 한 줄입니다.
- 입구는 세션마다 FIFO 하나입니다. FIFO는 프로그램끼리 글을 주고받으라고 만드는 특수한
파일이고 먼저 넣은 줄이 먼저 나갑니다. 티켓을 워커에 물리는 디스패처가 티켓을 잡는 순간
만들고, 세션이 끝나면 지웁니다. 이 경로가 티켓 frontmatter의
inbox:값입니다(티켓이 지나는 상태 참고). 세션이 끝나면 값도 같이 비워집니다. - 스트림의 원본은 claude가 이미 쓰고 있는 트랜스크립트입니다. 화면을 위해 새로 남기는 파일이 없습니다.
- 참견은 화면이 지어낸 메아리가 아닙니다. 트랜스크립트에 실제로 남은 줄입니다. 보낸 문장이 그대로 그 세션의 입력 기록에 들어갑니다.
- 창은 세션이 도는 동안만 열려 있습니다. 턴이 끝나면 닫힙니다.
이 창은 스트리밍 입력을 받는 엔진에서만 열립니다(기본값 claude -p). 화면이 칸을 여는 것도
claude 워커입니다. 엔진이 codex처럼 argv로 프롬프트를 한 번에 받는 쪽이면 이 입구 자체가
생기지 않습니다. argv는 프로그램을 띄울 때 이름 뒤에 붙여 넘기는 값이라 한 번 뜬 뒤에는 말을
더 넣을 자리가 없습니다. 어느 엔진으로 뜰지는 그 티켓의 페르소나가 정합니다
(페르소나 §디스패치 정책). 칸이 비활성이면 어느 엔진이라 못 받는지를 그
자리가 말해 줍니다.
최초 프롬프트는 이 입구를 안 씁니다. FIFO 대신 파일로 먹입니다. 프롬프트가 파이프 버퍼(64KB)를 넘으면 쓰는 쪽이 막히고 그 상태의 엔진은 시작조차 못 하고 멎습니다. 워커가 여섯쯤 되면 그 교착이 매번 납니다. 그래서 파일 한 방을 먼저 붙이고, 그다음 줄부터 FIFO가 stdin이 됩니다. 사람이 미는 참견은 그 뒤에 오는 줄들입니다.
파일 첨부
입력칸에는 파일도 겁니다. 클립 손잡이로 고르거나 그냥 붙여넣으시면(⌘V) 됩니다.
스크린샷을 찍어 바로 붙이는 것이 이 기능의 주 용도입니다. 고른 순간 올라갑니다. 화면은 그것을
칩으로 들고 있다가 보낼 때 본문에 합칩니다.
첨부는 바이트를 실어 보내지 않습니다. 파일을 놓고 그 경로를 프롬프트에 적습니다.
이 칸이 보내는 것은 FIFO에 들어가는 한 줄이라 이미지가 들어갈 자리가 없습니다. 대신 받는 쪽에
Read가 있으니, 앱은 파일을 세션이 닿는 자리에 놓고 그 절대경로를 프롬프트 끝에 붙입니다.
<사람이 쓴 본문>
첨부 파일 — 아래 경로를 Read로 읽어라:
/Users/.../myproject/.dira/attachments/ab12cd34-screenshot.png- 놓이는 자리는
<큐 루트>/attachments/입니다. 파일명 앞에 8자리 16진수가 붙어서, 같은 이름을 두 번 붙여도 덮어쓰지 않습니다. 자동 삭제는 없습니다. 티켓 본문과 트랜스크립트가 이 경로를 영구히 참조하므로 지우면 이력이 깨진 링크가 됩니다. 용량 정리는 사람이 합니다. - 상한은 1건 20MB, 한 번에 10개입니다. 넘으면 그 파일만 거절하고 사유가 칩 자리에 남습니다.
종류 제한은 없습니다.
Read가 못 여는 형식이면 세션이 그렇게 말합니다. - 파일 내용을 본문 안에 그대로 옮겨 적지 않습니다. 텍스트 파일이라도 경로만 적습니다. 안 그러면 티켓 본문이 로그 한 벌만큼 불어납니다.
- 붙는 칸은 넷입니다. 요구 접수, 티켓 발행, 여기(참견·이어받기), 프로젝트 홈 질의. 표기는 넷이 같습니다.
- 스크린샷을 두 장 붙이면 칩 둘이 다
image.png입니다. 크롬이 주는 이름이 그것입니다. 디스크에서는 앞의 8자리가 갈라 줍니다. - 드래그 앤 드롭은 없습니다.
에이전트가 스스로 거는 잠금
추측으로 진행하는 대신 되묻습니다. 티켓 본문에 질문을 붙이고 존재하지 않는 파일을
deps로 걸어 아무 워커도 못 집게 만듭니다. 앞에서 본 deps는 아직 안 끝난 티켓을 기다리는
용도였는데(자세한 것은 티켓 직접 발행하기에 있습니다), 여기서는 아예
없는 해시를 건다는 점이 다릅니다. 답을 쓰면 그 파일이 생겨 잠금이 저절로 풀립니다.
- 잠긴 티켓은 큐에서 보입니다. 화면에서 답할 수 있다는 뜻입니다.
- 사람이 상태를 되돌리지 않습니다. 잠금과 해제가 같은 규칙입니다.
- 같은 이유로 죽는 티켓이 세션을 무한히 태우지도 않습니다. 2회까지만 자동 회수하고 3회째는 질문이 됩니다.
- 본문 마지막 절이
## 블록이면 횟수와 무관하게 바로 질문이 됩니다. 세션이 벽을 보고 스스로 멈춘 것이라 다시 돌려 봐야 얻는 게 없어서입니다.
이 네 줄을 실제로 돌리는 것은 reap, 죽은 세션이 남긴 티켓을 거둬들이는 절차입니다.
세션이 죽은 채로 남은 티켓을 발견하면 우선 attempts를 올리며 자동으로 회수해 다시 큐에
돌립니다. 그런데 같은 이유로 두 번 더 죽으면, 즉 3회째부터는 회수 대신 본문에 ## 질문 n을
붙이고 아직 없는 해시를 deps(와 awaiting:)에 걸어 열림으로 되돌립니다. attempts와
무관한 지름길도 있습니다. 되돌린 티켓 본문의 마지막 ## 절이 ## 블록이면 1회째든
2회째든 그 즉시 같은 답변 요청으로 올립니다(tickets.py의 reclaim). 답변 파일이 생기기
전에는 deps가 미충족이라 어떤 워커도 그 티켓을 집어 가지 않습니다. 답이 달리면 attempts는
0에서 다시 셉니다.
다음은 티켓 직접 발행하기입니다.