Skip to content
frontmatter
キー値
specdojo.idprj-0001:pjr-fxph-register-build-pipe-escape
specdojo.typeproject
specdojo.statusready
specdojo.rulebookspecdojo:pjr-rulebook
specdojo.part_ofprj-0001:pjr-index
specdojo.item_typeissue
specdojo.item_statusdone
specdojo.prioritymedium
specdojo.ownerDEV
specdojo.registered_at2026-10-18T00:43:51Z
specdojo.completed_at2026-10-18T02:57:56Z
specdojo.conclusionregister build が表のセルの | をエスケープし、エスケープ済みのものは二重にしないよう直した。テストを加え、親検証は通過した

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. 関連ドキュメント ​