概要
sync.sh の write_metadata() が .commons/sync.yaml を毎回全再生成する際、pinned: リストのパスは保持されるが、各エントリの理由コメントと、pinned: 上の header コメントブロックが削除される。pinned は「user-editable」とされているが、ユーザーが書いた「なぜ pin したか」の記録が同期のたびに失われる。
非 pinned ファイルの sync に伴って metadata が書き換えられ、.commons/sync.yaml の diff が以下のようになった(パスは context 行=保持、コメント行のみ削除されている点に注意):
-
-# Files excluded from commons sync. Preserves local overrides that diverge
-# from the commons baseline (PR-specific decisions, incident remediations,
-# version migrations).
pinned:
- # PR #91 / #72: keep IDE/coverage/worktree/temp ignores; commons drops them
- .gitignore
- # PR #127: biome pre-commit hook (CI breakage remediation, see file header)
- lefthook.yaml
- # PR #128: biome schema migrated to 2.4.13; commons still on 2.4.9
- biome.json
- # release-please generates CHANGELOG.md with style that doesn't match MD012
- .markdownlint-cli2.yaml
根本原因
write_metadata()(sync.sh の該当関数)は echo でファイルを全再生成し、pinned は echo " - ${p}" でパスのみを出力する。per-entry コメントも、pinned: 直前の header コメントブロックも再出力しない。
read_pinned → read_yaml_list() は block-style 読み取りでコメント行を continue でスキップするため、コメントは read 時点で捨てられている。
- metadata の書き換えは「コピーが 1 件でも発生したら(
copied > 0)」発火するため、無関係な非 pinned ファイルの sync でも巻き添えで pinned のコメントが消える。
影響
- pin の機能自体は維持される(パスは残るので除外は効き続ける)。
- ただし「なぜ pin したか」(インシデント修復・バージョン移行などの根拠)が毎回消える。
- 将来の保守者が根拠不明の bare な pin を見て誤って un-pin し、解決済みインシデント(例: CI 破損の修復、biome バージョン移行)を再発させるリスクがある。
提案(対応方針)
- (推奨) surgical in-place 更新: 全再生成をやめ、機械管理スカラー(
commit / synced_at)と skills ブロックだけを yq -i で更新し、pinned: ブロックと周辺コメントは原文のまま温存する。header コメントの欠落も同時に解消できる。
sync.sh 内の「yq surgical merge は free-floating header コメントを増殖させ得る」というコメントは _template スキャフォールドのマージに関するもので、metadata の 2 スカラー更新では低リスク。
- (代替)
pinned: ブロックの raw 保持: 既存ファイルの ^pinned: 以降を verbatim に carry over し、エントリ追加時のみ bare 行を追記する(yq への依存を増やしたくない場合)。
読み取り側(read_yaml_list)は既にコメントを正しく無視できているので、修正は write 経路(write_metadata)のみで済む。
補足
consumer 側の暫定回避として feedradar#356 で巻き戻し対象ドキュメントを pinned に追加済みだが、これは README/_template.yaml の巻き戻し回避が主目的であり、本 Issue の「pinned コメント消失」は別問題(pin パスの保持/消失とは独立)。
概要
sync.shのwrite_metadata()が.commons/sync.yamlを毎回全再生成する際、pinned:リストのパスは保持されるが、各エントリの理由コメントと、pinned:上の header コメントブロックが削除される。pinnedは「user-editable」とされているが、ユーザーが書いた「なぜ pin したか」の記録が同期のたびに失われる。再現(consumer 側の実例: ozzy-labs/feedradar#351)
非 pinned ファイルの sync に伴って metadata が書き換えられ、
.commons/sync.yamlの diff が以下のようになった(パスは context 行=保持、コメント行のみ削除されている点に注意):根本原因
write_metadata()(sync.shの該当関数)はechoでファイルを全再生成し、pinned はecho " - ${p}"でパスのみを出力する。per-entry コメントも、pinned:直前の header コメントブロックも再出力しない。read_pinned→read_yaml_list()は block-style 読み取りでコメント行をcontinueでスキップするため、コメントは read 時点で捨てられている。copied > 0)」発火するため、無関係な非 pinned ファイルの sync でも巻き添えで pinned のコメントが消える。影響
提案(対応方針)
commit/synced_at)と skills ブロックだけをyq -iで更新し、pinned:ブロックと周辺コメントは原文のまま温存する。header コメントの欠落も同時に解消できる。sync.sh内の「yq surgical merge は free-floating header コメントを増殖させ得る」というコメントは_templateスキャフォールドのマージに関するもので、metadata の 2 スカラー更新では低リスク。pinned:ブロックの raw 保持: 既存ファイルの^pinned:以降を verbatim に carry over し、エントリ追加時のみ bare 行を追記する(yq への依存を増やしたくない場合)。読み取り側(
read_yaml_list)は既にコメントを正しく無視できているので、修正は write 経路(write_metadata)のみで済む。補足
consumer 側の暫定回避として feedradar#356 で巻き戻し対象ドキュメントを
pinnedに追加済みだが、これは README/_template.yamlの巻き戻し回避が主目的であり、本 Issue の「pinned コメント消失」は別問題(pin パスの保持/消失とは独立)。