[aside] `just seed-public` した mirror で `dev-fork` すると全 migration が再実行される(PR #261 スコープ外) PR #261 の `seed-public` は公開イベントを `/events/*.jsonl` から取るが、`events/.schema_version`(migration 進捗マーカー)は取らない(prod は `*.jsonl` しか公開していない)。一方 `migrate::run_pending`(`src/migrate.rs`)は: - dir が存在しないとき = fresh install → latest を stamp して 0 件適用(L62-68) - dir が存在 + `.schema_version` 無し → `read_version` が `0` を返す(L95-96) seed は dir を作って jsonl を置く=「存在するが marker 無し」なので、`dev-fork` 起動のたびに **既に最新化済みの prod データに対して migration 1..N を頭から再適用**する。 触らない判断: 既存 migration は string-rewrite の up-only なので idempotent なら実害は「起動が無駄に重い + 誤解を招くログ」程度(mirror は throwaway なので prod は無傷)。ただし idempotent 性は未検証で、phase3_audience_marker 等が無条件変換だと二重適用の懸念は残る。recipe PR の主目的(公開データで feature を目視確認)は満たせているので別 PR 送り。 取り掛かるトリガー / 直し方の候補: - `seed-public` が seed 後に `.local/events/.schema_version` を latest で stamp する(prod データは定義上 current)。shell が latest 番号を知る口が要る(`migrate.rs` から grep / 小さな print-version subcommand)。 - または `run_pending` に「非空 + marker 無し」を legacy(=0)と決め打ちしない逃げ道(seed 用 env / フラグ)を足す。