0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

回すだけでは良くならない。ループの骨格と停止条件を読む

0
Last updated at Posted at 2026-09-04

📚 連載「床で律する生成ループ — 自己検証エンジンを読む」第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回: 機械で落とせるものは機械で落とす — 床の実装(公開予定)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?