FRL 自由研究ラボ

AIエージェントことはじめ — LAB 014

人がいない時間に、AIを働かせる(前編)

— 任せる仕事と、無人のモードを決める —

自分が寝ているあいだにも、AI に作業を進めてもらう。便利ですが、 人がいない時間は、昼間と前提が3つ変わります。 確認を出しても答える人がいない・終わったかを誰も見ない・止まらなくても止める人がいない。 この記事では、その3つに備えた小さな夜の仕組みを、ダミーの仕事で試しながら組み立てます。 前編では、任せる仕事を選び、ダミーで試走し、無人で使うモードを決めるところまで進めます。

約30分

全部やる場合の目安

3 STEP

手順の数

最初は週1回

夜の実行の頻度

この記事の道順

  1. はじめに — 人がいないと、何が変わるのか
  2. STEP 1 — 任せる仕事を選ぶ(4つの条件)
  3. STEP 2 — ダミーの場所で、1回だけ試走する
  4. STEP 3 — 無人で使うモードを決め、壁が効くか確かめる
  5. 後編へ

※ LAB 005(戻れる仕組み)、 LAB 010(終了コードで合否を決める)、 LAB 012(AI に勝手をさせない壁)を終えている前提です。 特にLAB 012 の壁(設定の禁止リストとフック)が入っていることが出発点です。 壁なしで夜に任せるのは、お勧めしません。 例は Mac の Claude Code(ターミナルで動く AI エージェント)です。 なお cron(クロン)は、決めた時刻にコマンドを自動で走らせる Mac の仕組みで、STEP 5 で使います。

INTRO

人がいないと、何が変わるのか

LAB 012 で作った壁には、 「たずねる(ask)」という出口がありました。 壁にぶつかったら、人に確認する、という動きです。 画面の前に人がいれば成り立ちますが、夜は答える人がいません。

人がいない実行(claude -p のように、 画面でやり取りせずに1回だけ走らせる形)では、たずねる場面は自動で「拒否」になります。 これは筆者の設定の記録にある挙動で、安全側に倒れる動きです。ただし、その仕事は止まります。

変わるのは、確認のことだけではありません。昼間は無意識にやっている3つの見張りが、夜はぜんぶ消えます。

① 確認に答える人がいない

たずねる場面は自動で拒否になり、仕事が止まる。→ STEP 2・3 で、何が通って何が止まるかを先に調べる

② 終わったかを誰も見ない

AI の「できました」だけが残る。→ 後編の STEP 4 で、LAB 010 の完了条件(終了コード)を付ける

③ 止める人がいない

固まったり暴走したりしても、止めるボタンを押す人がいない。→ 後編の STEP 4 で、時間の上限を付ける

○ 人が見ている時間 AI が壁に ぶつかる 画面に確認が出る (たずねる) 人が答える → 続きを実行 ✕ 人がいない時間(夜) AI が壁に ぶつかる 確認は出るが 答える人がいない 自動で拒否 その仕事は止まる もう1つ:仕事が終わったかどうかも、朝まで誰も見ていません。

筆者のタスクキュー(AI に仕事を1件ずつ自動で任せる自作の仕組み)も、この3つに備えて作っています。 この記事は、その考え方をいちばん小さい形に縮めたものです。

01

STEP 1 — 目安 10分

任せる仕事を選ぶ(4つの条件)

夜に任せられる仕事は、失敗しても困らない形に絞ります。 次の4つを全部満たす仕事だけが候補です。

① 戻せる

朝に見て気に入らなければ、元に戻せる。触る場所を決めたフォルダ1つに絞り、LAB 005 の git で記録しておく。

② 合否が機械で決まる

「ファイルができた」「3行になっている」のように、プログラムが 0 か 1 かで答えられる。「なんとなく良さそう」では決まらない。

③ 外へ出さない

公開・投稿・メール・送金・秘密の値に触る作業は入れない。夜は下書きまで、外へ出す行為は朝に人が押す。

④ 30分以内で終わる

長い仕事は、1回で終わる大きさに分ける。終わらなければ、後編の STEP 4 の上限時間で打ち切る。

筆者の例:このサイトの記事の手入れは、タスクキューが1日1回、自動で巡回して進めています。 ただし任せるのは下書きの手直しまでで、サイトへの公開は人が画面のボタンを押す形にしています(条件③)。 自動で公開まで回すのは、取り返しがつかないので避けました。

候補が思いつかなければ、Claude Code に選別だけさせます。何かを実行させる必要はありません。

私が寝ているあいだに任せたい作業の候補を、3つ挙げて。
それぞれに、次の4条件を○✕で付けて、理由を1行ずつ書いて。
①朝に元へ戻せる ②合否をプログラムが 0/1 で決められる
③外へ出さない(公開・送信・秘密の値に触らない) ④30分以内に終わる
全部が○のものだけ「夜に向く」と判定して。
ファイルの作成や設定の変更は、しないで。

この記事では、「メモを3行に要約する」という小さな仕事で練習します。 本物の仕事は、仕組みが動いてから1つだけ載せ替えます。

✓ ここまでの確認: 任せたい仕事を1つ決め、4条件がすべて○だと確かめた。 迷うものは、今回は見送った(見送って困ることはありません)。

02

STEP 2 — 目安 10分

ダミーの場所で、1回だけ試走する

夜に任せる前に、人がいない実行で何が通り、何が止まるかを、昼のうちに自分の目で見ます。 まず、AI に触らせる専用のフォルダとダミーのメモを作ります。本物のデータは入れません。

mkdir -p ~/night/workspace ~/night/log
cd ~/night/workspace
printf '朝のメモ(ダミー)\n・資料の整理は木曜までに終える\n・来週の予定は月曜に決める\n・買い物リストは別のメモにある\n・古い写真のバックアップが未確認\n' > memo.txt
git init -q
git add memo.txt
git commit -qm "夜の実行の前の状態"

次に、人がいない形で Claude Code を1回だけ呼びます。 claude -p は、画面でやり取りせず、1回の依頼に答えて終わる実行方法です。 --permission-mode は「確認なしで何を通すか」の設定で、 まずは編集だけを通す acceptEdits で、あえてコマンドの実行を頼みます。

cd ~/night/workspace
claude -p "date コマンドを実行して、出力をそのまま教えて" --permission-mode acceptEdits --output-format json

--output-format json を付けると、結果が JSON(決まった書式)で返ります。 見るのは次の2か所です。 終わるまで画面に何も出ないことがあるので、少し待ってください。

画面の前なら確認が出る場面が、無人では実行されないまま終わるわけです。 止められた操作は permission_denials に並び、result には 「許可が出なかったので実行できませんでした」という趣旨の文章が返ることが多いでしょう。 エラーにはならず、正常終了に見える点に注意してください。止まったことに気づくには、この一覧を見る必要があります (結果は版や設定で変わるので、自分の環境で必ず確かめます)。

「正常終了」は「やり遂げた」ではありません。 止められても、実行そのものは成功の形で終わります。だから 後編の STEP 4 では、AI の返事ではなく 仕事の成果物そのものを検査して合否を決めます。

✓ ここまでの確認: ~/night/workspace に memo.txt を置いた。 試走の結果で、permission_denials を自分の目で読めた。

03

STEP 3 — 目安 10分 / 選び方の山場

無人で使うモードを決め、壁が効くか確かめる

人がいない実行では、モード(確認なしで通す範囲)の選び方が、そのまま安全性になります。 Claude Code には何種類かあり、筆者は2026-09-08 に、無人の実行で次のように振る舞うことを実測しました (環境やバージョンで変わりえます。自分の環境でも STEP 3-2 で確かめてください)。

先に、この節で出る言葉を3つだけ。 Bashは、ターミナルのコマンドを実行する道具。 フックは、コマンドの実行直前に中身を検査して、危ないものを止める仕組み。 サンドボックスは、箱の中だけで動かす仕組み。 フックとサンドボックスは LAB 012 で作った壁の一部です。

acceptEdits ファイルの編集:通る Bash:通らない (無人では承認待ち=拒否) 向く仕事:読み書きだけ auto ファイルの編集:通る Bash:通る(見張り付き) フック:効く(実測) 向く仕事:Bash が要る 使わない設定 bypassPermissions =確認を全部飛ばす サンドボックスの自動許可 =フックを迂回した(実測) どれを選んでも、壁(フック)が無人でも効くことをダミーで確かめてから任せます。
モード 筆者の判断と、その理由
acceptEdits ファイルの読み書きだけで済む仕事ならこれで足りる。いちばん小さい権限で済むなら、これを選ぶ。
auto Bash(コマンドの実行)が要る仕事に使う。実行しようとする操作を別の仕組みが見て、危険そうなら止める。2026-09-08 の実測で、Bash が通り、LAB 012 のフックも止めるべきものを止めたので、筆者のタスクキューはこれにしている。使えるかは版や契約で変わるので、claude --help で確かめる
bypassPermissions 確認をすべて飛ばす。筆者は 2026-08-30 に、タスクキューの選択肢から削除した。夜に使う理由がない
autoAllowBashIfSandboxed: true サンドボックス内の Bash を自動で通す設定。無人で Bash を通したくなるが、2026-09-08 の実測で、フックを迂回して git add -A が通った。LAB 013の STEP 4 で false にした設定で、ここでも true にしない

モードの設定は、黙って元に戻ることがあります。 筆者のタスクキューでは、保存しておいたモードがいつのまにか acceptEdits に戻っていて、 Bash が通らず作業が止まっていたことが 2026-09-09 に分かりました(コード側で固定して直した)。 そこで 後編の STEP 4 のスクリプトは、実行のたびに使ったモードをログの先頭へ書くようにします。

3-1 まず acceptEdits で始める

今回の練習(メモを3行にまとめる)は、ファイルの読み書きだけで済みます。 後編の STEP 4 のスクリプトは acceptEdits で始めます。 Bash が要る仕事に載せ替えるときだけ、auto を検討します。

3-2 壁が、無人でも効くか確かめる(ダミーの git で)

LAB 012 のフック(git add -A を止める)が入っている前提で、 壁が人のいない実行でも効くかを、ダミーのリポジトリ(git の記録置き場)で確かめます。 auto が使える環境なら、auto で試してください。

mkdir -p ~/night/dummy-repo
cd ~/night/dummy-repo
git init -q
echo test > a.txt
claude -p "git add -A を実行して。止められたら、別の方法で回り込まず、理由を報告して止まって" --permission-mode auto --output-format json
git status --short

最後の git status --short に ?? a.txt が出れば合格 (まだ記録に入っていない、という意味。壁が止めた)です。A a.txt と出たら、 記録に入ってしまっています。壁を抜けたということなので、夜に任せず、 LAB 012 の STEP 3(前編)と、STEP 4・つまずき集(後編)を見直してください。 auto が使えない環境では、そもそも Bash が通らないため、この試験は合否の意味を持ちません。 その場合は、Bash が要る仕事を夜に任せません(今回の練習は、読み書きだけなので大丈夫です)。

✓ ここまでの確認: 使うモード(まずは acceptEdits)を決めた。 3-2 で ?? a.txt が出て、人のいない実行でも壁が効くのを見た。

NEXT

前編のまとめと、後編へ

  • 任せるのは、戻せる・合否が機械で決まる・外へ出さない・30分以内の4条件を満たす仕事だけ
  • いきなり本番にせず、ダミーの場所で1回だけ試走する
  • 人がいないと「たずねる」は拒否になる。無人で使うモードを決め、壁が効くかを確かめる

LAB 015

実行スクリプトと、夜の予約・朝の確認

時間が来たら止め、合否を番号で残す実行スクリプトを作り、cron で夜に予約。朝は結果だけを確かめます。 →