最終確認日

公開ノートのリンク切れ問題(2026年1月)

ブログ上での表示の問題。公開ノートのリンク切れが起きている。

具体的な状況

  • 別の記事内ではリンクとして認識されているが、リンクを押すとページがない。
  • Supabase上にも存在しない
  • ブログ記事では起こらず、Noteでのみ起きている
  • アップロードするときは特にエラーは起きていない
  • 今回は中身を編集して再度アップロードしたら表示された。されないものもある。
    • でもブログ上には表示されない。これはrevalidate?
  • 単にprivate/public を変えただけだったり、parametersを変えただけだとアップロードされていない説?

考えられる問題

  • revalidate が効いていない?
    • でも Supabase上にもないというのはおかしい

1日経ったら昨日アップロードしたノートが消えた!もしかして reset 処理がおかしい?

リセット処理を見る

まずはGitHub Actionsのログを見ておく。毎朝3時にリンク切れの記事の一掃とrevalidateを行なっている。

🗑️ Found 2 missing article(s):
- licenseplist
- swift package manager
✅ Deleted licenseplist
✅ Deleted swift package manager

やっぱり。

一つ前のも見てみる。

🗑️ Found 4 missing article(s):
- html
- next.js
- obsidian の callouts をブログで表示する(2026年1月)
- next.js バージョンのアップデートをする(2026年1月)
✅ Deleted html
✅ Deleted next.js
✅ Deleted obsidian の callouts をブログで表示する(2026年1月)
✅ Deleted next.js バージョンのアップデートをする(2026年1月)

why?

古い記事でも新しい記事でも起きている。

確認してみる

この2つの記事で確認する。

ここで消された記事を再度編集してpushしてみると表示されるようになったので、uploadはできた。

もう一度リセットしてみる。

🗑️ Found 2 missing article(s):
- html
- obsidian の callouts をブログで表示する(2026年1月)

そうよね。

条件を確認する

  • slug をマークダウン側で設定しているノートは問題ない
  • タイトルを slug としている場合に起きている
  • 大文字 HTMLhtml が一致していない場合に一致しない扱いかも。

リセット処理を直す

  • slug の正規化処理(normalizeSlug)を追加
    • String化 + trim + toLowerCase + Unicode正規化(NFKC) を実施
    • Supabase 側 / ローカル側どちらの slug も同じルールで比較できるようにした
  • アップロード時とクリーンアップ時の slug 生成ルールを統一
    • 共通関数を利用
  • metadata.slug の 空白スペースだけを空扱いにした
  • 削除前にもう一度チェックするようにした
  • DRY_RUN(削除しないモード)を追加

確認

  1. 適当なノート 「Missingファイルのテスト」と「Missingファイルのテスト2」をつくる
  2. git push でアップロードする
  3. ブログ上で表示されることを確認
  4. リセットworkflowを実行する(消さないことを確認)
  5. ブログ上で表示されることを確認
  6. ローカルで「Missingファイルのテスト」を削除、「Missingファイルのテスト2」を「Missingファイルのテスト中」とリネーム
  7. git push する(この時点では消えないはず)
  8. ブログ上で表示されることを確認する(「Missingファイルのテスト」と「Missingファイルのテスト2」と「Missingファイルのテスト中」の3つが表示される)
  9. リセットworkflowを実行する
  10. ブログ上で消えていることを確認(「Missingファイルのテスト」と「Missingファイルのテスト2」が削除)

見つけたバグ

  • タイトル上の missing -> Missing にリネームしたところ反映されていないぽい
  • delete / renamed / add が Get changed files の工程で見えておらずアップロードされていない
    • そのため8ではリネーム後の「Missingファイルのテスト中」が表示されない
    • その後そのファイルの中身を編集して初めてアップロードされる

削除工程自体はおk

delete / renamed / add の場合もアップロードする

うまくいっていない場合のステータスをみる

git diff --name-status HEAD\^..HEAD 

R083    "Notes/Missing\343\203\225\343\202\241\343\202\244\3~
M       "Notes/\345\205~

R083 になっている。

changed_files.txt を git diff --name-status の形式で読むように修正する。このステータスを利用する。

変更を確認。次の3つのファイルでテスト後削除する。

  • MissingファイルをRenameします!
  • 新規Missingファイル
  • Private から Public への変更テスト
 ---- changed_files.txt ----
R084	Notes/MissingファイルをRenameしますよっと.md	Notes/MissingファイルをRenameします!.md
A	Notes/Private から Public への変更テスト.md
M	Notes/公開ノートのリンク切れ問題(2026年1月).md
A	Notes/新規Missingファイル.md
--------------------------
🔵 changed_files.txt >>  R084	Notes/MissingファイルをRenameしますよっと.md	Notes/MissingファイルをRenameします!.md
A	Notes/Private から Public への変更テスト.md
M	Notes/公開ノートのリンク切れ問題(2026年1月).md
A	Notes/新規Missingファイル.md

🔵 parsed changes >> [
  {
    status: "R",
    oldPath: "Notes/MissingファイルをRenameしますよっと.md",
    newPath: "Notes/MissingファイルをRenameします!.md"
  },
  { status: "A", path: "Notes/Private から Public への変更テスト.md" },
  { status: "M", path: "Notes/公開ノートのリンク切れ問題(2026年1月).md" },
  { status: "A", path: "Notes/新規Missingファイル.md" }
]
✅ Deleted "missingファイルをrenameしますよっと" (from Notes/MissingファイルをRenameしますよっと.md)
🔵 記事をアップロード >>  MissingファイルをRenameします!

2回目 Private から Public への変更テスト と 新規Missingファイル を public へ
完全新規の「新規Missingファイル2」も追加

🔵 changed_files.txt >>  M	Notes/Private から Public への変更テスト.md
M	Notes/公開ノートのリンク切れ問題(2026年1月).md
M	Notes/新規Missingファイル.md
A	Notes/新規Missingファイル2.md

🔵 parsed changes >> [
  { status: "M", path: "Notes/Private から Public への変更テスト.md" },
  { status: "M", path: "Notes/公開ノートのリンク切れ問題(2026年1月).md" },
  { status: "M", path: "Notes/新規Missingファイル.md" },
  { status: "A", path: "Notes/新規Missingファイル2.md" }
]
🔵 記事をアップロード >>  Private から Public への変更テスト
🔵 記事をアップロード >>  新規Missingファイル
🔵 記事をアップロード >>  新規Missingファイル2

良さそうに見えるが、ブログ上にアップロードできていない

  • 新規Missingファイル2のslugがない状態でアップロードされている
  • リネームしたファイルのタイトルリネームがうまくいっていない(中身の変更は反映されている)
  • private -> public の時に反映されない。
  • 完全新規のファイルはアップロードされているがslugがない

slug がない状態について空文字の時を弾けていないっぽい

---
createdDate: 2026-01-26 15:01
updatedDate: 2026-01-26 16:31
private: false
aliases: []
url: ""
priority: 0
slug: ""
---
Missingファイルのテスト2

private -> public の時に反映されないのもslugのせい?

ファイル名が Rename -> RENAME などの大文字小文字のみが変わる場合
-> お これはいけるようになった!

完全にファイル名を変えてみる
-> そもそもObsidian上でのリネームが時間かかるっぽい git に差分として出てくるのが遅い
-> 削除してリネームされた ok

ブログなど恒久的にslugが変わって欲しくない記事については最初からslugを設定しておく

さて。private -> public の時に反映されないも解決されたか確認する。
-> おkっぽい!

まとめ

  • ファイルの追加/リネーム/削除などの変更を「変更あり」として認識できていなかった
  • slug がローカルとSupabase上で異なっているせいでローカルにないファイル扱いにされて削除されていた。
  • slug が空の時に空slugとして認識されてうまく動作しなくなっていた

最後に uploadAllArticles を実行して public なものをアップロードして完了とする。

テストとかがないし本番環境でちまちま直してるの最悪すぎるのでどうにかせねば…

まだだめだった!

記事内のリンクがうまくいっていない。

  • slug 内の空白は- に置き換える
    • これは既存のブログは影響受けないでいてくれるはず…
  • 大文字/小文字がwikilink内でうまく変換できていない。
    • PostCache で変換していないせいか

修正して再度全ての記事をSupabaseに投稿し直して完了。

サイトアイコン
公開日
更新日