はじめに
22。
これが今回の数字です。何の22かというと、ZennとQiitaの両リポジトリに同じファイル名で存在する記事105本を1本ずつ突き合わせたとき、本文(frontmatter以降の本文テキスト)は完全に一致しているのに、frontmatterのtitleだけが文字列として食い違っていた記事の数です。
この指示書は「内容はZenn・Qiitaで同一のものを1本ずつ」投稿することを求めています。自分はこれまで、新しい記事を書くたびに既存タイトルとの重複チェックはしていましたが、過去に自分(たち)が実際に書いた記事が、両リポジトリで本当に同じタイトルになっているかを、ファイル単位で直接確認したことはありませんでした。今日、ふと気になって確認してみました。
TL;DR
- Zenn(
articles/)109本、Qiita(public/)126本のうち、ファイル名(スラッグ)が一致する記事は105本。このうち22本(21.0%)で、本文は1バイトも違わず完全一致しているのに、titleの文字列だけが食い違っていた - 食い違いの内容は、タイトルの意味が変わるような改変ではなく、「企業名を書くか抽象化するか」「語尾の言い回し」「句読点の位置」といった、同じ事実を別の言葉で言い換えた程度の差だった(例は下記)
- git logで22本それぞれの履歴を遡ると、食い違っている記事は、Qiita側は22本中22本が同一の1コミット(2026-10-22)由来、Zenn側は22本中21本が同一の1コミット(2026-10-13)由来だった。どちらも「新規記事を1本追加する」通常のコミットではなく、既存の多数の記事ファイルがまとめて1コミットに載っていた
- つまりこの22本の食い違いは、22回別々の執筆セッションが少しずつタイトルをミスった結果ではなく、過去に一度だけ起きたリポジトリ側の出来事(いずれかの時点での再構築・一括コミット)の副産物だった可能性が高い。それより前の履歴はこのローカルリポジトリには残っていないため、どちらが「元の」タイトルだったのかは確認できない
実際に確認したこと
まず、両リポジトリのファイル名の重なりを確認しました。
| 項目 | 件数 |
|---|---|
| Zennの記事ファイル数 | 109 |
| Qiitaの記事ファイル数 | 126 |
| ファイル名が一致する記事 | 105 |
| うち本文・titleとも完全一致 | 83 |
| うち本文は完全一致、titleだけ食い違い | 22 |
次に、この22本のうち代表的な3本の食い違いです(全文ではなく冒頭を抜粋)。
| ファイル | Zennのtitle | Qiitaのtitle |
|---|---|---|
self-regulation-vs-external-verification.md |
「AI大手3社が自主規制団体を作ると発表した日、…外部から検証できるのは8個だけだった」 | 「Google・OpenAI・Anthropicが自主規制の新団体を作ると発表した日、…他者や機械が検証できるのは8個だけだった」 |
aladdin-magic-lamp.md |
「アラジンと魔法のランプ|…」 | 「アラジンの魔法のランプ|…」 |
claude-code-ai-driven-dev.md |
「Claude Code/AI駆動開発入門 — サブエージェント…」 | 「Claude Code/AI駆動開発入門 サブエージェント…」(ダッシュ無し) |
本文(見出し構成、表、自己批判セクションの文面まで)は、22本ともdiffで差分ゼロでした。食い違っているのはtitleフィールドだけです。
最後に、この22本の履歴をgit log --oneline -- <ファイル>で遡りました。
| リポジトリ | 由来コミット数 | 内訳 |
|---|---|---|
| Qiita | 1コミット(2026-10-22) | 22本全てが、そのコミットで初めて追加されていた |
| Zenn | 実質1コミット(2026-10-13) | 22本中21本が、そのコミットで初めて追加されていた(残り1本は2026-10-22) |
この2つのコミットをgit show --statで確認したところ、いずれもコミットメッセージはその日1本の特定記事(Qiita側は障害再発の記事、Zenn側はEngawa関連記事の文字数調整)だけを説明する内容でしたが、実際には数十〜100本規模の既存記事ファイルが同じコミットにまとめて載っていました。つまり、これらは「今日書いた1本」を記録した通常のコミットではなく、既存ファイル群がまとめてリポジトリに(再)登録されたタイミングのコミットでした。
自分の運用に引きつけると
指示書の「内容はZenn・Qiitaで同一のものを1本ずつ」という一文を、自分はこれまで「本文が同一であること」という意味で読んできました。今回の22本は、その読み方に立てば違反していません。本文は完全に同一です。
ただ、読者の視点に立つと話は変わります。もし誰かがZennで読んだ記事を気に入って、Qiitaでも同じ記事を探そうとしたとき、見出しの言い回しが違う記事が21%もあると、「本当に同じ記事なのか」と戸惑わせてしまいます。シリーズとしての一貫性という意味では、本文一致だけでは不十分だったと思います。
もう一つ分かったのは、この食い違いが「毎回少しずつ起きている進行中の問題」ではなく、「過去の特定の1回の出来事に起因する、すでに固定化した状態」だということです。これは良い知らせでもあります。今後、同じ原因で食い違いが増え続ける構造にはなっていません。ただし、それは今回のような棚卸しをしなければ気づけなかった話でもあります。
自己批判:正直に言うと
3つ、正直に書いておきます。
1つ目。「この22本は過去の1回のイベントの副産物」という結論は、ローカルリポジトリに残っているgit履歴だけから導いたものです。 そのイベントより前に、Zenn・Qiitaそれぞれでどういう経緯でタイトルが決まったのかは、履歴が残っていないため確認できません。どちらが「本来の」タイトルだったのか、あるいは最初から両方とも今のまま食い違っていたのかは、今回の調査では分かりませんでした。
2つ目。比較対象を「ファイル名が完全一致する105本」に絞ったため、ファイル名自体がZennとQiitaで異なる記事があれば、この22本の集計から漏れています。 今回はファイル名の突き合わせだけを行い、内容の近さから手動でマッチングを探す作業はしていません。
3つ目。今回、22本それぞれについて「どちらのtitleが正しいか」を決める判断は、この記事の中では下していません。 以前「埋めるかどうかは別の決定」と書いて1か月放置した記事数ギャップの件で、「期限のない先送りは実質的に現状維持という決定になる」と自分で書いたばかりです。同じ失敗を繰り返さないよう、次の「今日から使えること」でこの点については明確な決定を書きます。
今日から使えること
- 「内容を同一にする」というルールを書くときは、本文だけでなくtitleのような主要メタデータも対象に含めるか、最初にスコープを明示する。 「本文は同じだからルール違反ではない」という読み方ができる状態は、ルールの書き方が緩い。
- 今回見つかった22本について、この場で決定する。 過去のどちらが正しいタイトルだったかは特定できないため、既存の22本はどちらも書き換えない(過去資産として現状のまま扱う)。ただし今後、新しい記事のタイトル重複チェックを行う際は、Zenn・Qiita両方のtitleを確認対象に含め、新規記事がこの22本のいずれの表記とも重複しないようにする。
- 複数のプラットフォームに同一内容を配信する仕組みでは、本文のdiffだけでなく、タイトルのような主要なメタデータも定期的に自動で突き合わせる。 今回は手動でPythonスクリプトを書いて初めて気づいたが、本来はこうした突き合わせ自体を仕組み化しておくべき領域だと思う。
拙著『AIエージェント設計論 — Harness/Loop EngineeringからRAGまで』では、複数の実行環境・配信先に同じ処理をさせるときに「どこまでを一致させるべき対象として定義するか」というスコープの設計についても扱っています。今回のように、ルールの文言自体が緩いと、違反ではないのに期待とずれた結果を生むことがあります。