report-card について
report-card は Bullshit Detector の Markdown レポートを、スマートフォンでも読みやすい単一の HTML ページに変換します。Markdown を正本として保ち、描画前に tally.py でレポートを検証します。
主な機能
- 01Markdown レポートを単体 HTML に変換
- 02描画前に tally.py でレポートを検証
- 03スコア、判定フィルター、画面幅対応カードを追加
- 04印刷スタイルとリンクプレビュー用メタデータ
- 05ブラウザーでのローカル表示と静かな実行
活用シーン
- 01読みやすいファクトチェックレポートを共有
- 02リンク付きレポートを PDF として印刷
- 03問題のある主張や重要な主張だけを確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ serhiikorniienko/ bullshit-detector --skill report-cardインストール後、Claude Code で/report-cardを入力して読み込まれたか確認します。
同梱ファイルscripts/render_report.pyVERSION
詳細
report-card
bs-report-<slug>-<date>.md を、誰でも開ける単一の HTML ファイルに変換します。
Markdown が成果物であり、今後も成果物であり続けます。tally.py がチェックし、後の実行結果との差分を取り、コミットするのもこのファイルです。このスキルは、同じファイルに閲覧者向けのビューを追加します。レンダリングするだけで、編集、再集計、追加は行いません。ページ上の数値はすべて、Markdown からそのままコピーされます。
これが必要な理由
BS レポートは、5 列の主張テーブルです。ノート PC なら問題ありません。共有リンクが実際に開かれるスマートフォンでは、Evidence 列が読めません。また、読者が最初に抱く疑問(「何がおかしいのか?」)に答えるには、重要な 2 行を見つけるために 20 行スクロールしなければなりません。
使い方
uv run <this-skill-dir>/scripts/render_report.py ~/.bullshit-detector/reports/<YYYY>/bs-report-<slug>-<date>.md
Markdown ファイルと同じ場所に bs-report-<slug>-<date>.html を書き出します。-o <path> を指定すると、別の場所に出力します。インストール手順も依存関係もありません。スクリプトは標準ライブラリのみを使用しており、通常の python3 と uv run のどちらでも実行できます。また、生成されるページはネットワークリクエストを一切行いません。この組み合わせにより、HTML だけがユーザーの持ち帰れる成果物となるコード実行サンドボックスでも動作します。
--openはページを既定のブラウザーで開きます。サンドボックスやヘッドレスホストなど、ブラウザーがない環境ではその旨を表示し、ファイルはそのまま書き出します。ページがすでに存在する場合はスキップされます。再レンダリングは通常の操作であり(最初の実行後に実行行を確定するため)、開くたびに新しいタブが作成されるためです。実際に 3 回連続で実行したところ、ユーザーには 2 つのタブが残りました。ファイルは同じ場所で更新されるため、開いているタブを再読み込みしてください。--reopenは、ページがすでに存在していても開きます。後のセッションでレポートを再び確認する場合に使います。これを失敗として扱わないでください。--quietは、スクリプトから実行する場合に、出力パスのみを表示します。
引き継ぎブロック
既定では、スクリプトは検出器の実行を締めくくるブロックを表示します。
BS score 4/10 · Mostly fine
the macro data is real and mostly checks out; the narrative glue is crypto-Twitter.
Tally: 35 claims extracted, 34 individually source-checked — 22 confirmed, 5 plausible,
5 misleading, 2 false. 1 not checked.
run: 16m30s, searches 35, tools 65, coverage 1, per claim 29s
markdown file:///Users/…/bs-report-japans-money-is-collapsing-2026-07-31.md
page file:///Users/…/bs-report-japans-money-is-collapsing-2026-07-31.html
opened in your browser
そのまま貼り付けてください。作り直さないでください。 すべての数値は、tally.py が直前に再集計したレポートから取得されています。自分が書いた内容を記憶から打ち直した要約は、実行結果を実際より良く見せる方向に間違えます。これは、集計や検索件数と同じ失敗パターンが、ひとつ上のレベルで起きたものです。
パスを file:// URL にしているのは意図的です。ターミナルでは URL をそのままリンクにできるため、どちらのファイルもコマンドキーをクリックするだけで開けます。~/… に短縮したり、リンクテキストの背後に隠したりしないでください。
コンプライアンスゲート
レンダリングの前に、スクリプトは検出器の tally.py でレポートをチェックし、チェックに失敗したレポートのレンダリングを拒否します。
REFUSED: bs-report-our-solar-system-2026-07-31.md does not pass tally.py.
✗ run line: 25 claims individually source-checked from 21 searches — every claim
carrying a verdict needs its own search, so this reports more verification than
was performed
終了コードは 3 です。これがゲートの目的です。計算に失敗したレポートから、これほど見栄えのするページを作ると、壊れたレポートが権威あるもののように見えてしまいます。ゲートが指摘した問題を修正し、再実行してください。
--forceは、失敗内容を警告として表示しながらレンダリングします。--no-checkは、BS レポートではない Markdown のためにゲートをスキップします。- 自動検出できない場合は、
--tally <path>または$BULLSHIT_DETECTOR_TALLYを指定します。
tally.py がインストールされていない場合、このスキルは検出器なしでもインストールできるため、スクリプトは警告を表示してレンダリングします。検証ツールがない場合は警告する理由にはなりますが、手元にあるレポートを誰かが見るのを止める理由にはなりません。
--og-image <absolute-url> を指定すると、リンクプレビュー画像を追加します。ページがどこかにホストされている場合にのみ役立つため、ローカルファイルでは省略してください。
ホストされたページのタグ
ホストされたページでは、スクリプトは <link rel="canonical">、Open Graph タグと Twitter カードタグ、
および Article 構造化データも出力します。そのためにはページの公開 URL が必要です。
--canonical <absolute-url>はその URL です。ページのアドレスが固定されている場合は、必ず渡してください。- 指定しない場合、ページには canonical も構造化データ内の
urlも含まれません。スクリプトが--og-imageなどから URL を推測することはありません。誤った canonical は検索エンジンに本当のアドレスを 誤って伝えるため、指定しないほうがましです。
--author <name> と --author-type Person|Organization は、Article の著者を設定します。このスキルは誰でも使えるため、
デフォルトはツール自体です。公開する際は、自分の名前を渡してください。
datePublished はレポート自体の **Checked:** 行から取得し、レンダリング時刻は使いません。先月行った作業に
今日の日付を付けるのは、この構造化データで絶対にしてはならないことです。そのため、日付を読み取れない場合は
日付を一切出力しません。
その後、ユーザーにファイルのパスと、どのブラウザーでも開けることを伝えてください。macOS では open <path> で開けます。
Markdown に加えてページに追加されるもの
- スコアのヒーロー表示 — スコアをふさわしい大きさで表示し、RUBRIC の区分(Solid / Mostly fine / Hype-heavy / Mostly bullshit / Fabricated)に応じて色分けし、横に一行の判定を表示します。
- 判定フィルターのチップ —
Problemsでは❌と🟠のみを表示します。Load-bearing onlyでは 付随的な表を非表示にします。これが、技術に詳しくない読者がレポートを最後まで読めるようにするための要点です。 - 900px 未満ではカード形式の主張表示、それ以上では表形式で表示します。行、順序、テキストは同じです。
- 印刷用スタイルシート — Cmd-P で、各リンクの後ろに URL を印字した見やすい PDF が作成されます。 印刷時はフィルターを意図的に無視します。フィルター適用済みの PDF は行がひそかに削除されたレポートになり、 このツールが絶対に生成してはならない成果物だからです。
- リンクプレビュータグ — リンクを貼り付けると、URL だけではなく
<title> — N/10と判定の行が表示されます。
ルール
- レポートを作り直さず、レンダリングしてください。 数値がおかしい場合は、Markdown に誤りがあります。そこで修正してから 再レンダリングしてください。HTML 内では決して修正しないでください。
- 信頼できる情報源はあくまで Markdown です。 ファイルを渡す際は、そのことを伝えてください。HTML は表示用であり、
tally.pyが検証したのは Markdown だけです。 - 拒否を回避するために
--forceを使わないでください。 ゲートが示しているのは、レポートに実際にある欠陥です。 それを無視してレンダリングすると、元の内容以上に信頼できそうなページができてしまいます。これこそ、このツールが 検出するために作られた問題です。 - 頼まれていないものは公開しないでください。 このツールは、未公開の草稿、内部文書、または内密に送られた資料にも使われます。 ローカルファイルへの書き込みは公開ではありません。インターネット上に掲載するかどうかは、レポートごとにユーザーが決めることです。
- レンダラーは意図的に寛容です。スコアやバージョン表記がないレポートもレンダリングし、欠けている項目をページ上に示します。
これはビューアーの役割です。厳格なのは
tally.pyであり、両者の役割を入れ替えてはいけません。
既知の制限
- 主張の表は
| # | Claim | Type | Verdict | Evidence |の形式を維持する必要があります。レンダラーは#列を使って 主張の表とそれ以外の表を見分け、判定の記号は行内の別の場所ではなく、必ず専用のセルから読み取ります。 - どの言語のレポートも正しくレンダリングされます(システムフォントを使用し、Web フォントは同梱していません)。
- 画像はここでは生成されません。SNS 用カルーセルは share にあります。