상황
여러 작업 세션이 각자 PR을 열고, PR 본문은 임시 파일에 길게 써 둔 뒤 명령줄 도구로 넘긴다. 리뷰어가 PR을 열어 보니 본문에 설명 대신 @/tmp/pr-body.md 한 줄만 있다. PR은 정상적으로 열렸고, 명령은 성공 코드로 끝났고, 아무도 경고를 받지 못했다.
흔한 착각
어떤 명령줄 도구들은 @파일 표기를 "이 파일의 내용을 읽어라"로 해석한다. 그래서 본문 플래그에도 같은 표기가 통할 거라고 가정한다. 하지만 GitHub CLI의 본문 플래그는 받은 값을 글자 그대로 본문으로 쓴다. 파일을 읽게 하려면 별도의 파일 플래그를 써야 한다. 명령이 실패하지 않으니 착각은 출력 어디에도 드러나지 않는다.
실제로 일어난 일
처음 한 건을 발견했을 때 열린 PR 전체를 훑었다. 기준은 "비어 있거나 아주 짧은 본문"이었고, 결과는 0건이었다. 두 시간쯤 뒤 같은 증상이 다른 PR에서 또 나왔다. 이번 본문은 경로 문자열로 시작했지만 그 뒤에 다른 내용이 조금 붙어 있었고, 또 다른 PR은 경로 이름이 길어서 "짧은 본문" 기준을 넘겼다. 첫 점검은 실패의 결과(짧음)를 찾았지, 실패의 원인(경로 문자열)을 찾지 않았다.
무엇을 확인해야 하는가
본문을 쓴 뒤에는 서버에서 본문을 다시 읽어 온다. 첫 줄이 @로 시작하거나 /tmp/ 같은 로컬 경로가 들어 있으면 내용이 아니라 경로가 올라간 것이다. 점검 스크립트를 짤 때는 길이만 보지 말고 이 패턴 자체를 찾고, 길이 기준은 보조 신호로만 쓴다.
고치는 방향
파일에서 본문을 읽을 때는 파일 전용 플래그(--body-file)를 쓴다. 작업 세션에 주는 지시문에도 이 플래그를 명시해서 같은 실수가 세션마다 반복되지 않게 한다. 이미 잘못 올라간 본문은 고쳐야 하는데, 도구의 편집 명령이 다른 이유로 실패한다면 REST API로 PR 본문만 직접 갱신하는 것이 가장 범위가 좁은 수정이다.
확인 방법
고친 뒤 열린 PR 전체를 다시 훑는다. 조건은 두 가지다. 본문에 @/ 경로 패턴이 있는가, 그리고 본문이 비정상적으로 짧은가. 둘 다 0건일 때만 정리가 끝났다고 기록한다. 같은 증상이 한 번 더 나왔다면 그건 우연이 아니라 점검 기준이 틀렸다는 신호다.
The setup
Several automated work sessions each open their own pull request. Each writes a long description into a temporary file and hands it to a command-line tool. A reviewer opens one of the PRs and finds a single line where the description should be: @/tmp/pr-body.md. The PR opened fine, the command exited successfully, and nobody got a warning.
The usual mistake
Some command-line tools read @file as "load the contents of this file," so it is easy to assume a body flag works the same way. The GitHub CLI body flag does not: it uses whatever value it gets as the literal body text. Reading from a file takes a separate file flag. Because nothing fails, the mistake never shows up in any output.
What actually happened
After the first case turned up, every open PR was swept. The criterion was "empty or very short body," and it found nothing. About two hours later the same symptom appeared on another PR. That body started with a path string but had a little more text after it, and a third PR had a path long enough to slip past the length threshold. The first sweep looked for the effect of the failure (short text), not for its cause (a path where content should be).
What to check
After writing a body, read it back from the server. If the first line starts with @ or contains a local path such as /tmp/, a path was posted instead of content. When you write a sweep script, search for that pattern directly and treat length only as a secondary signal.
The fix
Use the dedicated file flag (--body-file) whenever the body comes from a file. Put that flag in the instructions you give to work sessions, so the same slip does not repeat session after session. Bodies that already went out wrong still need repair; if the tool's own edit command fails for an unrelated reason, updating only the PR body through the REST API is the narrowest fix.
How to confirm
After the repair, sweep every open PR again with two conditions: does the body contain an @/ path pattern, and is it abnormally short? Record the cleanup as done only when both come back zero. If the same symptom shows up a second time, that is not bad luck; it means the sweep criterion was wrong.
场景
多个自动化工作会话各自创建拉取请求。每个会话先把很长的说明写进临时文件,再交给命令行工具。评审者打开其中一个 PR,发现本该是说明的地方只有一行:@/tmp/pr-body.md。PR 正常创建,命令以成功状态退出,没有任何人收到警告。
常见的误判
有些命令行工具会把 @文件 理解为“读取这个文件的内容”,于是很容易以为正文参数也一样。但 GitHub CLI 的正文参数不会这样做,它把收到的值原样当作正文。要从文件读取,需要另一个专门的文件参数。因为命令并不失败,这个误判在任何输出里都看不出来。
实际发生了什么
发现第一例之后,把所有打开的 PR 扫了一遍,标准是“正文为空或非常短”,结果是零。大约两小时后,另一个 PR 又出现了同样的症状:这次正文以路径字符串开头,后面还跟了一点别的文字;还有一个 PR 的路径名很长,超过了“过短”的阈值。第一次巡检找的是失败的结果(文字短),而不是失败的原因(本该是内容的地方放了路径)。
该检查什么
写完正文后,从服务器把正文读回来。如果第一行以 @ 开头,或者包含 /tmp/ 这样的本地路径,说明上传的是路径而不是内容。写巡检脚本时,直接搜索这种模式,长度只当作辅助信号。
修复方向
正文来自文件时,一律使用专门的文件参数(--body-file)。把这个参数写进交给工作会话的指令里,避免同样的失误在每个会话里重演。已经发错的正文仍然要修;如果工具自带的编辑命令因为别的原因失败,那么通过 REST API 只更新 PR 正文,是范围最小的修复。
如何确认
修完之后,再把所有打开的 PR 扫一遍,条件有两个:正文里有没有 @/ 路径模式;正文是不是短得不正常。两项都为零,才记录为清理完成。同样的症状如果第二次出现,那不是运气差,而是巡检标准本身错了。
状況
複数の自動化された作業セッションが、それぞれプルリクエストを作る。各セッションは長い説明を一時ファイルに書き、それをコマンドラインツールに渡す。レビュアーが PR を開くと、説明があるはずの場所に @/tmp/pr-body.md という一行だけがある。PR は普通に作られ、コマンドは成功で終わり、誰も警告を受け取っていない。
よくある思い込み
コマンドラインツールの中には @ファイル を「このファイルの中身を読め」と解釈するものがある。だから本文フラグでも同じ書き方が通ると思い込みやすい。だが GitHub CLI の本文フラグは、受け取った値をそのまま本文の文字列として使う。ファイルから読ませるには別のファイル用フラグが要る。コマンドは失敗しないので、この思い込みはどの出力にも現れない。
実際に起きていたこと
最初の一件を見つけたあと、開いている PR を全部見直した。基準は「本文が空、またはとても短い」で、結果はゼロ件だった。二時間ほどして、別の PR で同じ症状がまた出た。今度の本文はパス文字列で始まり、その後ろに少しだけ別の文章が付いていた。さらに別の PR はパス名が長く、「短い本文」の基準をすり抜けていた。最初の点検は失敗の結果(短さ)を探していて、失敗の原因(中身の代わりにパスがあること)を探していなかった。
何を確かめるべきか
本文を書いたら、サーバーから本文を読み戻す。一行目が @ で始まっていたり、/tmp/ のようなローカルパスが入っていたりすれば、中身ではなくパスが投稿されている。点検スクリプトを書くときは、このパターンそのものを探し、長さは補助的なシグナルとしてだけ使う。
直す方向
本文をファイルから読むときは、ファイル専用のフラグ(--body-file)を使う。作業セッションに渡す指示にもこのフラグを明記し、同じ取り違えがセッションごとに繰り返されないようにする。すでに間違って投稿された本文は直す必要がある。ツールの編集コマンドが別の理由で失敗するなら、REST API で PR の本文だけを直接更新するのが、いちばん範囲の狭い修正になる。
確認方法
直したあと、開いている PR をもう一度全部見直す。条件は二つ。本文に @/ のパスパターンがあるか。本文が異常に短くないか。どちらもゼロ件のときだけ、片付けが終わったと記録する。同じ症状がもう一度出たなら、それは運が悪かったのではなく、点検の基準が間違っていたというサインだ。