Skip to content

sync.sh: write_metadata が .commons/sync.yaml の pinned 理由コメントを毎回削除する #136

@ozzy-3

Description

@ozzy-3

概要

sync.shwrite_metadata().commons/sync.yaml を毎回全再生成する際、pinned: リストのパスは保持されるが、各エントリの理由コメントと、pinned: 上の header コメントブロックが削除されるpinned は「user-editable」とされているが、ユーザーが書いた「なぜ pin したか」の記録が同期のたびに失われる。

再現(consumer 側の実例: ozzy-labs/feedradar#351

非 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_pinnedread_yaml_list() は block-style 読み取りでコメント行を continue でスキップするため、コメントは read 時点で捨てられている。
  • metadata の書き換えは「コピーが 1 件でも発生したら(copied > 0)」発火するため、無関係な非 pinned ファイルの sync でも巻き添えで pinned のコメントが消える

影響

  • pin の機能自体は維持される(パスは残るので除外は効き続ける)。
  • ただし「なぜ pin したか」(インシデント修復・バージョン移行などの根拠)が毎回消える。
  • 将来の保守者が根拠不明の bare な pin を見て誤って un-pin し、解決済みインシデント(例: CI 破損の修復、biome バージョン移行)を再発させるリスクがある。

提案(対応方針)

  1. (推奨) surgical in-place 更新: 全再生成をやめ、機械管理スカラー(commit / synced_at)と skills ブロックだけを yq -i で更新し、pinned: ブロックと周辺コメントは原文のまま温存する。header コメントの欠落も同時に解消できる。
    • sync.sh 内の「yq surgical merge は free-floating header コメントを増殖させ得る」というコメントは _template スキャフォールドのマージに関するもので、metadata の 2 スカラー更新では低リスク。
  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 パスの保持/消失とは独立)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions