GitHub Actions のCIが10月10日から止まっていた:教材サイトのDD残件を worktree 5体の並行実装で進める

開発eurekapu-nuxt4

GitHub Actions の CI は10月10日から一度も動いていなかった

前のセッションの終わりに、私は「今ってどこまで進んでるんでしたっけ?」と聞いた。 進捗ファイルの冒頭は前日 15:55 の内容のままだったので、進捗ファイルと DD 報告を T8 の完了まで反映してもらった(dfed26d58)。 あわせて、次のセッションに渡すプロンプトをダウンロードフォルダのテキストに書き出してもらった。

この日は、そのファイルのパスを新しいセッションに貼るところから始めた。 教材サイトのデューデリジェンス(以下 DD)の残件を進める続きである(前日分は教材サイトのDD残件を直したら、所見はまだ148件あった)。

最初に手を付けたのは、ローンの残高の整数化と、T6・T4(デプロイ前の関門と自動検証の導線)の調査の2つだった。 T4 の調査から戻ってきた報告の1行目で、計画の前提が1つ崩れた。

ローンの残高を整数で持ち直す

返済予定表の「残高」の列は、丸める前の残高のままだった。 金額が小さく回数が多い入力(1,000円で600回など)では、表示の残高と最終回の返済が合わない。 既定のローンでも最大 18円ずれる。 T8 の束で積み残していた項目である。

列の中身を「元本から、これまでの丸めた返済額を引いたもの」に変えてもらった(2baebaf14)。 修正前後の差を測るスクリプトは、依存の解決で一度失敗した。 old と new の import 先を直して再実行し、差を出し直してもらっている。

テストでは、指紋の比較から残高を外し(指紋は古いコードの出力で固定)、残高が回をまたいでつながることを確かめる不変条件を足した。 関連する20ファイルの350件が通り、Chrome で v2 の「借入」シートを開いて残高の列も確かめてもらった。

push とデプロイは、別のセッションが担当している。 こちらでは触らないことにして、progress.md にもそう書いてもらった。

146回とも「not started」

T4 の調査役(サブエージェント)の報告は、次の一文から始まっていた。

GitHub Actions の CI は 10-10 から止まっています。

10-10 以降の146回は、どれも2〜4秒で「not started」で終わっていた。 GitHub の表示は "recent account payments have failed or your spending limit needs to be increased"。 直近3回の失敗は、Claude Code にも確かめてもらった。 つまり 10-10 以降のコミットは、CI で一度も検証されていない。 最後に成功したのは 10-05 である。

ci.yml のコメントには、10月は無料枠の 2,000分を10日で使い切ったと書いてあった。 ただ、止まっている理由が「無料枠を使い切った」なのか「支払いの失敗」なのかは、Billing の画面を見ないと分からない。 そこはまだ見ていない。

DD が T4 で立てた「検査を CI に足す」は、CI が動かない限り1つも効かない。 計画は、デプロイのスクリプトから呼ぶ共通の検査(pnpm verify)を本体にし、CI を従に置く形で組み直すことになった。

もう1つ、クリーンな HEAD の worktree で vitest を流すと、5ファイルで43件が落ちた(ほかに読み込みエラーが1件)。 origin/main の時点と比べようとしたら権限の判定で止められたので、git の履歴で代わりに見てもらった。 43件のうち42件は、下書きや開発用、一覧に出していない講座のテストだった。 公開の画面に関わるのは1件だけである。

計画書と Codex レビュー3回、判断7件

計画書(memo/2026-10-23/t6-t4-deploy-ci-plan.md)を書いてもらい、Codex のレビューを3回回した。 1回目の指摘を受けて、ソースの関門は2つのモードに分かれ、git cherry をやめて祖先関係で判定する形に変わった。 3回目の high 3件と medium 5件まで反映して、9daad042d でコミットした。

判断が要る7件は、Chrome の前面のタブ(http://127.0.0.1:8899/)に開いたフォームで答えた。 7件とも推奨どおりにした。 コメントを書いたのは、CI についての判断1だけである。

そう、これね、ずっと失敗し続けてるんで、なんとかしたいんですけど、とりあえず11月1日までは止めませんか?多分無料枠そもそも今ないですよね。

11月1日までは CI を止め、そのあとは軽い検査だけの ci.yml にして戻す、という形に決まった。

CI を止めるコマンドは自分で打った

ここで作業が止まった。 Claude Code が gh workflow disable ci.yml を実行しようとしたところ、権限の判定(CI Bypass)で拒否されていた。 直後は、読み取りだけのコマンドまで拒否されたという。

そこで私は、ターミナルから自分で打った。

gh workflow disable ci.yml

状態が disabled_manually になったことを確かめて、progress.md に記録してもらった。 11月の枠が戻ったら、軽い ci.yml にしてから gh workflow enable ci.yml で戻す。

続けて「コミットしてください」と頼み、積み残しも聞いた。 コミットは f0570aaf4 で、main は origin より6コミット先、push はしていない。

それでも実装が始まらない。 私は「ごめん、DDの残りどんどん進めていってほしいんですけど、なんか判断がいるんでしたっけ今。なんで止まってるんですか?」と聞いた。

止まっていた理由は、判断が残っていたからではなかった。 CI を止めるコマンドが拒否されたあと、実装を進めてよいかを念のため私に伺っていたのだという。 判断7件はもう揃っていたので、そのまま T6・T4 の実装に入ってもらった。

worktree 5体を走らせ、差分は親が読む

実装は、サブエージェントをそれぞれ別の worktree で動かす形にした。 並行で動かすのは5体までと決めている。 T6・T4 は、関門(担当G)、node:test の整理(担当N)、検査の空振りの修正(担当C)、lint(担当L)の4体に分けた。

上がってきた差分は、親のセッションが読んでから main に取り込んだ。

  • 担当N:node:test を pnpm test:node にまとめた(3e4fa1dfe。42本の621件で 0 fail)
  • 担当C:check:content と check:islands が対象0件でも通ってしまう空振りを止めた。島は本番と同じ解析で全769個を見る(2b94701ca)
  • 担当L:本番に入るコードの lint error 37件を0件にし、scripts の80件は許可の一覧に入れた(652690cd7)。関係するテスト19ファイルの1,059件が通り、画面再現の回帰にも差はなく、公開ページの描画も確かめた

並行して、B-04(音声の頭出しのずれ、2fff1c1a1)と G-12(問い合わせ API のテスト、f0270575b)も main に入った。

担当G の関門は、worktree で pnpm verify を流し直し、すべて通った。 ただし、worktree のブランチに仮コミットしたままで、main には入れていない。 入れると次のデプロイから手順が変わるので、別セッションのデプロイが終わるのを待つことにした。

セッション上限で一度止まる

T9 と T12・T16 の計画の判断を1つのフォームにまとめている途中で、"You've hit your session limit · resets 11:40am (Asia/Tokyo)" が2回出た。 そのあと「ごめん、続きやってください。」と打って再開した。 途中でコンテキストも尽きたので、要約から続きを始めている。

再開後は、CF のゴールデンテスト(F-11)と、画面再現の既定の検査(A-08→A-02)の計画書を書いてもらい、Codex のレビューに回した。 F-11 は、1回目のレビューの high 4件を反映した。

フォームは2枚になった。 T9 と T12・T16 で12件、F-11 と A-08 で9件、合わせて21件に答えた。 コメントは書いていない。 回答は af9be4ef8 でコミットしてもらった。

改行コードだけの差分と、単独コミットの git rm --cached

実装担当の5体(F-11、A-08/A-02、T9 の3分担)が別々の worktree で動き、空いた枠に T12・T16 を入れた。

T9 ①は、税務の講本の図を R2 に上げる処理を許可リスト方式にするものだった。 台帳には p153 と p154 の2行を足した。 worktree の生成物は main と食い違っていたが、worktree に未追跡の素材が無いせいだった。 main に適用して確かめると、違いは改行コードだけで、生成し直すと一致した。 p154 は止まり、p153 は公開できる状態のまま残っている。

T9 ②(CF の Excel の保存と旧版の退避)と ③(返済予定表から仕訳への書き出し)も、差分を読んでから main に適用した。 main で 87件と12件が通るのを見てから、②と③を別々にコミットした。 ②はコミット時の Codex のゲートで指摘が出たので、テストを足して直している。 これで T9 は3つとも main に入った(b5c8346c2、badd641c8、baf95954a)。

F-11 は、担当が Codex のレビューを5回通していた。 4コミットを main に cherry-pick すると、118件とも通った。

最後に、gitignore 済みなのに追跡されていた _tmp* の9ファイルを、追跡から外した。 git rm --cached は単独のコミットにする決まりなので、手順書を読んでから実行してもらった。 ステージされたのはちょうど9ファイルの削除で、手元のファイルは残っている。 それだけを dd6292f0a でコミットした。

途中のまま引き継ぎを書き出す

今日はここで終わりにしたいと伝え、引き継ぎをダウンロードフォルダのテキストに書き出してもらった。 まだ途中なのか、とも聞いた。

答えは「まだ途中」だった。 21件の判断のうち、実装済みは T9 と F-11 の11件である。 A-08 の4件と T12・T16 の6件は、それぞれの worktree に残っている。 push とデプロイはしていない。

学びメモ

  • 権限の判定で1つのコマンドが拒否されると、Claude Code は実装まで止めて許可を待つことがある。止まっている理由が判断待ちとは限らないので、聞けばすぐ分かる
  • 10-10 からの146回は、テストが落ちたのではなく、どれも始まってすらいなかった(2〜4秒で not started)
  • worktree の並行実装でも、main に入れる前に親が差分を読み、main でテストを流し直す。worktree と main の生成物の差は、未追跡の素材や改行コードから来ることがある

残っていること

  • CI を、11月の枠が戻ってから軽い ci.yml にして戻す(止まった原因は Billing の画面で未確認)
  • 担当G の関門を main に入れる(別セッションのデプロイが終わってから)
  • A-08/A-02 と T12・T16 の差分を読み、main に取り込む
#Claude Code#Codex#デューデリジェンス#GitHub Actions#git worktree#サブエージェント