ログイン切れを誤診した朝の定型作業と、PR のマージからデプロイまで
ログイン切れを誤診した朝の定型作業と、PR のマージからデプロイまで
朝の定型作業は、日記の生成から株価とコンセンサスの取り込みまでを1本のチェーンで回す。 その途中で株価データのサイトを開かせたら、画面の右上に Log In と出ていた。 cookie を見ても認証トークンが無い。 認証が切れたと判断して、そこだけ後回しにした。
判断は間違っていた。 切れていたのはセッションではなく、見ている窓のほうだった。
認証が切れていたのではなく、見ていた窓が違った
止まった1件を待たずに、開示資料の取得と統計チェーンを先に進めさせた。 メモリ価格の取得も、台湾の月次売上の確認も、ポートフォリオの更新も、株価スナップショットが無くても回る。 詳細記事5本と決算ビート記事も並行で書かせて、コミットと外部レビューの反映まで終わらせた。 残ったのは株価スナップショットの1件だけになった。
そこで原因が分かった。 私が「ログインしている」と言ったところで、掴ませていた Chrome が別ユーザーのプロファイルだったと気づいた。 サイト側のセッションは生きていて、その窓に無かっただけである。
cookie が無いという観測から言えるのは、「いま見ているプロファイルに無い」までだ。 「サイト側で認証が切れた」は、そこから一段飛んでいる。 飛んだ距離は短いが、待ち時間はその分だけ伸びた。
ログイン済みの窓を開き直してもらってから、73銘柄のバッチを流した。 ダッシュボードが重く、評価スクリプトがタイムアウトする。 同じオリジンの軽いページに移して実行させたら、73銘柄すべてが失敗ゼロで返ってきた。 取り込んだあとの当日差分は ±0.08% の改定だけで、待たされたわりに動いた数字は小さい。
続けて、3日前に決算を出した2銘柄の四半期を足した。 検索に日付を渡したら未来の日付と判断されて空振りしたので、投稿の中身を直接聞く形に変えて取り直した。 数値は検算が全部一致した。 チャートに新しい列が出て、発表翌日の株価が片方は上に、片方は下に大きく振れているのも見えた。
6分前にできた PR を、数値で確かめる
前日の作業ぶんの PR は、探し始めた6分前に上がっていた。 別リポジトリの1件で、単語ビューアのヘッダー直下に判定基準を出す変更である。 読んだ限り、参照ミスも位置ずれもない。 それでも、画面を見るまでは通さないことにしている。
dev サーバーを立てる段で最初につまずいた。
ポート3000 は別の dev が使っていた。
3001 を明示して立てさせたら、そのプロジェクトは 3200 で固定されていた。
nuxt.config.ts の devServer.port にも、プロジェクトの CLAUDE.md にも書いてある。
ポート競合を避けるために置かれた既定を、こちらから上書きしていた。
3200 で立て直した。
localStorage には学習履歴が25問分入っていた。 テスト用に上書きすると自分の実データが消えるので、その状態のまま見た。
見出しと注記の左端が揃っているかは、目視だと自信が持てない。 測らせたら、最初は要素の box の left を返してきた。 それは padding の前の位置なので、テキストの実際の開始位置で測り直させた。 デスクトップは 252px で一致した。 モバイル幅では注記が3行になり、高さが75px 増える。 単語カードは下に押し下げられるものの読める。 左端は 20px で一致した。
変更していない既存の2ページに、注記が出ていないことも見た。 足した側だけを見て終わらせると、隣で消えたものに気づけない。
CI は落ちていた。 中身は別機能の認証まわりの E2E で、サインアップとサインインが揃って500を返している。 main の直近6回も同じ落ち方をしていた。 この PR とは無関係の、前から壊れている箇所だった。
マージは通り、デプロイは分類器に止められた
マージして main に戻すよう頼んだ。 過去の PR に合わせてマージコミット方式で入れたあと、ローカルの main が origin より5コミット先行していると分かった。 こちらに未 push のコミットが5本あり、リモートには今入れたマージコミットがある。 分岐していたので統合させた。 コンフリクトは無し。
デプロイはそこで止まった。 止めたのは権限の設定ではなく、auto mode の分類器だった。 「本番デプロイ」と判定されると、許可リストに入っていても分類器の側で落ちる。 迂回はさせなかった。
理由を説明させたとき、一度は記憶で答えて間違えた。 設定ファイルとスキーマを読ませて訂正させ、そのうえで許可リストに1件足した。 次からは同じところで止まらない。 この日は状況が変わったので、デプロイしないままにした。
最後に、私が起動させたまま残っているものがないかを聞いた。 3200 の dev サーバーが生きていた。 タスクの表示は終了済みになっていたが、プロセスは残っている。
「未解決」を grep で数えていた
昨日の積み残しを聞いたら、2件出てきた。 1件は月初に公表される輸出統計の取り込み、もう1件は前日の午後に書いた記事2本が未コミットのまま残っていることだった。
そこに「次のデプロイで踏みそうな未解決の問題が2件ある」という報告が付いていた。 潰せないかと聞いたら、両方とも既に解決済みだった。 「未解決」という文字列を含む行があるファイルを grep で拾っただけで、チェックボックスの状態を見ていなかった。
ただし、読み直させたら別の穴が出てきた。 1件目の記録には犯人が特定できないまま終わった続きがあり、dev サーバーが35秒で勝手に復活してデプロイが弾かれる、という症状が残っていた。 その記録の結論は「20分を超える処理をバックグラウンド実行に載せず、別プロセスとして切り離せ」である。 ところがデプロイ用のスキルには、いまだに「バックグラウンドで起動」と書いてあった。 結論は記録に残っていたが、手順書のほうには反映されていなかった。
直させたコマンドは、今度は書き方のほうで壊れていた。 PowerShell の行継続の記法が、Bash 経由では通らない。 1行に直させ、害のないスクリプトで実際に起動するところまで確かめさせた。
500 が返る件は、根本原因が dev サーバー側にあるので直していない。 再発はするが、踏んだときの直し方は確定している。 その前提でコミットに進んだ。
コミット直前に、別セッションの作業と思われる変更が4ファイル出てきた。 テストを73件走らせて全部通ることを確かめてから、完了扱いで取り込んだ。 ローカル専用の記録は追跡対象外なので、手順書の修正だけをコミットに入れた。
デプロイ前の検証は、公開1,701本と非公開180本を数えてリンク漏れなしで通った。 完了までは実測で20分近くかかる。 終端に出るマーカーを待つ監視を仕掛けさせて、その間に別の作業を進めた。 1回目は17.7分で通り、本番のヘルスチェックも抜けた。 その後、統計の更新を載せてもう一度回した。
ここでも自分の記録を疑うことになった。 「最後のデプロイは前日の14時」という報告が誤りで、当日の朝8時に既に1回出ていた。 そのログは memo に残っていた。
予定調整は下書きまで
子どもの習い事の振替について、届いた連絡に返す下書きを作らせた。 候補日を3つ並べる形にして、送信は自分でやった。
送ったあとで条件が変わった。 後ろに入っていた予定をずらせると分かったので、そちらを動かせば当初の枠でも構わない、と伝えたくなった。 同じスレッドに追伸の下書きをもう1本作らせた。 先方にずらしてもらえるならそのほうがありがたい、という優先順位が伝わる書き方にしている。 これも送信は自分でやる。
一日の終わりに、触ったリポジトリを片付ける
昼前に、直近1週間で変更のあったリポジトリを洗い出させた。 11 あった。 そのうち9つをコミットして push し、1つはローカルのコミットだけにとどめ、1つは push を禁止している設定なので見送った。
書籍データベース側は、リダイレクトの生成物がタイムスタンプ1行だけの差分になっていた。 作業記録と生成物は別のコミットに分けさせた。
1件は push がリモートとの分岐で弾かれ、差分を見せてから rebase で解決させた。 学習ゲートはこの日のぶんを全部スキップ指定で通している。
設定ディレクトリの同期だけは、生の git を使わせなかった。 秘密の検出と大量削除のガードが入った専用スクリプトが正規の経路になっている。 それ経由で3ファイルをコミットし、private リポジトリへ push させた。
残ったもの
- cookie が無いことから言えるのは「このプロファイルに無い」まで。「サイト側で切れた」はそこから一段飛んでいる
- ポートを明示指定する前に、そのプロジェクトが既定を固定していないか見る
- 記録の結論は、手順書に書き戻すまでが1セット。記録した時点では手順は何も変わっていない
- 「未解決」は文字列ではなく、チェックボックスの状態で数える
- 表示確認は、足した側だけでなく足していないページも見る