ig-reconcile
Instagram の公開状態をライブのグリッド+プランナーと照合し(現状確認)、ローカル SoT (posted.json/status.json) のドリフトを是正し、未公開パックを安全に予約投稿まで運ぶ運用スキル。 CI 週次 snapshot(`login-collectors.yml` の `verify-ig-status`・encrypted-state)でドリフトを検出→poste
SKILL.md.claude/skills/social/ig-reconcile/SKILL.md
GitHubIG カルーセルの「実際に公開されているか(現状確認)」と「未公開の予約投稿」を、毎回ゼロから手作業せず反復実行するためのオーケストレーションスキル。公開の状態の正本はコンテンツ台帳(content/registry/publications/instagram/。posted.json・status.json は P7 で消す旧い写し)。設計の真実源は .claude/knowledge/reference/ig-publish-reconcile.md。
既存予約・公開済み投稿を改修するとき
SNS 投稿画像ポリシー §0.1 を先に読む。新規投稿フローを既存投稿の編集代わりに再実行しない。投稿 ID・予約の実体・変更可能項目を確認し、対応する編集処理がない場合はその不足を明示する。保存後の実表示と予約日時・公開状態の再照合までを外部更新の完了条件とする。
なぜ必要か(このスキルが生まれた経緯)
手動投稿のあと posted.json を残し忘れる/status.json を draft のまま放置するドリフトが頻発する(2026-06-25、keyword-packs 18件中 6件が未記録・1件 draft 誤記録・削除済み黒背景の旧 URL が記録残存)。ig-status はローカルしか見ず検知できなかった。本スキルはライブ照合を起点に SoT を実態へ寄せ、未公開を予約まで運ぶ。
アカウント SSOT
実アカウントは @dobokunotecom。アカウントとプロフィール表示値の機械可読SSOTは config/ig-account.json。Xは別アカウント @doboku373(config/x-account.json)。スクリプトはハンドルを誤ると空振りするので、必ずconfig経由で参照する。
フロー
1. 照合(現状確認・read-only)
照合は CI 週次 login-collectors.yml(encrypted-state・verify-ig-status --no-planner・PR #549) が Playwright で .claude/state/ig-reconcile/snapshot.json を source:"playwright" で書く。本スキルはその snapshot を読むのが既定で、Playwright 版 verify-ig-status はプランナー実体確認が要るときのフォールバックとして残す。
npm run verify-ig-status # 全パック / npm run verify-ig-status -- --exam=cem で絞る
npm run verify-ig-status -- --json # 機械処理用
ドリフトを 7 分類で出す(真実源は reference の表):
published_recorded(整合) / published_UNrecorded(★要 backfill) / draft_misrecorded(★) / recorded_but_gone(★記録 URL が削除済み) / scheduled(予約済み) / unpublished(未公開=予約候補) / anomaly(★同テーマ重複・要人手判断)。スナップショットは .claude/state/ig-reconcile/snapshot.json。
Playwright + ログイン済み
<auth root>/profiles/playwright-ig-bs-profileが必要。ローカル実行限定(会社 PC のプロキシ下では外部到達不可)。セッション切れはpublish-ig-bs ... loginで再ログイン。
2. ドリフト是正(非破壊・operator 確認のうえ)
published_UNrecorded→ operator 確認のうえnpm run verify-ig-status -- --registryで台帳を published に(公開中の投稿に 1 件だけ結び付いたカルーセルと、キャプション先頭が 1 件だけ一致したリールだけ。衝突・複数一致は見送りに出る)。写しのposted.jsonも移行のあいだはig-status mark <pack> carousel --url=... --note=...で残してよい。ambiguous: trueが付いたエントリは backfill しない(matched=1でも複数パックが同じ投稿を主張=一意対応ではない。未投稿のパックへ「投稿済み」を書き込む事故になる。2026-08-27 実測で 72 件中 48 件が該当)。ambiguousWithに衝突相手が入る。draft_misrecorded→ 台帳は--registryの対象外(曖昧になりやすい)。実態を確かめてrecordIgか、写しのstatus.jsonのcarousel:"draft"/posted:falseを是正。recorded_but_gone→ 記録 URL が削除済み。白版へ貼り直し済みなら新 URL へ更新、孤児なら note 付きで記録。anomaly(重複投稿・逆方向の衝突)→ 自動処理しない。ig-publish-auditorのフラグを人へ提示し判断を仰ぐ。
3. 未公開の予約投稿
unpublished各パックをig-publish-auditor(Evaluator)に渡し公開可否ゲート(caption 実在/品質・画像枚数・draft 痕跡・スライド整合)。Bash 不可なので親(このスキル)が reconcile JSON + パック内容(caption.txt / img 一覧 / status)をテキストで渡す。readyのみ、既存キュー(07:30/12:00/17:00/21:00 等)と衝突しない時間帯へ予約。既定は 19:00/日(本運用で確立した空き帯)。スロットは reference の方法で確認。
初回・1週間以上空いた後はnpx tsx .claude/skills/social/publish-ig-bs/publish-ig-bs.ts post "cem/keyword-packs/<slug>" --schedule 2026-MM-DDT19:00--dry-runを必ず先に。- プランナーで実体確認(月ビューの時刻チップ抽出。週送りボタンは効かず/日セルのクリックは投稿作成画面を開くので禁止)。
verify-ig-status(planner あり)か reference の手順で 19:00 スロットの実在を目視。
安全弁(必読)
- 報告+提案が既定。台帳への反映(
--registry)・posted.json 編集・予約投稿・どれも operator 確認後のみ実行する。台帳が published なのに投稿が削除済みの後戻りは所見に出るだけで、台帳は自動では戻さない。 - 公開済み投稿の削除は本スキル対象外(不可逆)。黒背景の貼り直し等は個別判断で手動。
- 鉄則: リール≠カルーセル。同テーマのリールが存在することはカルーセル削除の根拠にならない。削除・重複判定の前に投稿の型(
/p/=カルーセル・/reel/=リール・「オリジナル音源」表示)を必ず確認する。verify-ig-statusのtype_mismatchが機械ガード(rio 事故の再発防止)。 - 「予約成功モーダル+status.json」だけを信用しない。必ずプランナー実体確認([[publish-ig-bs]] の偽成功検証と同じ規律)。
- コミットは並行セッション保護のため develop を別 worktree で行う(
git worktree add <dir> develop→ 編集 → pathspec commit → push → worktree 撤去)。共有 worktree ではgit commitも pathspec 必須・commit 先 branch 確認。真実源 → reference「並行セッションとコミット」。
関連
verify-ig-status(scripts/verify-ig-status.mjs)= 照合エンジン(read-only)。ig-status= ローカル投稿記録 CRUD。publish-ig-bs= 予約投稿エンジン(本スキルが呼ぶ)。ig-publish-auditor(Evaluator)= 公開可否ゲート+異常検出。- 週次: CI
login-collectors.yml(encrypted-state・verify-ig-status --no-planner・PR #549) が.claude/state/ig-reconcile/snapshot.jsonを書き、/weekly-reviewはそれを読む(実行しない)。verify-ig-statusはプランナー実体確認が必要なときのローカルフォールバック。