📚 連載「床で律する生成ループ — 自己検証エンジンを読む」第1回 / 全5回
生成して、検証して、通らなければまた生成する。この形のループは説明としては単純だが、実装に落とすと途端に「どこまで回すのか」「回っていないときは何をするのか」「途中で人手に渡す条件は何か」を決めなければならない。この連載は、公開されている参照実装のひとつを 1 コミットに固定して読み進め、その決め方を追う。第 1 回は中心にある driver/loop.sh を、回る場所と止まる場所に絞って読む。
上限は既定で外れている
ループの回数上限は環境変数で持ち、既定値がどう振る舞うかがコメントに書かれている。
RINNE_MAX_TASKS (0 = run forever)
読めるのは、この変数が 0 のとき無制限に処理を続ける設計だということ。上限を「回数」で持ちつつ、0 を「上限なし」の番兵にしている。有限回で止めたい運用と、常駐で回し続けたい運用の両方を、同じ変数の値だけで切り替える作りだと読める。実際にどちらで動かしているかはソースからは分からない。
仕事が無いときは回さない
上限の次に決めるべきは、キューが空のときの挙動である。待機の長さも環境変数で持つ。
RINNE_SLEEP (default 30s)
既定は 30 秒。この待機は、処理すべきタスクが無いときに使われる。
queue has no pending task - idle ${SLEEP}s"; sleep "$SLEEP"; continue
pending なタスクが無ければ、待機してから continue でポーリングに戻ると書かれている。ここが重要なのは、空回りが「何もしない待機」として明示的に切り出されている点である。仕事が無いことをエラーにも終了条件にもせず、間隔を空けて再びキューを見に行く。無制限(run forever)と組み合わせると、常駐プロセスとしてキューを監視し続ける骨格になる。
状態はタスクの .status に持つ
回る/止まるの判断は、各タスクが持つ状態に依存する。状態の書き換えは jq で行われている。
jq --arg id "$1" --arg st "$2" '(.tasks[] | select(.id==$id)).status=$st'
id で対象タスクを選び、その .status を第 2 引数の値に置き換えている。状態はプロセスのメモリではなく、タスクごとの .status フィールドとして外部に持つ。どのファイルを書き換えているかは、この一行だけからは特定できない。分かるのは、状態遷移が「タスクの status を更新する」という一点に集約されているという構造である。
失敗を捨てずに pending へ戻す
検証を通らなかったタスクをどう扱うかが、ループが止まるか回り続けるかを分ける。差し戻しの分岐にコメントが添えられている。
*) set_status "$id" pending ;; # HOLD / REVISE / MAX_ITER / UNKNOWN -> retry later
HOLD、REVISE、MAX_ITER、UNKNOWN のいずれでも、status を pending に戻すと書かれている。これらは「失敗して終わり」ではなく、後のイテレーションで再試行される側に置かれる。前節の空回りと合わせると、ループは「done で消える」「pending で戻る」のどちらかにタスクを振り分け続ける構造だと読める。反復の上限に達したことを示す MAX_ITER さえ、この分岐では pending へ戻る側にある点は、ソースを読む際に一度立ち止まる価値がある。
自律から切り出す唯一の出口
pending へ戻さず、自律ループの外へ出す状態がひとつだけ用意されている。
PARKS only ESCALATE_HUMAN for the human
only が付いている。人手に渡すのは ESCALATE_HUMAN だけで、それ以外は自律側で回し続けるという切り分けである。設計意図は同じコメント群に明記されている。
Human involvement = (1) seeding goals, (2) clearing the escalated/ parking lot
人間の関与を、ゴールの初期投入と、切り出された領域のクリア(原文ではこれに続けて ledger の定期監査が挙げられている)に限る、という意図が書かれている。ループの停止条件を「人間が拾う一点」に絞り込み、それ以外の失敗は pending への差し戻しで吸収する。第 1 回で確認できるのはここまでで、実際にどの検証がこの分岐を駆動するのかは次回以降で読む。
出典について
本稿の引用は、公開されている参照実装のソースを ある 1 コミットに固定して 逐語照合したものだけです(2026-09-07 検証)。
読んだ対象は driver/loop.sh です。
連載「床で律する生成ループ — 自己検証エンジンを読む」の前後
- → 第2回: 機械で落とせるものは機械で落とす — 床の実装(公開予定)