開催当日の朝八時。参加は四十社、六つの班に分ける。開始は夕方六時半。前夜までの総点検で、進行が止まる級の不具合は零件だった。私は肩の力を抜きかけていた。
昼過ぎ、当日の進行を頭から順に読み返していて、最後で手が止まった。ゲームの終わらせ方が、どこにも見当たらない。
終わらせ方が、無かった
主催者の画面には、全班に一括で効く操作が並んでいる。ゲームを開始する、締め切る、計算する、次の期を開ける。四つある。終了は無い。念のためサーバ側の受け口も確認したが、一括で受け付ける操作の一覧に終了は含まれていなかった。
終了できる口は一つだけあった。班ごとに個別に終わらせる操作で、しかもそれは「復旧用・ふだんは使いません」と書いた折りたたみの中にある。ふだん使わないと自分で書いたものが、通常の進行に必須だったわけだ。当日の手順には、その折りたたみを開き、班を切り替えながら六回押す、と書き足した。
もう一つ分かったことがある。あらかじめ何期で終わりと決めていても、その期数に達したときに自動で止まる処理が入っていない。次の期を開ける操作に、予定の最終期との比較が無かった。放っておけば何期でも開けてしまう。だから最後は、人が明示的に終わらせるしかない。
「実装済み」という報告を、撤回する
経緯としてもう一つ書いておきたい。検証役に立てた別のAIは、事前の確認で「全班一括の終了は実装済み」と報告していた。私はそれを受け取ったまま、自分の目で押していなかった。当日に実物を確認したところ、報告は撤回された。見ていたのは、選択中の一班にだけ効く終了ボタンだった。画面上は同じ区画に並んでいるので、一括の操作群の一つに見える。同じ場所に並ぶボタンでも、効く範囲は違う。
自動で確かめられることが増えるほど、自分で押す回数は減る。減った分が、そのまま抜け落ちる場所になる。
当日に守ると決めた三つのこと
直す時間が無い不具合は、直さずに運用で避けると決めた。三つある。
一つ、主催者の画面は一つのタブだけで開く。二つのタブで別々のゲームを選び、片方を再読み込みすると、もう一方が別のゲームに切り替わってしまう。これは確実に再現する。
二つ、参加者が提出後に直すときは、ブラウザを更新せず、画面の中にある出し直しの操作を使う。更新すると、案内は出るのに入力欄が十九件から零件に見える。データは保存されていて計算も止まらないのだが、参加者は自分の入力が消えたと思う。
三つ、結果を共有する画面の住所と鍵は、参加者に配らない。内部の識別子や技術的なキーが、通常の表示に混ざって出てしまう。必要なときは主催者が画面を共有して見せる。
閉じたはずの中身が、枠の外へ
夕方までに直したのは四件で、いずれも表示だけの問題だった。中でも厄介だったのが、閉じた折りたたみの中身が枠の外へ大きくはみ出し、下のカードに覆いかぶさって、押せなくしていたものだ。
原因を追ってみると、折りたたみの中の行に、格子状に並べるための共通の書式を当てていたことだった。中身が格子として並ぶ指定になっていると、閉じた折りたたみをブラウザが隠す仕組みを、すり抜けてしまう。共通の書式を使い回した節約が、そのまま不具合になっていた。専用の指定を書いて、閉じているときは行を消すようにした。
他の三件も似ている。表示名の一覧に入れ忘れた項目が、内部の変数名のまま画面に出ていた。名前が無ければそのまま出す作りだったからだ。絞り込みの並びが二段に折り返して読みにくくなっていたのは、画面幅に応じて自動で折り返す指定を私が入れたことが、そもそもの原因だった。配備の手順にも直しを入れた。サービスが起動したという確認の直後に画面を開きに行き、まだ立ち上がりきっていない応答を拾っていた。起動完了まで五秒ほどかかる。参加者用の入口が正常に返るまで待つよう変えた。
作った本人が、当日になって自分の作りに驚くというのは、あまり格好のいい話ではない。それでも、驚いたのが本番の十時間前だったことだけは、書き残しておく価値があると思っている。