mcpField
W
wiki-audit

wiki-audit

github.com/kfchou生産性18854 回インストール17 週間前に更新
リポジトリ

wiki-audit について

wiki-auditは、wikiのページと引用元を照合するスキルです。引用のない事実や既存の引用を確認し、strongモードでは別モデルによる対抗レビューも行います。

主な機能

  1. 01引用のない事実の検出
  2. 02引用と出典内容の照合
  3. 03複数の出典を並行して確認
  4. 04任意のクロスモデル対抗レビュー
  5. 05ローカル監査レポートの作成

活用シーン

  1. 01公開前のwikiページ確認
  2. 02根拠のない記述や引用漏れの発見
  3. 03複数の出典に関する引用の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/kfchou/wiki-skills --skill wiki-audit

インストール後、Claude Code で/wiki-auditを入力して読み込まれたか確認します。

詳細

Wiki 監査

引用元に照らして、単一の Wiki ページを検証します。2 つのフェーズで構成されます。まず、引用のない事実に関する主張を検出し、次に、引用のある主張を検証するため、引用元ごとにサブエージェントを 1 つずつ並行して実行します。強化モード(wiki-audit strong)では、第 3 フェーズとして、別のプロバイダーのモデルによる敵対的なクロスモデルレビューを追加します。このモデルは同じ主張を再検討し、過剰な主張や矛盾を調べます。通常の検証との不一致は、指摘事項になります。

前提条件

SCHEMA.md を見つけます(カレントディレクトリから上位へ検索するか、~/wikis/ を検索します)。見つからない場合は、まず wiki-init を実行するようユーザーに伝えます。SCHEMA.md を読み、Wiki のルートパスと、監査で適用する規則および脚注形式が記載された Citations セクションを確認します。

リンク形式。 SCHEMA.md から link_style: を読み取ります。このフィールドがない場合、または <wiki-root>/config/link-style.md が存在しない場合は、obsidian([[slug]])を既定値として使用します。それ以外の場合は、<wiki-root>/config/link-style.md を読み取ります。監査対象ページの脚注にあるスラッグのリンク先は、Obsidian 形式または Markdown 形式のいずれでもかまいません。どちらも認識するには、## Parse の規則を使用してください。作成する監査レポートは Wiki ページなので、レポート内の相互参照とスラッグリンク先の例は、## Emit の規則に従って出力します。

SCHEMA.md に Citations セクションがない場合(このスキルが存在する前に初期化された古い Wiki):今回の実行では、以下のフォールバック規則を使用し、今後の操作で一貫性を保てるよう、最後に Citations セクションを SCHEMA.md に追加することを提案します。

Cite every non-common-knowledge factual claim. Granularity is paragraph or claim,
never per-sentence. Format: Markdown footnotes. Two citation kinds:

Quote:     [^N]: <target> <locator> — "<verbatim quote>"
Synthesis: [^N]: <target> <locator> [synthesis] — <what supports the claim>

Three rules:
1. Target is one of: a slug reference to a source-type wiki page (form per the
   wiki's link_style; fallback `[[source-slug]]`), raw/<file> or assets/<file>
   (a local file path), or a URL. Never an entity / concept / analysis page.
2. A semantic locator is present (§section, p.N, [HH:MM:SS], URL anchor, dated
   post). PLUS a line-range token (L142-145, L142, or L142-145,L201-203) when the
   resolved raw source is text-addressable (markdown / plaintext / code / cached
   HTML). The line-range points into the raw source file and is required for both
   citation kinds. Exempt (semantic locator only): PDFs, transcripts, live URLs
   with no local copy.
3. Either a verbatim quote, or the [synthesis] tag plus a description of what
   the cited range supports.

モード: 呼び出し引数に strong という語が含まれている場合(例:wiki-audit strong transformer-architecture)、強化モードを有効にし、フェーズ B の後にフェーズ C(§3b)を実行します。それ以外の場合は、通常モード(フェーズ A と B のみ)を実行します。残りの引数トークンがある場合は、対象ページ名として扱います。

ユーザーがページを指定していない場合は、監査するページを尋ねます。スラッグ、ファイル名、絶対パスを受け付けます。wiki/pages/<slug>.md に解決します。1 回の実行で監査するページは 1 つです。

プロセス

1. 対象ページを読む

ページ全体を読みます。以下を確認します。

  • フロントマターの sources: リスト(ページが正式に引用している引用元)。
  • すべての脚注定義([^N]: ...)と本文中の脚注参照([^N])。

ページに脚注がなく、事実に関する内容が含まれている場合、それ自体が監査結果となります。すべての主張がフェーズ A の指摘事項になります。それでもフェーズ A は実行し、フェーズ B はスキップします。

2. フェーズ A — 引用のない主張の検出(サブエージェント 1 つ)

サブエージェントを 1 つ実行します。次の情報を渡します。

  • ページの全文。
  • SCHEMA.md からコピーした Citations セクション。
  • ページの sources: リスト。

タスク:脚注のない、一般常識ではない事実に関する主張をすべて列挙します。(行番号, 主張のテキスト, sources リスト内から提案する引用元、または "unknown") の構造化リストを返します。

サブエージェントは、SCHEMA.md の「引用すべき内容」の規則を適用します。段落単位または主張単位の粒度とし、一般常識は対象外です。

3. フェーズ B — 引用された主張の検証(N 個のサブエージェント、並列)

ページ内のすべての脚注定義について、次の情報を解析します。

  • 対象 — スラッグ参照(config/link-style.md の ## Parse に従って照合し、Obsidian 形式または Markdown 形式からスラッグを抽出)、raw/ または assets/ 配下のパス、あるいは URL のいずれかです。
  • 意味的なロケーター(§セクション、p.N、タイムスタンプ、URL アンカー、日付付き投稿)。
  • L<start>-<end> の行範囲(指定されている場合)。テキストで参照できるソースには行範囲があります。
  • 逐語的な引用または [synthesis] の説明のいずれか。

各対象から読み取り可能なコンテンツを解決します。

  • スラッグ参照 → wiki/pages/<slug>.md を読み、**Source:** 行にある元ファイルのパスを確認します。次に、その raw/ または assets/ 内の元ファイルを読みます。
  • raw/<file> または assets/<file> → ファイルを直接読みます。
  • <URL> → URL から導出したファイル名で、assets/ にキャッシュ済みコピーがあるか確認します。ある場合は、それを読みます。ない場合は、脚注を 🚫 source-missing とします(再取得はしません。修正ステップで行います)。

解決できない対象の判定は 🚫 source-missing とし、その対象にサブエージェントを割り当てないでください。

ファストパス — 行範囲(L…)がある脚注: サブエージェントを割り当てないでください。 対象を元ファイルに解決し、引用された行だけを読みます(例:sed -n '142,143p' raw/<file>、または Read ツールでオフセットと上限を指定します)。次に、以下のように判定します。

  • 引用脚注: 先頭と末尾の空白を無視し、連続する空白を 1 つにまとめたうえで、逐語的な引用がその行範囲のテキストと文字列一致するか確認します。一致 → ✅ supported。不一致 → ❌ unsupported(その行に実際に書かれている内容を記載します)。
  • 合成脚注([synthesis] + L…): サブエージェントに、元ソース全体ではなく引用された行の抜粋と合成の説明だけを渡し、以下の判定基準を適用します。これは読み取り範囲を限定するケースで、ソース全体を読むよりはるかに効率的です。

行範囲を読み取れない脚注(ファイルの範囲外、ファイルが存在しない)は 🚫 source-missing とします。

スローパス — 行範囲がない脚注(従来形式の引用、および対象外ソース:PDF、トランスクリプト、ライブ URL):

解決可能な脚注を、解決したファイルごとにまとめます(同じ PDF に対する複数の脚注は、1 回の読み取りで処理します)。Agent ツールを使い、ファイルごとに 1 つのサブエージェントを並列で割り当てます。各サブエージェントには、次の情報を渡します。

  • 元ソースの内容(raw/、assets/、またはキャッシュ済み URL から取得)。
  • そのソースに対する脚注の一覧。それぞれの脚注には、番号、ロケーター、逐語的な引用または [synthesis] の説明を含めます。
  • 以下の判定基準。

各サブエージェントは、脚注ごとに 1 つの判定と 1 行の注記を返します。

  • ✅ supported — 引用が指定されたロケーターのソースと文字列一致する(L… の範囲がある場合は判定が確定します)、または [synthesis] の説明が引用範囲を正確に要約している。
  • ❌ unsupported — 引用が指定されたロケーター/行範囲で見つからない、または主張がソースによって否定されている。
  • ⚠️ partial — 引用が逐語的ではなく言い換えられている(かつ [synthesis] タグがない)、または合成の説明が引用範囲の内容を誇張している。

❌ および ⚠️ の場合、注記にはソースに実際に書かれている内容を含め、ユーザーが修正方法を判断できるようにします。

脚注ごとではなくソースごとに処理する理由: PDF の読み取りにはコストがかかります。30 ページの論文を 5 つの脚注のために 1 回読むほうが、5 回読むより効率的です。

3b. フェーズ C — モデル間の敵対的レビュー(強モードのみ)

このセクションは、監査が wiki-audit strong として実行された場合にのみ実行してください。通常モードでは、このセクション全体をスキップして手順 4 に進みます。

1. レビュアーモデルを選択します(プロバイダーチェーン)。 利用可能な、異なるプロバイダーの CLI を次の順に検出します。

  • command -v codex が成功 → codex(OpenAI)を使用します。ラベル:model codex、provider openai。
  • それ以外で command -v gemini が成功 → gemini(Google)を使用します。ラベル:model gemini、provider google。
  • それ以外の場合は、Agent ツールを介して Claude サブエージェント(Sonnet)にフォールバックします。ラベル:model claude-sonnet、provider anthropic。すべての指摘に same-provider — weaker signal を付け、codex または gemini をインストールすると、真のプロバイダー間チェックが可能になることをユーザーに伝えます。

2. 上限を設けたペイロードを組み立てます — フェーズ B の作業を再利用し、生のソースを再読み込みしないでください。

  • 対象ページの本文全体。
  • 引用されている各主張について、主張のテキストとフェーズ B ですでに読み込んだ行範囲の抜粋。
  • [[slug]] を介して対象ページから直接リンクされている各ページの本文(直接リンクのみ。Wiki 全体ではありません)。

ペイロードの後に以下の指示ブロックを続け、$TMPDIR/wiki-review-<page-slug>.md に書き込みます。

3. 指示ブロック(ペイロードファイルの先頭にそのまま含めます):

You are an adversarial reviewer. Given a wiki page, the source excerpts its claims
cite, and the bodies of its directly-linked neighbor pages, find ONLY these problems
and return them as a JSON array — nothing else. Do not restate claims that are fine.
Finding types:
- "overreach": a claim generalizes beyond what its cited excerpt supports.
- "internal-contradiction": two claims on this page conflict.
- "cross-page-contradiction": a claim conflicts with a directly-linked neighbor page.
Each finding is an object: {"type": "...", "where": "<line / footnote / page ref>",
"detail": "<one sentence>"}. Return [] if you find nothing.

4. レビュアーを非対話モードで呼び出します。

  • codex: codex exec "$(cat "$TMPDIR/wiki-review-<page-slug>.md")"
  • gemini: gemini -p "$(cat "$TMPDIR/wiki-review-<page-slug>.md")"
  • サブエージェントへのフォールバック:ペイロードファイルの内容をプロンプトとして Agent を 1 つ実行します。

CLI 呼び出しでエラーが発生した場合は、非対話モードでの使用方法(codex exec --help / gemini --help)を確認して 1 回再試行します。それでも失敗する場合は、サブエージェントの経路にフォールバックします。レビュアーの返信を指摘の JSON 配列として解析します(前後に文章があっても許容し、配列を抽出します)。

5. 見解の相違のみを抽出します。 フェーズ A/B ですでに指摘されていない指摘のみを残します。フェーズ B が ✅/⚠️ と評価した主張をレビュアーが overreach と指摘した場合は、見解の相違です。どちらのフェーズも指摘していない矛盾も、見解の相違です。フェーズ A/B の既存の判定を単に繰り返すレビュアーの指摘は破棄します。残った一覧がフェーズ C の指摘です。

6. 監査対象ページのフロントマターに review: を記録します(レポートではありません)。これは監査メタデータです。レポートと同様に自動で書き込み、ページの内容は変更しません。ページのフロントマターに review: ブロックを追加するか、既存のものと置き換えます。

review:
  model: codex          # gemini | claude-sonnet, per the chain above
  provider: openai      # google | anthropic
  date: <today>
  status: disputed      # `clean` if step 5 left zero disagreements, else `disputed`
  findings: 2           # the disagreement count; OMIT this line when status: clean

フェーズ C の指摘を手順 4 のレポートに含めます。

4. 監査レポートを作成します

必ず書き込みます。許可を求めないでください。パス:wiki/pages/audit-<page-slug>-<today>.md。以下のテンプレートでは読みやすさのために Obsidian 形式のスラッグ参照を使用しています。実際のレポートでは、すべてのスラッグ参照が config/link-style.md の ## Emit の規則に従う必要があります。

---
title: Audit Report — <page-slug> — <today>
tags: [audit, maintenance]
sources: []
updated: <today>
---

# Audit Report — [[<page-slug>]] — <today>

## Summary
- Cited claims verified: N
- ✅ Supported: N    ❌ Unsupported: N    ⚠️ Partial: N    🚫 Source missing: N
- 🆘 Uncited factual claims: N
- 🧪 Cross-model disagreements: N   (strong mode only; omit this line in normal mode)

## 🆘 Uncited Claims (Phase A)
- Line 42: "Transformers replaced LSTMs as the default sequence model."
  Suggested source: [[attention-is-all-you-need]] or unknown
  Fix: add footnote, weaken claim, or remove

## ❌ Unsupported (Phase B)
- [^3]: claims "8 attention heads with 128 dims each"
  Source says: "h = 8 parallel attention layers ... d_k = d_v = 64"
  Fix: correct the dimension to 64

## ⚠️ Partial (Phase B)
- [^7]: [synthesis] description says "compares to RNNs across 4 benchmarks"
  Source range covers 2 benchmarks, not 4. Tighten the description.

## 🚫 Source Missing
- [^5]: https://example.com/post — no cached copy in assets/
  Fix: re-fetch source, or remove citation

## ✅ Supported
- [^1], [^2], [^4], [^6], [^8] — all verified

## 🧪 Cross-Model Review (<model> / <provider>)
- overreach — [^3]: claim generalizes to "all transformers" but the cited excerpt
  (L142-143) covers only the encoder.
- internal-contradiction — line 12 says "8 heads", line 40 says "16 heads".
- cross-page-contradiction — [[this-page]] vs [[other-page]] disagree on the release date.
Disposition: surfaced for user review (not auto-applied).

## 🧪 Cross-Model Review セクションは強モードの場合にのみ含めます。見出しにはレビュアーを記載します(例:(codex / openai))。プロバイダーチェーンがサブエージェントにフォールバックした場合は、(claude-sonnet / anthropic — same-provider, weaker signal) とします。フェーズ C の見解の相違を 1 行ずつ列挙します。フェーズ C で見つかったものがない場合は、- none — reviewer agreed with the normal audit. と記載します。

監査レポートはローカル専用の成果物です。 レポートを書き込む前に、Wiki ルートの .gitignore に wiki/pages/audit-*.md の行が含まれていることを確認してください。含まれていない場合は追記します(この規約が導入される前に初期化された Wiki の自己修復です。.gitignore がない場合は作成します)。監査レポートは wiki/index.md に表示されません。インデックスは bin/generate-index.py によって生成され、audit-*.md ファイルをスキップするため、手作業で追加または削除するものはありません。強モードで実行した場合、コミットされる記録は §3b でページに付与された review: フロントマタートークンです。レポート自体はローカルに残ります。

5. 具体的な修正を提案する

空でないカテゴリごとに、1つずつ提案します。

  • 🆘 引用なし:「ページの sources: リストを検索して根拠を確認し、これらの主張に脚注を追加することを提案しますか?」
  • ❌ 根拠なし:「レポートに示された修正を適用しますか?(先に差分をお見せします。)」
  • ⚠️ 一部のみ:「統合の説明をより明確にしますか?それとも、付いていない箇所に [synthesis] タグを追加しますか?(先に差分をお見せします。)」
  • 🚫 ソースが見つからない:「URLを再取得するか、場所を誤っているPDFを raw/ に戻しますか?」

ユーザーの確認後にのみ適用します。書き込みの前に、正確な差分を表示します。

6. 操作を記録する

SCHEMA の 操作ログとコミット規約に従います。監査 レポート 自体は Git の対象外(audit-*.md)なので、コミットできるのはページの変更のみです。

  • Git wiki: 監査によってコミット可能なファイル(ページの引用修正、または強モードの review: フロントマタートークン)が変更された場合は、コミットを提案します(修正を適用した場合は既定で fix:、レビューのトークンのみの場合は chore: とトレーラー)。確認後にコミットします。通常モードの監査で何も変更されなかった場合、コミットするものはありません。
    fix: resolve uncited claims on <page-slug>
    
    Wiki-Op: audit
    
  • 非 Git wiki: wiki/log.md に追記します。
    ## [<today>] audit | <slug reference to <page-slug>> — N supported, N unsupported, N partial, N uncited
    Report: audit-<page-slug>-<today>.md (local-only)
    Cross-model: <model>/<provider> — clean | N disagreements   # strong mode only
    Fixed: <list, or "none">
    
7. ユーザーに報告する
  • 監査レポート:wiki/pages/audit-<page-slug>-<today>.md
  • 1行の判定(例:「引用付きの主張8件のうち5件を検証し、引用のない主張を2件確認しました」)
  • 修正を適用したかどうか

コメント