CLAUDE LABEN
VERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になりますVERSION — 8月10日に v2.1.227 が出ていました。新機能はなく、プラン判定と CI まわりの不具合修正が中心ですAUTO — 8月14日の既定化まで残り2日です。Pro・Max・Team で Claude Code の auto モードが既定で有効になりますCI — claude-code-action で allowed_non_write_users を指定すると GitHub ホストランナー上の Bash が全て失敗していた問題が直りましたBILLING — 期限切れトークンで開始したセッションが加入プランを取り違え、Max 利用者に使用クレジットの有効化を促していた不具合も解消していますSUNSET — 旧 Workbench と実験的プロンプトツール API の廃止は8月17日で、残り5日ですPRICE — Sonnet 5 のプロモ価格 $2/$10 per Mtok は8月31日までで、9月1日から $3/$15 per Mtok になります
記事一覧/Cowork
Cowork/2026-06-23上級

無人の記事生成タスクが『ほぼ同じ記事』を二度書く前に止める重複検出ゲート

Cowork のスケジュールタスクで毎日記事を生成していると、無人ゆえに数日前と中身がほぼ重なる記事を作ってしまいます。公開直前に slug の類似度と当日ログを照合して重複を止めるゲートを、実際に誤公開を防いだ実装とともにお届けします。

Cowork33スケジュールタスク19重複検出2自動化77Python17SEO2コンテンツ運用

プレミアム記事

今朝、Cowork のスケジュールタスクがプロンプトキャッシュの TTL を 5 分から 1 時間へ延ばす設計、という題材で記事を書き始めようとしていました。手が滑って公開していたら、半年前に出した claude-api-prompt-cache-5m-1h-two-tier-ttl-design とほぼ同じ内容が、別 URL でもう一本増えていたはずです。

無人で毎日記事を生成していて一番こわいのは、エラーで止まることではありません。エラーは止まればログに残り、翌日気づけます。本当にこわいのは、止まらずに「数日前と中身がほぼ重なる記事」を淡々と公開し続けることです。一本ずつ見れば破綻していないので、人間がレビューしない限り気づけません。そして Google から見れば、これは薄い記事を量産しているサイトの典型的な挙動です。

私はこの半年、4 サイトを無人のスケジュールタスクで回してきて、この「静かな重複」が検索評価をじわじわ削る最大の要因だと感じています。今日はその対策として、記事を公開する前に slug の近さと当日ログを照合し、重複しそうなら公開を止めるゲートの作り方を、実際に動いているコードでお伝えします。

なぜ「件数チェック」だけでは重複を防げないのか

多くの自動投稿パイプラインは、push 直前に日本語版と英語版の件数一致を確認します。これは 404 を防ぐためには必須ですが、重複検出には何の役にも立ちません。件数が揃っていても、中身が数日前と重なっていれば、それは「正しく数えられた重複記事」が一本増えるだけです。

タイトルの完全一致チェックも役に立ちません。無人タスクは毎回少しずつ違う言い回しでタイトルを作るので、「プロンプトキャッシュの TTL 設計」と「キャッシュ有効期限を延ばすコスト設計」は文字列としては一致せず、すり抜けます。

重複を捉えるには、表記ではなく「その記事がどの概念について書いているか」を比較する必要があります。そして幸い、私たちは概念を要約した短い文字列をすでに持っています。slug です。slug はハイフン区切りの英単語列で、記事の主題語がそのまま並んでいます。これをトークンの集合として比較すれば、表記ゆれに強い重複判定ができます。

slug をトークン集合にして Jaccard 類似度で測る

考え方はシンプルです。候補記事の slug と既存記事の slug をそれぞれハイフンで分割し、単語の集合にします。二つの集合がどれだけ重なっているかを Jaccard 係数(積集合のサイズ ÷ 和集合のサイズ)で測り、しきい値を超えたら「同一概念の疑いあり」と判定します。

#!/usr/bin/env python3
"""dup_gate.py — 候補 slug が既存記事と概念的に重複していないか検査する。
使い方:
  python3 dup_gate.py <repo> <category> <candidate-slug>
終了コード:
  0  重複なし(公開してよい)
  1  重複の疑いあり(角度を変えるか加筆昇格に切り替える)
"""
import sys
from pathlib import Path
 
# slug を主題語の集合に変換する。ノイズ語は主題ではないので落とす。
STOPWORDS = {
    "claude", "api", "sdk", "cli", "guide", "the", "a", "to", "for",
    "with", "and", "of", "in", "on", "how", "your", "cowork",
}
 
def slug_tokens(slug: str) -> set:
    parts = [p for p in slug.lower().split("-") if p]
    return {p for p in parts if p not in STOPWORDS and len(p) > 1}
 
def jaccard(a: set, b: set) -> float:
    if not a or not b:
        return 0.0
    return len(a & b) / len(a | b)
 
def main():
    repo, category, candidate = sys.argv[1], sys.argv[2], sys.argv[3]
    cand = slug_tokens(candidate)
    ja_dir = Path(repo) / "content" / "articles" / "ja" / category
    hits = []
    for mdx in ja_dir.glob("*.mdx"):
        existing = mdx.stem
        if existing == candidate:
            continue
        score = jaccard(cand, slug_tokens(existing))
        if score >= 0.5:
            hits.append((score, existing))
    hits.sort(reverse=True)
    if hits:
        print(f"❌ 重複の疑い: {candidate}")
        for score, existing in hits[:5]:
            print(f"   {score:.2f}  {existing}")
        sys.exit(1)
    print(f"✅ 重複なし: {candidate}")
    sys.exit(0)
 
if __name__ == "__main__":
    main()

このスクリプトを今朝の例で動かすと、候補 claude-api-prompt-cache-ttl-5m-to-1h-refresh-design に対して、既存の claude-api-prompt-cache-5m-1h-two-tier-ttl-design0.62 で引っかかります。共通トークンは prompt, cache, 5m, 1h, ttl, design の 6 語で、和集合は 10 語前後。表記は違うのに、概念は明確に重なっていることが数値で出ます。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
既存 slug をトークン分解して Jaccard 類似度を測り、しきい値で『同一概念の記事』を公開前に弾く Python ゲートの実装
当日ログと近接 slug を二段で照合し、誤検出と見逃しのどちらにも倒れないしきい値(0.5 前後)の決め方
重複を検出したあとの分岐 — 別角度へ振り直すか、既存記事の加筆昇格に切り替えるかの判断基準
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

Cowork2026-07-02
夜の同じ分に何本着火しているか — Cowork スケジュールタスクの衝突を cron から平らにする設計
Cowork のスケジュールタスクが同じ時刻に集中して共有リソースを奪い合う問題を、cron 式から着火時刻を展開して衝突と並行度を数え、プレミアム枠を動かさずにピークだけを削る貪欲オフセットで平準化する設計を、動くコードと実測 before/after で解説します。
Cowork2026-07-01
上流タスクが今日ちゃんと動いたかを、下流タスクが自分で確かめる — 無人スケジューラの完了台帳と依存バリア
無人スケジューラには依存関係の概念がないため、朝の参照データ更新が静かに失敗しても、昼の生成タスクは前日の残り物でそのまま走り続けます。上流の完了を原子的に台帳へ記録し、下流が実行前に前提を検証する依存バリアの設計を、動くTypeScriptと私自身の運用体験で解説します。
Cowork2026-06-30
3日前のローカルミラーで判断していた — 無人タスクが古い作業コピーを信じて二重作業する事故を止める
速度のために使い回す永続クローンは、いつの間にかリモートとずれます。同期を確かめないまま「この記事はもう直したか」を読みに行くと、無人タスクは古い木を信じて二重編集や空振り成功を起こします。HEAD 突き合わせと書き込み可否のプリフライト、自己修復の再クローンをbashで実装します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →