はじめに
記録時点: 2026-01〜2026-02
今回の不具合は「2ページ目が出ない」という見た目で報告されました。 ただ実体は、改ページ処理の前進条件が壊れて停止する問題でした。
この種類は、症状だけ追うと再発しやすいため、 修正より先に再現分類を固定するところから始めています。
この記事で扱う範囲
- 改ページ停止の再現条件をどう分解したか
- 前進しない分割ロジックをどう修正したか
- 境界条件をどうテストへ固定したか
再現が難しかった理由
同じデータ量でも、はみ出す位置で結果が変わっていました。 単一ケースだけ直すと別ケースで再発する状態です。
固定した再現分類
| 分類 | 症状 |
|---|---|
| 先頭問題がはみ出す | 分割位置が進まず停止 |
| 途中問題がはみ出す | 後続ページが欠ける |
| 最後の1問だけはみ出す | 分割不能なのに進行しようとする |
| 問題文ではなく解答欄がはみ出す | 判定軸がずれて停止 |
この4分類を先に決めたことで、修正成否を判定できる状態になりました。
修正の要点
1. 分割位置の前進保証を入れた
ページ先頭の要素が分割対象になると前進しないケースがあるため、 分割位置が進まない場合は次候補へ進めるガードを入れました。
function resolveSplitIndex(candidate: number, pageStart: number, lastIndex: number): number {
if (candidate <= pageStart && pageStart < lastIndex) {
return pageStart + 1;
}
return Math.min(candidate, lastIndex);
}2. 判定軸を表示制御と揃えた
内部判定と画面警告が別基準だと、利用者には意味不明な表示になります。 はみ出し判定を画面制御と同じ軸へ寄せ、挙動を一致させました。
3. 警告を「次アクションの手掛かり」にした
警告は出すだけでなく、どの問題を調整すべきかが分かる条件に整理しています。
見送った案
1. 先頭はみ出しを強制縮小して1ページへ収める
見た目は収まりますが、教材意図を壊す可能性があるため見送りました。
2. はみ出し時に無条件で新規ページへ送る
停止は減りますが、空白ページや不自然な分割を増やすため採用していません。
3. 画面警告だけで運用吸収する
再現不能バグが残るので、ロジック修正を優先しました。
テストで固定したこと
1. 計測模擬テストで再現分類を固定
DOM計測相当の値をモック化し、4分類を自動テストで再現可能にしました。
2. 改ページ境界の回帰を拡充
- 無効入力で落ちない
- 後半変更時に前半ページが崩れない
- 先頭変更時に構成を適切に再計算する
この回の判断が次に効いたこと
「再現分類を先に固定する」進め方は、次の不具合対応でも同じように効きました。
まとめ
今回の改善で、改ページ停止バグは「たまに起きる現象」から「再現して検証できる問題」へ変わりました。 この種の不具合は、修正コードより先に再現分類を固定したほうが、結果的に早く収束します。