PJR-FXPH register build が表のセルの | をエスケープせず一覧の表が壊れる
1. 課題内容
個票のタイトル・説明・結論に | があると、register build が生成する一覧(pjr-index.md と派生ビュー)の表の列がずれ、lint-md の MD056 で失敗する。2026-10-18 に PJR-BHMH の結論の stop|wait|fallback で起き、並行して動いていた 2 件の run の親の検証が落ちた
2. 影響範囲
| 観点 | 影響 |
|---|---|
| スコープ | register build が生成する一覧(generated/pjr-index.md と派生ビュー)の表のセル。src/register/core.ts・src/register/item.ts・src/register/views.ts |
| スケジュール | 急がないが、並行の run の親の検証を落とすため早めに直す |
| コスト | 個票のどこかに | が入るだけで、一覧の lint-md が失敗し、その間に動いている全 run の親の検証が落ちる |
| 品質 | 一覧の表の列がずれ、読めなくなる |
| 関係者 | 登録簿の一覧を読む人、exec の親の検証 |
3. 対応方針
| 項目 | 内容 |
|---|---|
| 原因 | src/register/item.ts の toCell は改行を空白にし | をエスケープするが、一覧の行を作る処理(src/register/core.ts の 350 行付近など)で、結論の列がこの処理を通っていないとみられる。タイトル・説明・担当など、ほかの列も同じかを確かめる |
| 対応策 | 一覧の表に入れるすべての文字列のセル(タイトル・説明・担当・結論・保留の理由など)を、同じ toCell の処理に通す |
| 依存事項 | なし |
| 完了条件 | 下記の完了条件を満たす |
3.1. 完了条件
- 個票のタイトル・説明・結論などに
\|や改行があっても、register buildが生成する一覧と派生ビューの表の列がずれない。lint-md(MD056)が通る。 - 一覧の文字列のセルを作る箇所をすべて調べ、同じ処理に通っていることを result に書く。
- 単体テストで、結論に
stop\|wait\|fallbackのような\|を含む個票から作った一覧の行の列の数が正しいことを確かめる。 - 個票の本文や frontmatter は変えない(表示のときだけエスケープする)。
- 作業を終える前に、
npm run typecheck・npm run lint:ts・npm run test:unitを実行して通す。 - 親の検証(lint-ts・lint-fm・lint-md・typecheck・test-unit・test-integration・validate-schema)が通る。
- CHANGELOG に記載する場合は、未公開の版の節(
## [0.4.0] - 未定)に書く。公開済みの版の節は変えない。
4. 対応結果
- 解決内容:
src/register/item.tsのtoCellを export し、エスケープ済みの\|を二重エスケープしない冪等な正規表現(/(?<!\\)((\\\\)*)\|/g)に改修した。src/register/core.tsのformatTableRowで、一覧の表へ展開する全 12 セル(ID、ステータス、タイトル、説明、分類、優先度、担当、登録日、期限、完了日、結論、個票)にtoCellを適用し、改行の空白化および|のエスケープを共通処理として通すようにした。- 個票の frontmatter や本文などの正本データは変更せず、一覧・派生ビューのテーブル行を出力する表示時のみエスケープされるようにした。
- 確認結果:
tests/src/register/item.test.tsにtoCellの単体テストを追加し、未エスケープの|が\|になること、すでにエスケープされた\|が二重エスケープされないこと、改行・空白が正規化されること、[[id|title]]形式のリンクが保護されることを確認した。tests/src/register/register.test.tsに単体テストを追加し、結論にstop|wait|fallbackなどの|や改行を含む個票から生成された一覧が 12 列を正しく維持し、markdownlint の MD056 でエラーにならないこと、個票ファイルが書き換わらないことを確認した。
- 再発防止策:
- 一覧本体(
pjr-index.md)および派生ビュー(pjr-views-*、pm-*)のすべてのテーブル行生成がformatTableRowを通るアーキテクチャとし、全セルに共通のセル正規化処理(toCell)が強制されるように集約した。
- 一覧本体(
5. 関連ドキュメント
- prj-0001:pjr-bhmh-pinned-agent-rate-limit-policy: 事象のきっかけになった結論。